diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 18:49:50 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 18:49:50 +0800 |
| commit | 27f0ca0597e2799e2a1ed431aadeb559c6dfbcf2 (patch) | |
| tree | f7465c43b1e421fc51641e81ee0f55d4845416c5 /src/LivingVillage.Kernel/Occupation.fs | |
| parent | f8830705272cfa2c877cd0b984f61d1fa7a77ec2 (diff) | |
| download | living-village-27f0ca0597e2799e2a1ed431aadeb559c6dfbcf2.tar.gz | |
feat(occupation): P11 存档 v3 today-task 尾段(annals 后追加)+ 双向兼容
Occupation.State 增 Today: DailyTask option(State 声明移至 DailyTask 之后;TaskToken 保留为 v3 前缀占位扩展位)。WorldSave:saveWith 有任务时在 annals 之后追加尾段 task-today|<template>|<state>|<offered>|<due>|npc-none/some|tile-none/some;无任务/无职业不追加(默认 None = 旧行为,v2 逐字节不变)。load 重构为内部 parse 返回 (World, Occupation.State option):尾段可选——旧 v3(P10 版式无尾段)新 reader 读出 Today=None;v1/v2 无任务;尾段后多余 token 或未知模板 token 拒绝(不吞档)。loadFromFileWith 顺手修正:不再经 stateOf 重置,前缀 task/stage 与 Today 全量保真。5 例测试:尾段位置(marker 在 annal 之后)+ 全字段 round-trip + 重存逐字节一致、无任务 v3 旧版式、v1/v2 无尾段 + 未知模板拒绝、尾段后垃圾拒绝、字节级双跑一致。
Diffstat (limited to 'src/LivingVillage.Kernel/Occupation.fs')
| -rw-r--r-- | src/LivingVillage.Kernel/Occupation.fs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/LivingVillage.Kernel/Occupation.fs b/src/LivingVillage.Kernel/Occupation.fs index e0507ae..a3c37bd 100644 --- a/src/LivingVillage.Kernel/Occupation.fs +++ b/src/LivingVillage.Kernel/Occupation.fs @@ -43,15 +43,6 @@ module Occupation = | Peddler -> { Kind = Peddler; InitialMoney = 90; InitialEnergy = 100.0f; InitialInventory = [ Sim.Food, 6; Sim.Spice, 4 ] } | Scholar -> { Kind = Scholar; InitialMoney = 70; InitialEnergy = 100.0f; InitialInventory = [ Sim.Food, 10; Sim.Scroll, 2 ] } - /// Placeholder carried in save v3 until the task-system slice lands (design §3). - type State = - { Profile: Profile - TaskToken: int - StoryStage: int } - - let stateOf (kind: Kind) : State = - { Profile = profileOf kind; TaskToken = 0; StoryStage = 0 } - // ---- 每日任务(design §3):Kernel 侧纯函数片,不进 Sim.step 数值路径 ---- type TaskState = @@ -169,3 +160,14 @@ module Occupation = OfferedTick = offered DueTick = offered + Sim.ticksPerDay - 1L State = Offered } + + /// 挂在玩家侧的职业状态,随存档 v3 保存(design §2)。 + /// Today = 当日任务(§3);TaskToken 保留为 v3 前缀占位扩展位(恒 0,暂未启用)。 + type State = + { Profile: Profile + TaskToken: int + Today: DailyTask option + StoryStage: int } + + let stateOf (kind: Kind) : State = + { Profile = profileOf kind; TaskToken = 0; Today = None; StoryStage = 0 } |
