Commit Graph

427 Commits

Author SHA1 Message Date
47c6e2c8db test(08-10): cover data-system/data-state gap codes and add loader tests
- eventDispatch: assert codes 171 (missing event id) and 172 (non-boolean reduce result)

- path/system: assert code 182 when binding a foreign CoreState layer

- data-state event: assert code 1001 for an unknown setBlock tile

- loader: new loader.test.ts covering PrefixedJSONCProcessor 66/67, DefaultDataLoaderHook 69/success, and MotaDataLoader public surface (66/67/68/69; 68 recorded unreachable)
2026-10-08 14:45:10 +08:00
b932f8cecd test(08-10): cover data-common/data-base gap codes and align baseline failures
- sandbox: drop obsolete playing=true bypass, align expired-step case, assert codes 73/194

- tileStore: assert codes 133/134 and add ItemStore/EnemyStore code 181 cases

- map/mover: assert code 192 when Dir8 handler missing

- hero/items: assert code 193 on missing item id registration

- mapLifecycle: drive resize via GameMap.resizeLayer so shared indexer width syncs
2026-10-08 14:35:03 +08:00
551e63de9a test(08-09): drop removed hook controller .load() in shared fixture
addHook now auto-loads; the returned controller exposes only unload().
2026-10-07 19:13:51 +08:00
ff9fd77880 test(08-09): align data-state integration and perf tests to shipped shapes
- dataClosure: local CoreState helper, Record equip.value, ReplayCommandResult/Active commands, natural sandbox step

- enemyCombination: local CoreState helper

- perf: CoreState loadStarter assembly, Record equip.value, addLayer('event')
2026-10-07 19:13:15 +08:00
827e11c7a4 test(08-09): align remaining data-state integration and perf tests
- delete tileLegacy.test.ts (tested removed data-state/src/legacy; authorized retirement)

- dataClosure: local CoreState helper, Record equip.value, ReplayCommandResult/Active commands, natural sandbox step

- enemyCombination: local CoreState helper

- perf: CoreState loadStarter assembly, Record equip.value, addLayer('event')
2026-10-07 19:13:00 +08:00
98118fac14 test(08-09): align shared fixture and core playback integration tests
- closed-loop: assemble CoreState via loadStarter contract, setFloor(real IGameMap) at both call sites

- coreNode: local createCoreState helper, addLayer('event')

- replayPlayback: drop useMapState, DefaultPassPredicateImpl(state), inject Dir4FaceHandler, setFloor(real map), ReplayCommandResult assertions

- saveablesRoundTrip: real map setFloor, addLayer('event'), Record equip.value, align container restore to uid/value
2026-10-07 19:01:48 +08:00
1ef95cd36b test(08-08): align core/event/commands tests to shipped interfaces
- coreEventLayer: redirect to MapState.fromRaw real event-layer assembly
- event: CoreState config constructor + addLayer('event') + setFloor(map)
- commands: CoreState config constructor; expected values aligned to
  ReplayCommandResult (Success/Failed) instead of boolean
- commands.ts: user-fixed boolean assertParameter and 'boolean' paramTypes,
  plus user-authorized // Parameter: comments to JS typeof semantics
2026-10-07 18:04:01 +08:00
46cad94aff refactor: UI 系统 2026-10-05 19:44:33 +08:00
ba92f5291b test(08-07): align path performance tests and clear prettier gate
- performance.test.ts: drop finder/builder useMapState, inject Dir4FaceHandler, read IPathfindingResult.path length; size matrix and thresholds unchanged
- graph.test.ts: prettier-format injected-fixture helpers
- path focused run 28/28, eslint 0
2026-10-05 18:51:30 +08:00
b62b394ee9 fix(08-07): align path graph/system tests and apply authorized D-10 fixes
- graph.ts: seed start node into mapped set (B1) and restore 174 NaN/negative cost guard (B2)
- graph.test.ts: drop useMapState/DirectionMapper, inject Dir4/Dir8 handlers, reach genuine out-of-map branch and assert 183
- system.test.ts: drop finder.useMapState, inject Dir4FaceHandler, adapt to IPathfindingResult
2026-10-05 18:49:18 +08:00
e024e2d2ea test(08-06): align eventDispatch test to shipped interfaces
- remove obsolete DirectionMapper injection and its module entries (Q2)
- construct MapState with commonState only (single-arg constructor)
- resolve the event layer via shipped GameMap.eventLayer instead of the removed getLayerByAlias
- focused combat+event: 96 passed / 0 failed; eslint clean
2026-10-05 17:26:41 +08:00
71f93a526d test(08-06): align combat tests to shipped interfaces
- remove obsolete addHook(...).load() chains in combat.test.ts (3 sites)
- give the special-query buildup fixtures a no-op global aura so the
  shipped buildupSpecials early-return path reaches the special-query stage
