【引擎审计修复】 - P0:大比 once(原整年刷 12 场、奖励通胀);flag 年份键 3 年剪枝(长线膨胀) - P1:飞升离世累加 feishengCount(飞升之资称号可达);圣者护族接消费(原死代码); 大比/传薪挂能力卡门控;pending 抢渡劫时不再重设 - P2:version 硬编码统一 0.1.11;yearaxis 飞升归类;MonumentList 挂载 【UI 审计修复】 - P0:已故成员卡显示「已殁」(原秀活动 status);空队迎战禁用+提示(原静默失效) - P1:指婚候选去截断(滚动列表);终局出口(回卷/主菜单按钮);saveNow 反馈; 事件来临写入 feed(k-event 使用);遣队「最强 N 人/清空」一键;寻衅确认+联姻原因提示; 未建建筑视觉 uc 类 - P2:speed 死代码;Modal 分层 z-index;FamilyPanel 在世/先人分隔 【UX 三件套】 - 警讯徽章(瓶颈/重伤/在外/媒缘/孤嗣之忧)顶栏一屏秒答「我该干嘛」 - 首启引导任务条(四步目标 + 完成推进,可跳不强制) - 顶栏丹药瘦身(4 资源);数字千/万化;瓶颈卡红框高亮 【测试】905→923(urgency/guide/format 三模块 + 审计修复回归 6 项) 金钟罩三档重固化(0.1.11),typecheck/build 通过
71 lines
2.7 KiB
TypeScript
71 lines
2.7 KiB
TypeScript
import { useGameStore } from '../store'
|
|
import { Character } from '../../game/types/domain'
|
|
import { describeRealm } from '../../game/data/realms'
|
|
import { describeRoots } from '../../game/data/elements'
|
|
|
|
const STATE_LABEL: Record<string, { label: string; cls: string }> = {
|
|
idle: { label: '无事', cls: '' },
|
|
meditation: { label: '闭关', cls: 'good' },
|
|
expedition: { label: '出探', cls: 'warn' },
|
|
wounded: { label: '养伤', cls: 'bad' },
|
|
apprentice: { label: '寄读', cls: 'gold' },
|
|
closed: { label: '养息', cls: '' },
|
|
dead: { label: '已殁', cls: 'bad' }
|
|
}
|
|
|
|
export function MemberCard({ c }: { c: Character }) {
|
|
const world = useGameStore((s) => s.world)
|
|
const setSelected = useGameStore((s) => s.setSelected)
|
|
if (!world) return null
|
|
const dead = !c.alive
|
|
const isHead = world.state.family.headId === c.id
|
|
const state = STATE_LABEL[dead ? 'dead' : c.state]
|
|
const blocked = !dead && c.realmProgress >= 100 && c.realm.major !== 'spirit'
|
|
return (
|
|
<div className={`member-card ${dead ? 'dead' : ''} ${blocked ? 'blocked' : ''}`} onClick={() => setSelected(c.id)}>
|
|
<div className="mc-head">
|
|
<div className="m-avatar">{world.state.family.surname}</div>
|
|
<div style={{ flex: 1 }}>
|
|
<div className="member-name">
|
|
<span>{c.name}</span>
|
|
{isHead && <span className="tag head-t">家主</span>}
|
|
{c.spouseHouse && <span className="tag">外亲</span>}
|
|
</div>
|
|
<div className="member-realm">
|
|
{dead
|
|
? `殁于${c.deathYear}年 · ${c.deathCause ?? '寿终'}`
|
|
: `${describeRealm(c.realm)} · ${world.ageOf(c)}岁 · 修为${Math.floor(c.realmProgress)}%`}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div className="member-tags">
|
|
<span className="tag">{describeRoots(c.roots)}</span>
|
|
{!dead && c.realmProgress >= 100 && <span className="tag gold-t">瓶颈 · 可冲击</span>}
|
|
{C_STATE[dead ? 'dead' : c.state] && (
|
|
<span className={`tag ${C_STATE[dead ? 'dead' : c.state]}`}>{STATE_LABEL[dead ? 'dead' : c.state]?.label ?? ''}</span>
|
|
)}
|
|
</div>
|
|
{!dead && (
|
|
<div className="mc-foot">
|
|
<div className="bar" title="灵气修为" style={{ height: 6 }}>
|
|
<div style={{ width: `${c.realmProgress}%` }} />
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function postLabel(c: Character): string {
|
|
const map: Record<string, string> = { head: '家主', elder: '长老', guardian: '供奉', steward: '执事', master: '掌教' }
|
|
return map[c.post ?? ''] ?? ''
|
|
}
|
|
|
|
const C_STATE: Record<string, string> = {
|
|
idle: '',
|
|
meditation: 'good',
|
|
expedition: 'warn',
|
|
wounded: 'bad',
|
|
dead: 'bad'
|
|
}
|