From 5da900c1c391be3088a87a77c873c34107a67adb Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Sun, 31 Aug 2025 20:55:53 +0200 Subject: [PATCH 1/4] Enhance Amogus --- src/components/Amogus/Amogus.tsx | 135 ++++++++++++++++--------------- 1 file changed, 72 insertions(+), 63 deletions(-) diff --git a/src/components/Amogus/Amogus.tsx b/src/components/Amogus/Amogus.tsx index c55620e..e7c5500 100644 --- a/src/components/Amogus/Amogus.tsx +++ b/src/components/Amogus/Amogus.tsx @@ -12,81 +12,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[]) => + 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))}; } -- 2.49.1 From 3606f9b0431678ea683f40dd4a2559f6106cc419 Mon Sep 17 00:00:00 2001 From: Arif Hasanic Date: Sun, 31 Aug 2025 21:08:08 +0200 Subject: [PATCH 2/4] restart firefox after pull --- .gitea/workflows/ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 9f083b1..d163181 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -69,12 +69,13 @@ jobs: password: ${{ secrets.GARRISON_DOCKER_PASSWORD }} script: | cd monitor-im-flur - export HYPRLAND_INSTANCE_SIGNATURE=$(hyprctl instances -j | jq '.[0].instance' | tr -d "'\"") - hyprctl dispatch exec 'pkill firefox' - hyprctl dispatch exec 'firefox -kiosk localhost:9123' git clean -dfx git reset --hard HEAD git pull docker-compose pull docker-compose down docker-compose up -d + export HYPRLAND_INSTANCE_SIGNATURE=$(hyprctl instances -j | jq '.[0].instance' | tr -d "'\"") + hyprctl dispatch exec 'pkill firefox' + hyprctl dispatch exec 'firefox -kiosk localhost:9123' + -- 2.49.1 From 53db7e795c4f0023a9f8d715fca88d7c90d7fabb Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Sun, 31 Aug 2025 22:34:02 +0200 Subject: [PATCH 3/4] Bad collision --- src/components/Amogus/Amogus.tsx | 59 +++++++++++++++++++------- src/components/Amogus/style.module.css | 4 ++ 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/src/components/Amogus/Amogus.tsx b/src/components/Amogus/Amogus.tsx index e7c5500..535fd00 100644 --- a/src/components/Amogus/Amogus.tsx +++ b/src/components/Amogus/Amogus.tsx @@ -12,6 +12,9 @@ type Amogus = { speedY: number; }; +const amogusWidth = 70; +const amogusHeight = 70; + const { innerWidth: width, innerHeight: height } = window; const getImage = (sus: Amogus) => (sus.isImposter ? imposter : amogus); @@ -24,6 +27,9 @@ const makeInitialCrewmates: Amogus[] = () => { makeCrewmate(false), makeCrewmate(false), makeCrewmate(false), + makeCrewmate(false), + makeCrewmate(false), + makeCrewmate(false), ]; }; @@ -32,14 +38,15 @@ const randNum: number = (min: number, max: number) => 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), + posX: randNum(0, width - amogusWidth), + posY: randNum(0, height - amogusHeight), + speedX: Math.random() > 0.5 ? randNum(3, 10) : randNum(-3, -10), + speedY: Math.random() > 0.5 ? randNum(3, 10) : randNum(-3, -10), }); const intersect: Bool = (c1: Crewmate, c2: Crewmate) => - Math.abs(c1.posX - c2.posX) < 80 && Math.abs(c1.posY - c2.posY) < 90; + Math.abs(c1.posX - c2.posX) < amogusWidth - 20 && + Math.abs(c1.posY - c2.posY) < amogusHeight - 20; const doMove = (crewmates: Amogus[]) => crewmates.map((c) => ({ @@ -48,16 +55,37 @@ const doMove = (crewmates: Amogus[]) => posY: c.posY + c.speedY, })); -const doCollision = (crewmates: Amogus[]) => +const doCollisionWalls = (crewmates: Amogus[]) => 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 }; + if (c.posX > width - amogusWidth) { + return { + ...c, + posX: width - amogusWidth, + speedX: c.speedX * -1, + }; + } else if (c.posX < -20) { + return { ...c, posX: -20, speedX: c.speedX * -1 }; + } else if (c.posY > height - amogusHeight) { + return { + ...c, + posY: height - amogusHeight, + speedY: c.speedY * -1, + }; + } else if (c.posY < -20) { + return { ...c, posY: -20, speedY: c.speedY * -1 }; + } else return c; + }); + +const doCollisionOthers = (crewmates: Amogus[]) => + crewmates.map((c) => { + const intersections = crewmates + .filter((o) => intersect(c, o)) + .filter((o) => Math.abs(o.posX - c.posX) > 1e-3) // don't collide with yourself pls + .filter((o) => Math.abs(o.posY - c.posY) > 1e-3); + if (intersections.some((o) => Math.abs(o.posX - c.posX) < 50)) { + return { ...c, speedX: c.speedX * -1 }; + } else if (intersections.some((o) => Math.abs(o.posY - c.posY) < 50)) { + return { ...c, speedY: c.speedY * -1 }; } else return c; }); @@ -88,7 +116,8 @@ export default function Amogus() { useEffect(() => { const timer = setInterval(() => { setCrewmates((c) => doMove(c)); - setCrewmates((c) => doCollision(c)); + setCrewmates((c) => doCollisionWalls(c)); + setCrewmates((c) => doCollisionOthers(c)); setCrewmates((c) => doKills(c)); setCrewmates((c) => checkReset(c)); }, 50); diff --git a/src/components/Amogus/style.module.css b/src/components/Amogus/style.module.css index 02b7665..53ffe35 100644 --- a/src/components/Amogus/style.module.css +++ b/src/components/Amogus/style.module.css @@ -1,4 +1,8 @@ .container { z-index: 100; position: absolute; + scale: 50%; + display: flex; + justify-content: center; + align-items: center; } -- 2.49.1 From cb4ce4188e9c361cc048dc43eed081bdf5d0da87 Mon Sep 17 00:00:00 2001 From: Darius Schefer Date: Mon, 1 Sep 2025 00:02:03 +0200 Subject: [PATCH 4/4] Amogus cleanup --- src/components/Amogus/Amogus.tsx | 22 +++++++++--------- src/components/Dashboard/Dashboard.tsx | 13 +++-------- src/components/Dashboard/style.module.css | 27 ----------------------- 3 files changed, 15 insertions(+), 47 deletions(-) diff --git a/src/components/Amogus/Amogus.tsx b/src/components/Amogus/Amogus.tsx index 535fd00..ada808b 100644 --- a/src/components/Amogus/Amogus.tsx +++ b/src/components/Amogus/Amogus.tsx @@ -4,7 +4,6 @@ import imposter from "/img/imposter.png"; import style from "./style.module.css"; type Amogus = { - key: string; isImposter: boolean; posX: number; posY: number; @@ -19,7 +18,7 @@ const { innerWidth: width, innerHeight: height } = window; const getImage = (sus: Amogus) => (sus.isImposter ? imposter : amogus); -const makeInitialCrewmates: Amogus[] = () => { +const makeInitialCrewmates = (): Amogus[] => { return [ makeCrewmate(true), makeCrewmate(false), @@ -33,10 +32,10 @@ const makeInitialCrewmates: Amogus[] = () => { ]; }; -const randNum: number = (min: number, max: number) => +const randNum = (min: number, max: number): number => Math.random() * (max - min) + min; -const makeCrewmate: Amogus = (imposter: boolean) => ({ +const makeCrewmate = (imposter: boolean): Amogus => ({ isImposter: imposter, posX: randNum(0, width - amogusWidth), posY: randNum(0, height - amogusHeight), @@ -44,7 +43,7 @@ const makeCrewmate: Amogus = (imposter: boolean) => ({ speedY: Math.random() > 0.5 ? randNum(3, 10) : randNum(-3, -10), }); -const intersect: Bool = (c1: Crewmate, c2: Crewmate) => +const intersect = (c1: Amogus, c2: Amogus): boolean => Math.abs(c1.posX - c2.posX) < amogusWidth - 20 && Math.abs(c1.posY - c2.posY) < amogusHeight - 20; @@ -76,17 +75,20 @@ const doCollisionWalls = (crewmates: Amogus[]) => } else return c; }); +// TODO: This is ugly const doCollisionOthers = (crewmates: Amogus[]) => crewmates.map((c) => { const intersections = crewmates - .filter((o) => intersect(c, o)) - .filter((o) => Math.abs(o.posX - c.posX) > 1e-3) // don't collide with yourself pls - .filter((o) => Math.abs(o.posY - c.posY) > 1e-3); + .filter((o) => o !== c) // don't collide with yourself pls + .filter((o) => intersect(c, o)); + if (intersections.some((o) => Math.abs(o.posX - c.posX) < 50)) { return { ...c, speedX: c.speedX * -1 }; - } else if (intersections.some((o) => Math.abs(o.posY - c.posY) < 50)) { + } + if (intersections.some((o) => Math.abs(o.posY - c.posY) < 50)) { return { ...c, speedY: c.speedY * -1 }; - } else return c; + } + return c; }); const doKills = (crewmates: Amogus[]) => { diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index c951ed8..08602f9 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -60,16 +60,9 @@ export default function Dashboard() { -
- - - -
+ + + diff --git a/src/components/Dashboard/style.module.css b/src/components/Dashboard/style.module.css index 117536e..fe94495 100644 --- a/src/components/Dashboard/style.module.css +++ b/src/components/Dashboard/style.module.css @@ -25,30 +25,3 @@ .night { background-color: #2a3f55; } - -.amogus { - z-index: 100; - position: absolute; - scale: 60%; - animation: - x 10s linear infinite alternate, - y 7s linear infinite alternate; -} - -@keyframes x { - from { - left: 0; - } - to { - left: calc(100vw - 70px); - } -} - -@keyframes y { - from { - top: 0; - } - to { - top: calc(100vh - 90px); - } -} -- 2.49.1