- focused combat: 90 passed / 0 failed; perf: 6 passed
2026-10-05 17:23:55 +08:00
59e190b468 chore: 调整 AI 计划执行不按流程导致的代码问题 2026-10-05 17:15:35 +08:00
58def1809d fix(08-05): expose MapTileBase.restoreDefaultEvents and use it in toStatic
- MapTileBase.restoreDefaultEvents: protected -> public; declare on ITileBase with jsDoc

- MapLayer.toStatic(keepEvent=false): reset reused static tile via restoreDefaultEvents() instead of loadState({})
2026-10-05 16:34:18 +08:00
8d6f851727 test(08-05): align data-base map tests to shipped interfaces
- drop DirectionMapper; new MapState(state); addLayer(alias)+setEventLayer; remove addHook().load()

- align removed getLayerByAlias/getLayerAlias to layerList/alias and setDynamicDirection to tile.setFaceDirection

- dispose stale codes 62/63/64/84/130 per Q1=A; keep 60/61

- tests: expect default events for transferToDynamic(keepEvent=false); setMapList does not dedup
2026-10-05 15:19:56 +08:00
a76137f2a0 fix(08-05): correct map layer region/event logic (D-10 authorized)
- getMapData(x,y,w,h): end index lineStart+nw and buffer width*height (keep out-of-range zero padding)

- toStatic(keepEvent=false): reset reused static tile to default events via loadState({})

- cropPointEvents: reindex by new width; resize/resize2 sync indexer width; resize2 clears point events on same-size reset

- eventView.reset(): clear dirty counter so dirty() returns false after restoring reference
2026-10-05 15:19:37 +08:00
69cec80c6b test(08-04): align data-base hero tests to shipped interfaces
Replay stub route->array; drop addHook().load() chains; ItemStore requires tileStore; item.equip value/percentage as Record; setFloor(IGameMap|null); getItem->addItem. Confirmed production fixes: HeroLocation.setFloor accepts null; HeroEquipment.loadState wraps re-equip in replay disable/revert. Container tests drop rendering/followers. Focused: 114 passed + 1 skipped.
2026-10-04 23:34:49 +08:00
1bfe7080d5 test(08-03): align data-base enemy and flag tests to shipped interfaces
EnemyManager tests use a real TileStore with registered id<->num tiles; drop legacy bridge and *ById helpers (getPrefab/createEnemy take number|string); reusePrefab 2-arg; addPrefab dedupes by code only. Widen IEnemyManager.getPrefab signature to number|string (doc+impl). Flag tests align to loadState rebuilding field instances (d74cc35). Focused: 60/60 green.
2026-10-04 22:17:00 +08:00
70d530d71c test(08-02): align data-common tests to shipped replay/face interfaces
Remove addHook().load() chains; align ReplaySandbox command stubs to ReplayCommandType.Active + ReplayCommandResult; retarget failure assertions to error 72; fix short-string param token base to 32; expect FaceDirection.Unknown for unknown blocks; onRecordCommand index 0; retire utils.test.ts. Confirmed production fix: restore first-step pre-read in ReplaySandbox play()/step() (75a39ad omission). Focused: 147/147 green.
2026-10-04 18:32:21 +08:00
36d8b4fb3c test(08-01): migrate data-layer tests into __test__ dirs
Move 65 *.test.ts + 6 *.perf.ts across data-{common,base,system,state} into sibling __test__/ (data-state/test -> data-state/__test__), incl. fixtures/floors.json and non-test helpers; rewrite Rule A relative specifiers (+1 depth), keep Rule B unchanged; sync script/test-data-node.ts require paths. Gates: test:ci=66 files, test:perf=6 files, eslint clean, zero config/production changes.
2026-10-04 17:34:09 +08:00
109fad3b29 chore: 调整事件系统注释 2026-10-04 15:49:17 +08:00
ce459d9e2d chore: 调整部分错误 2026-10-04 15:44:52 +08:00
75a39ad573 refactor: 被动录像步应当在主动录像步执行期间完成 2026-10-04 15:37:26 +08:00
e25ef3fa93 refactor: combat system 2026-10-03 16:04:20 +08:00
d306d11bce refactor(04-16): 渲染端去单例化第二步(挂载到主类) 2026-10-01 19:15:12 +08:00
2d3287804d refactor: combat flow 2026-09-30 17:54:11 +08:00
bc7d631dc2 feat(04-14): 部分 UI 进一步接口适配·第二步(D-74..D-78)
D-78: main.tsx 状态栏更新改为在 client.hero.attribute 上 addHook({ onUpdateAttribute }) 并在 onUnmounted 注销;移除全局 hook 残留与手工调用垫片。

