| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
| |
- scripts/bench-p70.sh:两档基准——Kernel --performance-baseline(6000 tick ×3)
+ Desktop xvfb 60s 真实帧循环;scripts/analyze-p70.py 汇总裁决
- Game.fs:LV_FRAME_LOG=1 逐帧日志(墙钟帧间隔 + GC 线程分配增量 + tick/panel),
仅新增日志,不改渲染/更新逻辑
- P70PerformanceBaselineTests:Pin --performance-baseline final_digest=953775FA…(防漂移)
- 实测:Kernel tps mean=466679 alloc=3032184 gen0/1/2=0/0/0 determinism=PASS;
Desktop 60s frames=8788 fps=139.3 mean=7.179ms max=33.919ms 掉帧>33.3ms=2
每帧分配 mean=231KB p95=297KB;dotnet-counters 缺席已如实标注
- Desktop 338/338、Kernel 120/120;Kernel/Sim/渲染口径/字形表未动
|
| |
|
|
|
|
|
|
|
|
|
| |
文案统一审校(面板措辞/交易缺货口径/页脚留白与 ESC)
- 面板打开语统一:「年鉴已打开」→「年鉴面板已打开」(Interaction + requiredUiLabels)
- 交易缺货口径统一:「背包不足」→「库存不足」(PlayerTrade,与对话交易失败名一致)
- 分页页脚留白/大小写统一:「…页 空格 翻页 Esc 关闭」→「…页 空格 翻页 ESC 关闭」
- P69CopyAuditTests(2 例,红先)+ P61 钉住样例同步
- 只改字符串字面量与相关断言;Kernel/Sim/MapSnapshot 未动
- Desktop 338/338、Kernel 119/119;digest 953775FA…7F6C 不变
|
| |
|
|
|
|
|
|
|
|
|
| |
- MapSnapshot:MapGen.Result 纯 CPU 渲染为整图 PNG(每瓦片 8px,自包含
IHDR/IDAT/IEND + CRC32 + ZLibStream,无外部图像依赖);调色板覆盖
河流/主路/农田/民居屋顶/小径/桥/树丛
- Program.fs:LV_P68_MAPSHOT=1 钩子用 paramsForSize 512 384 seed=4242 生成并
离线渲染整图后退出(headless,不需图形设备)
- P68MapSnapshotTests(3 例,红先):尺寸/PNG 签名、要素像素存在、两次渲染逐字节一致
- scripts/analyze-p68.py:尺寸/调色板像素/无黑白大块/missing_glyph_slots=0/确定性
- Desktop 336/336、Kernel 119/119;digest 953775FA…7F6C ×3 PASS;未动 Kernel/Sim
|
| |
|
|
|
|
|
|
|
|
| |
- TaskRuntime.targetText/taskLine:帮工→「村民 N」、翻土→「自家地块」,
无目标时与旧任务行文案逐字节一致(不加箭头/目标名)
- Interaction TaskPanel 任务行改用 taskLine(其余面板/文案不动)
- 字形表新增 地 块 →(343 字,图集重生成);ChineseText.requiredUiLabels 增补
- P67TaskTargetUiTests(5 例,红先)+ PrototypeTests 计数同步 340→343
- LV_P67_SHOT 证据钩子(有目标/无目标各一帧)+ scripts/analyze-p67.py
- Desktop 333/333、Kernel 119/119;digest 953775FA…7F6C ×3 PASS;未动 Kernel/Sim
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Kernel Occupation:TaskTargets + targetNpcOf/targetTileOf + dailyTaskOfWith/
refreshTodayWith/refreshStateWith(splitmix 同源定点,候选排序消除顺序依赖,禁随机)
- 仅既有 satisfiesCompletion 会读目标的模板定点:帮工→TargetNpc、翻土→TargetTile;
其余 8 模板目标保持 None(不改完成语义)
- Desktop WorldBootstrap:reachableTargets(世界 NPC + 样板菜地瓦片)+
occupationStateForWorld/refreshOccupationTodayWorld;Game 开局/跨日/证据路径切换
- 历史入口 dailyTaskOf/refreshState/occupationStateFor 保留为空候选通配包装(逐字节不变)
- 红先 P66TaskTargetTests(8 例):同 seed 幂等、跨 seed 落在可达集合、候选顺序无关、
历史通配回归、帮工/翻土定点门控完成、跨日重定点、v3 round-trip + v2 基线
- scripts/p66-target-report.fsx + docs/evidence/p66-analysis.txt(PASS)
- Desktop 328/328,Kernel 119/119;digest 953775FA…7F6C ×3 PASS;Sim.fs 未动
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
+ 稿证据)
- Kernel Occupation 新增 freshReliableRumors/inquiryRumor/marketInquiryText(纯判定+文案,
对齐 Sim.latestRumorFor 新鲜度/可信度口径,全序命中规则,禁随机;不改 Sim.fs)
- Desktop chooseIntent:货郎 OfferTrade 读对话前谣言池,Status=inquiry|<短答>;statusLabel 透出
- 真字补 17 字(东头西北巷口盐巴米布茶柴涨两文落些)并重出 atlas(340 字/384x528)
- 红先 P65RumorInquiryTests(6 例):命中/幂等/陈旧·微弱·空池/仅货郎/非货郎回归逐字节/
save v2 头不变+v3 round-trip/穷举组合无缺字
- LV_P65_SHOT 钩子 + scripts/analyze-p65.py + docs/evidence/p65-*(PASS)
- Desktop 320/320,Kernel 119/119;digest 953775FA…7F6C ×3 PASS
|
| |
|
|
| |
整改桥梁栏杆可辨(深墨栏体/亮扶手/望柱)与内景四角布局(Hermes vision 复核)
|
| |
|
|
| |
样板三处视觉雕琢(俯瞰上半补种/桥栏杆与护岸石/内景家具)+ 证据
|
| |
|
|
| |
+ 真实相机俯瞰)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
红:新增 src/LivingVillage.Desktop.Tests/P61GlyphCoverageTests.fs——扫描 Desktop 源码
字符串字面量内的全部 CJK 字,断言 100% 在 CjkGlyphAtlas 内;并逐字钉 G1 缺的
16 字(冬包卷品夏料春玩秋第背车轴页香鱼)、requiredUiLabels、以及运行期文案
(日历「春·第1天」/页脚「第 1/3 页…翻页」/「V 卖出 背包物品×1」/鱼卷轴香料玩车回)。
实现前实测 3 失败:缺字形 16。
绿:向 CjkGlyphAtlas.characterTable 补入 16 字(保持有序、去重),同步
Assets/cjk-glyphs.txt,并跑 scripts/generate-cjk-glyph-atlas.sh 用既有 Noto Sans CJK
重生成预生成 PNG:384x504(16x21 格,+16 字),16 个新字格均有真实字体墨迹
(ink_px 148-233,非程序几何伪字形)。更新 PrototypeTests 的图集几何常量
(307→323、rowCount 20→21、pixelHeight 480→504)。
证据:LV_P61_SHOT=1 拍 2 帧(p61-calendar 右上日历「春 · 第1天」;p61-dialog-footer
真实 Interact 开对话,页脚「第 1/3 页…翻页」+ 选项「V 卖出 背包物品×1」)。
analyze(p61-analysis.txt):缺字空白位=0、黑块=0、白块=0/2;全部抽检文案
missing_glyph_slots=0。钩子为 Game.fs 纯追加(53 行,0 删除),未动 HUD 结构。
回归(p61-verification.txt):Desktop 308/308(+4 P61)+ Kernel 119/119;
--performance-baseline ×3 digest 953775FAEB2F… 不变,determinism PASS。
未改 Kernel/Sim,未引外部素材(沿用既有 Noto 字体来源),未 push。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
增长曲线证据单,只读)
目标:量化「多世界并存 × 天数」的内存/GC 增长,收口 P49 范围外项。
口径:新增 Headless `--profile-multiworld <worlds> <days> <npcs> <sampleEveryDays> <seedBase>`,
N 个 Sim 世界同时存活,每轮 Parallel.For 各推进 sampleEveryDays 天并采样一行
(worlds/events/rumors/annals/memory_entries/gc_live_mb/working_set_rss_mb/elapsed_s,
行尾 flush);未改 Kernel/Sim 任何语义(Sim.initialWorldN / Sim.step 原样调用)。
标定:1 世界 × 2 天探针 = 34.2s(与 overnight-status 的 34.6s 一致),据此定 N=10 × 20 天。
运行:独立 systemd --user transient unit living-village-multiworld.service
(scripts/profile-multiworld.sh,StandardOutput=append: + exec 2>&1,state.json 记
pid/unit/log/commit/参数/起止/exit)。主运行 wall=1024.4s(17.1min < 40min),exit=0。
结论(artifacts/perf-multiworld/20260928T195839Z/README.md):
- 随世界数近似线性,未超线性:N=1 vs N=10(同日 D=20)annals/memory_entries 恰 10×、
rumors 9.67×、gc_live 8.81×(每世界 1.23MB,共享运行时开销摊薄)。
- RSS 有界无泄漏:N=10 39→峰值123(day8)→稳定104~112MB;每 2 天一轮墙钟恒 101~105s。
原因是历史集合有界(rumorRetentionDays=3 / rumorCapacity=16384 / maxAnnalEntries=128 /
Mind.Memory 上限),约 day4 后进入稳态。
- 两轮世界0 digest 一致(2364CB74…)→ 并存+并行不改变单世界语义。
- 数字未越界 → 明确「不修」;只读本 slice 不修 Kernel/Sim。
回归:Desktop 304/304 + Kernel 119/119;--performance-baseline ×3 digest
953775FAEB2F… 不变,performance_determinism=PASS。未 push。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
独立验收脚本)
缩尺口径:M3 phase2 50×100 实测 11.4h 仅完成 6/50(见
artifacts/m3-acceptance/final-candidate-20260921T095500Z/logs/*.diagnosis.txt),
改为 50 世界 × 15 模拟日、逐世界流式打印并 flush。标定据 docs/overnight-status.md
(Hermes 单 worker 亲测):1×2=34.6s、1×5=87.7s、1×10=173.6s,外推 15 天 ≈260s。
注意:派单所引用 artifacts/m3-independent/20260921T105500Z 全盘查找不存在,
故改用上述仓内标定,未编造任何数据。
内容:
- Headless 边缘:runSimulation 拆出 runSimulationCore 增加逐模拟日回调;
evalWorld 传入回调;runBatch 每 (days/5) 天打印 `[world k] progress day=d/D elapsed=..s`
并 flush,长世界不再零进度(BatchOutput.progressLine 纯函数 + 单测)。
- 新增 deploy/living-village-m3r.service 模板:wrapper 作 MasterProcess、
StandardOutput/StandardError=append: acceptance.log、Restart=no;
systemd-analyze --user verify 通过。本机 ~/.config/systemd/user 属外部目录受限,
实跑以等价属性的 systemd-run --user 瞬态单元 living-village-m3r.service 承载。
- scripts/m3r-master.sh:写 state.json(pid/unit/log/commit/workers/worlds/days/
起止/exit),exec 2>&1 运行 batch 并回传真实退出码。
- scripts/verify-m3r.py:独立可复跑,校验 state 字段、50 条 world 行(索引/seed/
ok 与 check_a/b/c 自洽)、summary passed+failed=50 与极值一致、抽查 3 行、
[done] 50 条、progress 行、M3_ACCEPTANCE=PASS 且 ratio_min>2.0。
本次实跑(commit 895d792):12 worker,wall=4316.0s,50/50 OK,
ratio_min=3.346 ratio_max=12.321 gini∈[0.412,0.548],relconn=30/18,
check_a/b/c 全 PASS,M3_ACCEPTANCE=PASS,exit=0;独立脚本复跑 M3R_VERIFY=PASS。
证据:artifacts/m3r-acceptance/acceptance.log + 20260928T183215Z/state.json。
回归:Desktop 303/303 + Kernel 119/119;--performance-baseline ×3
digest=953775FAEB2F… 不变,performance_determinism=PASS。
未改 Kernel/Sim;未 push。
|
| |
|
|
| |
菜单/启动水面第二层高光波光——逐列相位错开(步进2.4rad)/更快(周期80 vs 96 tick)/更亮更窄细高光条 + 昼夜 tint 衰减参数 + 帧计数纯函数回归;ANALYZE splash hl/main std=274.97 corr=-0.017、menu hl/main std=279.77 corr=-0.011、层间相关<0.95、相位差2.4rad、无黑块白块
|
| |
|
|
| |
当日任务经济闭环——设计口径物品报酬入账(夜捕鱼×2/送粮食物×1, 其余不发) + 连续完成天数(streak 跨日保留/漏完成清零) + v3 streak 尾段与 save(None) 兼容 + LV_P55_SHOT 证据
|
| |
|
|
| |
状态机接入真实事件/环境信号(接受/对话/交易/到达/夜水边),HUD 短中文反馈 + 任务面板接受提示 + v3 任务态往返与 save(None) 兼容 + LV_P54_SHOT 证据
|
| |
|
|
| |
情境提示与输入隔离回归——提示文案=实际作用对象(唯一映射)+隔墙/边界/切换/离开/隔离断言 + LV_P53_REC 录制证据
|
| |
|
|
| |
Sim.quotePrice→Occupation.biasedQuote,背包侧车/钱财增减 + v3 round-trip + HUD 短反馈(design §2.4-2)
|
| |
|
|
| |
当日任务/跨日刷新 + StartNewGameWith 读回(design §2.4-1)
|
| |
|
|
| |
Events/Rumors/Annals/Memory 条目数与估算字节)
|
| |
|
|
| |
验证条目(同seed一致/异seed发散/跨尺寸发散/钉值) + overnight-status
|
| |
|
|
| |
倒影改暖色垂直光柱(gap-skip穿桥面落水面,最长≥3格)+近景接入倒影+近景屋顶受光/背光双档luma
|
| |
|
|
| |
河道倒影(waterFrameTickAt微抖)+岸边芦苇加密度+鸭/叶漂浮元素+近景屋顶统一光源阴影
|
| |
|
|
| |
逐格涟漪(复用waterFrameTickAt)+灯笼呼吸+屋脊上双视差云影, 全纯函数可复现
|
| |
|
|
| |
四向x(走4+待机2)原创点阵内嵌图集, 行走/停止/idle 接入渲染
|
| |
|
|
| |
完整背景框+中文断行换行+分页翻页+Esc关闭+输入隔离(原创32x64点阵头像)
|
| |
|
|
| |
右上日历钟卡/体力条形图/底部10格hotbar(1-0选中+高亮+输入隔离)
|
| |
|
|
| |
防降振回归 (leader fix: 提交+推送)
|
| |
|
|
|
|
|
|
|
| |
- VillageArt.drawCc0BoatOverlay 增加夜层专用暗化系数 0.7(仅夜光晕层生效,
白天不调用 overlay,p40-day/p40-boat 逐字节不变)
- P40ArtTests 新增 NightBoatAwningIsAtLeast40GreyDarkerThanSurroundingGlow:
内嵌 PNG 解码读取夜帧,断言船 2 瓦包围盒比 24px 光晕环至少暗 40 灰阶
- 新增 scripts/check-p40-night-boat-contrast.py 独立像素守卫
- 重出 docs/evidence/p40-night.png(contrast 103.2 >= 40)
|
| |
|
|
|
|
|
|
|
|
|
| |
- make-cc0-art.py 重绘 boat 篷面为实心拱形竹篷:拱线以下逐列实心填充,
连续脊线高光跨越两半在瓦片边界相接,肋骨/端盖/甲板阴影收边(原 1px 竖柱
栅栏式画法改为整片拱面)
- 重生成 Assets/cc0-tiles.png(同参数逐字节稳定)
- P40ArtTests 新增 BoatAwningIsASolidArchWithAContinuousRidge 像素级断言:
脊线无透明断列、拱下每列有实心竹色、左右两半拱顶同高
属 P40 整改的篷面实心 + 回归部分。
|
| |
|
|
|
|
|
|
|
| |
- CenterCameraOnTile 让相机直对船瓦片,avatar 挪到岸上非水瓦片,消除遮挡
- day/night/boat 三个证据镜头统一以船为中心;boat 帧整条船(234-235,50)完整入框
- 夜光晕后重绘船体(drawCc0BoatOverlay),修复桥头灯把船洗白
- make-p40-closeups.py 裁剪框对准船真实包围盒,closeup 不再裁切船
- 相机遮挡修复含 leader 外科修复(CenterCameraOnTile)
- 重出 docs/evidence/p40-day/night/boat 及 closeup 2x
|
| |
|
|
|
|
|
|
|
| |
- P40ArtTests 6 例:连贯带覆盖路网且抑制孤立散布、摆放确定性、红灯笼落门口、
红/石灯笼同光晕路径、同 seed 重生成一致、P40 索引在界内
- AssetPackTests 索引列表加 19/20;fsproj 注册 P40ArtTests
- scripts/make-p40-closeups.py 乌篷船 2x NEAREST 特写
- docs/维护说明.md 追加 P40 小节;证据 4 帧白块检查 0 命中,重复运行 byte-identical
- Release 全量 Desktop 201/201、Kernel 119/119 exit 0
|
| |
|
|
|
|
|
|
| |
- VillageArt: cc0PavingTiles 纯函数(路径/门口/桥相连石板格),drawTerrainTile cc0
分支只铺连贯石板带(19)、孤立散布石板改画草地;fallback/大世界原样
- cc0RedLanternTiles 门口红灯笼(20),并入 nightLightTilesWith 复用 P14 预乘 alpha 光晕
- Game: LV_P40_SHOT 钩子拍 p40-day/night/boat(PrepareP40Shot/CaptureP40Shot)
- 不写瓦片/不改可达性/不动 Sim.step
|
| |
|
|
|
|
|
|
|
| |
格)
- make-cc0-art.py: 新增 draw_paving(19)/draw_red_lantern(20);重绘 draw_boat(14/15)
放大船体 + 醒目拱形竹篷,重绘 draw_stone_lantern(16) 三段石结构强化
- 索引 0-13、17-18 逐字节不变(git show 复核);二次生成 byte-identical
- docs/素材来源.md 更新为 21 格并新增第 5 节 P40
|
| |
|
|
|
|
|
|
|
|
| |
- P39ArtTests 9 例:桥/船/灯笼/摊位/芦苇地形与确定性、NightLightTilesIncludeRoadLanterns、
StallsAndLanternsDoNotOverlapForOddAndEvenSpacing(奇 {3,5,7,11,13}/偶 {2,4,6,8,12})、
DegenerateSpacingPlacesNothing({0,1,-3} 返回空集)
- AssetPackTests 更新为 19 格 + 新索引;fsproj 注册 P39ArtTests
- scripts/make-p39-closeups.py:2x NEAREST 特写
- docs/维护说明.md 追加 P39 小节;证据 5 帧白块检查 0 命中,重复运行 byte-identical
- Release 全量 Desktop 195/195、Kernel 119/119
|
| |
|
|
|
|
|
|
|
|
| |
- VillageArt: 新增 splitmix/hash2/tileIsWater 与 cc0BridgeTiles/cc0BoatTile/
cc0LanternTiles/cc0StallTiles/cc0ReedTiles,drawWorld cc0 分支叠加五类元素
- 奇偶 spacing 边界:摆放守卫 spacing<2 返回空集,消除 spacing=1 同余重叠
- nightLightTilesWith(includeRoadLanterns) + drawNightGlows 新参数;
旧 nightLightTiles 语义不变,Game.fs riverscape 分支按 cc0 开启路灯光晕
- LV_P39_SHOT 证据 hook:Update 准备、Draw 落盘(PrepareP39Shot/CaptureP39Shot)
- 不写瓦片/不改可达性/不动 Sim.step
|
| |
|
|
|
|
|
| |
- scripts/make-cc0-art.py 由 384x32(12格) 扩到 608x32(19格),新增
draw_bridge_center/end、draw_boat、draw_stone_lantern、draw_stall、draw_reeds
- 旧索引 0-11 逐字节不变;产物 1523 bytes,sha256 ef86ced2…6adcb,二次生成一致
- docs/素材来源.md 更新为 19 格并新增第 4 节(P39 清单 + 摆放规则 + fallback 差异)
|
| |
|
|
|
| |
新增 P38HudIconTests(4 例):五段图标唯一且 7x7 点阵良构、段宽=图标+间隙+文本且
不重叠/在 1280 内、段与布局确定、昼夜底色半透明且覆盖图标与文本。
|
| |
|
|
|
|
|
| |
顶部常驻条每个状态段前加 7x7 原创点阵图标(用 pixel 贴图绘制,无外部素材):
时段=太阳、时间=钟、倍速=双箭头、体力=心形、钱币=圆形钱眼。图标占
iconWidth+iconGap 后接文本,段总宽含图标;底色药丸与 1px 描边同覆盖图标与文本,
昼夜两套调色板均可读;仍为半透明窄条(barHeight 不变,非大黑块)。
|
| |
|
|
|
|
| |
新增 P37ProfessionTests(8 例):渔夫首项钓鱼相关、同职业同 seed 任务序列
逐项确定、不同职业序列不同、开局钱/体力差异、开局物品包、v1/v2 旧档读入
无职业、选择页键盘导航+Enter 确认、职业中文文案有 CJK 字形可渲染。
|
| |
|
|
|
| |
从主菜单进入「选择职业」页截图,按 LV_P37_OCCUPATION 选定职业(默认渔夫)
开局并打开任务面板截 HUD/任务列表后退出;仅证据用,不影响默认玩法。
|
| |
|
|
|
|
| |
新增 P36PromptTests(10 例):距离边界、就近目标切换、离开立即消失、
隔墙不触发、对话层输入隔离、提示对象=按键对象一致、Esc 关闭当前层、
暂停帮助 Esc 回上层、保存成功/失败中文 toast、布局多尺寸不遮 HUD。
|
| |
|
|
|
|
| |
复用 sample 脚本走位/互动序列,在自然状态下抓 4 帧关键帧
(靠近→提示出现→对话层打开且世界交互被隔离→关闭走远提示消失)
并逐帧打印 panel/prompt/home 对照点,第 4 帧后退出。仅证据用,不影响默认玩法。
|
| |
|
|
|
|
|
|
|
|
|
| |
- cc0-tiles.png 由 4 格扩到 12 格:0-3 仍 Kenney 地面,4-11 为自绘构件
(4 水A/5 水B/6 屋脊/7 屋檐/8 木构墙/9 木格窗/10 栏杆/11 门)
- 自绘 2 相位水面 cc0WaterTileIndexAt=(tick/32+x+2y)%2,单帧覆盖双相位;
河道与水田/水网共用;江南 fallback 不变
- drawWorld 接入:cc0 模式下民居屋顶/墙/窗/门、桥栏杆、水面走真素材,其余道具仍江南
- AssetPackTests 更新图集尺寸(12 格)+整数缩放,新增构件索引与双水相位用例
- docs/素材来源.md 记录自绘清单;同步 assets-and-licenses 与维护说明 P34 小节
- docs/evidence/p34-*.png 昼/夜/2x 特写/水波/对照(check-no-white-blocks 0 命中)
|
| |
|
|
|
|
|
|
|
|
|
|
| |
真实像素素材样板(地面+角色竖直切片)
- 修复 make-cc0-art.py 地块取样间距:packed sheet 无间距(16px pitch),旧 17px 误采错格
- 重选草地/石板格 (9,8)/(10,8)/(4,8)/(4,9),整数 2x NEAREST 重建 cc0-tiles.png
- VillageArt 暴露 selectedGround/CharacterAtlasRelativePath 纯函数,保留 LV_ASSET_PACK=cc0
开关与程序绘制江南图集 fallback
- 新增 AssetPackTests:图集加载尺寸、整数倍缩放、开关/回退断言
- docs/素材来源.md 记录来源/许可/sha256/构建/开关;同步 assets-and-licenses 与维护说明 P33 小节
- docs/evidence/p33-atlas-*.png 昼/夜/2x 特写/程序绘制对照(check-no-white-blocks 0 命中)
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Task panel (T key): a storyline row per occupation, e.g. ju-qing-xian:
shui-wei-yu-shou-cheng, zou-fang-zhong (line name + stage name); absent
for occupation-free saves.
- Occupation select page: minimal hint line showing the selected
occupation's storyline name.
- Evidence hook LV_STORY_SHOT=1 (+LV_STORY_OCCUPATION, LV_STORY_STAGE):
boots a real world through the standard bootstrap, advances the story
via the real dialogue pipeline (chooseDialogueWith bias + Story.onDialogue
+ StoryAnnal append), opens the task panel and saves one back-buffer
frame, then exits. 4 Xvfb shots (farmer/fisher/peddler/scholar) captured
under art/ (gitignored, not committed).
- 4 new desktop tests (156 -> 160): panel storyline lines, bias + story
advance through M5Interaction, no-occupation path stays story-free.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Sim.AnnalKind gains StoryAnnal (summary lives in the existing Summary
field); WorldSave v3 serializes it with the new 'story' token. v1/v2
saves never contain the token and stay byte-identical; v3 save -> load
-> save roundtrips byte-for-byte (tested).
- Occupation.Story.identitySummaryOf: plain chronicle-style identity line
written to the yearbook at game start (design section 3), e.g. yi-da-yu-wei-sheng.
- Desktop: story summaries render in the chronicle panel; StartNewGame
appends the identity annal; chooseIntent now routes responses through
Occupation.biasResponse and advances the storyline (one stage per
player dialogue) with the summary appended as a StoryAnnal.
- M5View gains Seed (world seed source for the story start-day hash).
- Chinese copy synced into requiredUiLabels; cjk-glyphs.txt +
CjkGlyphAtlas.characterTable extended 238 -> 307 glyphs (384x480),
atlas regenerated with the deterministic script.
- 4 new kernel tests (115 -> 119); performance digest unchanged.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Occupation.Story: three-segment arc per occupation (accept task -> visit
households -> conclude), driven one stage per player dialogue with day
gates derived from the same splitmix pattern as the daily task pool
(start day = hash(seed ^ storySeed, day 0) mod 3 + 2, range [2,4]).
- relationMeanToPlayer: decayed valence mean over acquainted NPCs only
(same decay formula as Sim.relationMatrix); no acquaintances = 0.
- Three endings (warm/plain/distant) chosen by deterministic thresholds
(>=0.3 / >=0.0 / <0); ending text is fixed at the concluding dialogue.
- onDialogue returns (state, summary text option) for the caller to write
into the yearbook; StoryStage itself is unchanged (0..3) and already
roundtrips through the existing v3 occupation segment.
- 14 new kernel tests (101 -> 115); performance digest unchanged.
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
- Occupation.biasResponse: deterministic pure remap over Sim.responseFor;
no occupation = byte-identical pass-through (all intents x personalities).
farmer AskHelp Refused->Helpful; fisher SmallTalk Reserved->Friendly;
peddler SmallTalk Reserved->Bargaining; scholar Joke fully overridden to
Reserved (documented total-override semantics, opposite of personality).
- Sim.responseFor made public (same pure function, reused as the base path).
- Sim.chooseDialogueWith: extracted body of chooseDialogue with an injectable
respond function; chooseDialogue keeps identity semantics unchanged.
- Sim.appendAnnal made public for the upcoming story annal writes.
- 9 new kernel tests (92 -> 101); performance digest unchanged.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- MapGen(仅大图尺寸自适应分支,默认 64x48/256x192 不进入、不消费额外 RNG):
① ExtraRiversideHouses 16 -> 30,组团 2-5 座;含基础岸屋的路段优先布组并为每座孤立
基础民居贴格配对,placeGroup 试排后按「与既有/同组民居足迹间隙 <=2」过滤,孤立单屋不落地。
512 seed4242:组团民居 24 -> 45,规模 [5;4x6;3x2;2x3],0 组 <2 座。
② 新增 GroundTile.PaddyField=4/VegetablePlot=5(成熟 tile;非水可通行)+ Result.Groves
(纯视觉)+ Result.Farmhouses(门贴院落路、计入 BFS);18x14 确定性网格铺田块/树丛/农舍,
离水 >=3 格、避开路网/核心/民居。草地瓦片 96.3% -> 83.9%,水田 11595 + 菜畦 12877 格。
③ Result.MainRoadCenter 逐列中心线,value noise(scale 130、幅度 ±3)确定性缓弯,
相邻列步长 <=1、遇弯补格保证 4 连通;默认图主街仍笔直。
- VillageArt:水田/菜畦/树丛/农舍渲染(复用成熟 sprite 与同一立面纯函数)、农舍门窗计入夜光、
新增 drawMapRegion 局部真实离屏渲染。
- Game:P30 证据钩子 LV_MAPGEN_P30_SHOT=1(整图 3072x2304 day/night + 田块/主路 512x256@4px)。
- 回归 +5:组团规模/空区填充/田块合规/农舍可达确定性/主路确定性弯曲。
Kernel 92 / Desktop 156 全绿;Release 0 警告 0 错误;
final_digest=953775FAEB2F… 3 次一致、performance_determinism=PASS;
64x48=6042052、256x192=1284656962 锁定不变。
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- MapGen:仅大图新增 ClusterSeed(group seeding)与组团布屋——512 沿横向石板路
(主街+河岸路)成排成组:组内 2-4 座/1 格间隙、组间 4-6 格空档,宽度 2/3/4 分层;
垂柳改为确定性成丛(2-3 株/丛、丛间 3-5 格空档)。独立 clusterRng 不触碰
structureRng,默认图仍不消费 RNG,64x48=6042052 / 256x192=1284656962 锁定不变。
- VillageArt:新增 lanternFalloff(二次 1-(d/r)^2,半径 0 处最大、边缘 0、严格单调无平台);
lanternGlowLayers 按该衰减逐环累积 alpha;drawNightGlows 对桥头灯笼+民居门窗画半径
4 tile 的柔和径向光晕,整图取证与实机 DrawWorldView 共用同一套纯函数。
- 回归 +6:组团行/成丛/衰减/光源确定性;Desktop 151、Kernel 92 全绿,Release 0/0,
final_digest=953775FAEB2F… 3 次一致。证据帧见 art/p29-*。
|