diff options
Diffstat (limited to 'src/LivingVillage.Desktop/TaskRuntime.fs')
| -rw-r--r-- | src/LivingVillage.Desktop/TaskRuntime.fs | 36 |
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 |