D-74/D-75: load.tsx 改依新加载系统 client.loader.start() + client.loader.manager.get*;移除旧接口成员与失效 @ts-expect-error。

D-76/D-77: 删除 render/index.tsx 的 restart 注释块、client.ts 两段兼容层注释、entry-client/src/create.ts 被注释接线与模块创建函数块。

仅含五个生产文件与 04-14-SUMMARY.md;未触用户 04-CONTEXT.md 并发改动。
2026-09-30 16:36:19 +08:00
7180649a64 refactor: hook & feat: 勇士属性更新接口 2026-09-30 15:44:29 +08:00
d8fa4b8507 refactor: Delete global loading & hook object 2026-09-30 12:30:42 +08:00
7c155be5ce refactor: map 2026-09-30 00:00:20 +08:00
b262918082 refactor: 地图 MapLayer 2026-09-29 20:21:50 +08:00
122567b050 refactor: hero 2026-09-29 16:41:44 +08:00
bbdea04393 refactor: 地图前半部分 2026-09-28 23:36:54 +08:00
b3ac1d2164 chore: 提示词调整 2026-09-27 14:01:03 +08:00
81e4e98507 refactor(04-12): 桶导出边界修正——shared 单文件化 + 消费者直连 @user/client-base(D-69/D-70) 2026-09-25 14:21:14 +08:00
0b93426d47 refactor(04-11): 渲染端结构性移植——通用渲染资产下沉 @user/client-base(D-58..D-68)
- MOVE:39 个文件由 client-modules/src/render/ 移入 client-base/src/{components,elements,map,layout}/,删除原件
- D-58:新建 client-base/src/shared/(10 常量纯摘取)+ 被移 map 文件 shared 说明符改指 4 处
- D-63:client-base/src/index.ts 新增 5 条桶导出;14 个实现层消费者改指 @user/client-base
- D-66:client-base/package.json 新增 5 条 workspace:* 依赖 + 根 pnpm i(lockfile importer 同步)
- D-59 / D-60 / D-68:10 处架构耦合以带原因 // @ts-expect-error 暂记,不反向引用、不解耦
- D-62:命名一律不变;D-64 ?raw 不处理;D-65 legacy 一律不管
2026-09-24 17:14:43 +08:00
47e71b52ae refactor: EnemyManager 2026-09-24 14:40:38 +08:00
3bc37b596d docs: 修正 types.ts 中关于录像参数的描述 2026-09-23 19:36:10 +08:00
2198734f81 refactor: replay system 2026-09-23 18:25:31 +08:00
9247a8886c feat: 调整录像参数类型的参数类型,10 ~ 31 留空,32 ~ 255 分配给短字符串 2026-09-23 16:26:17 +08:00
1fb92c3976 refactor: data-common/common 2026-09-23 16:04:50 +08:00
523ea6b333 style(04-09): collapse autotile.render call to satisfy prettier 2026-09-23 15:43:59 +08:00
88a21bf740 fix(04-09): complete texture interface adaptation in vertex/renderer
- vertex.ts: updateAutotile calls render; autotile checks use tileType; drop BlockCls import (D-43/D-44)

- renderer.ts: background autotile branches use tileType + render; add TileType import; drop BlockCls import (D-43/D-44)
2026-09-23 15:41:16 +08:00
d90c09f0a7 fix(04-09): adapt map render consumers to new texture interface
- hero.ts: hero texture literal builds tileType: TileType.Unknown (D-45)

