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 (
-
-

-
- );
+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) => (
+
+
})
+
+);
+
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))}>;
}