import { useGameStore } from '../store' import { computeGenealogy } from '../../game/engine/narrative/genealogy' import { describeRealm } from '../../game/data/realms' import { Character, FamilyState } from '../../game/types/domain' import { useState } from 'react' import { MemberModal } from '../components/MemberModal' export default function GenealogyPanel() { const world = useGameStore((s) => s.world) const revision = useGameStore((s) => s.revision) const selectedMemberId = useGameStore((s) => s.selectedMemberId) const setSelected = useGameStore((s) => s.setSelected) const [deceasedTab, setDeceasedTab] = useState(false) void revision if (!world) return null const w = world const s = w.state const rows = computeGenealogy(w) const deceased = !deceasedTab ? [] : Object.values(s.members).filter((c) => !c.alive).sort((a, b) => (a.deathYear ?? 0) - (b.deathYear ?? 0)) const selected = selectedMemberId ? s.members[selectedMemberId] as Character | undefined : undefined return (
宗族谱系:世代分带,夫妻同卷,子孙列后。点任一名字可查详情;染灰者已下世,功绩铭记。
{!deceasedTab && rows.map((row) => (
第{row.gen}代
{row.units.map((unit, i) => (
{unit.parents[0] && }
×
{unit.parents[1] && }
{unit.children.length > 0 && ( <>
{unit.children.map((ch) => ( ))}
)}
))} {row.singles.length > 0 && (
{row.singles.map((c) => ( ))}
)} {row.units.length + row.singles.length === 0 &&
此代凋零
}
))} {deceasedTab && deceased.map((c) => (
殁于{c.deathYear}年 {c.name} · {c.gender === 'male' ? '男' : '女'} · 第{c.generation}代 {c.deathCause ?? '寿终'}
))} {selected && }
) } function GeneNode({ c, w }: { c: Character; w: NonNullable['world']> }) { const setSelected = useGameStore((s) => s.setSelected) const isHead = w.state.family.headId === c.id const rank = c.techniqueRank ?? 0 const post = POST_NAME[c.post ?? ''] ?? '' return (
setSelected(c.id)} title={`${c.name} · ${describeRealm(c.realm)} · ${w.ageOf(c)}岁`} >
{c.name} {isHead && } {post && {post}} {!c.alive && }
{c.alive ? `${describeRealm(c.realm)} · ${w.ageOf(c)}岁` : `${c.deathCause ?? '寿终'}${c.deathYear ? `(${c.deathYear}年)` : ''}`} {rank > 0 && 悟{rank}}
) } const POST_NAME: Record = { head: '家主', elder: '长老', guardian: '供奉', steward: '执事', master: '掌教' } export type { FamilyState }