diff --git a/src/App.js b/src/App.js index ad7b14a..efe2c73 100644 --- a/src/App.js +++ b/src/App.js @@ -50,6 +50,24 @@ const DEFAULT_INIT_MOD = 0; const MONSTER_DEFAULT_INIT_MOD = 2; const ROLL_DISPLAY_DURATION = 5000; +const CONDITIONS = [ + { id: 'blinded', label: 'Blinded', emoji: 'π' }, + { id: 'charmed', label: 'Charmed', emoji: 'π' }, + { id: 'deafened', label: 'Deafened', emoji: 'π' }, + { id: 'exhaustion', label: 'Exhaustion', emoji: 'π΄' }, + { id: 'frightened', label: 'Frightened', emoji: 'π±' }, + { id: 'grappled', label: 'Grappled', emoji: 'π€' }, + { id: 'incapacitated', label: 'Incapacitated', emoji: 'π«' }, + { id: 'invisible', label: 'Invisible', emoji: 'π»' }, + { id: 'paralyzed', label: 'Paralyzed', emoji: 'β‘' }, + { id: 'petrified', label: 'Petrified', emoji: 'πΏ' }, + { id: 'poisoned', label: 'Poisoned', emoji: 'π€’' }, + { id: 'prone', label: 'Prone', emoji: 'β¬οΈ' }, + { id: 'restrained', label: 'Restrained', emoji: 'πΈοΈ' }, + { id: 'stunned', label: 'Stunned', emoji: 'π₯' }, + { id: 'unconscious', label: 'Unconscious', emoji: 'π€' }, +]; + // ============================================================================ // FIREBASE CONFIGURATION // ============================================================================ @@ -769,6 +787,7 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); const [itemToDelete, setItemToDelete] = useState(null); const [lastRollDetails, setLastRollDetails] = useState(null); + const [openConditionsId, setOpenConditionsId] = useState(null); const participants = encounter.participants || []; @@ -1057,6 +1076,23 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { } }; + const toggleCondition = async (participantId, conditionId) => { + if (!db) return; + const updatedParticipants = participants.map(p => { + if (p.id !== participantId) return p; + const current = p.conditions || []; + const next = current.includes(conditionId) + ? current.filter(c => c !== conditionId) + : [...current, conditionId]; + return { ...p, conditions: next }; + }); + try { + await updateDoc(doc(db, encounterPath), { participants: updatedParticipants }); + } catch (err) { + console.error("Error updating conditions:", err); + } + }; + const handleDragStart = (e, id) => { setDraggedItemId(id); e.dataTransfer.effectAllowed = 'move'; @@ -1329,6 +1365,47 @@ function ParticipantManager({ encounter, encounterPath, campaignCharacters }) { ))} )} + + {/* Active condition badges */} + {(p.conditions || []).length > 0 && ( +
Toggle Conditions
+