0.2.5-dev: merge claude/036-sim
# Conflicts: # CHANGELOG.md # docs/history/0.2.5.md # test/golden/matches.json
This commit is contained in:
commit
3dd2213e47
42 files changed
+2335
-961
No files matched your search
@@ -521,3 +521,186 @@ level-6 offers match the previous roll, including the one that shows the tier-6
|
||||
allowed. The digest records
|
||||
shop draws, fielded pieces, board hashes and the rng state, not an untaken reward card, so the stored scenario does
|
||||
not move. The release-relative total against 0.2.4 stays 46.
|
||||
|
||||
### 30.17 Funnel normal attacks keep a body hit
|
||||
|
||||
PR #537 by @Xinglan233. [PRTS 分支特性信息 驭械术师](https://prts.wiki/w/分支特性信息/data) says a drone that has not
|
||||
been released by a skill deals additional damage on top of the operator's attack: 20 % ATK at first, +15 on the same
|
||||
target, cap 110 %. A skill-released drone deals skill damage.
|
||||
|
||||
The profession used to return that ramp as the whole normal-attack multiplier, so the body hit was missing.
|
||||
`resolveHit` now keeps a 100 % ATK body instance and separate drone instances. `funnelMul` holds only the drone ramp;
|
||||
an attack's `dmgMul` (至简's talent) is applied once to both. Extra attached drones raise `hits`, not the body count.
|
||||
至简's charged S2 sets `funnelBodyHits`, so two body hits and two additions share one ramp step. Both share one
|
||||
`attackId` and one attack hook; only the body is `isAttack`. Additions carry `addition` and `funnel` and are not also
|
||||
emitted as a normal attack.
|
||||
|
||||
[ASSUMED] Body instances precede additions at the existing projectile impact, and a multi-hit volley takes one ramp
|
||||
step. Ordinary attacks and any skill that only buffs or retargets the normal attack keep the body. `info.isSkill` is
|
||||
not the switch: every attack or targeting override sets it. `funnelBodyHits === 0` means the attack is drone-only
|
||||
(the ramp stays inside those hits and no body is added). 荒芜拉普兰德 S2 sets that. 至简 S2 sets `funnelBodyHits`
|
||||
to two, so two body hits and two additions still share one ramp step.
|
||||
|
||||
耶拉 S2, base and hidden, follows the 洛洛 S2 split. `skchr_kjera_2` (docs/research/03-operators.md) says 自身与浮游单元
|
||||
攻击, and the lock lasts until the enemy dies or the skill ends. While it runs, `funnelMul` is detached, so her own
|
||||
shot is one 100 % `isAttack` hit inside her range and the unreleased addition is off. `1 + attack@cnt` drones tick
|
||||
on their own (`kjera:drone`, arts, `isSkill`, not `isAttack`) and may stay outside her range. Cold is rolled once
|
||||
on the body and once on each drone hit. Ending the skill restores the multiplier.
|
||||
|
||||
[ASSUMED] Those released drones use the trait ramp (20 % → +15 % on the same target → the cap). Her blackboard has
|
||||
no drone scale; the branch page gives that ramp to drones that were not released. The base form continues its
|
||||
per-target ramp, and two drones on one enemy in the same tick take one step. That map is written back when the skill
|
||||
ends. The hidden form restarts each drone at the initial scale, and those scales are not written back onto the single
|
||||
trait ramp. There is no flight delay. A lock that can no longer be targeted is dropped and the drone retargets. Stun
|
||||
and disarm do not pause the released drones. An in-flight shot from before the skill can still step the live ramp;
|
||||
the skill keeps its own copy, and a shot that lands after the skill ends can step the restored ramp.
|
||||
|
||||
[ASSUMED] 荒芜拉普兰德 S1 says 释放浮游单元 and does not say she stops attacking. The toggle is read as a retarget of
|
||||
the unreleased attack: one body hit plus the two additions, at the raised ATK. A 洛洛-style release is not used.
|
||||
澄闪's skills and 荒芜拉普兰德 S3 stay on their own `dealDamage` paths. 澄闪 S3 and the skill-drone simulator on
|
||||
淬羽 are unchanged.
|
||||
|
||||
Kits that stored the ramp on `dmgMul` (至简, both 耶拉 forms, 澄闪 S2) now store it on `funnelMul`.
|
||||
|
||||
Tests: `test/sim/funnel-body.test.js`, and the funnel cases in `kits_t3`, `kits_t4`, `kits_t6`, `kits_alt_t6`,
|
||||
`kits_alt_t2` and `op_gdglow`. The golden moves from this correction, measured against the candidate after §30.22,
|
||||
are §30.23.
|
||||
|
||||
### 30.18 Redeploy resets the drone ramp
|
||||
|
||||
PR #536 by @Xinglan233. The same branch page says that changing target, or redeploying the operator, restores the
|
||||
drone damage to its initial value at once.
|
||||
|
||||
`installFunnel` resets `funnelTarget`, `funnelScale` and the per-target `funnelMap` (耶拉 / 至简) on a normal
|
||||
deployment, including automatic revival against the same living target. A free move (`moveRedeploy`, the same carry
|
||||
as a 秘术师's stored energy and 乌尔比安 S3) keeps the ramp. An in-flight drone still applies the ramp it computes on
|
||||
impact, so a shot launched before the reset can step the new ramp. That limit is documented and not changed.
|
||||
|
||||
Tests: `test/sim/funnel-redeploy.test.js`, `test/match/funnel-redeploy.test.js`.
|
||||
|
||||
### 30.19 洛洛 S2 keeps its lock outside her range
|
||||
|
||||
PR #535 by @Xinglan233. The official skill table `skchr_rockr_2`, as recorded in `docs/research/03-operators.md`,
|
||||
says the released drone stays locked until the enemy is killed or the skill ends, then returns. Leaving her attack
|
||||
range is not a return condition. The branch page says a skill-released drone deals skill damage, and that additional
|
||||
damage belongs to drones that were not released.
|
||||
|
||||
S2 now runs one independent skill tick (`rockr:drone`, one drone at both ranks). While the skill is up the trait
|
||||
multiplier is detached, so new body shots are ordinary attacks and the unreleased addition is off. The drone's hits
|
||||
are arts skill damage (`isSkill`, not `isAttack`). It inherits the trait ramp on its own copy, so an older projectile
|
||||
cannot change that ramp. A living selectable lock stays valid outside the body's range. Ending the skill writes the
|
||||
ramp back and restores the multiplier and the overload cap. S1 and other operators' funnel attacks keep their
|
||||
existing paths. 立于磐石 is unchanged.
|
||||
|
||||
[ASSUMED] There is no flight delay. A lock that becomes untargetable is dropped and the drone retargets. Body control
|
||||
(stun and the like) does not pause the released drone.
|
||||
|
||||
Tests: `test/content/rockrock-s2-lock.test.js`, and the 洛洛 case in `kits_t1t2`.
|
||||
|
||||
### 30.20 Hit tiles use half-even rounding
|
||||
|
||||
PR #520 by @Cloudnyco. PRTS 作战机制 (oldid 433935, 「碰撞体积与位置识别」) says the struck unit's coordinates are
|
||||
rounded half to even (四舍六入五成双) onto the tile they occupy. `Math.round` sends an exact .5 toward +∞, so an enemy
|
||||
held on an outer half-tile was indexed off the board and dropped from the hit index.
|
||||
|
||||
`roundHalfEven` is used for hit tiles only: `body.js` `posKey`, the point cases of `bodyOnTile` and `bodyTileReach`,
|
||||
the point-enemy index in `battle/queries.js`, and `targeting.js` `tileKeyOf`. Movement, knockback, `ai.js`, a unit's
|
||||
standing tile for range keys, and `onFrontLine` still use `Math.round`. #519's signed-zero case in `powi` was already
|
||||
on this candidate and is left as it is.
|
||||
|
||||
[ASSUMED] `FIELD_EDGE_INSET` = 1/1048576 pulls a clamped enemy just inside the outer half-tile, so half-even rounding
|
||||
keeps it on the edge tile. An inset of 1/1024 was rejected because it moved unbalance steps. The inset has no
|
||||
official source.
|
||||
|
||||
Tests: `test/sim/hit-tile-round.test.js`, `test/sim/detmath.test.js`, the edge landing in
|
||||
`feedback5-raid-own-board`, the 连星 probe in `op_wang`, and the 麦哲伦 probe in `feedback5-wv-summon-triggers`.
|
||||
|
||||
### 30.21 Bots soft-reserve a living teammate's opening bonds
|
||||
|
||||
PR #518 by @IceCodeNew, for issue #514. This is not an official rule. It extends the accepted #407 card penalty.
|
||||
|
||||
Opening-band choice and focus planning used to ignore a living teammate's selected strategy until someone from it was
|
||||
deployed, so a bot could take that faction's high cards. A living teammate's strategy now soft-reserves its bonds for
|
||||
both choices, before any member is deployed. The reservation ends when that teammate is eliminated (`alivePlayers`).
|
||||
It does not hard-exclude a strategy, reserve stock, or stop an immediate merge. A reserved band's draw weight is a
|
||||
quarter of its unreserved weight (`SOFT_BAND_RESERVE` = 0.25) and stays above zero, so the strategy can still be
|
||||
drawn. Focus planning applies the existing −6 teammate penalty to those bonds as well. Mode-inactive bonds stay
|
||||
weight 0 (DESIGN §21.26). A solo match has no teammate to reserve against. The shared-pool −18 card penalty is
|
||||
unchanged, and a stronger merge can still win it.
|
||||
|
||||
[ASSUMED] The quarter weight is a project choice. The PR text called the reservation soft; its diff hard-zeroed the
|
||||
weight. This candidate follows the text. The reservation is equal for human and AI teammates.
|
||||
|
||||
Tests: the two `#514` cases in `test/match/bot-smarter.test.js`. One proves the focus leaves the reserved bond while
|
||||
the teammate lives and returns after elimination. The other proves a reserved strategy is still drawn, and drawn more
|
||||
often once that teammate is eliminated. The existing card test still shows a merge outscoring the −18 penalty.
|
||||
|
||||
### 30.22 Golden changes after the funnel, hit-tile and bot-reservation ports
|
||||
|
||||
All 287 scenarios were recomputed once after §30.17–§30.21 and compared with this candidate before those ports
|
||||
(`HEAD` `7fd0478d`, `git show HEAD:test/golden/*.json`). No scenario was added or removed. 43 digests differ from
|
||||
that candidate. They are additional to §30.9 and §30.16.
|
||||
|
||||
Against released 0.2.4 the total is now 64. Of the previous 45, 21 are byte-for-byte the digests already on this
|
||||
candidate and are not repeated below: `roster-011`, `roster-012`, `roster-013`, `roster-032`, `roster-033`,
|
||||
`roster-034`, `roster-039`, `roster-040`, `roster-043`, `bond-maniShip-high`, `bond-yanShip-low`,
|
||||
`boss-boss_2-pair`, `boss-boss_5-solo`, `hidden-boss_8-pair`, `hidden-boss_9-solo`, `solo-NORMAL-2`,
|
||||
`coop2-NORMAL-3`, `solo-HARD-9-boosted`, `coop2-ABYSS-10-boosted`, `standin-06`, `standin-07`. The other 24 of
|
||||
those 45 moved again, and 19 scenarios that still matched 0.2.4 on this candidate now differ.
|
||||
|
||||
Opening strategy ids do not change in any of the 20 match digests. A solo match has no teammate, so §30.21 cannot
|
||||
move one. Co-op seeds keep the same `bandId` and the same bot-draw counts except `coop4-ABYSS-7`. The recorded
|
||||
match moves are battle totals from §30.17–§30.20, and the later gold and LP those totals change. No isolated
|
||||
counterfactual was re-run; the groups below follow who is actually on the board.
|
||||
|
||||
| Cause | Changed scenarios |
|
||||
|---|---|
|
||||
| Funnel body hit plus redeploy reset, and 洛洛 S2's independent lock (§30.17–§30.19). These boards include 洛洛 | `roster-004`, `roster-005`, `roster-023`, `roster-024`, `bond-victoriaShip-low`, `bond-victoriaShip-high` |
|
||||
| Funnel body hit plus redeploy reset (§30.17–§30.18). 至简 and/or 耶拉, not 洛洛 | `roster-007`, `roster-009`, `roster-026`, `roster-028`, `bond-deputShip-low`, `bond-emptyShip-low`, `bond-kjeragShip-high`, `bond-maniShip-low`, `bond-miraShip-low`, `bond-sargonShip-high`, `bond-soloShip-low`, `bond-visiShip-low` |
|
||||
| Same body hit and redeploy reset on 荒芜拉普兰德 | `roster-017`, `roster-019`, `roster-036`, `roster-046`, `roster-047`, `boss-boss_3-pair`, `boss-boss_5-pair`, `boss-boss_7-pair`, `hidden-boss_9-pair` |
|
||||
| 澄闪 DIY: the normal attack is a body hit plus one drone addition (§30.17) | `diy-098`, `diy-099` |
|
||||
| Hit-tile half-even rounding and the edge inset (§30.20). No funnel operator is deployed; the damage total stays 1388100 and the hook counts and the snapshot sample at index 27 move | `standin-04` |
|
||||
| Full matches. Opening bands are unchanged. Final lineups include a funnel operator, except `coop2-HARD-4` (both seats eliminated, lineup empty) and `coop3-ABYSS-5` (the surviving lineup has none), whose first divergence is round 7 and round 5; those two are the hit-tile change, or a funnel operator who is not left in the stored lineup | `solo-FUNNY-1`, `solo-FUNNY-2`, `solo-NORMAL-1`, `solo-HARD-1`, `solo-ABYSS-1`, `coop2-HARD-4`, `coop2-NORMAL-1-coverage-standins`, `coop2-NORMAL-5-coverage-diy`, `coop2-NORMAL-8-serverrun`, `coop2-NORMAL-70-diy`, `coop3-ABYSS-5`, `coop4-FUNNY-6`, `coop4-ABYSS-7` |
|
||||
|
||||
Result flips inside that match list: `solo-NORMAL-1` defeat → victory (team LP 0 → 2); `solo-FUNNY-1` team LP 15 → 23
|
||||
and `solo-FUNNY-2` team LP 8 → 23, both still victories, with every settled round row unchanged; `coop2-NORMAL-8-serverrun`
|
||||
team LP 26 → 27; `coop4-ABYSS-7` eliminated at round 12 → defeat at round 13, and its shop and bot draw counts change.
|
||||
The other matches keep the same end reason. `standin-04` is the only battle in this set with no funnel operator on
|
||||
the board.
|
||||
|
||||
### 30.23 Golden changes after the skill-only funnel body correction
|
||||
|
||||
All 287 scenarios were recomputed after the §30.17 correction (a skill that only buffs or retargets keeps the body;
|
||||
耶拉 S2 uses the 洛洛 split) and compared with this candidate after §30.22 (`HEAD` `e0f37718`,
|
||||
`git show HEAD:test/golden/*.json`). No scenario was added or removed. `fields`, `standins` and `diy` are unchanged
|
||||
(澄闪 stays on `dealDamage`). 19 digests differ. They are additional to §30.9, §30.16 and §30.22. Seventeen of them
|
||||
already moved in §30.22 and move again. `roster-038` and `coop2-NORMAL-14-standins` did not move in §30.22.
|
||||
|
||||
Opening strategy ids do not change in any of the 20 match digests. No isolated counterfactual was re-run. The roster
|
||||
and bond rows name the skill index the corpus assigns: 耶拉 index 1 is 心随意动, 荒芜拉普兰德 index 0 is 慵怠者悲鸣.
|
||||
至简 is on two of those roster boards at index 1; her S2 already kept two body hits, and her totals move because the
|
||||
fight around 耶拉 changed.
|
||||
|
||||
| Cause | Changed scenarios |
|
||||
|---|---|
|
||||
| 耶拉 S2, base form, skill index 1. `roster-007` also fields 至简 S2 | `roster-007`, `roster-009` |
|
||||
| 耶拉 S2, skill index 1. No 荒芜拉普兰德 on the board | `bond-emptyShip-low`, `bond-kjeragShip-high`, `bond-miraShip-low`, `bond-soloShip-low` |
|
||||
| 荒芜拉普兰德 S1, skill index 0. The toggle keeps one body hit and both unreleased additions | `roster-036`, `roster-038` |
|
||||
|
||||
Battle-total flips in that table: `roster-007` killed 132 → 137, leaks 41 → 37, coins 4 → 6, deaths 11 → 10, damage
|
||||
234357 → 243212 (耶拉's own damage 9204 → 17443; 至简 8936 → 9558). `roster-009` keeps the same kills and leaks;
|
||||
耶拉's damage 2 → 3 and 至简's kills 28 → 29, damage 7594 → 7168. `roster-036` killed 75 → 76, leaks 55 → 54,
|
||||
damage 1160465 → 1189341 (荒芜拉普兰德 60604 → 99946, kills 2 → 3). `roster-038` damage 3467641 → 3468742
|
||||
(荒芜拉普兰德 kills 4 → 14, damage 106163 → 187571). The four bonds keep the same kills and leaks. `bond-emptyShip-low`
|
||||
healing 381 → 362; 耶拉's damage 6585 → 11450 (kills 1 → 3), `bond-kjeragShip-high` 6927 → 16312,
|
||||
`bond-miraShip-low` 10165 → 18617 (kills 2 → 4), `bond-soloShip-low` 1963 → 2764.
|
||||
|
||||
Match end and the final lineup. A bot's chosen skill is not stored. Where the final lineup still contains 耶拉, her
|
||||
default skill is S2, which is the skill this correction changes.
|
||||
|
||||
| Final lineup | Changed scenarios and the recorded end |
|
||||
|---|---|
|
||||
| 耶拉, lineup unchanged | `solo-FUNNY-1` (`3_20_b`): victory, team LP 23 → 27; only round 8's bond layers move (steadShip 34 → 35). `solo-FUNNY-2` (`3_20_a`): victory, team LP 23 → 29; all eight stored round rows are identical, so the LP change is the boss round. `solo-NORMAL-1` (`3_20_b`): victory, team LP 2 → 11; first divergence round 10 (kjeragShip 13 → 14). `solo-HARD-1` (`3_20_a` and 至简 `3_13_a`): still a defeat, team LP 0, boss pool 215042 → 212054; first divergence round 8, the board hash. `coop2-NORMAL-8-serverrun` (ai_1 `3_20_a`): victory, team LP 27 → 37 (ai_0 LP 10 → 19, ai_1 LP 17 → 18); first divergence round 8, ai_1 killed 22 → 23, leaks 1 → 0. `coop2-NORMAL-5-coverage-diy` (ai_0 `3_20_a`): victory, team LP 33 → 34 (h_0 LP 27 → 28); first divergence round 13, ai_0's board hash, killed 26 → 21, leaks 17 → 22 |
|
||||
| 耶拉 was on the pre-change lineup; that seat is then eliminated and the stored lineup is empty | `solo-ABYSS-1`: defeat at round 13 → eliminated at round 12, team LP 0 → null. The pre-change lineup had 耶拉 `3_20_a` and 至简 `3_13_a`. First divergence round 8: LP 27 → 18, killed 19 → 10, leaks 0 → 9. `coop4-ABYSS-7`: still a defeat at round 13, team LP 0, boss pool 4821366 → 3417504. ai_1 is eliminated at round 13; the pre-change lineup had 至简 `3_13_a` and 耶拉 `3_20_a`. First divergence round 8: ai_1 LP 19 → 20, killed 2 → 3, leaks 7 → 6. ai_0's lineup also changes and has no funnel chess id before or after |
|
||||
| 耶拉 plus other funnel operators, lineup unchanged, same victory and the same team LP 130 | `coop4-FUNNY-6`: ai_0 耶拉 `3_20_a`, ai_1 荒芜拉普兰德 `6_18_a`, ai_3 洛洛 `2_10_a`. First divergence round 11, ai_0's kjeragShip layers 26 → 23 |
|
||||
| No 耶拉 on the final lineup. The diverging round's pieces and skill choice are not stored | `coop2-NORMAL-1-coverage-standins`: still a defeat, team LP 0, boss pool 25040 unchanged. ai_0's final lineup includes 荒芜拉普兰德 `6_18_a`. First divergence round 7, the other seat's miraShip layer 5 → 6. `coop2-NORMAL-14-standins`: victory, team LP 31 → 40 (ai_0 LP 13 → 22). Neither final lineup contains a funnel chess id. First divergence round 10 bond layers (raidShip 26 → 28, steadShip 16 → 18); that round's board hash is unchanged |
|
||||
Reference in new issue
Block a user