import { useMemo } from "react"; import { GffEditor, getFieldValue, type FieldOverrideProps, } from "./GffEditor"; interface CreatureEditorProps { repo: string; filePath: string; content: string; onSave?: (content: string) => void; onSwitchToRaw?: () => void; } function AbilityScoresOverride({ data, onChange }: FieldOverrideProps) { const abilities = [ ["Str", "Dex", "Con"], ["Int", "Wis", "Cha"], ]; const displayNames: Record = { Str: "STR", Dex: "DEX", Con: "CON", Int: "INT", Wis: "WIS", Cha: "CHA", }; return (
{abilities.flat().map((ab) => { const val = getFieldValue(data, ab); const num = typeof val === "number" ? val : 0; return (
{displayNames[ab]} onChange(ab, parseInt(e.target.value, 10))} style={{ marginTop: "0.25rem", width: "4rem", borderRadius: "0.25rem", border: "1px solid var(--forge-border)", padding: "0.25rem", textAlign: "center", fontSize: "var(--text-lg)", fontWeight: 600, backgroundColor: "var(--forge-surface)", color: "var(--forge-text)", }} /> mod {num >= 10 ? "+" : ""}{Math.floor((num - 10) / 2)}
); })}
); } function RaceGenderOverride({ data, onChange }: FieldOverrideProps) { const race = getFieldValue(data, "Race"); const gender = getFieldValue(data, "Gender"); const raceNum = typeof race === "number" ? race : 0; const genderNum = typeof gender === "number" ? gender : 0; return (
onChange("Race", parseInt(e.target.value, 10))} style={{ width: "5rem", borderRadius: "0.25rem", border: "1px solid var(--forge-border)", padding: "0.375rem 0.5rem", fontSize: "var(--text-sm)", backgroundColor: "var(--forge-bg)", color: "var(--forge-text)", }} /> (racialtypes.2da)
); } function ScriptsOverride({ data, onChange }: FieldOverrideProps) { const scripts = [ { label: "ScriptHeartbeat", display: "Heartbeat" }, { label: "ScriptOnDamaged", display: "On Damaged" }, { label: "ScriptDeath", display: "On Death" }, { label: "ScriptSpawn", display: "On Spawn" }, ]; return (
{scripts.map((s) => { const val = getFieldValue(data, s.label); const str = typeof val === "string" ? val : ""; return (
onChange(s.label, e.target.value)} style={{ flex: 1, borderRadius: "0.25rem", border: "1px solid var(--forge-border)", padding: "0.375rem 0.5rem", fontFamily: "var(--font-mono)", fontSize: "var(--text-sm)", backgroundColor: "var(--forge-bg)", color: "var(--forge-text)", }} placeholder="(none)" />
); })}
); } export function CreatureEditor({ repo, filePath, content, onSave, onSwitchToRaw }: CreatureEditorProps) { const fieldOverrides = useMemo(() => { const overrides = new Map React.ReactNode>(); overrides.set("Str", (props) => ); overrides.set("Dex", () => null); overrides.set("Con", () => null); overrides.set("Int", () => null); overrides.set("Wis", () => null); overrides.set("Cha", () => null); overrides.set("Race", (props) => ); overrides.set("Gender", () => null); overrides.set("ScriptHeartbeat", (props) => ); overrides.set("ScriptOnDamaged", () => null); overrides.set("ScriptDeath", () => null); overrides.set("ScriptSpawn", () => null); return overrides; }, []); return ( ); }