Commit Graph

316 Commits

Author SHA1 Message Date
3c59f31e6f test(06-16): add enemy context buildup and hero attribute perf suites
- context.perf.ts: 3 cases (50/200/1000 enemies), fixed 10 global auras + 5 special codes, cached aura topology, one buildup per sample
- attribute.perf.ts: 3 cases (10/100/1000 modifiers over 10 attributes), 1000 recalc rounds per sample via markModifierDirty + getFinalAttribute
- warmup 3 + 20 samples, median/min/p95 via console.table, no assertions
2026-09-16 15:02:57 +08:00
37bf89bc94 test(06-16): add isolated perf channel and critical calculation perf
- vitest.perf.config.ts: include only *.perf.ts, mirror vite.config.ts aliases, 30s timeouts
- package.json: add test:perf script (test/test:ci untouched)
- damage.perf.ts: 3 cases (1000/10000/50000) warmup 3 + 20 samples, no assertions
2026-09-16 14:56:28 +08:00
0224c2e67e docs(07): align replay param type table with the renumbered codes 2026-09-16 13:27:38 +08:00
2f148c900c test(07-08): #06-07-1 bind the event layer in the teleport playback test
- createSmallMapScene returns map (additive; existing callers ignore it)
- target case binds state.pathfinding.finder.useMapLayer(map.eventLayer) after floor activation
- teleport target changed to (2,0) to avoid self-target empty-path early return; asserts x=2/y=0
- un-skip and rename to reflect test-side event layer binding; neutral leading comment
2026-09-16 13:02:46 +08:00
1ff22dd07d feat: 寻路系统接线 2026-09-15 21:28:52 +08:00
95ea6609c6 fix(07-07): #06-09-5 warn code 178 for unloaded save keys
- core.ts loadState: 差集方向改为 loaded.difference(total),178 = 存档出现但未加载的 key
- saveablesRoundTrip.test.ts:322-334 改写为「缺 key 不触发 178、仍触发 177」负向见证并更名
- saveablesRoundTrip.test.ts:337-349 取消 it.skip,承担「多出 key 触发 178」正向见证
2026-09-15 21:10:33 +08:00
9f058650c1 fix(07-06): #06-08-1 keep backward steps on the same axis
- Special 后退分支基准由 getCurrentDirection() 改为 this.faceDirection,避免被本步写入的反方向改写而在多步之间摆动
- 前进分支保持既有 getCurrentDirection() 语义不变
- 同步 IObjectMover.backward jsdoc 与 getCurrentDirection/prepareStep 注释措辞(D-11)
- 取消 mover.test.ts 多步后退用例的 it.skip,断言一字未改(D-10)
2026-09-15 20:57:13 +08:00
620382cc5f fix(07-05): #06-06-1 warn code 128 for an out-of-map dynamic transfer
- transferToDynamic 越界分支由 131 改为 128,对齐两个 transferToStatic* 兄弟分支
- 取消 mapLayer.test.ts 的码 128 用例 skip
2026-09-15 20:45:01 +08:00
3b1b9f1d5c fix(07-05): #06-09-3 restore the dynamic tile num on load
- loadState 先 this.set(save.num),再恢复存档事件
- 取消 saveLoad.test.ts 的 num 恢复用例 skip
2026-09-15 20:43:20 +08:00
2d2855c394 chore(07-04): #06-05-3 annotate the retained 147 skip and close windows 25/26
- D-06: equipment.test.ts code-147 case stays it.skip with a Chinese note that 147 is a reserved code, currently unreachable by design; no production code touched
- WINDOWS.md ids 25/26 marked fixed (open_count 13 -> 11); no new ledger entries
2026-09-15 20:34:03 +08:00
2452711edb fix(07-04): #06-05-2 prefer the first empty named slot
- getCouldEquipSlot tests empty === -1 so the first empty named slot wins instead of always replacing the first match
- un-skip the named-slot empty-preference case; canEquipTo string branch untouched
2026-09-15 20:30:32 +08:00
04943416a5 fix(07-04): #06-05-1 refresh final attributes without modifiers
- recalculateAttribute writes the base value into finalAttribute when no modifier is attached
- un-skip the base-only-change case; catchCalculateProgress is intentionally left untouched
2026-09-15 20:29:27 +08:00
02786047d2 fix(07-04): #06-09-2 deep copy the equipment save snapshot
- saveState returns new Map(this.equips) and [...this.slots] so the snapshot is decoupled from the live state
- un-skip the independent-snapshot and container round-trip cases
2026-09-15 20:27:57 +08:00
e7f341095d fix(07-04): #06-09-1 restore equipment modifiers from split save tables
- loadNoCompression reads value entries from state.value instead of state.percentage
- loadDiff seeds this.value/this.percentage from the item.equip base definition before applying save diffs
- un-skip the four correct-expectation EquipmentState round-trip cases (Low/High percentage, NoCompression value, compressed unchanged value)
2026-09-15 20:26:45 +08:00
40824cc10b fix(07-03): #06-04-4 shift replay params in the insert direction
- Move paramArray bytes to paramStart + length so later steps keep their data
- Move indexArray entries to index + 1 so get(i) sees the inserted step
- Un-skip both insert order cases
2026-09-15 18:50:30 +08:00
45dde1cb1c fix(07-03): #06-04-3 shift param indexes from the command index on delete
- Add a private getParamRange helper using paramUsed as the last-step sentinel
- Roll back indexArray from the command index instead of the param byte offset
- Un-skip the middle-step delete cases
2026-09-15 18:45:31 +08:00
965e002476 fix(07-03): #06-04-2 round-trip multi-byte and negative bigint parameters
- Encode bigint bytes by bit-shift mask instead of the broken accumulator
- Decode the bigint length prefix and payload bytes unsigned
- Encode negative bigint as dedicated type 8 with magnitude payload
- Un-skip the multi-byte and heterogeneous bigint cases, add focused cases
2026-09-15 18:37:21 +08:00
528b8c91a5 fix(07-03): #06-04-1 round-trip negative int64 and renumber param type codes
- Correct the int64 decode multiplier to 2147483648
- Encode negative int64 as dedicated type 5 with magnitude payload
- Shift float/bigint/long-string/short-string type codes to 6/7/9/length+9
- Un-skip the int64 round-trip case and add negative int64 focused cases
2026-09-15 18:35:18 +08:00
b70ccbd5f6 fix(07-02): #06-03-1 resolve the reuse mapping in enemy creation
- createEnemy/createEnemyById now resolve prefabs through internalGetPrefab,
  matching getPrefab/deletePrefab/modifyPrefabAttribute behaviour