- vertex.ts updateMoving: tileType destructure + autotile.render(tile, connection) (D-43/D-44)

- renderer.ts: autotile taken from manager.autotile; drop unused AutotileProcessor import (D-46)
2026-09-23 15:28:50 +08:00
d74cc35c8e feat: Adding should replay flag 2026-09-23 13:09:43 +08:00
7743795948 refactor: Hero equipment system 2026-09-23 13:09:19 +08:00
d36ea69066 refactor: 贴图存储方式 2026-09-22 21:11:21 +08:00
78873d0a27 refactor(04-07): adapt material interfaces (drop big-image, inject state)
- delete MaterialManager big-image implementation (IBigImageReturn import, bigImageStore/bigImageData/bigImageId fields, 5 methods, setDefaultFrame coupling)
- change 7 consumers getIfBigImage -> getTile (door x2, hero x3, renderer, vertex); drop getOffsetPool big-image offset loop
- delete cache.ts legacy big-image path (RenderableDataBase.bigImage, literals, destructuring, enemys special-case, big-image branch, unused enemys decl)
- inject state via constructor into MaterialManager/AutotileProcessor/AssetBuilder/TrackedAssetData (from ClientCore; renderer uses manager.state)
- add MaterialManager.textures (dedicated TextureStore)
- declare @user/data-state in client-base/package.json (lockfile not synced)
2026-09-22 11:52:55 +08:00
4e305e392a refactor(type): material types. 2026-09-21 19:16:33 +08:00
50bd679fad feat: 渲染端配置加载 2026-09-21 10:09:20 +08:00
d65b107819 refactor: 渲染端配置文件 2026-09-20 23:49:27 +08:00
cc434a6c66 refactor: 加载系统重构 2026-09-20 20:53:46 +08:00
d12790280a feat: 完成数据端数据类型的构建 2026-09-20 19:11:43 +08:00
704294f9c3 fix(04-05): forward layer area/block updates via IMapLayerHooks 2026-09-20 16:46:17 +08:00
49d86a2c57 fix(04-05): read hero status via client attribute API 2026-09-20 16:43:05 +08:00
a3f3e90e47 style: hero render 2026-09-20 15:50:42 +08:00
3414233e34 refactor(04-04): align hero renderer with IFaceManager and split hooks
- inject IFaceManager into MapHeroRenderer; degrade/next use Dir4FaceHandler via FaceGroup.Dir4, movement uses hero.mover.faceHandler (Dir8)
- IMapExtensionManager.addHero gains faceManager param; manager.ts forwards it
- split MapHeroHook into MapHeroLocationHook / MapHeroMoverHook; onSetPos unconditional
- handle ObjectMoveType.AnimDir via step.dir
- replace mutate-animate TimingFn with @motajs/animate ExcitationCurve2D in hero.ts
2026-09-19 16:51:55 +08:00
4e649533ee chore: 内部接口改名 2026-09-19 12:33:10 +08:00
ed0b95b1c4 feat: CoreState 配置添加 loadStarter 2026-09-18 20:36:03 +08:00
f5a6ed8cf6 refactor: 加载系统 2026-09-18 20:30:40 +08:00
a3826bfa6a refactor(04-03): rebind hero renderer to IHeroLocation and existing hooks
- manager.ts / types.ts: heroMap, addHero, removeHero keyed by IHeroLocation
- hero.ts: bind IHeroLocation, read getCurrentFaceDirection, use ObjectAnimDirection
- MapHeroHook subscribes IHeroLocationHooks / IObjectMoverHooks with existing member names (D-21)
- IMapHeroRenderer drops the 8 external drive members per D-20; D-18 / D-22 members preserved
- hero.image read converged to one minimal compile bridge annotated for D-18
2026-09-18 15:55:02 +08:00
ae5a956492 chore: 删除 IDirectionMapper,全换成 IFaceHandler 2026-09-18 08:26:57 +08:00
4aaea68b65 refactor: 寻路系统改进 2026-09-17 21:21:08 +08:00
bb1986508a fix(07-15): restore modifier bookkeeping when cloning an attribute
- clone() now binds each cloned modifier to the clone, records its modifierName, mirrors the source save flag and recomputes the attribute, matching addModifier's bookkeeping
- a cloned attribute can enumerate, index and persist its modifiers, and a cloned modifier's setValue notifies the clone
- add the bookkeeping and save-ability regression cases
2026-09-17 20:55:58 +08:00
49116c0784 fix(07-15): reject an expand multiplier of exactly one
- both multiplier checks tighten from < 1 to <= 1, matching warning 149's own text (must be greater than 1)
- an exact multiplier of 1 now warns 149 and falls back to the existing factor 2, so buffer expansion always terminates
- add the multiplier-of-one regression case (two code 149 warnings, 15 appended steps all read back in order)
2026-09-17 20:52:20 +08:00
a7c9f97c94 fix(07-15): drop unencodable replay params instead of a zero-length record
- normalizeParam returns null for an unencodable param value, matching its own jsDoc and the documented discard semantics of normalizeParamList
- the command param count, the bytes actually written and the param cursor stay consistent so later commands keep their correct byte offsets
- add the discard-alignment regression case (count 0, later command bytes intact, read stream aligned)
2026-09-17 20:48:47 +08:00
53f067a0af fix(07-15): compare equipment without rebinding the equipped modifiers
- compareEquip clones each compared item's modifier before adding it to the comparison clone and removes the same clone objects afterwards
- the live attribute's already-bound modifiers never enter the clone and are never unbound
- add the equipped-item diff regression case (both directions, no warning 108, live bookkeeping untouched)
2026-09-17 20:46:10 +08:00
e9e9939bd8 refactor: 删除 data-state 中的 legacy 文件夹 2026-09-17 19:37:30 +08:00
a2a8e6ec35 refactor: ReplaySystem.route -> ReplaySystem.array,修复 disabled 标记在 setReplayArray 中清零可能导致意外记录的问题 2026-09-17 19:18:30 +08:00
3a3a6ac82d refactor: 统一 refreshEnemy 和 refreshEnemyAndClearCache 2026-09-17 19:08:34 +08:00
34ba9e873b fix: 录像 onRecordCommand 钩子参数错误 2026-09-17 19:02:47 +08:00
219ac4991d fix: Flag 系统语义问题 2026-09-17 19:01:46 +08:00
a027b04d14 chore: 清空类型错误 2026-09-17 18:38:29 +08:00
6d7cc2af22 refactor: 删除 legacy-client 2026-09-17 18:30:39 +08:00
12c2943c5e refactor: 删除 legacy-plugin-client 2026-09-17 18:28:06 +08:00
e2e27d9ff2 refactor: 删除 data-fallback 2026-09-17 18:24:07 +08:00
10755475a4 refactor: 删除 legacy-plugin-data 2026-09-17 18:21:35 +08:00
13234b762a fix(07-13): clear existing dynamic tiles before loading
- add private clearDynamics() that snapshots the managed dynamic tiles and drops each via the deleteDynamic semantics (syncStaticEvent + removeTile + onDeleteDynamic), without awaiting the hook
- call it as the first line of loadState so all three compression tiers and the missing-dynamicBlocks case start from a clean slate (#06-17-8)
- add regressions: mapLayer hook/instance witness and the three-tier repeated-load non-accumulation case
2026-09-17 17:27:09 +08:00
c1df1e0116 fix(07-13): prune deleted views and empty sourceless points
- deleteEnemy removes the deleted view from point.affectedBy and drops its point.damages entry so lazy refreshIndex never revisits a dead view (IN-01)
- deleteMapDamage removes the sourcelessDamage IPointInfo once both damages and affectedBy are empty, keeping markDirtyIndex
- add IN-01 regressions: dead-view witness (getDamageWithoutCheck not called) and the two arms of the sourceless empty-point cleanup
2026-09-17 17:23:01 +08:00
cff4291512 fix(07-13): #CR-02 mark removed indexes dirty and register empty view sets
removeEnemyAffecting collects removed coordinate indexes and markDirtyIndex each; refreshEnemyAndClearCache/refreshEnemy register enemyStore.set(view, set) before the empty-set return so later markEnemyDirty uses local refresh instead of refreshAll(). Adds a Chinese comment before each new it.
2026-09-17 16:56:33 +08:00
3e68880e82 fix(07-12): compareEquip 在克隆属性上按对象定位删除目标(Q4 仅修 (i))
- 原属性索引为负或克隆槽位越界时不删除任何修饰器
- 删除目标改为克隆属性同槽位的自身对象,不再跨对象拼接索引
- 回归构造 rebuildModifiers 重建后的负索引路径,含触发机制断言
2026-09-17 16:06:53 +08:00
d8fb6f088c fix(07-12): loadState 用 disable/revert 包裹重新装备(WR-06)
- HeroEquipment.loadState 在重新装备循环外包一层录像禁用窗口,try/finally 保证恢复
- 录像桩补禁用计数语义,读档期间写入的指令被丢弃
- 回归覆盖:读档不产生录像指令、禁用与恢复配对平衡、读档后 equip/unequip 记录仍保留
2026-09-17 16:01:32 +08:00
ab18aa3ec7 fix(07-12): deleteModifierByIndex 委托 deleteModifier(WR-05)
- 按索引取出修饰器后委托 deleteModifier,删除簿记收敛为一份实现
- 返回被删修饰器;索引越界或为负返回 null 且不删除任何修饰器
- 回归覆盖:迭代器产出、索引解析、final 重算、重新挂载、存盘开关清理、越界
2026-09-17 15:56:50 +08:00
762bf2e95c docs(07-12): 记录装备加成事实源契约(WR-04 设计如此,零行为变更)
- types.ts 的 IEquipmentStateSave / IEquipmentState 补充契约注释
- 装备自身数值与百分比加成是事实源,存档持久化这两个表并由其重建装备修饰器
- 跨读档不保留旧修饰器引用属预期;运行时改加成须经装备自身而非改其修饰器
2026-09-17 15:56:26 +08:00
b99d040b11 test(07-12): 对齐空存档 nextUid 重置契约(IN-02,测试专用)
- saveLoad.test.ts 的码 58 用例改写为「空存档 → 随后 add 发号 0 且不产生码 58」
- 用例内注释登记码 58 分支只剩非空畸形数组可达,生产实现保持原样
- equipStore.ts 零改动(生产修复基线 ba60ef9)
2026-09-17 15:54:02 +08:00
ba60ef99eb fix: equipStore 的 nextUid 在空存档下报错 2026-09-17 14:56:56 +08:00
e4d392330c fix(07-11): #06-17-4/5/6 add top-level same-reference integration assertions
- CoreState 三档往返中断言装备实例、flag 字段与 follower 实例跨读档为同一实例
- 同时断言其数值/位置仍等于存档点(同引用不改变恢复结果)
- 新增 registerIdentityEquipment 夹具,既有夹具与断言未改动
2026-09-17 13:57:46 +08:00
78f6796915 fix(07-11): #06-17-6 preserve follower instances across loadState
- HeroFollowersController 新增 restoreFollowers 保留式恢复入口
- 同索引同图块数字原地 loadState 并保留实例;否则替换槽位并按既有语义触发增删钩子
- 存档中不存在的末尾跟随者按存档为准删除
- HeroState.loadState 改用 restoreFollowers,不再 removeAllFollowers 全量重建(保持同步)
- IHeroFollowersController 补声明与 jsDoc;新增同实例/替换/删除/补齐回归用例
2026-09-17 13:53:46 +08:00
9964326210 fix(07-11): #06-17-5 preserve flag field instances across loadState
- FlagSystem.loadState 按 key 复用现有 FlagCommonField 并用 fromStructured 原地写值
- 存档中不存在的字段一律删除(以存档为准)
- IFlagSystem.loadState jsDoc 补写同引用与删除语义
- 新增同实例保真、getOrInsert 复用、结构化值恢复、删除多余字段回归用例
- flag/saveLoad.test.ts 的「重建字段对象」断言按 Q1=A 裁决改为同实例保真
2026-09-17 13:50:09 +08:00
153f4a490a fix(07-11): #06-17-4 preserve equipment instances across loadState
- HeroEquipsStore.loadState 按 uid 复用现有 EquipmentState 原地读档
- 同 uid 但装备图块数字不同时才替换该实例
- 存档中不存在的装备实例一律删除(以存档为准)
- IHeroEquipsStore.loadState jsDoc 补写同引用与删除语义
- 新增同实例保真、删除多余实例、num 不同替换三条回归用例
2026-09-17 13:47:20 +08:00
94ceb50cfe refactor: 存档系统挪至渲染端 2026-09-17 13:29:34 +08:00
7121c93914 test: update replay command assertions after ReplayCode rename
49aacb0 renamed ReplayMoveCommand -> ReplayMove (and siblings); sync the two stale expectations in data-state/src/replay/commands.test.ts (constructor names + core.ts source assertions).
2026-09-17 13:15:30 +08:00
0c6812fcda test(07-10): 末步 set 用例改为断言 paramUsed 的外部可观测偏移
- paramUsed 为私有成员,其正确性只能通过下一条命令参数的写入偏移观测
- 增长与缩短两条末步用例补充参数缓冲区原始字节断言,使「末步起点回退」子缺陷在未修复时可直接失败
2026-09-17 12:59:24 +08:00
5b26539b00 docs(07-10): WR-03 录像参数格式改为类型码只增不改的追加式约定
- 按 Q6=B 不加格式版本字段:array.ts 的类型码表注释写明只增不改约定(新语义必须分配新码,禁止复用),并记录 5/6/7/8 与短字符串基址的一次性重新分配
- types.ts 的 IReplaySystemSave.paramArray 与 IReplayArray.getParamArray jsDoc 同步该约定,并写明不承诺读回旧格式录像
- array.test.ts 新增类型码映射锚定用例(5/6/7/8/9/短字符串基址 9)
- system.ts 无改动(未引入版本字段)
2026-09-17 12:55:50 +08:00
35d4ad6f1c fix(07-10): 编解码自洽 —— bigint 长度字节守卫与参数计数取截断后长度
- WR-01:normalizeParam 的 bigint 分支按长度字节的真实容量(255 字节 = 2^2040)判定,|值| >= 2^2040 触发告警 152 并丢弃该参数;normalizeParamList 过滤被丢弃项,不保留占位
- WR-02:add/insert/set 写入的命令参数计数一律取标准化后的 normalizeParam.length,与 normalizeParamList 的 255 截断一致
- logger.json 的 warn 152 文案改为与真实可表示范围(2^2040 - 1)一致,并写明溢出参数会被忽略
- array.test.ts 新增 bigint 长度字节边界往返、超界丢弃后命令计数/读流对齐、256/300 参数截断计数回归
2026-09-17 12:53:27 +08:00
1f9fb18cf5 fix(07-10): 写入路径越界校验与读流跨读档过期
- insert/delete/set 在 disabled 早退后、任何缓冲读写前校验 index,越界不修改任何缓冲区并告警新码 179(携带操作名/索引/当前长度)
- insert(index === length) 判为合法追加,按 add 语义写入(paramUsed 起、indexArray[length] = paramUsed),insert 合法区间变为 [0, length]
- setReplayArray 在 rebuildIndexArray 后补 expireStreams(),活跃读流跨 ReplaySystem.loadState 标记过期(#06-17-3 / 审计 H)
- types.ts 的 insert/delete/set jsDoc 写明合法区间与越界契约
- logger.json 新增 warn 179(当前最大 warn 码 178 之后)
- array.test.ts 新增 5 条边界回归(含越界前后逐字节不变量);saveLoad.test.ts 新增活跃读流跨读档告警 156 回归
2026-09-17 12:50:45 +08:00
9ae28c68cc fix(07-10): CR-01 ReplayArray.set 索引回退起点与末步终点对齐
- set() 改用 getParamRange(index) 取 [start, end),末步终点取 paramUsed,不再直读未初始化的 indexArray[index + 1]
- 索引回退循环起点由参数字节偏移 paramStart + 1 改为命令索引 index + 1,与 delete() 同口径
- types.ts 的 IReplayArray.set jsDoc 写明允许参数编码长度变化及其后步骤索引平移
- array.test.ts 新增 6 条 CR-01 回归:中间步增长/缩短、末步增长/缩短、读流遍历(IN-03 场景)
2026-09-17 12:42:48 +08:00
fe595b7983 refactor: 存档系统应处于渲染层 2026-09-16 21:54:12 +08:00
49aacb087a refactor: 调整录像命名 2026-09-16 21:51:19 +08:00
513a9c354c fix: 读档的 executor 未执行 2026-09-16 21:44:52 +08:00