diff --git a/app/routes/maps.tsx b/app/routes/maps.tsx index ce9ae032a..84c25c395 100644 --- a/app/routes/maps.tsx +++ b/app/routes/maps.tsx @@ -2,9 +2,17 @@ import type { LinksFunction } from "@remix-run/node"; import { useTranslation } from "react-i18next"; import { Image } from "~/components/Image"; import { Main } from "~/components/Main"; +import type { ModeShort, StageId } from "~/modules/in-game-lists"; import { modes, stageIds } from "~/modules/in-game-lists"; +import type { MapPool } from "~/modules/map-pool-serializer/types"; import styles from "~/styles/maps.css"; -import { modeImageUrl } from "~/utils/urls"; +import { modeImageUrl, stageImageUrl } from "~/utils/urls"; +import clsx from "clsx"; +import { useSearchParams } from "@remix-run/react"; +import { + mapPoolToSerializedString, + serializedStringToMapPool, +} from "~/modules/map-pool-serializer"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; @@ -14,39 +22,114 @@ export const handle = { i18n: "game-misc", }; +const DEFAULT_MAP_POOL = { + SZ: [...stageIds], + TC: [...stageIds], + CB: [...stageIds], + RM: [...stageIds], + TW: [], +}; + export default function MapListPage() { + const { mapPool, handleMapPoolChange } = useSearchParamMapPool(); + return ( -
- +
+
); } -function MapPoolSelector() { +function useSearchParamMapPool() { + const [searchParams, setSearchParams] = useSearchParams(); + const mapPool = searchParams.has("pool") + ? serializedStringToMapPool(searchParams.get("pool")!) + : DEFAULT_MAP_POOL; + + const handleMapPoolChange = ({ + mode, + stageId, + }: { + mode: ModeShort; + stageId: StageId; + }) => { + const newMapPool = mapPool[mode].includes(stageId) + ? { + ...mapPool, + [mode]: mapPool[mode].filter((id) => id !== stageId), + } + : { + ...mapPool, + [mode]: [...mapPool[mode], stageId], + }; + + setSearchParams( + { + pool: mapPoolToSerializedString(newMapPool), + }, + { replace: true, state: { scroll: false } } + ); + }; + + return { + mapPool, + handleMapPoolChange, + }; +} + +function MapPoolSelector({ + mapPool, + handleMapPoolChange, +}: { + mapPool: MapPool; + handleMapPoolChange: (args: { mode: ModeShort; stageId: StageId }) => void; +}) { const { t } = useTranslation(["game-misc"]); return (
{stageIds.map((stageId) => (
-
{t(`game-misc:STAGE_${stageId}`)}
-
- {modes - .filter((mode) => mode.short !== "TW") - .map((mode) => ( - - ))} + +
+
{t(`game-misc:STAGE_${stageId}`)}
+
+ {modes.map((mode) => { + const selected = mapPool[mode.short].includes(stageId); + + return ( + + ); + })} +
))} diff --git a/app/styles/maps.css b/app/styles/maps.css index fbc32bce1..db46d2b10 100644 --- a/app/styles/maps.css +++ b/app/styles/maps.css @@ -1,5 +1,17 @@ +.maps__container { + max-width: 32rem; +} + .maps__stage-row { display: flex; + width: 100%; + align-items: center; + gap: var(--s-3); +} + +.maps__stage-name-row { + display: flex; + flex-grow: 1; align-items: center; justify-content: space-between; background-color: var(--bg-lighter); @@ -11,6 +23,13 @@ padding-inline: var(--s-3); } +.maps__mode-buttons-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: var(--s-1-5); +} + .maps__mode-button { padding: 0; padding: var(--s-1-5); @@ -20,3 +39,19 @@ color: var(--theme); outline: initial; } + +.maps__mode-button.selected { + background-color: var(--theme-very-transparent); +} + +.maps__stage-image { + border-radius: var(--rounded); +} + +.maps__mode { + filter: grayscale(100%); +} + +.maps__mode.selected { + filter: grayscale(0%); +} diff --git a/app/utils/urls.ts b/app/utils/urls.ts index a32c20f13..5df411573 100644 --- a/app/utils/urls.ts +++ b/app/utils/urls.ts @@ -6,6 +6,7 @@ import type { AbilityWithUnknown, MainWeaponId, SpecialWeaponId, + StageId, SubWeaponId, } from "~/modules/in-game-lists/types"; import type navItems from "~/components/layout/nav-items.json"; @@ -102,6 +103,7 @@ export const specialWeaponImageUrl = (specialWeaponSplId: SpecialWeaponId) => export const abilityImageUrl = (ability: AbilityWithUnknown) => `/img/abilities/${ability}`; export const modeImageUrl = (mode: ModeShort) => `/img/modes/${mode}`; +export const stageImageUrl = (stageId: StageId) => `/img/stages/${stageId}`; export function resolveBaseUrl(url: string) { return new URL(url).host; diff --git a/public/img/stages/0.avif b/public/img/stages/0.avif new file mode 100644 index 000000000..d04cef0bf Binary files /dev/null and b/public/img/stages/0.avif differ diff --git a/public/img/stages/0.png b/public/img/stages/0.png new file mode 100644 index 000000000..0d2ed9eae Binary files /dev/null and b/public/img/stages/0.png differ diff --git a/public/img/stages/1.avif b/public/img/stages/1.avif new file mode 100644 index 000000000..1b7d8ea16 Binary files /dev/null and b/public/img/stages/1.avif differ diff --git a/public/img/stages/1.png b/public/img/stages/1.png new file mode 100644 index 000000000..dd24468c1 Binary files /dev/null and b/public/img/stages/1.png differ diff --git a/public/img/stages/10.avif b/public/img/stages/10.avif new file mode 100644 index 000000000..012a18210 Binary files /dev/null and b/public/img/stages/10.avif differ diff --git a/public/img/stages/10.png b/public/img/stages/10.png new file mode 100644 index 000000000..e3c61bc9c Binary files /dev/null and b/public/img/stages/10.png differ diff --git a/public/img/stages/11.avif b/public/img/stages/11.avif new file mode 100644 index 000000000..c44985de8 Binary files /dev/null and b/public/img/stages/11.avif differ diff --git a/public/img/stages/11.png b/public/img/stages/11.png new file mode 100644 index 000000000..49f81d3c6 Binary files /dev/null and b/public/img/stages/11.png differ diff --git a/public/img/stages/2.avif b/public/img/stages/2.avif new file mode 100644 index 000000000..49560502d Binary files /dev/null and b/public/img/stages/2.avif differ diff --git a/public/img/stages/2.png b/public/img/stages/2.png new file mode 100644 index 000000000..f206c1db2 Binary files /dev/null and b/public/img/stages/2.png differ diff --git a/public/img/stages/3.avif b/public/img/stages/3.avif new file mode 100644 index 000000000..82afedbca Binary files /dev/null and b/public/img/stages/3.avif differ diff --git a/public/img/stages/3.png b/public/img/stages/3.png new file mode 100644 index 000000000..479974903 Binary files /dev/null and b/public/img/stages/3.png differ diff --git a/public/img/stages/4.avif b/public/img/stages/4.avif new file mode 100644 index 000000000..8fa9a5943 Binary files /dev/null and b/public/img/stages/4.avif differ diff --git a/public/img/stages/4.png b/public/img/stages/4.png new file mode 100644 index 000000000..71c050484 Binary files /dev/null and b/public/img/stages/4.png differ diff --git a/public/img/stages/5.avif b/public/img/stages/5.avif new file mode 100644 index 000000000..23bf252e0 Binary files /dev/null and b/public/img/stages/5.avif differ diff --git a/public/img/stages/5.png b/public/img/stages/5.png new file mode 100644 index 000000000..3ec46b419 Binary files /dev/null and b/public/img/stages/5.png differ diff --git a/public/img/stages/6.avif b/public/img/stages/6.avif new file mode 100644 index 000000000..4b2fea09c Binary files /dev/null and b/public/img/stages/6.avif differ diff --git a/public/img/stages/6.png b/public/img/stages/6.png new file mode 100644 index 000000000..e7bc0d70c Binary files /dev/null and b/public/img/stages/6.png differ diff --git a/public/img/stages/7.avif b/public/img/stages/7.avif new file mode 100644 index 000000000..33743932a Binary files /dev/null and b/public/img/stages/7.avif differ diff --git a/public/img/stages/7.png b/public/img/stages/7.png new file mode 100644 index 000000000..5e9b17543 Binary files /dev/null and b/public/img/stages/7.png differ diff --git a/public/img/stages/8.avif b/public/img/stages/8.avif new file mode 100644 index 000000000..fe1f33e93 Binary files /dev/null and b/public/img/stages/8.avif differ diff --git a/public/img/stages/8.png b/public/img/stages/8.png new file mode 100644 index 000000000..d8acc7626 Binary files /dev/null and b/public/img/stages/8.png differ diff --git a/public/img/stages/9.avif b/public/img/stages/9.avif new file mode 100644 index 000000000..fae5f7d00 Binary files /dev/null and b/public/img/stages/9.avif differ diff --git a/public/img/stages/9.png b/public/img/stages/9.png new file mode 100644 index 000000000..4ea88d248 Binary files /dev/null and b/public/img/stages/9.png differ