summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Kernel/Occupation.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 18:49:50 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 18:49:50 +0800
commit27f0ca0597e2799e2a1ed431aadeb559c6dfbcf2 (patch)
treef7465c43b1e421fc51641e81ee0f55d4845416c5 /src/LivingVillage.Kernel/Occupation.fs
parentf8830705272cfa2c877cd0b984f61d1fa7a77ec2 (diff)
downloadliving-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.fs20
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 }