summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop/TaskRuntime.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-29 00:24:08 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-29 00:24:08 +0800
commita59a4bbe1ab45adb29d1367995230d3f09847d9b (patch)
tree9570b3c7168a6252920138e380e2a9d9cb6f9acf /src/LivingVillage.Desktop/TaskRuntime.fs
parent80c99bc9251e4ca6304761ef9bd88f2724642278 (diff)
downloadliving-village-a59a4bbe1ab45adb29d1367995230d3f09847d9b.tar.gz
p55: 当日任务经济闭环——设计口径物品报酬入账(夜捕鱼×2/送粮食物×1, 其余不发) + 连续完成天数(streak 跨日保留/漏完成清零) + v3 streak 尾段与 save(None) 兼容 + LV_P55_SHOT 证据
Diffstat (limited to 'src/LivingVillage.Desktop/TaskRuntime.fs')
-rw-r--r--src/LivingVillage.Desktop/TaskRuntime.fs36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/LivingVillage.Desktop/TaskRuntime.fs b/src/LivingVillage.Desktop/TaskRuntime.fs
index 75675aa..efc57f3 100644
--- a/src/LivingVillage.Desktop/TaskRuntime.fs
+++ b/src/LivingVillage.Desktop/TaskRuntime.fs
@@ -9,10 +9,21 @@ open LivingVillage.Kernel
/// (其内部是 `satisfiesCompletion`),绝不按日历索引硬编码计数。
module TaskRuntime =
- let private completionMessage (before: Occupation.DailyTask option) (after: Occupation.DailyTask option) : string option =
+ /// 完成短中文反馈:有设计口径物品奖励时带「+物品×数量」。
+ let completionText (task: Occupation.DailyTask) (reward: (Sim.ItemKind * int) option) : string =
+ let headline = sprintf "任务完成:%s" (Occupation.taskNameOf task.TemplateId)
+ match reward with
+ | Some(item, quantity) -> sprintf "%s +%s×%d" headline (Occupation.itemNameOf item) quantity
+ | None -> headline
+
+ let private completionMessage
+ (before: Occupation.DailyTask option)
+ (after: Occupation.DailyTask option)
+ (reward: (Sim.ItemKind * int) option)
+ : string option =
match before, after with
| Some previous, Some current when previous.State = Occupation.Active && current.State = Occupation.Done ->
- Some(sprintf "任务完成:%s" (Occupation.taskNameOf current.TemplateId))
+ Some(completionText current reward)
| _ -> None
/// 接受当日任务(Offered → Active);无任务 / 已在进行 / 终态时无变化、无反馈。
@@ -23,19 +34,17 @@ module TaskRuntime =
Some(sprintf "已接受任务:%s" (Occupation.taskNameOf task.TemplateId))
| _ -> state, None
- /// 用一条既有世界事件推进当日任务;Active → Done 时返回短中文反馈。
+ /// 用一条既有世界事件推进当日任务;Active → Done 时返回(含奖励的)短中文反馈。
let advanceWithEvent (event: Sim.InteractionEvent) (state: Occupation.State) : Occupation.State * string option =
let before = state.Today
- let next = Occupation.advanceTask event state
- next, completionMessage before next.Today
+ let next, reward = Occupation.advanceTaskWithReward event state
+ next, completionMessage before next.Today reward
/// 用一条已折叠的任务信号(到达瓦片 / 观察 / 夜在水边)推进当日任务。
let advanceWithSignal (signal: Occupation.TaskSignal) (state: Occupation.State) : Occupation.State * string option =
- match state.Today with
- | Some task ->
- let after = Occupation.applySignal signal task
- { state with Today = Some after }, completionMessage (Some task) (Some after)
- | None -> state, None
+ let before = state.Today
+ let next, reward = Occupation.applySignalToState signal state
+ next, completionMessage before next.Today reward
/// 折叠多条信号(后面的不覆盖已得到的完成反馈)。
let foldSignals (signals: Occupation.TaskSignal list) (state: Occupation.State) : Occupation.State * string option =
@@ -58,7 +67,12 @@ module TaskRuntime =
if isNight && nearWater then yield Occupation.NightAtWater ]
/// 比较两份职业状态,返回本次推进是否让当日任务完成(供交易等路径复用)。
- let completedMessage (before: Occupation.State option) (after: Occupation.State option) : string option =
+ let completedMessageWithReward
+ (before: Occupation.State option)
+ (after: Occupation.State option)
+ (reward: (Sim.ItemKind * int) option)
+ : string option =
completionMessage
(before |> Option.bind (fun state -> state.Today))
(after |> Option.bind (fun state -> state.Today))
+ reward