| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
| |
- LV_UNLOCK_FPS=1 关闭 vsync/固定步长以测真实渲染上限;
LV_PERF_SUMMARY=1 退出时用 PerformanceSummary 打印 mean/min/max。
- LV_RIVERSCAPE_SECONDS=N 让巡游循环到 N 秒,支撑 60s 稳定采样。
|
| |
|
|
|
| |
- PerformanceSummary.summarize:丢弃 warmup 后求每秒 FPS 的均值/最低/最高,
空样本返回 None;含 3 条单测(TDD)。
|
| |
|
|
|
| |
LV_AUTOPLAY_SAMPLE(非巡游)仍走旧 64x48 以确保既有录像可复现;
LV_RIVERSCAPE_TOUR=1 时才启用 256x192 生成器世界。新增 world-mode 启动日志。
|
| |
|
|
|
|
|
|
|
|
|
|
| |
第三步 B)
- Game:默认 256x192 生成器世界(核心可达区站位),LV_LEGACY_MAP=1 /
LV_MAP_SCALE>1 / LV_MAP_TOUR=1 回退旧路径;StartNewGame 走同一站位。
- VillageArt.drawWorld 新增 pixel 与 mapGen option:Some 时按生成器瓦片绘地面
并叠加桥面/沿河民居/门,跳过 64x48 样例平面与道具;水波沿用 waterFrameTickAt。
- 新增 bridgeLanternTiles;夜间 LanternGlow 沿用既有预乘同心圆(无过曝白芯),
生成器世界用桥头灯笼。
- 新增 LV_RIVERSCAPE_TOUR 真走位巡游与 LV_RECORD_NAME 录屏前缀(证据用)。
|
| |
|
|
|
|
|
|
|
|
|
| |
- 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 不变。
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
第二步)
- 河道改为贯穿全图连续水带(每列一段、宽度 >= RiverWidth),置于核心区上下
两侧且不相交;新增不变量测试:逐列水段数恒定、每段宽度下限、任意水格
>=2 个水邻居(禁止断裂缺口与孤立水点)。
- Result 新增 Rivers/Bridges/Paths/Buildings/BridgeCrossingsOk;每河 2 座桥、
横贯主路 + 垂直连接路 + 远岸路 + 白墙黑瓦民居(门朝路)。
- 公开 isWalkable/floodFill;ReachabilityOk 现覆盖 30 spawn + 所有门 + 所有桥面,
BridgeCrossingsOk 保证每桥两岸同连通域。
- 回归:Desktop 115->119、Kernel 90 不变;final_digest 与基线一致。
|
| |
|
|
|
|
|
|
|
|
| |
- 新增纯函数 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 与基线一致。
|
| |
|
|
| |
中性白平衡,黄昏暖橙保留)
|
| |
|
|
| |
双窗口光照 + 时段标签对齐)
|
| |
|
|
| |
路径生效(resolveStartTick 纯函数 + 回归 + 重拍证据)
|
| |
|
|
| |
证据与 docs 记录
|
| |
|
|
| |
过渡窗口参数化,分数小时平滑)
|
| |
|
|
| |
tick 节奏)
|
| |
|
|
| |
街边中式细节物(石灯笼/水缸/摊贩摊位)图集扩展 28 格
|
| |
|
|
| |
真实菜单证据补拍
|
| |
|
|
| |
顶部窄信息条(时段/时间/倍速/体力/钱币)+ 冬夜冷色 + 面板/提示渐变重绘
|
| |
|
|
| |
开始界面收敛三项(开始/读档/退出)+ CJK 补字 238
|
| |
|
|
| |
谣言窗口扫描去中间表——最新在前早停递归替代 takeWhile/filter/sort,零分配且等价
|
| |
|
|
| |
谣言裁剪回归——容量内零拷贝与逐字节一致/按天淘汰/单调 id/DayIndex 存档往返
|
| |
|
|
| |
派生字段/纯函数 trim/窗口化扫描/O(1) nextId
|
| |
|
|
|
|
|
|
|
|
| |
全链路回归(既有事件通道)
- 从 WorldBootstrap.occupationStateFor(选择职业入口)取四职业第一天 Offered 任务,
acceptTask 转 Active,再用该模板对应信号推到 Done:交易/对话模板走 InteractionEvent
→ signalOfInteraction(玩家买/卖、玩家对话),到达瓦片/夜水边/观察由调用方折叠信号。
- 覆盖农夫送粮、渔夫夜捕、货郎收货、书生观察记事等四职业首日模板,验证池内生成与终态。
- Desktop 94 / Kernel 83 全绿;不改 Sim.step 数值路径。
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
开局职业选择页——新档四选一+暂不选择,接入 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 面板显示所选职业的模板名与「待接受」、跨日刷新保持同日。
|
| |
|
|
|
|
|
|
|
|
|
| |
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 全绿。
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
既有事件通道信号桥(Kernel 纯函数 TDD)
- TaskTemplateId 扩出 BuyGoods(收货)/Resell(转卖)/ObserveNotes(观察记事)/ReasonDebate(论理),
taskPoolOf 货郎=[收货,转卖]、书生=[观察记事,论理],四职业池均非空。
- TaskSignal 增 Purchased(玩家买入)/Observed(观察),satisfiesCompletion 给出四模板完成判定;
新增 occupationSeedOf/refreshToday(跨日才重生成,同日含 Done/Failed 终态保留)。
- signalOfInteraction/advanceTask:仅 playerId 发起的 DialogueEvent/TradeEvent 产生信号,
NPC 互动不派任务;Offered 须先 acceptTask,终态不可复活。WorldSave 模板 token 双向同步。
- 测试 83 全绿(新增 6:池非空、货郎书生逐日池内确定、模板中文名、完成信号正负、
事件桥含玩家买/卖与 NPC 忽略、既有 DialogueEvent→accept→Done 全链路、refreshToday 逐日)。
- 不动 Sim.step 数值路径;旧档 v3 模板 token 仅新增合法值,未知模板仍拒绝。
|
| |\
| |
| |
| | |
流式可观测性+门槛缩尺+成本量化(独立复验全绿)
|
| | |
| |
| |
| |
| |
| | |
- world 行前缀不变、行尾 elapsed_s;[done k/N] 与 summary 追加字段断言
- runStreaming workers=1 断言逐世界 emit(非收完再打印);并行下不重不漏
- costLine ticks/s 由实测 ticks/墙钟推导
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
- runBatch 改为每个世界一完成立即打印 world= 行(行尾追加 elapsed_s)与
[done k/N] elapsed=…s 进度行并 flush,长批次不再整轮零进度
- batch_summary 旧字段原样保留,追加 workers 与 wall_s 总墙钟
- 新增 BatchOutput 纯格式化与 runStreaming 并行驱动
- 新增只读 --cost-probe [D1,D2,...]:按天阶梯真实测量 ticks/s、墙钟、分配与 GC
- 判据语义 check a/b/c 未改
|
| |/
|
|
|
| |
- 断言 cjk-glyphs.txt 非空、每行恰 1 字符、字符唯一
- 读 cjk-glyph-atlas.png IHDR,断言 16 列且网格容量覆盖清单、无多余空行
|
| |
|
|
| |
Release 构建归零告警
|
| |
|
|
|
|
|
|
| |
- 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 命中)
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
预乘并改径向层叠,消除夜间纯白方块
- 新增 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 交易会崩溃且告警)
|
| |
|
|
|
|
| |
- 更新 isMoving 签名、WalkFrame 帧号、characterAtlasWidth=3840
- 水面断言改三相 (0,0,1,1,2,2,0),新增待机呼吸与炊烟三相测试
- Desktop 75/75 通过
|
| |
|
|
|
|
|
| |
- 新增 avatarMoving(比较前后位置)驱动走路/待机帧切换,
覆盖采样、地图巡游与手动输入三条路径
- 录帧目录与间隔改为环境变量 LV_RECORD_DIR / LV_RECORD_EVERY
(默认 /tmp/lv-p5-prompt、25),便于证据落到指定目录
|
| |
|
|
|
|
|
|
|
|
| |
- 角色图集每个 (变体,方向) 由 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 图集(脚本可复现,逐字节一致)
|
| |
|
|
| |
键任务页、Offered/Active/Done 三态+职业名,存读档字段级携带职业
|
| |
|
|
| |
报价偏置纯函数——货郎买卖±3.00%/书生解读±1.00%,4位定点基点,默认无职业=旧行为(TDD 6例)
|
| | |
|
| |
|
|
|
|
| |
双向兼容
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 无尾段 + 未知模板拒绝、尾段后垃圾拒绝、字节级双跑一致。
|
| |
|
|
|
|
| |
状态机(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 向量、池约束、逐日确定性、窗口=整日、中文名、状态机转移、六模板正负完成信号、终态不可复活、逾期判负。
|
| |
|
|
|
|
| |
/ 存档 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 占位(任务系统后续单实现)。
|
| |
|
|
| |
Game.fs 733/741 两条编译警告(FS0049 未限定模式绑 + FS0026 不可达)由 Qualified VillageArt.RenderPropKind.RiverLantern 修复,全仓 0 警告;Leader 所指 Interaction.fs:191 并无编译警告(已记录于验资说明);docs/维护说明.md 首开:模块职责/O 不变量/信息 digest 变化处理/可复制命令。
|
| |
|
|
| |
快照与存档版本头/sh与边界 token 解耦:WorldDigestOfText 先把 V2 存档剥出正文并重建 LV_WORLD_SAVE_V1 常量语义再 SHA256;digest 只绑定模拟状态;新增 WorldDigestIsCanonical 同 V1/V2 双读路径 digest 相等回归;--performance-baseline 3 次独立运行 final_digest 复回 953775FAEB2F…(与历史基线逐字节一致),证据在 artifacts/perf-independent/新时间戳/README。
|
| |
|
|
| |
LV_MAP_TOUR 需自动开局(复用 LV_AUTOPLAY 的菜单自动确认路径),更新 autoplay 判定并提交;巡游/周边日志等已在前一单。
|
| |
|
|
| |
AreEqual 波及重载解析 (int,int,string) — 改用 mutable diverged 检查等价断言;清洁全绿。
|
| |
|
|
| |
ProceduralMap 纯函数生成器:splitmix64 随机游走河道(三条西→东,宽 3,穿核心禁入)、三倍频值噪声草地/泥炭变化、泊松式最小距离布点(800 次尝试),村核矩形(24..38 x 16..34)由生成器不变式保证可通行;VillageArt 于大世界模式下按 terrain code 逐格绘制(可视化范围裁剪,无每帧分配);Game 新增 LV_MAP_SCALE(默认 1,表示规模倍数)与 LV_MAP_TOUR 巡游采样(八个地标位置含角/中心/河带);快照回归断言:同 seed 逐字节一致、异 seed 必然差异、核心矩形无水面。
|
| |
|
|
| |
Sim 地图边界由常量 52 改为可配置(configureBounds,默认 64x48 = 与全部基线一致);Sim.step 裁剪、initialWorld 中心出生时点按当前边界读取;WorldSave 升级 V2 头携带 width/height 两字段,V1 旧存档照常读入并自动回退到 64x48;回归:512x384 边界裁剪/初界转正/双份存档往返/案例 v1 档兼容读。修复前一段中报错已修正的测试代码(Ensure saved-file timeouts)。
|
| |
|
|
| |
夜晚灯笼光晕由三层高不透明矩形改为四层宽环径向衰减(外圈 alpha 9→渐强),核心亮度压到 34 并去掉全白芯层,灯笼本图块在夜色下保持可读;Xvfb 夜景 hěllo 帧自证:暖色簇 776/745 采样像素、近白过曝核心消失。
|
| |
|
|
| |
VillageArt 支持 CC0 素材包切换(环境变量 LV_ASSET_PACK=cc0):Kenney 地块替代草地(棋盘双绿)/石径纹理,Puny 角色图集(与江南人物同 cell 几何)替换五变体角色;水面/屋檐/桥/灯笼/竹丛等江南图块保留并存于同一场景,江南图集仍作为水与建筑纹理源;未设环境变量时行为与既有路径一致(全部既有测试不变)。
|
| |
|
|
| |
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 记录)。
|
| |
|
|
| |
entranceProgress 纯函数按帧计数(固定 60Hz 步长,禁实时时钟):黛瓦天际线自上 36px 落定、标题自下 24px 升起、水面带 2s 淡入、灯笼/面板同步;快照回归断言进度锚点(0/60/120/超时)与确定性;LV_AUTOPLAY_FLOW 标题停留 60 帧可直接采样入场过程。
|