summaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* test(kernel): 用 List.item 替换弃用的 List.nth,全解决方案 ↵Somhairle H. Marisol13 days1-3/+3
| | | | Release 构建归零告警
* test(desktop): 预乘/光晕/水面/站位回归与夜间白块校验脚本Somhairle H. Marisol13 days1-0/+80
| | | | | | | | - premultiply 定点:核心 (255,226,168,34)->(34,30,22,34),(252,196,128,34)->(34,26,17,34), 通道恒 <= alpha、<250 无白 - lanternGlowLayers 径向/预乘/无白、水面 per-tile 三相、角色脚底对齐断言 - scripts/check-no-white-blocks.py:夜晚帧不得有 >=64x64、每通道>=250、alpha>=250 的块 (P13 旧帧 42/69 命中,P14 修复后 0 命中)
* fix(desktop): 灯笼光晕按自身 alpha ↵Somhairle H. Marisol13 days3-28/+110
| | | | | | | | | | | | | 预乘并改径向层叠,消除夜间纯白方块 - 新增 VillageArt.premultiply:MonoGame SpriteBatch 默认预乘混合,直传 Color(r,g,b,a) 会直接加 rgb 导致多层暖色饱和成 75x75 纯白块 - lanternGlowLayers 用同心圆 pixel run 做径向衰减,逐层预乘,只在 RiverLantern 实体处绘制 - 水面相位改 waterFrameTickAt=(tick/32+x+2y)%3,同一帧相邻砖相位不同 - 炊烟改为 drawWorld 末尾独立一遍,位置 offsetTile 0 -3,画在屋瓦/竹子之上 - 角色脚底对齐 characterFeetOffset=16 并加预乘椭圆接触阴影 - 补全 Interaction.itemName 的 ItemKind 匹配(否则非 Food 交易会崩溃且告警)
* test(desktop): 覆盖六帧角色、待机呼吸与三相水面/炊烟Somhairle H. Marisol13 days1-10/+49
| | | | | | - 更新 isMoving 签名、WalkFrame 帧号、characterAtlasWidth=3840 - 水面断言改三相 (0,0,1,1,2,2,0),新增待机呼吸与炊烟三相测试 - Desktop 75/75 通过
* feat(desktop): 接入角色走路/待机动画并参数化录帧Somhairle H. Marisol13 days1-4/+21
| | | | | | | - 新增 avatarMoving(比较前后位置)驱动走路/待机帧切换, 覆盖采样、地图巡游与手动输入三条路径 - 录帧目录与间隔改为环境变量 LV_RECORD_DIR / LV_RECORD_EVERY (默认 /tmp/lv-p5-prompt、25),便于证据落到指定目录
* feat(art): 角色六帧动画与水面/炊烟三相循环Somhairle H. Marisol13 days4-21/+68
| | | | | | | | | | - 角色图集每个 (变体,方向) 由 2 帧扩到 6 帧(4 走路 + 2 待机呼吸), cellIndex=(variant*4+direction)*6+frame,图集 3840x48 - 世界图集扩到 25 格 800x32:水面第 3 相 WaterSpriteC(slot 21)、 炊烟三帧 SmokeSpriteA/B/C(slot 22-24) - 帧选择为纯函数:walk=(tick/4)%4、idle=(tick/24)%2、 water=(tick/32)%3、smoke=(tick/40)%3 - 重生成 jiangnan/cc0 图集(脚本可复现,逐字节一致)
* feat(desktop): P12 中文每日任务面板——T ↵Somhairle H. Marisol13 days3-6/+91
| | | | 键任务页、Offered/Active/Done 三态+职业名,存读档字段级携带职业
* feat(occupation): P12 ↵Somhairle H. Marisol13 days3-0/+93
| | | | 报价偏置纯函数——货郎买卖±3.00%/书生解读±1.00%,4位定点基点,默认无职业=旧行为(TDD 6例)
* style(desktop): Interaction.fs:191 行尾空白顺手修(P11 附带项)Somhairle H. Marisol13 days1-1/+1
|
* feat(occupation): P11 存档 v3 today-task 尾段(annals 后追加)+ ↵Somhairle H. Marisol13 days3-42/+238
| | | | | | 双向兼容 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 无尾段 + 未知模板拒绝、尾段后垃圾拒绝、字节级双跑一致。
* feat(occupation): P11 每日任务生成纯函数 + TaskState ↵Somhairle H. Marisol14 days3-0/+310
| | | | | | 状态机(Kernel 侧) Occupation.fs 增补:TaskState(Offered|Active|Done|Failed)、TaskTemplateId 首期池=农夫3(送粮/帮工/翻土)+渔夫3(夜捕/卖渔/询价)、DailyTask 记录(设计 §2/§3)。生成 = taskHash(seed ^ occupationSeed, dayIndex) mod |pool|,与 Rng.fs splitmix 同源(禁 System.Random),输出只依赖三元组;taskHash 以 5 个 splitmix 已知向量钉死。完成判定 = satisfiesCompletion 纯谓词,信号 TaskSignal(Dialogued/Traded/ArrivedAt/NightAtWater) 全部来自既有事件通道(DialogueEvent/TradeEvent/到达瓦片/夜+水边),TargetNpc/TargetTile None=通配;acceptTask/applySignal/expireAt 状态机纯函数,Sim.step 数值路径零改动。货郎/书生空池 → dailyTaskOf = None。13 例测试:splitmix 向量、池约束、逐日确定性、窗口=整日、中文名、状态机转移、六模板正负完成信号、终态不可复活、逾期判负。
* feat(occupation): 职业系统第一片 — Kernel 结构 / bootstrap 注入 ↵Somhairle H. Marisol14 days7-10/+215
| | | | | | / 存档 v3 Occupation.fs(Kind/Profile/State + 农夫/渔夫/货郎/书生 中文名常量,按设计 §1 表给初始 Money/Energy/Inventory);ItemKind 扩出 Fish/Spice/Scroll(basePrice 分支补齐,Food 10.0f 数值路径不变 → 无职业 digest 不动);WorldBootstrap.initialWorldWithOccupation 默认 None = 旧行为(Money/Energy 覆盖,库存字段先留数据侧、物理挂接留交易单——取舍见 design §2-C 反对加字段);WorldSave: v3 头仅在有职业时写入(保存 saveToFileWith / loadFromFileWith,v1/v2/v3 无职业类型默认,token 顺序 version|w|h|kind|task|story|…),默认路径 save 输出逐字节等同现行 v2;P10 测试 5 例(§1 表值、v3 round-trip、v1/v2 不吞档、双 seed 逐字节、中文名);Kernel.Tests 引用 Desktop 以驱动 WorldBootstrap(取舍:不做测试专用 shim)。TaskToken/StoryStage 为 v3 占位(任务系统后续单实现)。
* fix(desktop): RiverLantern 模式限定消除TW + 中文维护文档Somhairle H. Marisol14 days1-1/+1
| | | | Game.fs 733/741 两条编译警告(FS0049 未限定模式绑 + FS0026 不可达)由 Qualified VillageArt.RenderPropKind.RiverLantern 修复,全仓 0 警告;Leader 所指 Interaction.fs:191 并无编译警告(已记录于验资说明);docs/维护说明.md 首开:模块职责/O 不变量/信息 digest 变化处理/可复制命令。
* fix(headless): worldDigest 规范化恢复性能基线字节口径Somhairle H. Marisol14 days2-6/+51
| | | | 快照与存档版本头/sh与边界 token 解耦:WorldDigestOfText 先把 V2 存档剥出正文并重建 LV_WORLD_SAVE_V1 常量语义再 SHA256;digest 只绑定模拟状态;新增 WorldDigestIsCanonical 同 V1/V2 双读路径 digest 相等回归;--performance-baseline 3 次独立运行 final_digest 复回 953775FAEB2F…(与历史基线逐字节一致),证据在 artifacts/perf-independent/新时间戳/README。
* feat(desktop): 地图巡游模式自动入场Somhairle H. Marisol14 days1-1/+1
| | | | LV_MAP_TOUR 需自动开局(复用 LV_AUTOPLAY 的菜单自动确认路径),更新 autoplay 判定并提交;巡游/周边日志等已在前一单。
* test(desktop): 澄清生成器逐字节快照断言Somhairle H. Marisol14 days1-1/+3
| | | | AreEqual 波及重载解析 (int,int,string) — 改用 mutable diverged 检查等价断言;清洁全绿。
* feat(desktop): 512x384 程序生成地图与巡游取证模式Somhairle H. Marisol14 days5-1/+216
| | | | ProceduralMap 纯函数生成器:splitmix64 随机游走河道(三条西→东,宽 3,穿核心禁入)、三倍频值噪声草地/泥炭变化、泊松式最小距离布点(800 次尝试),村核矩形(24..38 x 16..34)由生成器不变式保证可通行;VillageArt 于大世界模式下按 terrain code 逐格绘制(可视化范围裁剪,无每帧分配);Game 新增 LV_MAP_SCALE(默认 1,表示规模倍数)与 LV_MAP_TOUR 巡游采样(八个地标位置含角/中心/河带);快照回归断言:同 seed 逐字节一致、异 seed 必然差异、核心矩形无水面。
* feat(kernel): 地图边界参数化与存档 v2Somhairle H. Marisol14 days3-5/+78
| | | | Sim 地图边界由常量 52 改为可配置(configureBounds,默认 64x48 = 与全部基线一致);Sim.step 裁剪、initialWorld 中心出生时点按当前边界读取;WorldSave 升级 V2 头携带 width/height 两字段,V1 旧存档照常读入并自动回退到 64x48;回归:512x384 边界裁剪/初界转正/双份存档往返/案例 v1 档兼容读。修复前一段中报错已修正的测试代码(Ensure saved-file timeouts)。
* fix(desktop): 夜灯光晕径向衰减防过曝Somhairle H. Marisol14 days1-4/+8
| | | | 夜晚灯笼光晕由三层高不透明矩形改为四层宽环径向衰减(外圈 alpha 9→渐强),核心亮度压到 34 并去掉全白芯层,灯笼本图块在夜色下保持可读;Xvfb 夜景 hěllo 帧自证:暖色簇 776/745 采样像素、近白过曝核心消失。
* feat(desktop): LV_ASSET_PACK=cc0 素材渲染路径Somhairle H. Marisol14 days1-9/+41
| | | | VillageArt 支持 CC0 素材包切换(环境变量 LV_ASSET_PACK=cc0):Kenney 地块替代草地(棋盘双绿)/石径纹理,Puny 角色图集(与江南人物同 cell 几何)替换五变体角色;水面/屋檐/桥/灯笼/竹丛等江南图块保留并存于同一场景,江南图集仍作为水与建筑纹理源;未设环境变量时行为与既有路径一致(全部既有测试不变)。
* feat(assets): CC0 素材接入与制作管线Somhairle H. Marisol14 days4-0/+4
| | | | third_party 收录 Kenney Tiny Farm(CC0,来源 kenney.nl,sha256 a06f75f3…)与 Puny Characters(CC0,opengameart 作者 Shade,sha256 971d7b07…),上游名未改,License 原文保留于包内;新增 scripts/make-cc0-art.py 确定性管线:Kenney 地块 16px → 2x 32px 整数放大(草亮/草深/路径/泥地四块 128x32 图集),Puny 角色 16x24 内容带 2x 精确映射 32x48(2560x48 图集,变体/方向/帧几何与江南人物一致;仅南向素材——北向沿用原朝向、西/东镜像,限制已在脚本注释与 provenance 记录)。
* feat(desktop): 标题画面两秒确定性入场动画Somhairle H. Marisol14 days3-7/+26
| | | | entranceProgress 纯函数按帧计数(固定 60Hz 步长,禁实时时钟):黛瓦天际线自上 36px 落定、标题自下 24px 升起、水面带 2s 淡入、灯笼/面板同步;快照回归断言进度锚点(0/60/120/超时)与确定性;LV_AUTOPLAY_FLOW 标题停留 60 帧可直接采样入场过程。
* feat(desktop): 村民与主角四帧行走动画Somhairle H. Marisol14 days3-6/+38
| | | | 人物图集 5 变体 x 4 向 x 4 帧(2560x48,全部经 make-jiangnan-art.py 原创,四种腿步:站立/左跨/站立微跳/右跨镜像);animationFrame 按 tick/4 mod 4 确定性取帧(16 tick 一循环,禁实时时钟);快照式回归断言四帧循环与逐帧图集列映射,主角同规则。
* feat(desktop): 确定性昼夜光照过渡与夜灯暖光Somhairle H. Marisol14 days3-10/+85
| | | | 新增 lightingBlend 纯函数(黎明明 4:00-6:00、暮色 20:00-22:00 线性过渡,边界与 isNightTick 对齐),天空底色/世界 tint 按混合插值渲染,夜晚灯笼暖光晕强度=LanternGlow(纯叠加矩形、无每帧分配风险);回归测试含锚点/单调斜坡/确定性/光晕开关。
* test(desktop): LV_AUTOPLAY_RECORD 情境提示采帧Somhairle H. Marisol14 days1-0/+17
| | | | LV_AUTOPLAY_RECORD=1 且样例模式下每 25 帧经 GetBackBufferData 保存 PNG 到 /tmp/lv-p5-prompt/,用于靠近→提示→交互→关闭→离开片段取证;仅记录模式触发,不影响普通运行路径。
* feat(desktop): 目标上方浮动情境提示Somhairle H. Marisol14 days3-4/+116
| | | | 新增 FloatingPrompt 纯布局模块(含 measureWidth 与 PixelText 等宽规则):短提示锚定在唯一目标头顶上方,水平居中并钳制在视口内,避开左下 HUD 带(height-160)与右上状态条带(宽度 248);沿用现有 CJK 图集字体路径,不新造字形;对话/需求面板与菜单打开时不显示(复用 worldInputAllowed 判定与渲染门)。回归测试覆盖 1280x720/1920x1080 五个极限锚点、宽度测量、面板开启时提示为空且禁用世界输入。
* fix(desktop): 目标选择纯距离优先与 id 平局Somhairle H. Marisol14 days2-6/+36
| | | | 情境提示目标选择改为距离最近优先(不再按门/人类型特权),平局按实体 id 升序确定唯一目标;新增门/人两侧距离优先对照、精确等距 tie、NPC 数组快照不变(resolve 与 refreshPrompt 均不突变 Npcs)回归测试;透墙与超距判定沿用既有 实现,已有边界/竞争/切换用例保持全绿。
* fix(desktop): 键位页面板锚点与行列对齐Somhairle H. Marisol14 days2-6/+7
| | | | 键位页内容行与标题改为相对 ControlsPanelY 锚定(标题=面板顶+20、首行=面板顶+60),controlRowRects 同步采用该锚点;实测末行与页脚不再重叠,逐行键名/动作列保持不相交。
* fix(desktop): 键位页键名列统一宽度不叠印Somhairle H. Marisol14 days3-3/+47
| | | | Controls 页按键名列独立成列(ControlsKeyX/KeyWidth=120/ActionX),controlRowRects 纯函数返回键名与动作矩形,回归测试断言逐行矩形不相交、全部行键名列 x/宽度一致、列宽容纳最长键名 F1/F2/F3;面板上移至 ControlsPanelY 保证 14 行键位加页脚完整落入视口。
* fix(desktop): 标题菜单光标与文字分列不再叠印Somhairle H. Marisol14 days3-9/+58
| | | | 根因:页面标题行(panelY+24)与首行内容(MenuTopY)同为 y=320 造成两串文字叠印。修复:TitleScreen 布局新增 HeadingY/FirstItemY 分层与独立光标列(CursorX/CursorWidth/TextX),selectionRects 纯函数返回光标与文字矩形,回归测试断言逐行矩形不相交且标题行净空≥32px;渲染改为光标、文字分别绘制。
* test(desktop): 自动演示在标题与键位页停留取证Somhairle H. Marisol14 days1-1/+17
| | | | LV_AUTOPLAY_FLOW 在主菜单标题画面与操作说明页各停留 60 帧,使 10fps 录屏可稳定采样两页证据帧;其余流程步骤与日志保持不变。
* feat(desktop): P 键暂停帮助页Somhairle H. Marisol14 days3-3/+40
| | | | P 键改为打开暂停帮助页(完整键位说明),打开时暂停模拟并保留原控制状态,返回游戏时精确恢复(速度/暂停原状);常驻 HUD 不放全键位清单。MenuState 新增 enterPauseHelp/exitPauseHelp 纯函数与回归测试。
* feat(desktop): 顶部极简状态条Somhairle H. Marisol14 days4-1/+52
| | | | 常驻 HUD 新增右上角半透明状态条:天数(world.Tick/ticksPerDay+1)与金钱/精力(直接取自 avatar.Mind.Needs 真实数据,无编造数值源);新增 cornerStatusLines 纯函数与回归测试,UI 文案目录补 天数/金钱/精力(字符表已含,无需重生成图集)。
* feat(desktop): 江南氛围标题画面Somhairle H. Marisol14 days5-22/+194
| | | | 新增 TitleScreen 纯布局模块(确定性、可测):五段暮色渐变天幕、黛瓦屋脊/檐口轮廓带(复用图集 8/9 号地块)、水面倒影带(1 号地块)、岸边灯笼光晕、江南水乡四倍大字标题;主菜单改为纵向简洁排布浮于其上,子页面板按内容自适应高度,去除全屏暗色遮罩大黑块。Xvfb 截图像素自查通过。
* feat(desktop): 村民五套服饰帽饰区分Somhairle H. Marisol14 days3-4/+25
| | | | 人物图集扩至五套变体(1280x48):靛蓝袍配布巾、褐衫配发髻马甲、翠衫配发簪红巾、灰袍配瓜皮帽,主角专属斗笠独立第五套;村民按 id 取模四种服饰轮转,永不与主角同装,四向两帧动画保持。
* feat(desktop): 河畔植被与中式道具点缀Somhairle H. Marisol14 days3-5/+78
| | | | 图集新增柳树(垂枝两段)、灌木、花丛、芦苇、石凳、灯笼七类图块并经复制规则进构建;场景加入两株垂柳、两丛灌木、两处花丛、水中两簇芦苇、河畔石凳与两盏岸边灯笼,芦苇立于水面、灯笼立于岸道,全部入图集无程序几何占位。
* feat(desktop): 江南水乡河道横贯与波纹两帧Somhairle H. Marisol14 days4-17/+69
| | | | 场景改为沿村蜿蜒水带(北岸凸湾、中段横贯、南段收窄),南北两岸石板路沿河展开,木桥三块纵跨全河连接民居门前石径;水面新增第二张波纹图块,按世界 tick/32 取模确定性交替,绘制无新增每帧分配。
* feat(desktop): 民居正面完整化与图集足迹Somhairle H. Marisol14 days4-9/+54
| | | | 新增屋脊/檐口/木构粉墙/格窗/木门五个地块图块,可进屋民居以门为锚点绘制四宽三高完整立面(黛瓦正脊、檐口层次、木构白墙、格窗与木门);新增 planFootprint 供生成阻挡判定,村民不会刷在建筑图块上。
* fix(desktop): 修复 HUD 缺字并统一轻量面板与情境提示Somhairle H. Marisol14 days9-34/+279
| | | | 字符表扩充至 197 字(补 间/门/谈/体/屋/返/×/,/:等全部 UI 用字),用 Noto Sans CJK 重新生成图集并逐字校验;新增字符表覆盖全部 UI 文案、瞬态状态 2.5 秒过期、对话完成后回到轻量面板等回归测试;户外与室内统一左下角轻量 HUD,互动日志改为短暂反馈;样例脚本保留 E 交谈 提示与对话菜单停留帧。
* feat(desktop): 增加可选昼光自动演示启动Somhairle H. Marisol14 days3-3/+29
| | | | | | | | | | | | | | | | | [变更性质] - 本提交新增可选的 Desktop 启动行为,不改变默认启动行为。 [新增功能] - 设置 LV_AUTOPLAY_DAYLIGHT=1 时,初始世界和 StartNewGame 从黎明 tick 开始。 - 未设置该变量时继续从 tick 0 的夜晚状态开始。 [实现方案] - 在 WorldBootstrap 中集中计算昼光起始 tick 和同步时间。 - 在 Game 中复用同一世界工厂,并增加黎明与默认状态回归测试。 [影响范围] - 仅影响 Desktop 运行时代码和测试;Kernel 保持不变。 - 环境变量为显式 opt-in,不影响现有自动演示和普通启动路径。
* feat(desktop): 固化样例世界与昼光呈现Somhairle H. Marisol14 days6-6/+99
| | | | | | | | | | | | | | | | | [变更性质] - this commit adds a deterministic desktop bootstrap for the playable sample world. [新增功能] - this commit places the avatar away from the home doorway and separates villagers from scene footprints. - this commit provides a warm high-contrast daylight tint and exits autoplay after SampleComplete. [实现方案] - this commit isolates desktop spawn policy in WorldBootstrap and routes game startup and sample tests through it. - this commit adds regression coverage for spawn positions, spacing, determinism, and daylight tint. [影响范围] - this commit affects the Desktop application and Desktop tests only. - this commit preserves Kernel behavior and does not include unrelated worktree changes.
* feat(desktop): LV_AUTOPLAY_SAMPLE 情境演示脚本Somhairle H. Marisol2026-09-215-5/+252
| | | | | | | | 新增 SampleScript 状态机:进门→内景驻留→出门→走向 NPC →打开对话→发送意图→关闭面板→走开,超时兜底进 SampleComplete。 Game.fs 读取 LV_AUTOPLAY_SAMPLE=1 切换 sample 模式(2x 模拟、 关闭旧 step 倍率、UpdateMenu 常开、独立 UpdatePlaying 分发)。 SampleTests 覆盖首步行走、进门、完整巡游(42/42 通过)。
* feat(desktop): 江南美术改为真实 PNG 图集Somhairle H. Marisol2026-09-217-166/+164
| | | | | | | | - scripts/make-jiangnan-art.py 生成三张原创透明 PNG:世界 256x32、角色 1024x48、内景 392x96 - VillageArt.fs 移除进程内像素烘焙,改为 BaseDirectory 加载图集并校验尺寸 - 内景渲染改用图集(地板/墙/窗/桌/床/屏/毯/柜),新增玩家专属 StrawHat 变体 - 内景新增地毯与柜子装饰,角色按 FeetPosition 定位 - fsproj 随包复制三张 PNG;m6c-package.sh 校验三张 PNG 进入交付包
* feat(m6c): 完成江南村庄中文交付Somhairle H. Marisol2026-09-2111-183/+1239
| | | | | | | | | | 完成江南村庄场景、角色表现和中文界面的 M6c 交付范围。 新增 CJK 字形图集、中文文案与运行时加载,补充民居情境交互和确定性村庄美术表现。 更新资源复制与 Linux/macOS 打包校验,加入 188 字符清单、资源许可说明和对应原型测试。 补充江南美术方向与 M6c 交付说明,并保持原有模拟内核和桌面构建入口不变。
* feat(desktop): add deterministic Jiangnan art and Chinese text primitivesSomhairle H. Marisol2026-09-204-0/+253
| | | | | | | | | | | | | | | | | [Change Nature] This commit adds the Task 3a desktop presentation data slice. [New Capability] - Defines immutable Jiangnan props, water and paving tiles, NPC variants, directions, and two-frame animation metadata. - Provides formal Chinese scene, menu, status, and missing-glyph text layout primitives. [Implementation] - Keeps the new modules pure and deterministic with no GUI, network, or global mutable state. - Adds focused prototype tests, F# compile ordering, and asset/license boundary documentation. [Impact] - Extends desktop presentation APIs without modifying Kernel or Game.fs. - Leaves GUI rendering integration for Task 3b.
* feat(desktop): localize village presentation labelsSomhairle H. Marisol2026-09-206-74/+244
| | | | | | | | | | | | | | | | [Change Nature] - This commit adds the Chinese display layer for the desktop village prototype. [New Capability] - Menu, settings, controls, interaction panels, chronicle entries, trade results, day-night labels, and speed labels now use Chinese copy. [Implementation] - Keep simulation state, commands, and machine-readable status strings unchanged. - Add focused formatter coverage and update affected presentation assertions. [Impact] - Desktop presentation behavior is localized without changing Kernel or simulation logic. - Existing release build and test coverage remain green.
* feat(desktop): add Chinese village presentation prototypeSomhairle H. Marisol2026-09-204-0/+275
| | | | | | | | | | | | | | | | | [Change Nature] - This commit adds a deterministic presentation-model feature, not MonoGame rendering. [New Capability] - Provide an immutable Jiangnan village scene with homes, waterways, paths, bridge, bamboo, and garden elements. - Provide typed home transitions, four-way input mapping, tick animation, NPC styles, and Chinese stage-one labels. [Implementation] - Add the pure VillagePresentation module and six focused MSTest cases. - Keep the model free of mutable global state and update only the required F# compile order. [Impact] - This commit affects the Desktop presentation and test projects only. - Kernel behavior, Game.fs wiring, MonoGame drawing, and existing acceptance artifacts remain unchanged.
* feat(m6a): add file save acceptance smokeSomhairle H. Marisol2026-09-203-25/+214
| | | | | | | | | | | | | | | | | [Change Nature] This commit adds the bounded M6a file-save acceptance path. [New Capability] - Add file-level round-trip and deterministic continuation coverage. - Add Headless --m6a-smoke with digest checks and explicit PASS/FAIL output. [Implementation] - Reject non-finite numeric values and negative inventory quantities. - Exercise dialogue, chat/rumor, trade, events, annals, time, and RNG state. [Impact] - Affects Kernel save parsing, Kernel tests, and Headless smoke tooling. - Preserves the existing save format and M5 smoke behavior.
* perf: add simulation baseline probeSomhairle H. Marisol2026-09-205-3/+277
|
* feat(m6b): add playable menu and save flowSomhairle H. Marisol2026-09-205-78/+565
| | | | | | | | | | | | | | | | | [Change Nature] - This commit adds the M6b desktop menu and persistence integration. [New Capability] - Provide new game, continue, settings, controls, load error, save, load, and exit flows. - Provide a bounded autoplay flow covering menu navigation and persistence. [Implementation] - Add pure menu state transitions and focused M6b coverage. - Connect menu commands to simulation controls, WorldSave, view resets, and rendering. [Impact] - Desktop runtime gains the playable M6b front end without changing out-of-scope files. - Release focused and solution test suites remain passing.