From 4d9edb3dbee62f73a0291bf4e0199fc232f73c3d Mon Sep 17 00:00:00 2001 From: Z8MB1E Date: Mon, 14 Sep 2026 15:38:26 -0400 Subject: [PATCH] feat(chips): credit chip bank from non-card minigame XP Each minigame action credits chipBank with chipsForXp on profile update, feeding the card-game buy-in pool. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- src/app/(frontend)/minigames/eod/actions.ts | 5 +++++ src/app/(frontend)/minigames/flappy/actions.ts | 5 +++++ src/app/(frontend)/minigames/opord/actions.ts | 5 +++++ src/app/(frontend)/minigames/qualification/actions.ts | 5 +++++ src/app/(frontend)/minigames/radio/actions.ts | 5 +++++ 5 files changed, 25 insertions(+) diff --git a/src/app/(frontend)/minigames/eod/actions.ts b/src/app/(frontend)/minigames/eod/actions.ts index adfd1ff..346a26a 100644 --- a/src/app/(frontend)/minigames/eod/actions.ts +++ b/src/app/(frontend)/minigames/eod/actions.ts @@ -5,6 +5,7 @@ import { getPayload } from "payload"; import { emitGameEvent } from "@/utils/event-log/emit"; import { EventTypes } from "@/utils/event-log/eventTypes"; import { broadcastToUser } from "@/lib/realtime/bus"; +import { chipsForXp } from "@/lib/minigames/chips"; interface ActionResult { success: boolean; @@ -133,6 +134,7 @@ export async function submitEodResult(input: { const progression = (profile.progression ?? {}) as { xp?: unknown; + chipBank?: number | null; minigames?: { eodMinesweeper?: { gamesPlayed?: number; @@ -172,6 +174,7 @@ export async function submitEodResult(input: { const bestFlags = isBestRun ? input.flags : previousBestFlags; const { xp: _xp, ...progressionRest } = progression; + const chipBank = Math.max(0, (progression.chipBank ?? 0) + chipsForXp(runXp)); await payload.update({ collection: "profiles", @@ -179,6 +182,7 @@ export async function submitEodResult(input: { data: { progression: { ...progressionRest, + chipBank, minigames: { ...(progressionRest.minigames ?? {}), eodMinesweeper: { @@ -205,6 +209,7 @@ export async function submitEodResult(input: { broadcastToUser("profile-update", Number(user.id), { reason: "xp", xpGained: runXp, + chipBank, profileId: profile.id, }); diff --git a/src/app/(frontend)/minigames/flappy/actions.ts b/src/app/(frontend)/minigames/flappy/actions.ts index 330a5bc..d706acb 100644 --- a/src/app/(frontend)/minigames/flappy/actions.ts +++ b/src/app/(frontend)/minigames/flappy/actions.ts @@ -5,6 +5,7 @@ import { getPayload } from "payload"; import { emitGameEvent } from "@/utils/event-log/emit"; import { EventTypes } from "@/utils/event-log/eventTypes"; import { broadcastToUser } from "@/lib/realtime/bus"; +import { chipsForXp } from "@/lib/minigames/chips"; interface ActionResult { success: boolean; @@ -68,6 +69,7 @@ export async function submitFlappyScore(input: { const progression = (profile.progression ?? {}) as { xp?: unknown; + chipBank?: number | null; minigames?: { flappyBird?: { gamesPlayed?: number; @@ -85,6 +87,7 @@ export async function submitFlappyScore(input: { const flappyXp = (current.xpEarned ?? 0) + runXp; const { xp: _xp, ...progressionRest } = progression; + const chipBank = Math.max(0, (progression.chipBank ?? 0) + chipsForXp(runXp)); await payload.update({ collection: "profiles", @@ -92,6 +95,7 @@ export async function submitFlappyScore(input: { data: { progression: { ...progressionRest, + chipBank, minigames: { ...(progressionRest.minigames ?? {}), flappyBird: { gamesPlayed, totalPasses, bestScore, xpEarned: flappyXp }, @@ -104,6 +108,7 @@ export async function submitFlappyScore(input: { broadcastToUser("profile-update", Number(user.id), { reason: "xp", xpGained: runXp, + chipBank, profileId: profile.id, }); diff --git a/src/app/(frontend)/minigames/opord/actions.ts b/src/app/(frontend)/minigames/opord/actions.ts index 30b8202..805f926 100644 --- a/src/app/(frontend)/minigames/opord/actions.ts +++ b/src/app/(frontend)/minigames/opord/actions.ts @@ -2,6 +2,7 @@ import config from "@payload-config"; import { getPayload } from "payload"; +import { chipsForXp } from "@/lib/minigames/chips"; import { OPORD_DIFFICULTIES, @@ -99,6 +100,7 @@ export async function submitOpordRecallResult( const progression = (profile.progression ?? {}) as { xp?: unknown; + chipBank?: number | null; minigames?: { opordRecall?: { gamesPlayed?: number; @@ -153,6 +155,7 @@ export async function submitOpordRecallResult( input.difficulty === "elite" ? tierBestTimeMs : (current.eliteBestTimeMs ?? null); const { xp: _xp, ...progressionRest } = progression; + const chipBank = Math.max(0, (progression.chipBank ?? 0) + chipsForXp(xp)); await payload.update({ collection: "profiles", @@ -160,6 +163,7 @@ export async function submitOpordRecallResult( data: { progression: { ...progressionRest, + chipBank, minigames: { ...(progressionRest.minigames ?? {}), opordRecall: { @@ -183,6 +187,7 @@ export async function submitOpordRecallResult( broadcastToUser("profile-update", Number(user.id), { reason: "xp", xpGained: xp, + chipBank, profileId: profile.id, }); diff --git a/src/app/(frontend)/minigames/qualification/actions.ts b/src/app/(frontend)/minigames/qualification/actions.ts index 3989271..3ce2eb2 100644 --- a/src/app/(frontend)/minigames/qualification/actions.ts +++ b/src/app/(frontend)/minigames/qualification/actions.ts @@ -5,6 +5,7 @@ import { getPayload } from "payload"; import { emitGameEvent } from "@/utils/event-log/emit"; import { EventTypes } from "@/utils/event-log/eventTypes"; import { broadcastToUser } from "@/lib/realtime/bus"; +import { chipsForXp } from "@/lib/minigames/chips"; import { isAimTrainerDifficulty, calculateAimTrainerAccuracy, @@ -119,6 +120,7 @@ export async function submitAimTrainerResult( const progression = (profile.progression ?? {}) as { xp?: unknown; + chipBank?: number | null; minigames?: { aimTrainer?: { gamesPlayed?: number; @@ -163,6 +165,7 @@ export async function submitAimTrainerResult( const aimTrainerXp = (current.xpEarned ?? 0) + xp; const { xp: _xp, ...progressionRest } = progression; + const chipBank = Math.max(0, (progression.chipBank ?? 0) + chipsForXp(xp)); const recruitBestScore = input.difficulty === "recruit" ? difficultyBestScore : (current.recruitBestScore ?? 0); const veteranBestScore = input.difficulty === "veteran" ? difficultyBestScore : (current.veteranBestScore ?? 0); @@ -180,6 +183,7 @@ export async function submitAimTrainerResult( data: { progression: { ...progressionRest, + chipBank, minigames: { ...(progressionRest.minigames ?? {}), aimTrainer: { @@ -202,6 +206,7 @@ export async function submitAimTrainerResult( broadcastToUser("profile-update", Number(user.id), { reason: "xp", xpGained: xp, + chipBank, profileId: profile.id, }); diff --git a/src/app/(frontend)/minigames/radio/actions.ts b/src/app/(frontend)/minigames/radio/actions.ts index e362728..77ceb71 100644 --- a/src/app/(frontend)/minigames/radio/actions.ts +++ b/src/app/(frontend)/minigames/radio/actions.ts @@ -5,6 +5,7 @@ import { getPayload } from "payload"; import { emitGameEvent } from "@/utils/event-log/emit"; import { EventTypes } from "@/utils/event-log/eventTypes"; import { broadcastToUser } from "@/lib/realtime/bus"; +import { chipsForXp } from "@/lib/minigames/chips"; interface ActionResult { success: boolean; @@ -126,6 +127,7 @@ export async function submitRadioResult(input: { const progression = (profile.progression ?? {}) as { xp?: unknown; + chipBank?: number | null; minigames?: { radioTraffic?: { gamesPlayed?: number; @@ -185,6 +187,7 @@ export async function submitRadioResult(input: { const radioTrafficXp = Math.round(((current.xpEarned ?? 0) + runXp) * 10) / 10; const { xp: _xp, ...progressionRest } = progression; + const chipBank = Math.max(0, (progression.chipBank ?? 0) + chipsForXp(runXp)); await payload.update({ collection: "profiles", @@ -192,6 +195,7 @@ export async function submitRadioResult(input: { data: { progression: { ...progressionRest, + chipBank, minigames: { ...(progressionRest.minigames ?? {}), radioTraffic: { @@ -222,6 +226,7 @@ export async function submitRadioResult(input: { broadcastToUser("profile-update", Number(user.id), { reason: "xp", xpGained: runXp, + chipBank, profileId: profile.id, });