v0.1.1: 养成闭环 + 管理自主 + 存档安全
- 指婚/续弦:成员详情可主动找人结亲(血亲自动排除、鳏寡可再醮) - 装备 UI:法宝从府库装备/替换,战力实时反馈 - 御敌点将:劫掠事件可自选迎战阵容(默认 Top4 可改) - 宗祠祭祖:每两年一次,灵石150 → 声望+6/全族修为小升 - 回档时间轴:每季快照列表,一键回卷(回卷前自动保当前档) - 战报匣子:史书页全文战报留存可翻阅 - 年度族簿纸笺:每年初弹收支/人丁/战力简报 - 媒人提示条 + 寻衅一年冷却 + 出生率与劫掠频率微调 - 单测 19→29(storage mock roundtrip/回档/指婚血亲/祭祖/寻衅/装备/账本)
This commit is contained in:
@@ -21,6 +21,7 @@ export default function ChroniclePanel() {
|
||||
const revision = useGameStore((s) => s.revision)
|
||||
void revision
|
||||
const [filter, setFilter] = useState<string>('all')
|
||||
const [battleId, setBattleId] = useState<string | null>(null)
|
||||
const entries = useMemo(() => {
|
||||
if (!world) return []
|
||||
const all = [...world.state.chronicle]
|
||||
@@ -28,6 +29,8 @@ export default function ChroniclePanel() {
|
||||
return filtered.slice().sort((a, b) => (b.year - a.year) || (b.month - a.month))
|
||||
}, [world, filter])
|
||||
if (!world) return null
|
||||
const battles = world.state.battles.slice().reverse()
|
||||
const battle = battles.find((b) => b.id === battleId)
|
||||
|
||||
return (
|
||||
<div>
|
||||
@@ -54,6 +57,49 @@ export default function ChroniclePanel() {
|
||||
))}
|
||||
{entries.length === 0 && <div className="dim2">暂无记载。</div>}
|
||||
</div>
|
||||
|
||||
<div className="card-title" style={{ fontSize: '1.02rem', marginTop: 22 }}>战报匣(全文留存)</div>
|
||||
{battle ? (
|
||||
<div className="mission-card" style={{ maxWidth: 720 }}>
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
|
||||
<b>{battle.title}</b>
|
||||
<span className="dim2" style={{ fontSize: '0.85rem' }}>
|
||||
{battle.year}年{battle.month}月 ·{' '}
|
||||
<span className={battle.winner === 'player' ? 'good' : battle.winner === 'enemy' ? 'bad' : 'warn'}>
|
||||
{battle.winner === 'player' ? '我方得胜' : battle.winner === 'enemy' ? '我方败北' : '平分秋色'}
|
||||
</span>
|
||||
</span>
|
||||
<button className="btn btn-sm" style={{ marginLeft: 'auto' }} onClick={() => setBattleId(null)}>
|
||||
收起
|
||||
</button>
|
||||
</div>
|
||||
<div className="dim" style={{ fontSize: '0.92rem', lineHeight: 1.8, marginTop: 8 }}>
|
||||
{battle.lines.slice(1).map((l, i) => (
|
||||
<div key={i}>· {l}</div>
|
||||
))}
|
||||
{battle.losses.length > 0 && (
|
||||
<div className="bad">我方折损:{battle.losses.join('、')}</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
) : battles.length === 0 ? (
|
||||
<div className="dim2" style={{ marginBottom: 6 }}>尚无战事可录。</div>
|
||||
) : (
|
||||
<div style={{ maxWidth: 720 }}>
|
||||
{battles.map((b) => (
|
||||
<div key={b.id} className="set-row" style={{ maxWidth: 720 }}>
|
||||
<span>
|
||||
<span className="ch-year" style={{ marginRight: 10 }}>{b.year}年{b.month}月</span>
|
||||
{b.title}
|
||||
<span className={`tag ${b.winner === 'player' ? 'good' : b.winner === 'enemy' ? 'bad' : 'warn'}`} style={{ marginLeft: 8 }}>
|
||||
{b.winner === 'player' ? '胜' : b.winner === 'enemy' ? '负' : '平'}
|
||||
</span>
|
||||
</span>
|
||||
<button className="btn btn-sm" onClick={() => setBattleId(b.id)}>阅</button>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user