- add a Chinese invariant comment above createEnemyById covering all
  code/id prefab entry points
- un-skip the two correct-expectation reuse mapping cases in manager.test.ts
  (assertions unchanged) and sync their Chinese comments
2026-09-15 17:16:44 +08:00
650b96059d fix(07-01): #06-01-3 abandon the battle only when before returns false
- read the before result into proceed and abandon only on falsy, matching the
  ICombatScript.before contract in types.ts
- un-skip the correct-expectation case and correct the three existing cases that
  encoded the inverted semantics (explicit truthy beforeResult, complementary
  truthy-branch assertion, synced FakeScript comment)
2026-09-15 17:02:57 +08:00
24534fbca6 fix(07-01): #06-01-2 clear enemy-sourced map damage on delete
- register viewStore/damageStore reverse indexes when sourced damage is written
  and re-register them after a refreshIndex recompute (route A)
- deleteEnemy now finds and removes the enemy-sourced damage instead of leaving
  stale entries behind
- un-skip the correct-expectation case in mapDamage.test.ts (#06-01-2)
2026-09-15 17:00:44 +08:00
8225ef129c fix(07-01): #06-01-4 reset enemy views before a full buildup
- reset every EnemyView before a full buildup so repeated builds start from
  the base enemy instead of compounding on the previous result
- un-skip the correct-expectation cases in damage.test.ts (#06-01-4) and
  context.test.ts (#06-15-1)
2026-09-15 16:55:36 +08:00
9e96df4c3b fix(07-01): #06-01-1 align critical info with the yielded next value
- move targetInfo assignment into the damage < referenceDamage branch so the
  reported critical info matches the yielded next value
- un-skip the correct-expectation case in damage.test.ts (#06-01-1)
2026-09-15 16:53:50 +08:00
65251f5f42 test(06-15): cover deleteAura via correct-expectation skip and register #06-15-1
- add pplies a global aura after addAura and stops applying it after deleteAura (it.skip, D-05)
- reuse in-file createContextFixture/createEnemy/FakeAura/FakeConverter, no new helpers
- register finding #06-15-1 in 06-TEST-FINDINGS.md (same root cause as #06-01-4)
- unskip-verified: addAura applies (atk 2 -> 5) but deleteAura + buildup stays 5, expected 2
2026-09-15 13:15:51 +08:00
25e8c0662a test(06): normalize CRLF line endings for enemy comparer/special tests 2026-09-15 13:00:04 +08:00
83dc4fdaf6 test(06-14): register blocked delete/insert heterogeneous stream order (G-06-04-C) and map coverage
- add correct-expectation it.skip for the heterogeneous route after delete(1) (anchor #06-04-3)
- add correct-expectation it.skip for the heterogeneous route after insert(2, 9, [true, 5]) (anchor #06-04-4)
- add file-inline expectRouteStream helper (stream-only typed reads with index 1..N and terminal null)
- append the create-or-append 06-14 section to 06-COVERAGE-MAP.md; existing 5 skips unchanged
2026-09-15 11:50:30 +08:00
2cffe3ef6c test(06-14): strengthen stream assertions with types, index progression and expiry (G-06-04-C/B)
- rewrite expectHeterogeneousRead to assert per-param typeof + value, stream index i+1, terminal null and stream.index === length
- add per-param typeof/value and stream.index progression to the sequence and expand stream cases
- add 'expires a read stream after the heterogeneous route is mutated': add() expires the old stream (warn 155) and a fresh stream reads the new 7-step order
2026-09-15 11:47:25 +08:00
8ae4588ba4 test(06-14): verify a heterogeneous route exclusively through a read stream (G-06-04-C/A)
- add file-inline expectParamTyped/expectStepTyped helpers asserting typeof + toBe per parameter
- add a 7-command complex route (param counts 1/2/0/1/4/2/3, boolean/int8/int32/float/bigint/string)
- read it only through createReadStream: per-step command, per-param type/value, index 1..7, terminal null
- add a middle-start variant (createReadStream(3) -> indexes 4..7, createReadStream(6) -> index 7)
2026-09-15 11:44:38 +08:00
992ca9d585 test(06-13): assert all CoreState key states and varied 10-step replay (G-06-09-A/B)
- seedState/mutateState/assertRestored now cover every key state: hero base attrs + modifier final atk + location, flags score/coins/stage, map two blocks + active status, enemy hp/atk, replay steps
- Replay seeded with 10 @system/replay steps mixing Up/Right/Down/Left/Teleport/UseItem/Equip/Unequip and varied param types, asserted per step
- New container test loops flags and replay through CoreState across the three compression tiers
- Append 06-13 create-or-append section to 06-COVERAGE-MAP.md; existing #06-09-1..5 skips unchanged
2026-09-15 11:27:57 +08:00
8a7cda95ae test(06-13): tier map tile save/load across all compressions (G-06-09-B)
- StaticTile covered-event round trip looped over NoCompression/LowCompression/HighCompression
- DynamicTile covered-event round trip looped over the three tiers, keeping the tile num assertion
- Existing #06-09-3 it.skip unchanged
2026-09-15 11:24:08 +08:00
6d7e57ab34 test(06-13): tier hero save/load classes across all compressions (G-06-09-B)
- EquipmentState percentage round trip per tier (NoCompression green; Low/High correct-expectation it.skip anchored #06-09-1)
- HeroItems constant/consumable tables and HeroState attributes/location loop over the three compression tiers
- HeroState container covers HeroLocation/HeroRendering across tiers; HeroEquipment container expectation it.skip anchored #06-09-2
- Existing #06-09-1/#06-09-2 skips unchanged
2026-09-15 11:22:52 +08:00
e2c163899d test(06-12): register blocked four-facing prefab reuse expectation (G-06-03-A)
- add correct-expectation it.skip for four facing codes reusing one prefab
- append 06-12 coverage-gap section to 06-COVERAGE-MAP.md
2026-09-15 10:43:03 +08:00
573402592d test(06-12): register blocked multi-byte bigint/int64 expectation (G-06-04-A) 2026-09-15 10:40:37 +08:00
0a7f25338f test(06-12): cover heterogeneous replay sequence read-back (G-06-04-B) 2026-09-15 10:38:51 +08:00
309f1b1850 test(06-11): cover static-dynamic-move-static full chain (G-06-06-A)
- mapLayer.test.ts: both keepEvent branches verified after a real-timer move,
  with exact event maps, dirty flags, block write-back and dynamic index updates
- 06-COVERAGE-MAP.md: append the 06-11 gap-fill section (create-or-append)
2026-09-15 10:27:59 +08:00
41da613f0b test(06-11): cover coexisting map layers of different z-index (G-06-06-C)
- gameMap.test.ts: three layers at z-index 1/5/9 keep independent block data and
  are judged separately by z-index during compareWith (missing ref marks dirty)
2026-09-15 10:25:17 +08:00
436386ea67 test(06-11): cover multi-slot equipment merge and createMap content generation
- equipment.test.ts: G-06-05-A asserts combined atk/def for weapon+armor and keeps the other slot's modifier after unequip
- mapState.test.ts: G-06-06-B writes/reads block, point event, event layer binding and dirty flag on a createMap floor
2026-09-15 10:23:16 +08:00
f01c23eba0 test(06-10): cover maximum-pipeline single-monster final damage (G-06-07-A)
- drive real MainDamageCalculator over a monster with 10 top-level specials,
  real aura 25, real support 26, common/special query and final effects
- assert one exact {damage,turn} with full per-branch derivation in comments
- add a control asserting the result differs without the support pipeline
- append the 06-10 coverage-map section (create-or-append, no new codes)
2026-09-15 10:10:44 +08:00
ef95cc710f test(06-10): cover combined effects and cross-enemy nested auras
- G-06-01-A: four effect kinds together, assert stage order and final
  atk/def/hp/special on the computed enemy
- G-06-01-B: m1 -> A1 -> m2 -> A2 -> all enemies, assert per-enemy final
  atk plus A1 range boundary via special 21 ownership
2026-09-15 10:06:26 +08:00
fcba44c756 test(06-10): cover multi-source map damage stacking (G-06-01-C)
- add inline createTypedInfo/FakeTypedView/SemanticReducer helpers
- assert separated count and reduced damage/type/extra for sourced+sourced,
  sourceless+sourceless, and mixed multi-source combinations
2026-09-15 10:04:12 +08:00
9f9dd11223 test(06-07): add small-map replay playback and second-recording comparison
- play a recorded small-map route with bounded waiting and recording disabled
- assert a second recording equals the first step-by-step (code and param type/value)
- trigger warn 176 and errors 2001-2008 through the real replay commands
- append 06-07 code coverage map rows and record finding #06-07-1
2026-09-14 21:06:39 +08:00
edd4de34dc test(06-07): add enemy combination stage 2 multi-special and aura pipelines
- combine multiple top-level specials through the real damage calculator
- cover real support recursion, aura base/query combination and stage order
- cover final-effect priority order and damage cache markDirty/deleteEnemy/with
2026-09-14 21:06:29 +08:00
bdeafd5cd2 test(06-07): add enemy damage combination stage 1 baselines
- add real-API single-special damage baselines via EnemyManager prefab
- add real EnemyContext single common aura and single guard aura baselines
- inline synthetic fixtures with no production changes
2026-09-14 20:42:00 +08:00
6d3d4dbaed fix(state): replace removed noRoute with replaySystem disable/revert in hero events 2026-09-14 20:20:20 +08:00
c08f3f8484 fix(replay): enable recording guard; update tests for replay refactor 2026-09-14 20:14:01 +08:00
17d7c8f46a refactor: refactor replay system record. 2026-09-14 19:55:20 +08:00
2ff422a682 test(06): restore suite green after replaySystem wiring change 2026-09-14 19:16:32 +08:00
502d87ba26 test(06-09): cover CoreState top-level saveables round trips
- add data-state/test/saveablesRoundTrip.test.ts: public CoreState.saveState/loadState over 5 saveables x 3 compressions, codes 112/113/177/178
- append 06-09 section to 06-COVERAGE-MAP.md (11 codes, create-or-append)
- register #06-09-1..5 suspected defects and the pre-existing test:ci blocker in 06-TEST-FINDINGS.md
2026-09-14 18:58:01 +08:00
c707c87add test(06-09): cover map, replay and flag save/load round trips
- add map/saveLoad.test.ts: StaticTile/DynamicTile/MapLayer/GameMap/MapState round trips, codes 55/122/124
- add replay/saveLoad.test.ts: ReplayArray and ReplaySystem same-instance round trips
- add flag/saveLoad.test.ts: FlagSystem round trip and separated snapshot
2026-09-14 18:57:51 +08:00
3e29548bfa test(06-09): cover enemy and hero save/load round trips
- add enemy/saveLoad.test.ts: Enemy/special/EnemyManager same-instance round trips across 3 compressions, codes 119/120
- add hero/saveLoad.test.ts: modifier/location/rendering/equipment/equipStore/items/follower/state round trips, codes 58/59
- add 06-SAVE-EXCLUSIONS.md: per-class excluded fields and rationale (D-42)
2026-09-14 18:57:42 +08:00
82205a9dc1 feat: 录像存储 2026-09-14 18:17:37 +08:00
cee843981f feat: 录像记录 & CoreState 存储接口 2026-09-14 18:09:45 +08:00
6699df9eee test(06-08): extend ObjectMover coverage across its public surface (stage 3)
- cover setPos/setFaceDir/setMoveDir/jump/stepFace/forward/backward/speed/face/animDir/push/clear/start
- add controller stop and start-while-moving contract checks with real timers and await onEnd
- mark the multi-step backward case as skipped suspected bug #06-08-1
2026-09-14 17:00:13 +08:00
2cb9bba3ce test(06-08): cover FlagSystem, FaceManager handlers and RoleFaceBinder (stage 2)
- add system.test.ts covering the full FlagSystem public surface and warn code 111
- add faceManager.test.ts covering FaceManager registry plus Dir4/Dir8 handlers
- add face.test.ts covering RoleFaceBinder malloc/bind/query and error codes 43/44
2026-09-14 16:56:17 +08:00
7394a2591c test(06-08): cover common direction utils and MapLocIndexer (stage 1)
- add utils.test.ts covering getFaceMovement/degradeFace/nextFaceDirection/fromDirectionString for all directions
- add indexer.test.ts covering MapLocIndexer coordinate/index round-trip and setWidth stride
2026-09-14 16:51:59 +08:00
235eb1a5c9 test(06-06): cover DynamicTileMover async lifecycle (stage 3)
- mover.test.ts: successful step and layer reindex, cumulative/diagonal movement, warn 126 on an unexpected move code, lifecycle hook order, concurrent start rejection, initial face direction
2026-09-14 16:28:30 +08:00
b971e145e9 test(06-06): cover map registration, layers and dynamic conversion (stage 2)
- mapState.test.ts: createMap/getMap, raw validation codes 60/61/62/63/64, activation, areas, compareWith
- gameMap.test.ts: layer lifecycle, aliases 84, background, event layer 131, dirty, resizeLayer, compareWith
- mapLayer.test.ts: matrix, getMapData 80/81, putMapData 8/9, setMapRef 123, dynamic conversion 127/128/129/130, point events, dirty/compareWith, async doors 46
- eventView extension plus stage 1 files already committed
2026-09-14 16:26:10 +08:00
4cffe90794 test(06-06): cover map tile units and event view (stage 1)
- tile.test.ts: MapTileBase num/raw/set, default-event restore, per-tile event view, pointEvent linkage, setFaceDirection binder mapping
- staticTile.test.ts: num/raw/set/raw-miss/shouldSave/toDynamic
- dynamicTile.test.ts: create warn 143, num/raw/set, setPos, face direction, toStatic/toStaticIfSafe, step, delete
- eventView.test.ts: extend per-priority dirty tracking and duplicate priority warn 136
2026-09-14 16:19:09 +08:00
351111487a test(06-05): cover HeroMover async movement and HeroRendering (stage 3)
- add mover.test.ts: config round-trip, Step/CannotMove/Hit, out-of-bound, terrain bypass, enter/leave order, code 144
- add rendering.test.ts: default alpha, setAlpha hook, hook unload
2026-09-14 15:55:08 +08:00
6d5081abcb test(06-05): cover hero assembly and item/equipment pipeline (stage 2)
- add location/state tests: locator, floor/pos hooks, subsystem assembly, code 116, changeFloor hook order
- add equipment/equipStore/items tests: equip/unequip/replace, compareEquip, instance sorting, item routing, code 146
- add follower tests: add/remove hooks, neighbour links, sync/async gather, code 142
- record suspected bugs #06-05-2/#06-05-3 (named-slot empty check, unreachable code 147) as it.skip
2026-09-14 15:52:32 +08:00
c1781b8102 test(06-05): cover HeroAttribute and hero modifier formulas (stage 1)
- add attribute.test.ts: base/final, priority sort, delete, save flag, clone, codes 108/109
- add modifier.test.ts: value/percentage formulas, default priorities, setValue recompute
- record suspected bug #06-05-1 (no-modifier final value stale) as it.skip
2026-09-14 15:43:59 +08:00
cb9c90abc1 test(06-04): cover ReplaySystem and ReplaySandbox pipeline (stage 3)
- system.test.ts:registerCommand/getCommand、重复注册 163、record + onRecordCommand、沙箱创建/reset、释放与实例独立性
- sandbox.test.ts:step/onStep、失败即停 158、157、notExecuted 175、156、startIndex、play/pause/resume/stop、setSpeed
- 06-COVERAGE-MAP.md 追加 06-04 小节(148–163、175)
- 06-TEST-FINDINGS.md 登记 #06-04-1..4
2026-09-14 15:21:49 +08:00
8832159f8c test(06-04): cover ReplayArray pipeline and replay safety decorators (stage 2)
- 读流/缓冲区组合:createReadStream / setReplayArray / rebuildIndexArray / 位宽切换
- 触发告警码 149 / 150 / 154 / 155
- func.ts 播放安全装饰器:begin/nested/end/detail、ignoreReplay、收集外 end
- 触发告警码 159 / 160 / 161 / 162
- insert 带参数组合按正确预期 it.skip(#06-04-4)
2026-09-14 15:15:14 +08:00
dfe14b12ec test(06-04): add ReplayArray codec and single-operation tests (stage 1)
- 单类型编解码:boolean / 各整数位宽 + 浮点 / bigint / string / 多参数
- 单数组操作:add / insert / delete / set / get 单次读回
- 触发告警码 148 / 151 / 152 / 153
- int64、多字节 bigint、中间步 delete 按正确预期 it.skip(#06-04-1..3)
2026-09-14 15:11:36 +08:00
7012aa49fc test(06-03): cover EnemyManager registry, prefab, reuse and dirty (stage 3)
- registry/attribute defaults incl. error 53 for non-serializable values
- prefab add/get/create/delete/change and reuse mapping reads
- modifyPrefabAttribute callback and index rebuild
- comparer lifecycle: warn 117 on repeat compareWith, warn 118 without comparer
- skip #06-03-1 (createEnemy does not resolve reuse mapping) per D-05
2026-09-14 14:39:41 +08:00
ff752713b9 test(06-03): cover Enemy special CRUD and clone/copyFrom (stage 2)
- enemy.test.ts: addSpecial/get/has/iterate, duplicate warn 96, delete by object/code, clone/copyFrom independence
- special.test.ts: clone value independence and deepEqualsTo code/value rules, NonePropertySpecial clone
2026-09-14 14:35:24 +08:00
965868c219 test(06-03): add Enemy attribute and special unit tests (stage 1)
- enemy.test.ts: attribute get/set/add independence and cloneAttributes deep copy
- special.test.ts: CommonSerializableSpecial value/name/description and NonePropertySpecial units
- fixtures inline, legacy and save/load excluded per D-30/D-32
2026-09-14 14:32:40 +08:00
136a9845d6 test(06): fix lint and type errors in data-layer test files 2026-09-14 14:03:25 +08:00
e72231d9fa test(06-02): close GuardAura converter and capability coverage gap
- add a normal case for GuardAuraConverter.convert (code 26 -> GuardAura)
- assert GuardAura priority/couldApplyBase/couldApplySpecial/range/applySpecial
- keeps D-30 per-public-method coverage symmetric with CommonAura
2026-09-14 13:35:51 +08:00
a9b6e7290c test(06-01): stage 3 integration coverage for combat, damage and map damage
- add D-26 attribute-to-damage linkage and getCalculator coverage in damage.test.ts
- cover markEnemyDirty refresh and unregistered delete in mapDamage.test.ts
- cover off-map handler and standalone computed enemy in combat.test.ts
- register suspected buildup compounding bug as #06-01-4 it.skip with a findings entry
- complete the 06-COVERAGE-MAP.md code rows for 106/107/102/103/104/138/139/140/141
2026-09-14 12:58:46 +08:00
f536901733 test(06-01): stage 2 pipeline coverage for EnemyContext
- cover full buildup aura conversion and one/two-layer nested auras
- assert four-stage order specials -> base -> query -> final with forward-only visibility
- cover local requestRefresh, needTotallyRefresh full fallback, and warn codes 97/98/99/100/101/110
- fill the 06-COVERAGE-MAP.md rows for the stage 2 warning codes
2026-09-14 12:52:29 +08:00
2e4e6d739d test(06-01): stage 1 component-level EnemyContext coverage
- cover every public EnemyContext method (registry, converters, effect registrations, attachments, dirty, lifecycle)
- apply single fake auras over Full/Rect/Manhattan ranges and assert out-of-range enemies stay unchanged
- add shared 06-COVERAGE-MAP.md skeleton with the code -> module -> case header protocol
2026-09-14 12:49:29 +08:00
7b956705d3 test(06-02): cover map damage views, converter and reducer
- Zone/Repulse/Laser/Between/Ambush views: range params, damage info, guards
- MainMapDamageConverter: per-special view order and laser face lookup
- MainMapDamageReducer: sum, max-damage type and catch/repulse union
2026-09-14 09:06:59 +08:00
b36a4ee8a9 test(06-02): cover aura converters and special registration
- CommonAura/CommonAuraConverter: range selection, buff math, capabilities
- GuardAura/GuardAuraConverter: 3x3 range, guard locator registration, own-locator and missing-source no-ops
- registerSpecials: code 0-27 registered once, guard default, name/description generation
2026-09-14 09:05:34 +08:00
5b76cf4dc9 test(06-02): cover damage calculator, final effect and comparer
- MainDamageCalculator: base, defeat, all special branches, guard recursion/warn 137, negative-damage flag, critical limit
- MainEnemyFinalEffect: solid/mimic/unchanged branches and priority
- MainEnemyComparer: base attributes, special count/code/value deep equality
2026-09-14 09:04:23 +08:00
6c8f85a2be test(06-01): cover CombatFlow binding, script ordering and guards
- add combat.test.ts for same-state binding, foreign-state warn 138, script priority sort and duplicate warn 140, guard warns 139/141, awaited script/hook ordering with real timers, and battleComputed delegation
- extend the 06-TEST-FINDINGS.md sink with the #06-01-3 before-return semantics row
2026-09-14 08:51:13 +08:00
484da2db19 test(06-01): cover MapDamage and EnemyContext behavior
- add mapDamage.test.ts for sourceless add/delete, sourced conversion, reduction caching, warns 102/103/104 and the #06-01-2 deleteEnemy finding
- add context.test.ts for the enemy registry (register/lookup/unknown-null/delete/resize/scan) and effect-registry add/remove behavior
- extend the 06-TEST-FINDINGS.md sink with the #06-01-2 row
2026-09-14 08:50:05 +08:00
15f329b61d test(06-01): polyfill Map.getOrInsert in combat test harness
- keep the global Map stub uniform across combat test files so modules using
  getOrInsert/getOrInsertComputed load under Node
2026-09-14 08:49:55 +08:00
59b709e43e test(06-01): prove combat damage context/system via tracer
- add damage.test.ts covering DamageContext/DamageSystem results, handler identity, warns 106/107, cache invalidation, with(hero) and calculateCritical
- declare api-coverage in COVERAGE.md for the test-only phase
- open the shared 06-TEST-FINDINGS.md sink with schema and #06-01-1 finding
2026-09-14 08:45:34 +08:00
c80516deb7 fix(event): 采纳七个内建并修正 touched-jsdoc 门禁
- event.test.ts 与 03-EVENT-CONTRACT.md 同步为七个内建(移除 touchFront/EventTouchFront)

- check-touched-jsdoc 按 dev.md 豁免继承/implements 成员,补充防误删说明

- 刷新 Phase 01-03 验证指纹,三个阶段恢复 passed
2026-09-13 23:38:46 +08:00
aa3c7296c7 chore: 将事件执行标记为 ignoreReplay 2026-09-13 20:52:42 +08:00
b623e8ac98 fix: 勇士事件移动时不应记录录像 2026-09-13 20:42:48 +08:00
0ba70e1a63 docs(event-contract): sync with current built-in names and collection design
- built-in names: setBlock/moveBlock/removeBlock/moveHero/stepHero/touchFront/
  insertEvents/insertEvent (class names Event*)
- removeBlock: static by default, dynamic:true also removes dynamic tiles
- touchFront: steps the hero forward; the mover produces the OnTouch on bump
- GameEventSystem.collectEvent owns source collection; mover enter/leave/hit reuse it
- IBlockEventEnv gains required system and nullable heroFloor; utils.ts keeps only
  getPossibleMap/getPossibleLayer
2026-09-13 20:40:15 +08:00
a66be585d1 feat(event): rework built-ins and centralize trigger collection
- rename deleteBlock -> removeBlock (dynamic tiles need dynamic:true),
  moveHeroStep -> stepHero; touchFront steps forward and lets the mover bump
- GameEventSystem.collectEvent owns point/tile source collection; moverImpl
  enter/leave/hit reuse it with OnEnter/OnLeave/OnTouch
- IBlockEventEnv gains required system field and nullable heroFloor
- MapLayer.removeBlock added and setBlock guarded by inMap; GameMap owns floorId
- IObjectMover.push accepts readonly steps
- update event/eventDispatch tests to the current implementation (fixtures
  supply system, hero location snapshots, renamed registrations)

Verified: data type gate 0 in-scope; vitest 19 files / 112 tests pass; prettier
and eslint clean on touched files.
2026-09-13 20:37:32 +08:00
f0fd2f54a1 refactor(event): class-based built-ins, shared utils, single registration
- rewrite every built-in as EventXxx implements BuiltInFunction<P, E>
  (setBlock/moveBlock/deleteBlock/moveHero/moveHeroStep/touchFront/
  insertEvents/insertEvent), matching the EventSetBlock reference style
- move shared helpers to event/utils.ts (getPossibleMap, getPossibleLayer,
  getEventExecutor, enter/exitEventInsert); utils is not exported via index
- move per-class helpers into private methods (EventTouchFront and
  EventInsertEvents collectInvocations)
- use IObjectMover.push for move sequences instead of manual step calls
- registrations.ts: one createEventRegistrations() writing the eight entries
  in order, categories separated by single-line comments
- remove EventBuiltinName; classes own short string names
- update event tests; core.ts uses createEventRegistrations
2026-09-13 19:17:32 +08:00
a701aa6da9 refactor(anon-tokyo): import embedded workspace package everywhere
- rename all anon-tokyo imports to @motajs/anon-tokyo in data-common,
  data-system and data-state
- declare @motajs/anon-tokyo workspace dependency in data-common and
  data-system; refresh pnpm-lock.yaml
2026-09-13 19:17:21 +08:00
5a05eecad1 wip(event): scaffold EventSetBlock class, utils helpers, anon-tokyo workspace dep
- data-state: add @motajs/anon-tokyo workspace dependency
- map.ts: new EventSetBlock BuiltInFunction class (reference style)
- utils.ts: getPossibleMap/getPossibleLayer helpers (not yet wired)

Checkpoint of user-authored in-progress event refactor.
2026-09-13 19:04:25 +08:00
b86a060759 feat: 移动器新增 push 方法 2026-09-13 19:01:57 +08:00
46a38fa0c6 refactor: 录像系统指令 2026-09-13 16:38:19 +08:00
dd4e66a335 refactor(replay): rewrite remaining commands and register in CoreState
- ReplayUseItemCommand / ReplayEquipCommand / ReplayUnequipCommand now extend
  BaseReplayCommand with fixed numeric params and per-false-position logger
  error codes (2006-2010); string item/slot params removed, autoUnload is a
  required bool.
- remove isNumber/isItem/isBoolean/isSlot/resolveSlot helpers; all logic now
  lives in the command classes.
- drop createReplayCommandItems/registerReplayCommandItems; CoreState owns a
  private registerReplayCommand() registering the eight stable codes directly.
- prune unused replay boundary types from replay/types.ts.
- fix ReplaySandbox: a replay ending on a run of moves now finalizes the
  trailing run through notExecuted (previously the last move never started).
- rewrite commands.test.ts for the base-class design and direct registration.

Verified: data type gate 0 in-scope; vitest 19 files / 112 tests pass; prettier
and eslint clean on touched files.
2026-09-13 15:39:12 +08:00
37bfb77301 refactor(replay): add command base class and rewrite move/teleport
- BaseReplayCommand with name/paramTypes and assertParameter guard
- add optional IReplayCommand.notExecuted for trailing-step finalization
- sandbox invokes previous command notExecuted when the next command differs
- rewrite ReplayMoveCommand (batched step + notExecuted start/await) and ReplayTeleportCommand
- add replay logger error codes 2001-2005 and warn 175

NOTE: command tests still reference the pre-rewrite class names; updated in follow-up.
2026-09-13 15:16:51 +08:00
521413fea4 style(03-19): normalize touched event JSDoc to multiline
- Convert map, hero, event, and registration-assembly function JSDoc
  into multiline form for every touched declaration
- Preserve export-only barrels, class-owned registration order, direct
  Statement[] insertion, hero front-touch ownership, and Chinese event
  test comments
2026-09-12 13:26:13 +08:00
cabee3cc01 style(03-19): normalize touched replay JSDoc to multiline
- Convert replay command, helper, and registry JSDoc into multiline form
- Add declaration-aware script/check-touched-jsdoc.ts scanner that
  inventories constructors as explicit exemptions and fails any other
  touched top-level function or class method without multiline JSDoc
2026-09-12 13:24:06 +08:00
a69130c8ad test(03-18): cover event registration ownership and barrel purity
- Assert the real eight-entry class registry, fresh per-group instances,
  and the three-map/three-hero/two-control ownership split
- Prove every class owns its stable name and function, classes originate
  from their owning modules, and hero owns the front-touch registration
- Verify both event barrels stay export-only while prior public event
  symbols remain reachable from the data-state root index
2026-09-11 23:10:37 +08:00
0dc30aace8 refactor(03-18): move event registration assembly out of the barrel
- Add event/registrations.ts as the sole direct-construction assembler for
  the eight class-based registrations in stable map/hero/control order
- Reduce event/index.ts and data-state/src/index.ts to export-only barrels
  that re-export the four public registration creators
- Point CoreState at event/registrations and record the ownership and
  public-export boundaries in the event contract
2026-09-11 23:02:15 +08:00
cb716f699e refactor(03-18): own event registrations as explicit classes
- Replace generic per-invocation registration factories with explicit
  SetBlock/MoveBlock/DeleteBlock, MoveHero/MoveHeroStep/TouchFront, and
  InsertEvents/InsertEvent registration classes
- Move eventTouchFront, invocation collection, and target resolution into
  the hero event layer while keeping awaited OnTouch behavior
- Keep map and control modules limited to their own registration ownership
2026-09-11 22:59:16 +08:00
febdcdc967 refactor: align state system replay and path contracts 2026-09-11 22:36:09 +08:00
4bd6a463d6 test(03-17): cover replay registry construction
- Assert direct stable registry construction
- Guard against formatter suppressions and duplicate directional classes
- Retain deferred movement and pathfinding ordering coverage
2026-09-11 22:22:21 +08:00
df7d1e12c2 fix(03-17): await replay movement completion
- Remove replay-safety decoration from command implementations
- Await directional and pathfinding controller completion
- Collapse directional commands into one parameterized class
2026-09-11 22:21:01 +08:00
4e318e6ce1 refactor(03-15): order replay class internals consistently
- Keep private command actions before their execute callers per project conventions
2026-09-11 14:32:20 +08:00