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 }