diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 11:45:11 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 11:45:11 +0800 |
| commit | b13b28521f4b286d9a750848c7940546cf50adf3 (patch) | |
| tree | 440a8dc2943d52d17a0dd8db5523680732648802 /src/LivingVillage.Desktop | |
| parent | 89be1bce62a01c6994c0de4d5c9f05338f3b4d4f (diff) | |
| download | living-village-b13b28521f4b286d9a750848c7940546cf50adf3.tar.gz | |
feat(desktop): 顶部极简状态条
常驻 HUD 新增右上角半透明状态条:天数(world.Tick/ticksPerDay+1)与金钱/精力(直接取自 avatar.Mind.Needs 真实数据,无编造数值源);新增 cornerStatusLines 纯函数与回归测试,UI 文案目录补 天数/金钱/精力(字符表已含,无需重生成图集)。
Diffstat (limited to 'src/LivingVillage.Desktop')
| -rw-r--r-- | src/LivingVillage.Desktop/ChineseText.fs | 5 | ||||
| -rw-r--r-- | src/LivingVillage.Desktop/Game.fs | 13 | ||||
| -rw-r--r-- | src/LivingVillage.Desktop/Interaction.fs | 8 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/LivingVillage.Desktop/ChineseText.fs b/src/LivingVillage.Desktop/ChineseText.fs index 95ec180..d516432 100644 --- a/src/LivingVillage.Desktop/ChineseText.fs +++ b/src/LivingVillage.Desktop/ChineseText.fs @@ -181,7 +181,10 @@ module ChineseText = "获得" "单价" "食物" - "关闭" ] + "关闭" + "天数" + "金钱" + "精力" ] let layoutText (maxWidth: int) (supported: Set<char>) (text: string) : TextLayout = let width = max 1 maxWidth diff --git a/src/LivingVillage.Desktop/Game.fs b/src/LivingVillage.Desktop/Game.fs index 219cc96..785a6aa 100644 --- a/src/LivingVillage.Desktop/Game.fs +++ b/src/LivingVillage.Desktop/Game.fs @@ -650,6 +650,7 @@ type LivingVillageGame() as this = let statusView = { m5View with StatusTick = Some hudStatusAt } let statusLine = M5Interaction.transientStatusLine hudClock statusView |> Option.toList let allLines = persistentLines @ dialogueLines @ statusLine + let cornerLines = M5Interaction.cornerStatusLines world let panelWidth = min 360 (max 1 (viewport.Width - 32)) let maxLines = max 1 ((viewport.Height - 48) / lineHeight) let lines = allLines |> List.truncate maxLines @@ -668,4 +669,16 @@ type LivingVillageGame() as this = let visible = if line.Length > maxChars then line.Substring(0, maxChars) else line let color = if index = 0 then Color(220, 235, 220) else Color(190, 205, 210) PixelText.draw spriteBatch pixel cjkAtlas innerX (panelY + 12 + index * lineHeight) textScale color visible) + + // Minimal top-right status strip: day counter + real money/energy values. + let cornerWidth = 232 + let cornerHeight = List.length cornerLines * lineHeight + 20 + let cornerX = viewport.Width - cornerWidth - 16 + let cornerY = 16 + spriteBatch.Draw(pixel, Rectangle(cornerX, cornerY, cornerWidth, cornerHeight), Color(15, 19, 25, 150)) + spriteBatch.Draw(pixel, Rectangle(cornerX, cornerY, cornerWidth, 3), Color(92, 180, 190)) + cornerLines + |> List.iteri (fun index line -> + let visible = if line.Length > maxChars then line.Substring(0, maxChars) else line + PixelText.draw spriteBatch pixel cjkAtlas (cornerX + 10) (cornerY + 10 + index * lineHeight) textScale (Color(220, 235, 220)) visible) spriteBatch.End() diff --git a/src/LivingVillage.Desktop/Interaction.fs b/src/LivingVillage.Desktop/Interaction.fs index 91e09ae..20ffa17 100644 --- a/src/LivingVillage.Desktop/Interaction.fs +++ b/src/LivingVillage.Desktop/Interaction.fs @@ -434,6 +434,14 @@ module M5Interaction = Some(statusText view) | _ -> None + /// Minimal corner status for the persistent HUD: day counter plus money/energy taken + /// directly from the avatar's real needs (no invented values). + let cornerStatusLines (world: World) : string list = + let day = world.Tick / Sim.ticksPerDay + 1L + let needs = world.Avatar.Mind.Needs + [ sprintf "天数 %d" day + sprintf "金钱 %.0f / 精力 %.0f" needs.Money needs.Energy ] + let private annalLine (entry: AnnalEntry) : string = match entry.Kind with | DialogueAnnal outcome -> |
