import { useCallback, useEffect, useMemo, useState } from 'react'; import styles from '../styles/Army.module.css'; interface MarchingGroupType { id: number, people: [number, number][] removeGroup: (id: number) => void } const MarchingGroup = ({ people, id, removeGroup }: MarchingGroupType) => { useEffect(() => { const destroyTimeout = setTimeout(() => { removeGroup(id) }, 18000); return () => clearTimeout(destroyTimeout) }, [id, removeGroup]) const groupHtml = useMemo(() => { return
{people.map(([personStatus, role], index) => { const cssRole = intToRole(role); const cssStatus = intToStatus(personStatus); return
})}
}, [people, id]) return groupHtml } const MarchingBand = () => { const [groups, setGroups] = useState([]); const removeGroup = useCallback((id: number) => { setGroups(p => p.filter(p => p.id !== id)); }, [setGroups]) const addGroup = useCallback(() => { const nPeople = getRandomInt(2, 4); const people: [number, number][] = [] for (let i = 0; i < nPeople; i++) { people.push([getRandomInt(0, 3), getRandomInt(0, 14)]) } setGroups(g => [...g, { id: Math.random(), people, removeGroup }]); }, [removeGroup]) useEffect(() => { const addingInterval = setInterval(() => { addGroup() }, 8000) return () => clearInterval(addingInterval) }, [addGroup]) return
{groups.map(({ id, people }) => )}
} const getRandomInt = (min: number, max: number) => Math.floor(Math.random() * (max + 1 - min) + min) const intToRole = (val: number) => { switch (val) { case 0: return styles.alchemist case 1: return styles.archer case 2: return styles.cleric case 3: return styles.druid case 4: return styles.dwarf case 5: return styles.monk case 6: return styles.necromancer case 7: return styles.paladin case 8: return styles.ranger case 9: return styles.rogue case 10: return styles.scribe case 11: return styles.warrior case 12: return styles.wizard case 13: return styles.healer case 14: return styles.hunter default: return styles.wizard } } const intToStatus = (val: number) => { switch (val) { case 0: return styles.moloch_denier; case 1: return styles.apprentice; case 2: return styles.anointed; case 3: return styles.champion; default: return styles.moloch_denier; } } export default MarchingBand