@@ -792,11 +810,11 @@ export function MinesweeperBoard({
{CUSTOM_MAX_SIZE}×{CUSTOM_MAX_SIZE} field.
- ) : (
+ ) : !customUnlocked ? (
Clear all three standard locations to unlock custom minefields.
- )}
+ ) : null}
diff --git a/src/components/frontend/radio/CustomTestLeaderboard.tsx b/src/components/frontend/minigames/radio/CustomTestLeaderboard.tsx
similarity index 100%
rename from src/components/frontend/radio/CustomTestLeaderboard.tsx
rename to src/components/frontend/minigames/radio/CustomTestLeaderboard.tsx
diff --git a/src/components/frontend/radio/RadioArena.tsx b/src/components/frontend/minigames/radio/RadioArena.tsx
similarity index 86%
rename from src/components/frontend/radio/RadioArena.tsx
rename to src/components/frontend/minigames/radio/RadioArena.tsx
index 22110da..54eb5dd 100644
--- a/src/components/frontend/radio/RadioArena.tsx
+++ b/src/components/frontend/minigames/radio/RadioArena.tsx
@@ -1,16 +1,15 @@
"use client";
import { useCallback, useEffect, useState } from "react";
-import Link from "next/link";
-import { Radio } from "lucide-react";
-import type { RadioStats } from "@/app/(frontend)/radio/actions";
+import type { RadioStats } from "@/app/(frontend)/minigames/radio/actions";
import {
isRadioUnlocked,
SPRINT_ACCURACY_REQUIREMENT,
WATCH_ACCURACY_REQUIREMENT,
-} from "@/lib/custom-minigames/radio";
+} from "@/lib/minigames/custom/radio";
import { useRealtimePresence } from "@/hooks/useRealtimePresence";
import { UnlockNotice } from "@/components/frontend/minigames/UnlockNotice";
+import { UgcLinkButton } from "@/components/frontend/minigames/UgcLinkButton";
import { RadioLeaderboard } from "./RadioLeaderboard";
import { RadioTraffic } from "./RadioTraffic";
@@ -49,13 +48,13 @@ export function RadioArena({
return (
-
-
- Custom radio tests
-
+
{!customUnlocked && (
{
}
async function playOpordRound(page: Page): Promise {
- await page.goto(`/opord?seed=${FIXED_SEED}`);
+ await page.goto(`/minigames/opord?seed=${FIXED_SEED}`);
await expect(page.getByRole("heading", { name: "OPORD Recall" })).toBeVisible();
await page.getByRole("button", { name: "Receive briefing" }).click();
diff --git a/tests/int/aim-trainer.int.spec.ts b/tests/int/aim-trainer.int.spec.ts
index 8c3cc9a..e69f40a 100644
--- a/tests/int/aim-trainer.int.spec.ts
+++ b/tests/int/aim-trainer.int.spec.ts
@@ -29,7 +29,7 @@ import {
resolveAimTrainerTargetHit,
stepAimTrainerTarget,
stepAimTrainerTargets,
-} from "@/lib/aim-trainer";
+} from "@/lib/minigames/aim-trainer";
/** Deterministic LCG-style RNG so target creation is reproducible across runs. */
function seededRng(seed: number): () => number {
diff --git a/tests/int/custom-minefields.int.spec.ts b/tests/int/custom-minefields.int.spec.ts
index 751e163..2dfec59 100644
--- a/tests/int/custom-minefields.int.spec.ts
+++ b/tests/int/custom-minefields.int.spec.ts
@@ -17,8 +17,8 @@ import {
validateMinefieldName,
validateMinefieldScore,
validateMinePositions,
-} from "@/lib/custom-minigames/eod";
-import { creditEodXp } from "@/lib/custom-minigames/payouts";
+} from "@/lib/minigames/custom/eod";
+import { creditEodXp } from "@/lib/minigames/custom/payouts";
let payload: Payload;
const RUN = `cmf-${Date.now().toString(36)}`;
diff --git a/tests/int/custom-radio-tests.int.spec.ts b/tests/int/custom-radio-tests.int.spec.ts
index b7291ec..f26043a 100644
--- a/tests/int/custom-radio-tests.int.spec.ts
+++ b/tests/int/custom-radio-tests.int.spec.ts
@@ -11,7 +11,7 @@ import {
validateMessages,
validateRadioScore,
validateTestName,
-} from "@/lib/custom-minigames/radio";
+} from "@/lib/minigames/custom/radio";
let payload: Payload;
const RUN = `crt-${Date.now().toString(36)}`;