summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop.Tests
Commit message (Collapse)AuthorAgeFilesLines
* test(p40): 连贯带/同seed/夜光回归 + 运行时证据帧Somhairle H. Marisol7 days3-2/+109
| | | | | | | | | - 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
* test(p39): 摆放/光晕/奇偶 spacing 回归 + 运行时证据帧Somhairle H. Marisol7 days3-2/+149
| | | | | | | | | | - 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
* test(desktop): P38 HUD 图标布局与确定性回归Somhairle H. Marisol7 days2-0/+72
| | | | | 新增 P38HudIconTests(4 例):五段图标唯一且 7x7 点阵良构、段宽=图标+间隙+文本且 不重叠/在 1280 内、段与布局确定、昼夜底色半透明且覆盖图标与文本。
* test(desktop): P37 职业系统首切片验收回归Somhairle H. Marisol7 days2-0/+125
| | | | | | 新增 P37ProfessionTests(8 例):渔夫首项钓鱼相关、同职业同 seed 任务序列 逐项确定、不同职业序列不同、开局钱/体力差异、开局物品包、v1/v2 旧档读入 无职业、选择页键盘导航+Enter 确认、职业中文文案有 CJK 字形可渲染。
* test(desktop): P36 情境提示契约回归Somhairle H. Marisol7 days2-0/+236
| | | | | | 新增 P36PromptTests(10 例):距离边界、就近目标切换、离开立即消失、 隔墙不触发、对话层输入隔离、提示对象=按键对象一致、Esc 关闭当前层、 暂停帮助 Esc 回上层、保存成功/失败中文 toast、布局多尺寸不遮 HUD。
* feat(art): P34 素材扩展切片(水面/屋顶/墙体/栏杆)Somhairle H. Marisol7 days1-1/+31
| | | | | | | | | | | - 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 命中)
* feat(art): P33 接入 CC0 ↵Somhairle H. Marisol7 days2-0/+74
| | | | | | | | | | | | 真实像素素材样板(地面+角色竖直切片) - 修复 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 命中)
* feat(desktop): P31 step4 story progress display + evidence shotsSomhairle H. Marisol13 days2-0/+106
| | | | | | | | | | | | | | | | - 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.
* feat(kernel,desktop): P31 step3 story annals + identity entry + glyph atlasSomhairle H. Marisol13 days1-3/+3
| | | | | | | | | | | | | | | | | | - 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.
* feat(desktop): P30 512 民居增密 + 乡村空区填充 + 主路柔化Somhairle H. Marisol13 days1-5/+107
| | | | | | | | | | | | | | | | | | | - 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 锁定不变。
* feat(desktop): P29 512 聚落组团 + 夜景灯光径向光晕Somhairle H. Marisol13 days2-0/+109
| | | | | | | | | | | | - 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-*。
* test(desktop): P28 断言变体 B 挑檐亮度显著高于变体 A 屋脊Somhairle H. Marisol13 days1-0/+53
| | | | - 直接解码 world 图集 slot 8/28 平均亮度,防配色差异被回退抹平
* feat(mapgen): P28 512 沿河民居加密至 16 并宽度 2/3/4 分层Somhairle H. Marisol13 days1-0/+15
| | | | | | - ExtraRiversideHouses 10 -> 16(沿河 +6 座),宽度加权 2/3/4 形成聚落层次 - 仅 large 分支执行、默认图不消耗 RNG:64x48=6042052、256x192=1284656962 锁定不变 - 新增 LargeMapHouseDensityHierarchyOnlyGrowsLargeMaps 回归
* feat(desktop): P26 HUD 常驻元素半透明底色 + 1px ↵Somhairle H. Marisol13 days1-0/+21
| | | | 描边(昼/夜可读)
* feat(desktop): P26 夜晚冷月光 veil(纯渲染层)+ ↵Somhairle H. Marisol13 days2-0/+46
| | | | 灯笼光晕径向无方斑回归
* feat(mapgen): P26 512 ↵Somhairle H. Marisol13 days2-4/+51
| | | | 大图河岸装饰(护岸石垒/芦苇/垂柳)仅视觉层,不挡通行
* feat(desktop): P26 ↵Somhairle H. Marisol13 days1-4/+22
| | | | 民居立面第二变体(挑檐/木格栅窗/院门)沿河沿路交替
* fix(mapgen): 大图关闭孤立装饰石块,杜绝草地上游离石板 ↵Somhairle H. Marisol13 days1-0/+31
| | | | | | | | | tile(P25) - 新增 Params.DecorativeStones(默认 true);paramsForSize 对 >256x192 关闭, 512x384 不再产生 292 个孤立石板(stone 非路网计数归零,石块全部属于路网)。 - 64x48/256x192 保持开启,checksum 6042052/1284656962 不变。 - 新增 NoIsolatedStoneTiles / DecorativeStonesDisabledOnLargeMaps 回归;Desktop 134 -> 136。
* feat(mapgen): 512x384 沿河民居加密到 18 座且门全部可达(P24)Somhairle H. Marisol13 days1-0/+32
| | | | | | | - Params.ExtraRiversideHouses(默认 0);paramsForSize 仅对 >256x192 设为 10, 从既有路网泊松散布 3x2 民居并接门入网(structureRng 确定性),512x384 共 18 座。 - 64x48/256x192 仍 4 座、checksum 6042052/1284656962 不变(新增用例锁定)。 - 新增 512 民居数量/可达/确定性用例;Desktop 130 -> 134。
* feat(mapgen): 512x384 尺寸自适应参数与扩程回归(P23)Somhairle H. Marisol13 days1-0/+63
| | | | | | | | | - paramsForSize:河道数量随高度约每 96 行一条(64x48/256x192 仍 2 条,512x384 得 4 条), 第 3 条起在核心上/下方逐层外扩,互不重叠且不压核心。 - 噪声特征尺度封顶 4x,避免 512x384 退化成过度平滑的放大图。 - 64x48/256x192 生成结果逐字节不变(新增 checksum 锁定用例)。 - 新增 512x384 同 seed 逐字节一致/异 seed 分化/四河道连续/30 spawn 与桥两岸可达用例。 - Desktop 测试 124 -> 130。
* feat(perf): 帧率采样汇总纯函数 + 测试(P21)Somhairle H. Marisol13 days2-0/+35
| | | | | - PerformanceSummary.summarize:丢弃 warmup 后求每秒 FPS 的均值/最低/最高, 空样本返回 None;含 3 条单测(TDD)。
* feat(mapgen): 生成器序列化 + 世界站位接入(P20 第三步 A)Somhairle H. Marisol13 days1-0/+25
| | | | | | | | | | | - MapGen.serialize:生成结果的确定性序列化(尺寸/seed/瓦片/Rivers/Bridges/ Paths/Buildings),同 seed 逐字节一致,供回归与跨机核对。 - WorldBootstrap.initialWorldWithPlacement:显式站位建世界;旧 64x48 路径 (initialWorld/initialWorldWithOccupation)字节口径不变。 - WorldBootstrap.initialWorldInMap:用生成器核心可达区做站位,30 spawn 全落 可达核心;新增 serialization/placement 两条测试。 - fsproj:MapGen 先于 WorldBootstrap 编译。 - Desktop 119->121,Kernel 90 不变。
* feat(mapgen): 河道连续性不变量 + 桥/石板路网/沿河民居(P20 ↵p20-map-gen-foundationSomhairle H. Marisol13 days1-0/+76
| | | | | | | | | | | | | 第二步) - 河道改为贯穿全图连续水带(每列一段、宽度 >= RiverWidth),置于核心区上下 两侧且不相交;新增不变量测试:逐列水段数恒定、每段宽度下限、任意水格 >=2 个水邻居(禁止断裂缺口与孤立水点)。 - Result 新增 Rivers/Bridges/Paths/Buildings/BridgeCrossingsOk;每河 2 座桥、 横贯主路 + 垂直连接路 + 远岸路 + 白墙黑瓦民居(门朝路)。 - 公开 isWalkable/floodFill;ReachabilityOk 现覆盖 30 spawn + 所有门 + 所有桥面, BridgeCrossingsOk 保证每桥两岸同连通域。 - 回归:Desktop 115->119、Kernel 90 不变;final_digest 与基线一致。
* feat(mapgen): 参数化确定性生成器与视口裁剪(P20 第一步)Somhairle H. Marisol13 days2-0/+82
| | | | | | | | | | - 新增纯函数 MapGen:尺寸参数化(默认 64x48,可 256x192),splitmix64 随机游走河道 + 2-3 octave value noise + 泊松式布点;核心区整平后以 BFS 校验 5x6=30 个 spawn 全部可达,不可达确定性修整并复验。 - visibleTileRange/visibleTileCount 纯函数,drawWorld 改为调用之(行为不变); drawMapFitted/drawMapViewport 仅证据用。 - 存档沿用 v2/v3 边界字段,补参数化边界 round-trip 测试,未改 Sim 语义。 - 回归:Desktop 109->115、Kernel 89->90;final_digest 与基线一致。
* fix(desktop): P19 白天色调去偏黄(day tint ↵p19-daylight-tamingSomhairle H. Marisol13 days2-0/+29
| | | | 中性白平衡,黄昏暖橙保留)
* feat(desktop): P18 黄昏暖色真实渲染(加性暖色 veil + ↵Somhairle H. Marisol13 days2-9/+30
| | | | 双窗口光照 + 时段标签对齐)
* fix(desktop): P17-FIX 起时钩子在 sample/autoplay ↵Somhairle H. Marisol13 days1-0/+14
| | | | 路径生效(resolveStartTick 纯函数 + 回归 + 重拍证据)
* test(desktop): P17 取证钩子(LV_AUTOPLAY_START_HOUR 纯函数起时)+ ↵Somhairle H. Marisol13 days1-0/+4
| | | | 证据与 docs 记录
* feat(desktop): P17 清晨/黄昏光照精修(暖色天际 + ↵Somhairle H. Marisol13 days1-15/+29
| | | | 过渡窗口参数化,分数小时平滑)
* feat(desktop): P17 村民走路节奏差异化(农夫/货郎/书生 纯 ↵Somhairle H. Marisol13 days1-3/+31
| | | | tick 节奏)
* feat(desktop): P17 ↵Somhairle H. Marisol13 days1-4/+27
| | | | 街边中式细节物(石灯笼/水缸/摊贩摊位)图集扩展 28 格
* feat(desktop): P16-FIX 开始界面截图模式(LV_AUTOPLAY_MENU_SHOT)+ ↵Somhairle H. Marisol13 days1-0/+24
| | | | 真实菜单证据补拍
* feat(desktop): P16 HUD ↵Somhairle H. Marisol13 days2-3/+61
| | | | 顶部窄信息条(时段/时间/倍速/体力/钱币)+ 冬夜冷色 + 面板/提示渐变重绘
* feat(desktop): P16 启动画面淡入(Esc/空格跳过)+ ↵Somhairle H. Marisol13 days4-6/+75
| | | | 开始界面收敛三项(开始/读档/退出)+ CJK 补字 238
* test(desktop): P15 选职业→第一天任务→完成判定→Done ↵Somhairle H. Marisol13 days1-0/+50
| | | | | | | | | | 全链路回归(既有事件通道) - 从 WorldBootstrap.occupationStateFor(选择职业入口)取四职业第一天 Offered 任务, acceptTask 转 Active,再用该模板对应信号推到 Done:交易/对话模板走 InteractionEvent → signalOfInteraction(玩家买/卖、玩家对话),到达瓦片/夜水边/观察由调用方折叠信号。 - 覆盖农夫送粮、渔夫夜捕、货郎收货、书生观察记事等四职业首日模板,验证池内生成与终态。 - Desktop 94 / Kernel 83 全绿;不改 Sim.step 数值路径。
* feat(desktop): P15 ↵Somhairle H. Marisol13 days2-0/+99
| | | | | | | | | | | | | 开局职业选择页——新档四选一+暂不选择,接入 v3 存档与当日任务 - MenuState:新增 OccupationSelect 页与 StartNewGameWith 命令;occupationOptions=农夫/渔夫/货郎/书生/暂不选择, 默认高亮「暂不选择」= 不写职业的旧行为;四选一确认后发 StartNewGameWith,ESC 返回主菜单(既有 MainMenu 行为与测试不变)。 - WorldBootstrap.occupationStateFor/refreshOccupationToday:按 seed+职业种子生成/跨日刷新当日 Offered 任务。 - Game:主菜单「开始新游戏」→ 职业选择页;选定后 initialWorldWithOccupation 注入 Money/Energy 与 Today, m5View.Task 随之写入 v3 存档;游玩中按日刷新;autoplay/flow 默认走「暂不选择」保持旧演示行为;DrawMenu 渲染职业页。 - 测试 Desktop 93(新增 6):职业页选项顺序/默认 None/标签、确认命令与返回、bootstrap 四职业 Money/Energy+当日池内 Offered 任务、四职业 v3 round-trip(职业+任务逐字段)、T 面板显示所选职业的模板名与「待接受」、跨日刷新保持同日。
* fix(ui): P15 补齐职业/任务中文用字(CJK 图集 ↵Somhairle H. Marisol13 days1-3/+3
| | | | | | | | | | | 197->228),requiredUiLabels 锁定防复发 - CjkGlyphAtlas 字表 + Assets/cjk-glyphs.txt + cjk-glyph-atlas.png 重生成(384x360,15 行): 新增 职/业/收/货/转/事/论/理/粮/工/翻/土/捕/渔/询/送/帮/农/夫/郎/书/生/待/接/受/今/日/任/务/行/中 共 31 字,覆盖职业选择页与 T 面板全部模板/状态文案,消除方框缺字。 - ChineseText.requiredUiLabels 增职业/模板/状态标签,既有 FormalChineseUiLabelsUseTheRealGlyphAtlasBoundary 与 RequiredUiLabelsAreFullyCoveredByTheGlyphTable 继续强制全字形可渲染。 - PrototypeTests 几何常量同步 197->228、13->15 行、312->360 像素。Desktop 87 全绿。
* merge: 采纳 M3-1 ↵Somhairle H. Marisol13 days2-0/+85
|\ | | | | | | 流式可观测性+门槛缩尺+成本量化(独立复验全绿)
| * test(desktop): M3 批次输出格式与流式驱动回归Somhairle H. Marisol13 days2-0/+85
| | | | | | | | | | | | - world 行前缀不变、行尾 elapsed_s;[done k/N] 与 summary 追加字段断言 - runStreaming workers=1 断言逐世界 emit(非收完再打印);并行下不重不漏 - costLine ticks/s 由实测 ticks/墙钟推导
* | test(desktop): CJK 清单唯一性与图集网格防复发断言Somhairle H. Marisol13 days1-0/+33
|/ | | | | - 断言 cjk-glyphs.txt 非空、每行恰 1 字符、字符唯一 - 读 cjk-glyph-atlas.png IHDR,断言 16 列且网格容量覆盖清单、无多余空行
* 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 命中)
* test(desktop): 覆盖六帧角色、待机呼吸与三相水面/炊烟Somhairle H. Marisol13 days1-10/+49
| | | | | | - 更新 isMoving 签名、WalkFrame 帧号、characterAtlasWidth=3840 - 水面断言改三相 (0,0,1,1,2,2,0),新增待机呼吸与炊烟三相测试 - Desktop 75/75 通过
* feat(desktop): P12 中文每日任务面板——T ↵Somhairle H. Marisol13 days1-0/+52
| | | | 键任务页、Offered/Active/Done 三态+职业名,存读档字段级携带职业
* fix(headless): worldDigest 规范化恢复性能基线字节口径Somhairle H. Marisol14 days1-0/+18
| | | | 快照与存档版本头/sh与边界 token 解耦:WorldDigestOfText 先把 V2 存档剥出正文并重建 LV_WORLD_SAVE_V1 常量语义再 SHA256;digest 只绑定模拟状态;新增 WorldDigestIsCanonical 同 V1/V2 双读路径 digest 相等回归;--performance-baseline 3 次独立运行 final_digest 复回 953775FAEB2F…(与历史基线逐字节一致),证据在 artifacts/perf-independent/新时间戳/README。
* test(desktop): 澄清生成器逐字节快照断言Somhairle H. Marisol14 days1-1/+3
| | | | AreEqual 波及重载解析 (int,int,string) — 改用 mutable diverged 检查等价断言;清洁全绿。
* feat(desktop): 512x384 程序生成地图与巡游取证模式Somhairle H. Marisol14 days1-0/+22
| | | | ProceduralMap 纯函数生成器:splitmix64 随机游走河道(三条西→东,宽 3,穿核心禁入)、三倍频值噪声草地/泥炭变化、泊松式最小距离布点(800 次尝试),村核矩形(24..38 x 16..34)由生成器不变式保证可通行;VillageArt 于大世界模式下按 terrain code 逐格绘制(可视化范围裁剪,无每帧分配);Game 新增 LV_MAP_SCALE(默认 1,表示规模倍数)与 LV_MAP_TOUR 巡游采样(八个地标位置含角/中心/河带);快照回归断言:同 seed 逐字节一致、异 seed 必然差异、核心矩形无水面。
* feat(assets): CC0 素材接入与制作管线Somhairle H. Marisol14 days1-0/+2
| | | | 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 days1-0/+9
| | | | entranceProgress 纯函数按帧计数(固定 60Hz 步长,禁实时时钟):黛瓦天际线自上 36px 落定、标题自下 24px 升起、水面带 2s 淡入、灯笼/面板同步;快照回归断言进度锚点(0/60/120/超时)与确定性;LV_AUTOPLAY_FLOW 标题停留 60 帧可直接采样入场过程。
* feat(desktop): 村民与主角四帧行走动画Somhairle H. Marisol14 days1-3/+26
| | | | 人物图集 5 变体 x 4 向 x 4 帧(2560x48,全部经 make-jiangnan-art.py 原创,四种腿步:站立/左跨/站立微跳/右跨镜像);animationFrame 按 tick/4 mod 4 确定性取帧(16 tick 一循环,禁实时时钟);快照式回归断言四帧循环与逐帧图集列映射,主角同规则。
* feat(desktop): 确定性昼夜光照过渡与夜灯暖光Somhairle H. Marisol14 days1-0/+35
| | | | 新增 lightingBlend 纯函数(黎明明 4:00-6:00、暮色 20:00-22:00 线性过渡,边界与 isNightTick 对齐),天空底色/世界 tint 按混合插值渲染,夜晚灯笼暖光晕强度=LanternGlow(纯叠加矩形、无每帧分配风险);回归测试含锚点/单调斜坡/确定性/光晕开关。