diff --git a/src/components/Amogus/Amogus.tsx b/src/components/Amogus/Amogus.tsx index 7b36c77..2587c50 100644 --- a/src/components/Amogus/Amogus.tsx +++ b/src/components/Amogus/Amogus.tsx @@ -11,81 +11,90 @@ type Amogus = { speedY: number; }; +const { innerWidth: width, innerHeight: height } = window; + const getImage = (sus: Amogus) => (sus.isImposter ? imposter : amogus); -const initialCrewmates: Amogus[] = [ - { key: "a", isImposter: true, posX: 10, posY: 20, speedX: 10, speedY: 30 }, - { - key: "b", - isImposter: false, - posX: 400, - posY: 200, - speedX: 10, - speedY: -20, - }, - { - key: "c", - isImposter: false, - posX: 900, - posY: 200, - speedX: -20, - speedY: 10, - }, -]; - -const makeCrewmate = (crewmate: Amogus) => { - const image = getImage(crewmate); - return ( -
- Amogus -
- ); +const makeInitialCrewmates: Amogus[] = () => { + return [ + makeCrewmate(true), + makeCrewmate(false), + makeCrewmate(false), + makeCrewmate(false), + makeCrewmate(false), + makeCrewmate(false), + ]; }; -const stepCrewmates = (list: Amogus[]) => { - const { innerWidth: width, innerHeight: height } = window; - const newCrewmates = list.slice(); - for (const c of newCrewmates) { - let newX = c.posX + c.speedX; - let newY = c.posY + c.speedY; - if (newX > width - 90) { - newX = width - 90; - c.speedX *= -1; - } - if (newX < 0) { - newX = 0; - c.speedX *= -1; - } - if (newY > height - 120) { - newY = height - 120; - c.speedY *= -1; - } - if (newY < 0) { - newY = 0; - c.speedY *= -1; - } - c.posX = newX; - c.posY = newY; - } - return newCrewmates; +const randNum: number = (min: number, max: number) => + Math.random() * (max - min) + min; + +const makeCrewmate: Amogus = (imposter: boolean) => ({ + isImposter: imposter, + posX: randNum(0, width - 90), + posY: randNum(0, height - 120), + speedX: Math.random() > 0.5 ? randNum(5, 15) : randNum(-5, -15), + speedY: Math.random() > 0.5 ? randNum(5, 15) : randNum(-5, -15), +}); + +const intersect: Bool = (c1: Crewmate, c2: Crewmate) => + Math.abs(c1.posX - c2.posX) < 80 && Math.abs(c1.posY - c2.posY) < 90; + +const doMove = (crewmates: Amogus[]) => + crewmates.map((c) => ({ + ...c, + posX: c.posX + c.speedX, + posY: c.posY + c.speedY, + })); + +const doCollision = (crewmates: Amogus[]) => p; +crewmates.map((c) => { + if (c.posX > width - 90) { + return { ...c, posX: width - 90, speedX: c.speedX * -1 }; + } else if (c.posX < 0) { + return { ...c, posX: 0, speedX: c.speedX * -1 }; + } else if (c.posY > height - 120) { + return { ...c, posY: height - 120, speedY: c.speedY * -1 }; + } else if (c.posY < 0) { + return { ...c, posY: 0, speedY: c.speedY * -1 }; + } else return c; +}); + +const doKills = (crewmates: Amogus[]) => { + const imposters = crewmates.filter((c) => c.isImposter); + const alive = crewmates + .filter((c) => !c.isImposter) + .filter((c) => imposters.every((i) => !intersect(i, c))); + return imposters.concat(alive); }; +const checkReset = (crewmates: Amogus[]) => + crewmates.every((c) => c.isImposter) ? makeInitialCrewmates() : crewmates; + +const renderCrewmate = (crewmate: Amogus, key: number) => ( +
+ Amogus +
+); + export default function Amogus() { - const [crewmates, setCrewmates] = useState(initialCrewmates); + const [crewmates, setCrewmates] = useState(() => makeInitialCrewmates()); useEffect(() => { const timer = setInterval(() => { - const c = crewmates; - setCrewmates(stepCrewmates(c)); - }, 100); + setCrewmates((c) => doMove(c)); + setCrewmates((c) => doCollision(c)); + setCrewmates((c) => doKills(c)); + setCrewmates((c) => checkReset(c)); + }, 50); return () => { clearInterval(timer); }; - }, [crewmates]); + }, []); - return <>{crewmates.map((c) => makeCrewmate(c))}; + return <>{crewmates.map((c, index) => renderCrewmate(c, index))}; }