import { useEffect, useMemo, useState } from "react"; import { CREATURE_READINESS_LABELS, CREATURE_READINESS_STATUSES, type CreatureReadinessStatus, useRandomizedCreatureReadiness, } from "../app/randomizedCreatureReadiness"; import { useShellStore } from "../app/shellStore"; import type { RandomizedCreatureKind } from "../game/dungeons/randomizedBiteSizedStockades"; import { RANDOMIZED_BITE_SIZED_CREATURE_CATALOG } from "../game/dungeonRegistry"; import { BrandMark, FrontSurface } from "./FrontSurface"; const CREATURES = RANDOMIZED_BITE_SIZED_CREATURE_CATALOG; type KindFilter = "all" | RandomizedCreatureKind; type StatusFilter = "all" | CreatureReadinessStatus; export function RandomizedCreatureReadinessScreen({ onClose }: { readonly onClose: () => void }) { const session = useShellStore((state) => state.session); const reviews = useRandomizedCreatureReadiness((state) => state.reviews); const loading = useRandomizedCreatureReadiness((state) => state.loading); const error = useRandomizedCreatureReadiness((state) => state.error); const refresh = useRandomizedCreatureReadiness((state) => state.refresh); const save = useRandomizedCreatureReadiness((state) => state.save); const [query, setQuery] = useState(""); const [kind, setKind] = useState("all"); const [status, setStatus] = useState("all"); const [selectedKey, setSelectedKey] = useState(CREATURES[0]?.key ?? ""); useEffect(() => { void refresh(); }, [refresh]); const statusOf = (key: string): CreatureReadinessStatus => reviews[key]?.status ?? "needs-testing"; const filtered = useMemo(() => CREATURES.filter((creature) => ( (kind === "all" || creature.kind === kind) && (status === "all" || statusOf(creature.key) === status) && (!query.trim() || creature.name.toLowerCase().includes(query.trim().toLowerCase()) || String(creature.sourceEntry).includes(query.trim())) )), [kind, query, reviews, status]); const selected = CREATURES.find((creature) => creature.key === selectedKey) ?? filtered[0] ?? null; const counts = Object.fromEntries(CREATURE_READINESS_STATUSES.map((candidate) => [ candidate, CREATURES.filter((creature) => statusOf(creature.key) === candidate).length, ])) as Record; return (

Game Master tools

Randomized creature readiness

{CREATURE_READINESS_STATUSES.map((candidate) => (
{counts[candidate]}{CREATURE_READINESS_LABELS[candidate]}
))}
{filtered.map((creature) => ( ))} {!filtered.length &&

No creatures match these filters.

}
{selected ? <>

{selected.kind === "boss" ? "Boss candidate" : "Mob candidate"}

{selected.name}

Source
{selected.sourceDungeonTitle}
Entity
{selected.entityId}
Source entry
{selected.sourceEntry}

Current status: {CREATURE_READINESS_LABELS[statusOf(selected.key)]}

{CREATURE_READINESS_STATUSES.map((candidate) => ( ))}
{reviews[selected.key] && Last reviewed by {reviews[selected.key].reviewedBy} on {new Date(reviews[selected.key].reviewedAt).toLocaleString()}.} :

Select a creature to review it.

} {error &&

{error}

}
); }