From cfd3c672816a58ed9445ea0699cbb73840087336 Mon Sep 17 00:00:00 2001 From: sganggs Date: Wed, 7 Oct 2026 17:09:39 +0800 Subject: [PATCH] =?UTF-8?q?feedback6=20R21A:=20a=20=E7=AA=81=E8=A2=AD=20me?= =?UTF-8?q?mber=20may=20land=20on=20a=20teammate's=20half=20when=20both=20?= =?UTF-8?q?halves=20of=20the=20field=20are=20taken=20=E2=80=94=20the=20two?= =?UTF-8?q?-helper=20=E8=81=94=E9=98=B2=20field=20and=20the=20Final=20Assa?= =?UTF-8?q?ult=20/=20Hidden=20Core=20pair=20field=20(the=20owner's=20decis?= =?UTF-8?q?ion=20of=202026-10-07):=20Battle.onFieldBoard=20(onOwnBoard=20o?= =?UTF-8?q?f=20any=20player=20of=20the=20battle)=20read=20by=20raidTile=20?= =?UTF-8?q?only;=20a=20lone=20=E8=81=94=E9=98=B2=20helper's=20empty=20half?= =?UTF-8?q?,=20a=20solo=20boss=20field's=20other=20half=20and=20the=20hand?= =?UTF-8?q?=20/=20=E4=B8=B4=E6=97=B6=E6=95=B4=E5=A4=87=E5=8C=BA=20rows=20s?= =?UTF-8?q?tay=20closed,=20every=20other=20landing=20rule=20kept,=20?= =?UTF-8?q?=E4=B9=8C=E5=B0=94=E6=AF=94=E5=AE=89's=20S3=20=E3=80=90?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E3=80=91=20keeps=20onOwnBoard;=20golden:=208?= =?UTF-8?q?=20moved,=20each=20parting=20from=20the=20parent=20at=20a=20mem?= =?UTF-8?q?ber's=20first=20landing=20on=20its=20teammate's=20half=20(check?= =?UTF-8?q?ed=20tick=20by=20tick=20with=20the=20parent=20instrumented)=20?= =?UTF-8?q?=E2=80=94=20fields=20boss-boss=5F2=20/=203=20/=204=20/=205=20/?= =?UTF-8?q?=206-pair=20and=20hidden-boss=5F8=20/=2010-pair=20(the=20right?= =?UTF-8?q?=20player's=20=E7=BC=84=E9=BB=98=E5=BE=B7=E5=85=8B=E8=90=A8?= =?UTF-8?q?=E6=96=AF=20/=20=E4=BC=8A=E5=86=85=E4=B8=9D=20/=20=E4=BB=87?= =?UTF-8?q?=E7=99=BD=20/=20=E8=80=80=E9=AA=91=E5=A3=AB=E4=B8=B4=E5=85=89?= =?UTF-8?q?=20on=20the=20left=20player's=20half,=201=E2=80=937=20landings?= =?UTF-8?q?=20per=20battle,=20the=20first=200.3=E2=80=9339.8=20s=20in),=20?= =?UTF-8?q?matches=20coop4-ABYSS-7=20(round=206's=20two-helper=20=E8=81=94?= =?UTF-8?q?=E9=98=B2:=20ai=5F2's=20=E6=96=AF=E5=8D=A1=E8=92=82=20on=20ai?= =?UTF-8?q?=5F1's=20half=20at=2052=20s;=20only=20ai=5F1=20/=20ai=5F2=20dmg?= =?UTF-8?q?Dealt=20move,=208263=20between=20them);=20unite-2=20unchanged?= =?UTF-8?q?=20(its=20two=20landings=20stay=20on=20their=20own=20half)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tests: test/sim/feedback5-raid-own-board.test.js — the pair field (the right player's member onto the left telin's board tile (2,3), the left player's onto the mirrored right (2,17), the hand rows closed) and the two-helper 联防 (each helper onto the other's half; 乌尔比安 beside a teammate stays on his own) fail on the parent; the solo boss field's hand rows and the lone helper unchanged. Docs: docs/history/0.2.1.md (new, §26; §26.1 cites the owner's decision and PRTS 卫戍协议/帮助 §联防阶段), the DESIGN index row and versions line, a pointer from §25.18.1, docs/SIM.md (onFieldBoard; onOwnBoard now 乌尔比安's only). --- docs/DESIGN.md | 3 +- docs/SIM.md | 3 +- docs/history/0.2.0.md | 4 + docs/history/0.2.1.md | 46 ++ server/sim/battle/players.js | 18 +- server/sim/content/bonds/addon/battle.js | 18 +- .../content/kits/ops/chess_char_5_05-ulpia.js | 8 +- test/golden/fields.json | 707 +++++++++--------- test/golden/matches.json | 4 +- test/sim/facing-invariance.test.js | 5 +- test/sim/feedback5-raid-own-board.test.js | 85 ++- 11 files changed, 507 insertions(+), 394 deletions(-) create mode 100644 docs/history/0.2.1.md diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 4eb1c70b..15759813 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -4,7 +4,7 @@ This is the **single source of truth** for every implementer. Research lives in Language: player-facing text is **Simplified Chinese** by default, with an English switch since 0.2.0 (§25.2, docs/I18N.md: UI strings through `t('中文')`, game texts from the official Chinese data or the official EN client's). Code, comments and identifiers are English. -Versions: the first public release was **0.1.0** (2026-10-02, the state of §0–§20.15); the releases after it add the player feedback and GitHub reports — 0.1.1 §21, 0.1.2 §22, 0.1.3 §23, 0.1.4 §24 — and **0.2.0** (`package.json`, `shared/constants.js APP_VERSION`; `CHANGELOG.md`) the maintainability refactor, two languages, 补位, 自选编队 and their fidelity work — §25 — and is the state described by this document. The labels v1 / v2 / v2.1–v2.5.2 in §0, §14–§20 and in the BALANCE / SIM comparisons name the design generations and the private playtest builds that came before it; they are kept as history. +Versions: the first public release was **0.1.0** (2026-10-02, the state of §0–§20.15); the releases after it add the player feedback and GitHub reports — 0.1.1 §21, 0.1.2 §22, 0.1.3 §23, 0.1.4 §24 — and **0.2.0** (2026-10-07; `CHANGELOG.md`) the maintainability refactor, two languages, 补位, 自选编队 and their fidelity work — §25. The 0.2.1 dev line (`package.json`, `shared/constants.js APP_VERSION`: `0.2.1-dev`) adds §26 and is the state described by this document. The labels v1 / v2 / v2.1–v2.5.2 in §0, §14–§20 and in the BALANCE / SIM comparisons name the design generations and the private playtest builds that came before it; they are kept as history. --- @@ -32,3 +32,4 @@ normative lines it rewrote). | §23 | [history/0.1.3.md](history/0.1.3.md) | 0.1.3 — community reports after 0.1.2 | | §24 | [history/0.1.4.md](history/0.1.4.md) | 0.1.4 — community reports after 0.1.3 | | §25 | [history/0.2.0.md](history/0.2.0.md) | 0.2.0 | +| §26 | [history/0.2.1.md](history/0.2.1.md) | 0.2.1 — after the 0.2.0 release | diff --git a/docs/SIM.md b/docs/SIM.md index cf39ca95..0d0d6f59 100644 --- a/docs/SIM.md +++ b/docs/SIM.md @@ -842,7 +842,8 @@ instance) and skip `'counter'` / `'reflect'` damage. When the guard trips, the l | `addLayers(playerId, bondId, n, reason, {source})`, `addCoins(playerId, n)` | layers are a no-op when `flags.layerGainsEnabled` is false (unite/boss); a gain adds at most the room left under `BOND_LAYER_CAP` (999, shared/constants.js `layerGainRoom`: the client's `AddBondCount` min(L + n, 999)) on the live copy — or, without one, on the battle's own gains — and returns what it added (0 at the cap: no hook, no event) | | `getPlayer(playerId)` | `{ playerId, seat, side, colOffset, mirror, dir (default unit direction: RIGHT, mirrored side LEFT), facing (its sign), bonds (live copy, layers updated by addLayers), bandId, playerEffects, lpForBoss, dp, units }` | | `mapTile(ps, row, col, abs?)` / `mapDir(ps, dir, abs?)` | board → field tile / direction of a player (the FA right-side mirror) | -| `onOwnBoard(ps, r, c)` | whether a field tile lies on the player's own board — GEO.FIELD (rows 9–12, cols 2–10) mapped onto this field: the 联防 right-hand helper's +8 columns, the boss field's rows 2–5 (never its hand / 临时整备区 rows 0–1), the mirrored right half; the 突袭 landing takes only such tiles (DESIGN §25.18), and so does 乌尔比安's S3 【移动】 (DESIGN §25.17.2) | +| `onOwnBoard(ps, r, c)` | whether a field tile lies on the player's own board — GEO.FIELD (rows 9–12, cols 2–10) mapped onto this field: the 联防 right-hand helper's +8 columns, the boss field's rows 2–5 (never its hand / 临时整备区 rows 0–1), the mirrored right half; 乌尔比安's S3 【移动】 takes only such tiles (DESIGN §25.17.2) | +| `onFieldBoard(r, c)` | whether a field tile lies on the board of a player of this field — `onOwnBoard` of any of `players` (the players whose units the battle holds; an eliminated or absent teammate is not one): both halves of the two-helper 联防 field and of a Final Assault / Hidden Core pair field, the own half only for a lone 联防 helper and on a solo boss field, never a boss field's hand / 临时整备区 rows; the 突袭 landing takes only such tiles (DESIGN §25.18, §26.1) | | `addDp(playerId, n)`, `retreat(unit, {reason, permanent, dying})`, `relocate(unit, r, c)` | `relocate` only changes the tile (state kept, no event) | | `moveRedeploy(unit, r, c, { clearSp })` | a 【移动】 (PRTS 术语释义: "不退场,以当前血量在目标位置部署", a special retreat + redeploy): `relocate`'s checks (false = refused, nothing changed), then a new deployment (`deploySeq` / `aggroSeq` / `deployedAt`) and `deploy {initial:false, move:true}` (deploy effects fire again); no `die` / `death`, timer or cost (不屈 / 阿戈尔's revive never see it); HP, buffs and a running skill are kept (owner's deviation, DESIGN §22.3); `clearSp` empties the SP before the deploy handlers run — 乌尔比安 S3's move (kits/ops/chess_char_5_05-ulpia.js) and 【返回】 (`clearSp`; also the 从不混淆的方向 fallback, content/tokens.js) | | `redeploy(unit, { free=true, tile, keepSp })` | immediate (re)deployment of a dead/retreated ally (full HP, `deploy {initial:false}`); `free: false` pays `base.cost` DP (refused without it); without `tile` it lands on the unit's rest tile (`restTile`: where a knocked-out operator lies, else home); `tile: [r, c]` lands on that tile once (home unchanged; refused when off-rect, occupied or a knocked-out operator's tile, no fallback); `keepSp` keeps SP/charges (保留技力), restored before `deploy` fires — 突袭 raids, 阿戈尔 / 不屈 revives where the unit lies | diff --git a/docs/history/0.2.0.md b/docs/history/0.2.0.md index e07e0559..35ca03b0 100644 --- a/docs/history/0.2.0.md +++ b/docs/history/0.2.0.md @@ -1379,6 +1379,10 @@ briefing types' share of the waves). #### 25.18.1 「…新约能天使在开了突袭之后蹦到了下方…临时放置溢出的干员和道具的那一栏高台」, 「单人联防时突袭也可以跑到对面的场地上」 (items 40, 16.3): 突袭 lands only on its player's own board — `sim/battle/players.js onOwnBoard`, `content/bonds/addon/battle.js raidTile` +- **Changed in 0.2.1** (§26.1, the owner's decision of 2026-10-07): where both halves of the field are taken — the + two-helper 联防 field and a Final Assault / Hidden Core pair field — a member may land on its teammate's half too + (`Battle.onFieldBoard`); the hand / 临时整备区 rows, a lone helper's empty half and a solo boss field's other half stay + closed. This replaces the own-half rule of **Now** below on those two fields. - **Seen**: in a solo leader round a ranged 突袭 member (新约能天使 with the 转职球 and the 突袭手雷) jumped onto the boss field's 临时整备区 row; in a 联防 with one helper a member jumped onto the right half of the map. - **Cause**: `raidTile` took any tile of the battle rect its position may stand on (grid.canStand). BOSS_RECT holds rows diff --git a/docs/history/0.2.1.md b/docs/history/0.2.1.md new file mode 100644 index 00000000..affaf2d6 --- /dev/null +++ b/docs/history/0.2.1.md @@ -0,0 +1,46 @@ +# DESIGN §26 — 0.2.1 + +Part of [DESIGN.md](../DESIGN.md) (the index; section numbers are global). + +## 26. 0.2.1 — after the 0.2.0 release + +0.2.1 is built on `feedback6`, branched from the 0.2.0 release (tag v0.2.0) and marked `0.2.1-dev` until it ships. Its +workstreams branch off it as `fb6-*`, each merged after review with its golden scenarios named. Each rule was checked +against the official data and PRTS; anything no source backs is marked [ASSUMED]. Where each is handled: the 突袭 +landing on a teammate's half of a shared field → §26.1. + +Decisions of the owner: 2026-10-07 — a 突袭 member may land on a teammate's half when both halves of the field are +taken (the two-helper 联防 field, the Final Assault / Hidden Core pair field), replacing part of §25.18.1; 乌尔比安's +S3 【移动】 keeps his own board (§26.1). + +### 26.1 突袭 may land on a teammate's half when both halves are taken (the owner's decision of 2026-10-07) — `sim/battle/players.js onFieldBoard`, `content/bonds/addon/battle.js raidTile` + +- **Seen**: 0.2.0 (§25.18.1) let a member land only on its own board, on every field. Where both halves belong to + players — the two-helper 联防 field and a Final Assault / Hidden Core pair field — a member whose target stood on the + teammate's half stayed home or took a farther tile of its own half (reproduced: the right player's member with an + enemy on the left telin (1,3) of 战场#01 stayed home; on the two-helper 联防 map the left helper's member with an enemy + at (10,15) stayed home). After the release the owner decided that such a member may land on the teammate's half. +- **Official**: the bond text 「保留技力立即再部署至一名地面敌人周围」 names no board, and where the official landing falls + among the legal tiles is not in the data (§22.2). PRTS 卫戍协议/帮助 §联防阶段: with two helpers 「两处阵地将前后拼接为一处 + 阵地,玩家在同一阵地作战」; a pair field is one boss map holding both players' boards (research 09 §1.2, + ConvertChessPositionInfoToBossMap). A lone helper's other half and a solo boss field's other half hold no player. +- **Now**: `Battle.onFieldBoard(r, c)` — the tile lies on the board of a player of this field (`onOwnBoard` of any of + `players`, the players whose units the battle holds; the 联防 right-hand helper's +8 columns and the mirrored right half + of a pair are mapped as before) — and `raidTile` takes only those tiles: both halves on the two-helper 联防 field and on + a pair field; the own half for a lone 联防 helper (escaped_single) and on a solo boss field (nobody stands on the other + half; a teammate eliminated before the battle or playing another field opens nothing); never a boss field's hand row 0 + or 临时整备区 row 1 (no board covers them). Every other landing rule is kept: ground / ranged tiles (grid.canStand), + free tiles (isReservedTile), a blockable tile first for a melee member (§25.11.3), a target only reachable from a + forbidden tile skipped (the next candidate is tried, else the member stays); the candidates are still the player's own + enemies first (raidTargets). 乌尔比安's S3 【移动】 keeps `onOwnBoard` (§25.17.2, a separate community report): his landing + never takes the teammate's half. This replaces the own-half rule of §25.18.1 on those two fields. +- [ASSUMED]: none beyond §22.2's landing rule (which legal tile the official landing takes); with both halves open the + nearest covering tile wins, on whichever half it lies. +- Golden: 8 scenarios, each parting from the parent at the first landing on a teammate's half (checked tick by tick with + the parent instrumented: identical up to that landing): boss-boss_2 / 3 / 4 / 5 / 6-pair, hidden-boss_8 / 10-pair (the + right player's 缄默德克萨斯, 伊内丝, 仇白 or 耀骑士临光 landing on the left player's half, 1–7 times per battle, the first + 0.3–39.8 s in) and the bot match coop4-ABYSS-7 (its round-6 two-helper 联防: at 52 s ai_2's 斯卡蒂 lands on ai_1's + half; of the match digest only the two players' damage totals move, 8263 from ai_1 to ai_2). unite-2 is unchanged (its + two landings stay on their own half). Tests: `test/sim/feedback5-raid-own-board.test.js` (4 cases; the pair and the + two-helper cases fail on the parent; the solo boss field's hand rows, the lone helper and 乌尔比安 beside a teammate are + unchanged). Docs: docs/SIM.md (`onFieldBoard`; `onOwnBoard` is now 乌尔比安's only). diff --git a/server/sim/battle/players.js b/server/sim/battle/players.js index dbdeb953..bed7dc89 100644 --- a/server/sim/battle/players.js +++ b/server/sim/battle/players.js @@ -78,9 +78,9 @@ export class BattlePlayers { * Whether field tile (r, c) lies on player `ps`'s own board: the board region GEO.FIELD (rows 9–12, cols 2–10, the * tiles its pieces are deployed on) mapped onto this field — the 联防 right-hand helper's +8 columns, the boss field's * rows 2–5, the mirrored right half of a pair (whatever coordinates the player's input uses). Never the hand / 临时 - * 整备区 rows of a boss field (rows 0–1, inside BOSS_RECT) nor the other half of a 联防 or boss field. Automatic - * redeployments and moves that must stay where the player could deploy read it (the 突袭 landing, bonds/addon/battle.js - * raidTile; 乌尔比安's S3 【移动】, kits/ops/chess_char_5_05-ulpia.js). + * 整备区 rows of a boss field (rows 0–1, inside BOSS_RECT) nor the other half of a 联防 or boss field. Moves that must + * stay where the player could deploy read it (乌尔比安's S3 【移动】, kits/ops/chess_char_5_05-ulpia.js); the 突袭 + * landing reads onFieldBoard (any player of this field). */ onOwnBoard(ps, r, c) { if (!ps) return false; @@ -94,6 +94,18 @@ export class BattlePlayers { return keys.has(r * COLS + c); } + /** + * Whether field tile (r, c) lies on the board of a player standing on this field: onOwnBoard of one of `players`, + * the players whose units this battle holds (a teammate eliminated before it or playing another field is not one). + * Both halves on the two-helper 联防 field and on a Final Assault / Hidden Core pair field; the own half only for a + * lone 联防 helper and on a solo boss field; never a boss field's hand / 临时整备区 rows. The 突袭 landing reads it + * (bonds/addon/battle.js raidTile — the owner's decision of 2026-10-07, DESIGN §26.1). + */ + onFieldBoard(r, c) { + for (const ps of this.players) if (this.onOwnBoard(ps, r, c)) return true; + return false; + } + _boardTile(ps, row, col) { const bossLike = this.kind === 'boss' || this.kind === 'hidden'; let r = row; diff --git a/server/sim/content/bonds/addon/battle.js b/server/sim/content/bonds/addon/battle.js index e4843bab..210a07d7 100644 --- a/server/sim/content/bonds/addon/battle.js +++ b/server/sim/content/bonds/addon/battle.js @@ -33,8 +33,10 @@ // 助力 deputShip all operators DEF +(base + per·L), redeploy time ×(1 + respawn_time) // 突袭 raidShip member idle ≥ no_attack_duration s (or skill ready — a passive skill that is on counts, GitHub // #49, and so does a deploy-timed skill while it runs, #109) with no enemy in range → "保留技力立即再部署" -// next to the most advanced ground enemy it can reach: on a free tile of its own board (Battle.onOwnBoard: -// never a boss field's hand / 临时整备区 rows, never the other half of a 联防 or boss field — community +// next to the most advanced ground enemy it can reach: on a free tile of a board of its field +// (Battle.onFieldBoard: its own or a teammate's on the same field — the two-helper 联防 field and a +// pair field open both halves, the owner's decision of 2026-10-07; never a boss field's hand / +// 临时整备区 rows, never the empty other half of a lone 联防 helper or a solo boss field — community // reports of 2026-10-06, items 40 and 16.3) its position may be deployed // on from which its range covers that enemy (GitHub issue #51 [ASSUMED]: the first of the 8 most // advanced that has such a tile; none → it stays and the next poll looks again, never a jump that @@ -271,10 +273,12 @@ function raidReach(u) { /** * Landing tile [row, col] of a jump to enemy `e`, or null: a tile from which the member's range (`reach`, raidReach) * covers the enemy's body (a huge enemy: any tile it occupies — body.js), within RAID_SEARCH tiles (Chebyshev) of the - * enemy, inside the field rect and on the member's own board (Battle.onOwnBoard — "再部署" goes where its player deploys: - * never a boss field's hand row 0 or 临时整备区 row 1, both inside BOSS_RECT and buildable high ground, nor the half of the - * 联防 or boss field that is not its player's; community reports of 2026-10-06, items 40 and 16.3: a ranged member landed - * on the 临时整备区 row of a solo leader round, and on the right half of the one-helper 联防 map), that the member's + * enemy, inside the field rect and on a board of its field (Battle.onFieldBoard — "再部署" goes where a player of the + * field deploys: its own board or a teammate's half when both halves are taken, the two-helper 联防 field and a pair + * field — the owner's decision of 2026-10-07, DESIGN §26.1; never a boss field's hand row 0 or 临时整备区 row 1, both + * inside BOSS_RECT and buildable high ground, nor the empty other half of the one-helper 联防 map or a solo boss field; + * community reports of 2026-10-06, items 40 and 16.3: a ranged member landed on the 临时整备区 row of a solo leader + * round, and on the right half of the one-helper 联防 map), that the member's * position may be deployed on (grid.canStand: never the 深水区 — * player report #3 after 0.1.0 —, and for a melee member low ground only, never a 高台: GitHub #148) and that is free * (Battle.isReservedTile: no living unit, no knocked-out operator's body — player report F5 —, no waiting piece's tile). @@ -299,7 +303,7 @@ function raidTile(battle, u, e, reach) { for (let i = 0; i < reach.length; i += 2) { const r = br - reach[i], c = bc - reach[i + 1], dr = r - er, dc = c - ec; if (Math.abs(dr) > RAID_SEARCH || Math.abs(dc) > RAID_SEARCH) continue; - if (!battle.grid.inRect(r, c) || !battle.onOwnBoard(u.player, r, c) || !battle.grid.canStand(r, c, { ranged }) || battle.isReservedTile(r, c)) continue; + if (!battle.grid.inRect(r, c) || !battle.onFieldBoard(r, c) || !battle.grid.canStand(r, c, { ranged }) || battle.isReservedTile(r, c)) continue; const t = r * COLS + c; const p = path && battle.grid.tile(r, c).pass === 'ALL' && (path.has(t) || body.includes(t)) ? 0 : 1; // its block applies const d = Math.max(Math.abs(dr), Math.abs(dc)) + 0.01 * (Math.abs(dr) + Math.abs(dc)); diff --git a/server/sim/content/kits/ops/chess_char_5_05-ulpia.js b/server/sim/content/kits/ops/chess_char_5_05-ulpia.js index 55f2fc62..cf7ea860 100644 --- a/server/sim/content/kits/ops/chess_char_5_05-ulpia.js +++ b/server/sim/content/kits/ops/chess_char_5_05-ulpia.js @@ -95,9 +95,11 @@ export default { if (stop === 0 || !unit.alive) return; // PRTS 备注: landing tile > the tile one beyond it > his own tile (a deployable, free, unreserved melee tile). // "可部署" is a tile his player may deploy on: his own board (Battle.onOwnBoard) — never the other half of a 联防 or - // boss field nor a boss field's hand / 临时整备区 rows. Community report of 2026-10-06 (item 27) 「乌尔比安使用3技能会在 - // 联防阶段跳到红门后」: on the one-helper 联防 map (escaped_single, enemies from the middle gate at col 10) an anchor that - // met no enemy flew on to the right half, where no enemy ever walks, and he moved there for the whole skill + // boss field nor a boss field's hand / 临时整备区 rows; a teammate's half stays closed to him even where the 突袭 + // landing may take it (Battle.onFieldBoard, DESIGN §26.1). Community report of 2026-10-06 (item 27) + // 「乌尔比安使用3技能会在联防阶段跳到红门后」: on the one-helper 联防 map (escaped_single, enemies from the middle gate at + // col 10) an anchor that met no enemy flew on to the right half, where no enemy ever walks, and he moved there for + // the whole skill const ok = ([r, c]) => (r !== unit.tileR || c !== unit.tileC) && battle.grid.inRect(r, c) && battle.onOwnBoard(unit.player, r, c) && battle.grid.canStand(r, c) && !battle.grid.isObstacle(r, c) && !battle.isReservedTile(r, c); const dest = [[sr, sc], frontOf(unit.tileR, unit.tileC, unit.dir, stop + 1)].find(ok); if (dest == null) return; diff --git a/test/golden/fields.json b/test/golden/fields.json index 7df79ce2..be5ee8d0 100644 --- a/test/golden/fields.json +++ b/test/golden/fields.json @@ -138,45 +138,45 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 8, + "killed": 7, "total": 8, "unspawned": 0, - "bossHpLeft": 5364048, - "rngDraws": 918, + "bossHpLeft": 5323494, + "rngDraws": 861, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":8,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":616628,"bossDmg":345587,"heal":26145,"deaths":2,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":880723,"bossDmg":287200,"heal":6229,"deaths":1,"layerGains":{}} + "p1": {"killed":7,"total":8,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":591887,"bossDmg":312274,"heal":19990,"deaths":0,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":878330,"bossDmg":361136,"heal":6843,"deaths":1,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,0,197572,2597,100,74,3], - ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,11,0,17911,21305,265,56,1], - ["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,7,0,24825,1118,94,12,15], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,13,0,1795,0,0,14,1], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,130284,0,7387,70,11], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2418.5,1,3,0,59757,0,0,44,4], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2769.3,1,45,2,24180,3155,385,53,2], - ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,43,1,113691,1831,220,46,16], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,17694,25,3], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,15,1,46613,1393,0,31,2], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",965.67,1,12,0,0,3839,1557,0,2], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",3545.85,1,46,2,233157,0,0,265,6], - ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2236.31,1,8,0,2429,1159,1012,15,6], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",2671.35,1,44,0,59323,1488,148,88,7], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2241.91,1,10,0,73699,1180,644,69,4], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,2,1,334155,0,0,251,3], + ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,9,0,176503,1132,0,72,3], + ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",5482.35,1,11,0,723,12906,183,34,1], + ["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,7,0,26692,1028,261,54,14], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,13,0,13640,0,0,80,1], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,1,0,59962,0,1824,33,6], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",2418.5,1,3,0,72626,0,0,43,4], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",2769.3,1,17,0,28364,0,0,57,3], + ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,19,4,174454,2396,1503,57,21], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,5,0,0,0,16175,20,3], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,15,0,38923,1393,44,40,2], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",599.39,1,12,0,0,3929,1201,0,2], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",3545.85,1,48,1,241366,511,511,284,8], + ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",1898.31,1,8,0,2347,1249,764,15,6], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",2671.35,1,47,1,101686,2806,1366,162,10], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",1931.91,1,10,0,56922,1270,424,53,3], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,2,0,275392,0,0,175,2], ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,4,0,0,0,0,0,0], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",1857.24,1,18,1,46534,3241,2866,40,3], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,41,0,49013,1991,2,68,18], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,6,0,82414,0,0,54,13], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",1636.54,1,18,1,44668,3170,2575,41,4], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,41,0,62779,1991,2,96,26], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,6,0,93170,0,0,61,17], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ], - "enemies": {"enemy_1005_yokai_2":[6,6,0,5219,62190],"enemy_1430_lrrook":[2,2,0,0,802449],"enemy_9017_achunt":[2,0,0,39076,635952]}, - "hooks": [1,44,6000,1295,1317,2756,2794,4870,11,20,120,118,30,38466,950,0,10,0,1,11,0,10,0], - "events": {"atk":1324,"deploy":34,"die":20,"dmg":2786,"engage":17,"fx":669,"heal":105,"skill":238,"spawn":32,"status":467}, - "fx": {"aoe":38,"appear":2,"blink":9,"burst":10,"catShield":1,"charge":6,"counter":30,"crit":129,"dilemma":4,"disappear":2,"explosion":13,"frostNova":18,"garrisonGrant":1,"iceSpike":48,"overclock":2,"pull":3,"quadShot":3,"ripple":20,"sentry":3,"sermon":1,"shadowWeave":7,"shield":7,"soul":3,"sp":9,"stealth":6,"swordRain":56,"swordStorm":7,"tornado":3,"tornadoPulse":15,"weightless":4,"zone":209}, - "snaps": "8c0abe54 9b607288 6cf7a409 8ec6ce4a 66e96af1 6d758f4b e066e1ea 6fdf025d 882eda72 5ed9da5e 7e3d9207 cf937907 87c02c66 6568fc9b 8ff56eae e01a7f49 a42fcffe a29bd92b c8cb8269 eade103a" + "enemies": {"enemy_1005_yokai_2":[6,6,0,3536,62190],"enemy_1430_lrrook":[2,1,1,0,734721],"enemy_9017_achunt":[2,0,0,30243,676506]}, + "hooks": [1,46,6000,1360,1380,2884,2934,5316,9,22,136,129,20,37832,1031,0,10,1,1,9,0,12,0], + "events": {"atk":1385,"deploy":36,"die":21,"dmg":2926,"engage":17,"fx":608,"heal":52,"leak":1,"skill":265,"spawn":32,"status":510}, + "fx": {"aoe":38,"appear":2,"blink":13,"burst":12,"catShield":1,"charge":6,"counter":20,"crit":105,"dilemma":3,"disappear":2,"explosion":17,"frostNova":26,"garrisonGrant":1,"iceSpike":53,"overclock":2,"pull":3,"quadShot":2,"ripple":20,"sentry":5,"sermon":1,"shadowWeave":10,"shield":5,"soul":6,"sp":8,"stealth":8,"swordRain":91,"swordStorm":10,"tornado":4,"tornadoPulse":16,"weightless":4,"zone":114}, + "snaps": "8c0abe54 9b607288 1caf7332 0a2c806b 7150cfeb d45d0ed9 229f0fc6 ef6d1f81 e2e85ea0 26f10b0b 0c82b27e 47c4ad4c df8430ce d95002b8 6dd882d2 f5a00286 2fc6c867 1819614e fccc3872 e186462f" }, "boss-boss_2-solo": { "about": "假想敌:铳 solo pool 3000000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", @@ -224,102 +224,107 @@ "round": 14, "seed": 1428555614, "waveId": "act1autochess_h07_03", - "time": 199.53, - "ticks": 5986, + "time": 193.13, + "ticks": 5794, "reason": "cleared", "killed": 21, "total": 21, "unspawned": 0, "bossHpLeft": 0, - "rngDraws": 1385, + "rngDraws": 1390, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1881663,"bossDmg":1745302,"heal":2230,"deaths":0,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":2302143,"bossDmg":2254698,"heal":16832,"deaths":0,"layerGains":{}} + "p1": {"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1855908,"bossDmg":1714973,"heal":2427,"deaths":0,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":2327898,"bossDmg":2285027,"heal":19380,"deaths":0,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",3430,1,7,0,0,0,638,0,1], + ["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",3430,1,7,0,0,0,0,0,0], ["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",2939,1,11,0,0,0,0,0,0], ["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",3101,1,9,0,0,0,0,0,0], - ["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",2131.5,1,13,2,1071144,0,0,62,8], - ["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",1933,1,17,1,348232,165,10,63,3], - ["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",1214.37,1,19,1,35824,8763,1252,0,5], - ["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",2307.2,1,21,4,284196,1248,326,96,8], - ["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",1668,1,5,0,13,0,3,6,1], - ["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",1322,1,15,1,10883,0,0,7,7], - ["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",1893,1,23,0,88919,0,0,206,5], + ["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",2131.5,1,13,4,1086765,0,0,59,8], + ["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",1933,1,17,0,323232,179,10,62,3], + ["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",1598,1,19,3,34124,9264,1926,0,4], + ["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",2307.2,1,21,3,287510,1776,490,93,8], + ["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",1668,1,5,0,0,0,0,0,0], + ["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",1322,1,15,0,9,0,0,3,3], + ["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",1893,1,23,0,87940,0,0,200,5], ["p1",11,"token","token_10017_skadi2_dedant",null,null,130.4,0,26,0,0,0,0,0,null], - ["p2",12,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",3985.92,1,31,3,358064,3029,0,188,3], - ["p2",13,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",2767,1,12,0,5,0,0,0,1], - ["p2",14,"op","chess_char_5_01_b",1,"uniequip_002_excu2",2314,1,10,0,0,0,0,0,0], - ["p2",15,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",6215.89,1,48,0,280519,0,0,81,4], - ["p2",16,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",3117.74,1,16,2,186844,0,0,74,4], - ["p2",17,"op","chess_char_6_13_b",1,"uniequip_002_angel2",2392.2,1,20,4,1216961,5257,494,363,6], - ["p2",18,"op","chess_char_6_14_b",2,"uniequip_002_lumen",2050.92,1,22,0,0,0,2448,44,1], - ["p2",19,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1554.12,1,25,0,86149,981,0,163,4], - ["p2",20,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1541,1,6,4,173602,0,0,5,3], - ["p2",21,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1631.88,1,18,0,0,0,13890,48,2], + ["p2",12,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",3801.6,1,31,1,444142,0,0,198,3], + ["p2",13,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",2767,1,12,0,17,0,0,3,1], + ["p2",14,"op","chess_char_5_01_b",1,"uniequip_002_excu2",486.07,1,10,1,10,2744,600,10,1], + ["p2",15,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",6215.89,1,32,0,262944,772,0,82,3], + ["p2",16,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",3117.74,1,16,3,185854,1603,33,71,4], + ["p2",17,"op","chess_char_6_13_b",1,"uniequip_002_angel2",2392.2,1,20,2,1176054,5113,1442,351,6], + ["p2",18,"op","chess_char_6_14_b",2,"uniequip_002_lumen",2050.92,1,22,0,0,2006,3449,55,1], + ["p2",19,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1554.12,1,25,1,76907,482,0,144,4], + ["p2",20,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",1541,1,6,4,154611,0,0,12,3], + ["p2",21,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1631.88,1,18,0,0,0,13856,55,2], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null], ["-","~3","device","trap_1105_accrate",null,null,100,1,3,0,0,0,0,0,null], ["-","~4","device","trap_1105_accrate",null,null,100,1,4,0,0,0,0,0,null], - ["p1","~1","token","token_10030_mlyss_wtrman",null,null,1557.36,1,24,0,42452,0,0,90,1], - ["p1","~2","token","token_10030_mlyss_wtrman",null,null,1880.37,0,41,0,0,0,0,0,null], + ["p1","~1","token","token_10030_mlyss_wtrman",null,null,0,0,24,0,8947,1880,0,18,1], + ["p2","~1","token","token_10019_nearl2_sword",null,null,7824,0,41,0,9120,0,0,0,null], + ["p1","~2","token","token_10030_mlyss_wtrman",null,null,1880.37,0,42,0,0,0,0,0,null], ["p1","~1","token","token_10017_skadi2_dedant",null,null,100,0,49,0,0,0,0,0,null], - ["p2","~1","token","token_10019_nearl2_sword",null,null,6480,0,50,0,0,0,0,0,null], - ["p1","~2","token","token_10017_skadi2_dedant",null,null,130.4,0,53,0,0,0,0,0,null], - ["p2","~2","token","token_10019_nearl2_sword",null,null,6480,0,55,0,0,0,0,0,null], - ["p1","~3","token","token_10017_skadi2_dedant",null,null,100,0,58,0,0,0,0,0,null], - ["p2","~3","token","token_10019_nearl2_sword",null,null,6480,1,60,0,0,0,0,0,null] + ["p1","~3","token","token_10030_mlyss_wtrman",null,null,1557.36,1,50,0,27382,0,0,58,1], + ["p2","~2","token","token_10019_nearl2_sword",null,null,6480,0,51,0,9120,0,0,0,null], + ["p1","~4","token","token_10030_mlyss_wtrman",null,null,1880.37,0,53,0,0,0,0,0,null], + ["p1","~2","token","token_10017_skadi2_dedant",null,null,130.4,0,55,0,0,0,0,0,null], + ["p1","~5","token","token_10030_mlyss_wtrman",null,null,1880.37,0,57,0,0,0,0,0,null], + ["p2","~3","token","token_10019_nearl2_sword",null,null,6480,0,58,0,9120,0,0,0,null], + ["p1","~3","token","token_10017_skadi2_dedant",null,null,100,1,61,0,0,0,0,0,null], + ["p1","~6","token","token_10030_mlyss_wtrman",null,null,1557.36,1,62,0,0,0,0,0,null] ], "enemies": { "enemy_1197_sfshu_2": [2,2,0,0,28809], "enemy_1198_msfshu_2": [6,6,0,0,24], - "enemy_1209_sfden_2": [2,2,0,0,154793], + "enemy_1209_sfden_2": [2,2,0,1880,154793], "enemy_1210_msfden_2": [2,2,0,0,90], "enemy_9021_acduml": [1,1,0,0,4000000], - "enemy_9023_acdums": [9,9,0,6252,90] + "enemy_9023_acdums": [9,9,0,11292,90] }, - "hooks": [1,58,5986,1498,1498,3074,3446,2102,22,32,67,60,370,46778,1625,2,22,0,1,21,0,2,0], - "events": {"atk":1634,"deploy":32,"die":32,"dmg":3158,"engage":13,"fx":1025,"heal":282,"skill":127,"spawn":55,"status":511}, + "hooks": [1,61,5794,1478,1478,3054,3458,2076,23,34,61,54,365,42860,1548,2,22,0,1,22,0,1,0], + "events": {"atk":1636,"deploy":35,"die":34,"dmg":3169,"engage":15,"fx":1006,"heal":257,"skill":115,"spawn":59,"status":470}, "fx": { - "airstrike": 130, + "airstrike": 126, + "appear": 1, "beam": 9, - "blink": 3, - "bombard": 69, - "bombardShell": 69, + "blink": 2, + "bombard": 67, + "bombardShell": 68, "buff": 3, - "burst": 2, - "copy": 1, + "burst": 1, + "copy": 2, + "disappear": 1, "displace": 1, "dp": 5, - "drone": 337, - "droneLock": 17, + "drone": 316, + "droneLock": 20, "drones": 3, - "explode": 133, + "explode": 140, + "extraAttack": 2, "finale": 1, - "firewall": 1, "garrisonGrant": 1, - "lightning": 76, - "link": 4, + "lightning": 72, + "link": 5, "lock": 69, "lure": 3, "phase": 18, "radiantSword": 3, - "scorchBurst": 1, - "slash": 5, - "snow": 15, - "split": 1, + "slash": 11, + "snow": 11, + "split": 4, "steal": 6, "storm": 8, "summon": 14, - "sunBurst": 3, + "sunBurst": 1, "talent": 4, - "telegraph": 3, - "tide": 5, + "telegraph": 2, + "tide": 4, "wanted": 2 }, - "snaps": "4c79f145 ebcda26d 068f0e59 f77a47b8 1b3b0779 8e1af8f0 1007ce9e d942d746 2f1bb88d ece27d81 47c5042c 2a8ee6a5 39f34644 5c84574d dd568842 0b4a024a 5841ee36 0333ed5c df19d0bf fd9c01b0" + "snaps": "87a11c35 cc0e1f70 2de88ef7 63a50852 bfa7908b 914f7c08 091eb4fe 5b00a32a f97091e6 0a5e8c62 86447ea8 3ed18a03 c3e24dbc 6be1eceb ee182741 32a8c050 844ac675 b68a311f e7240f5d e53be9d9" }, "boss-boss_3-solo": { "about": "假想敌:管 solo pool 2000000: chess_char_5_08_b chess_char_5_11_b chess_char_5_05_b chess_char_5_06_b chess_char_5_13_b chess_char_5_07_b chess_char_5_02_b chess_char_5_03_b chess_char_5_10_b chess_char_5_12_b", @@ -384,81 +389,81 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 13, + "killed": 9, "total": 14, "unspawned": 0, - "bossHpLeft": 7489465, - "rngDraws": 714, + "bossHpLeft": 7407945, + "rngDraws": 698, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":13,"total":14,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":937786,"bossDmg":282683,"heal":29100,"deaths":19,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1020451,"bossDmg":627852,"heal":3149,"deaths":22,"layerGains":{}} + "p1": {"killed":9,"total":14,"perfect":false,"leaks":3,"leaksUncounted":0,"coins":0,"dmg":934576,"bossDmg":339282,"heal":32737,"deaths":18,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":962433,"bossDmg":652774,"heal":4943,"deaths":18,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,59,2,110966,8370,556,23,2], - ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",0,0,5,1,16854,6179,893,11,1], - ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,55,0,63230,12371,2180,19,11], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,62,0,21622,11562,642,15,1], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",665.83,1,68,2,328446,4367,7770,86,13], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,61,0,63719,8962,505,34,4], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1052.8,1,69,0,77291,3000,24,129,4], - ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",0,0,3,5,156756,1980,369,37,14], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,60,0,0,4355,16136,31,2], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",0,0,15,0,98901,2490,24,44,2], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,53,0,755,6766,24,2,1], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",1428.75,1,71,0,170122,7513,24,159,7], - ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,66,0,17943,7354,100,27,6], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,65,1,155750,18103,360,102,13], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,63,0,218608,6639,45,51,4], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,64,0,185590,3491,369,163,3], - ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,14,0,0,3121,43,0,0], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,20,0,60787,5025,1462,67,4], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1448.82,1,67,1,56087,2881,352,57,18], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1049.8,1,70,1,154810,2572,369,68,14], + ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",0,0,51,2,150221,7838,24,25,1], + ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",678.66,1,59,0,14590,10234,993,13,2], + ["p1",3,"op","chess_char_5_14_b",1,"none",0,0,56,0,47411,15900,1110,5,8], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,54,0,4008,10228,37,2,1], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",761.83,1,63,1,359478,3677,9741,105,17], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",167.22,1,57,3,74351,11069,471,39,4], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,19,0,99495,2424,24,135,4], + ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1093.46,1,64,2,80044,2593,464,36,13], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,55,0,0,4347,19849,37,3], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",0,0,15,0,104978,2071,24,44,2], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,50,0,0,6877,135,0,1], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,49,1,173917,8656,447,180,6], + ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,61,0,29424,7508,149,41,10], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1173.48,1,60,0,95990,8638,140,158,6], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,53,0,187872,6955,257,41,4], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",935.42,1,58,0,190892,2651,464,167,3], + ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,14,0,0,3537,144,0,0], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",2232,1,66,0,61989,6611,1985,68,4], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1588.23,1,62,0,61525,3148,758,68,20], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1144.47,1,65,0,160825,2572,464,69,13], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ], - "enemies": {"enemy_1010_demon":[4,4,0,0,200612],"enemy_1438_dspred":[10,9,1,34600,847090],"enemy_1521_dslily":[1,0,0,85783,910535]}, - "hooks": [1,69,6000,1096,1161,2887,2998,5367,55,61,124,123,11,31539,1072,22,15,1,1,56,0,27,8], - "events": {"atk":1299,"deploy":54,"die":60,"dmg":2987,"engage":18,"fx":777,"heal":170,"leak":1,"skill":247,"spawn":37,"status":923}, + "enemies": {"enemy_1010_demon":[4,4,0,1913,200612],"enemy_1438_dspred":[10,5,5,17182,704342],"enemy_1521_dslily":[1,0,0,100635,992055]}, + "hooks": [1,64,6000,1179,1254,2936,3072,5802,45,52,122,120,13,31249,1058,15,15,5,1,47,0,30,1], + "events": {"atk":1398,"deploy":49,"die":47,"dmg":3061,"engage":17,"fx":807,"heal":220,"leak":5,"skill":242,"spawn":37,"status":929}, "fx": { - "aoe": 29, - "appear": 4, - "blink": 6, - "burst": 27, - "charge": 6, - "counter": 11, - "crit": 81, + "aoe": 23, + "appear": 9, + "blink": 2, + "burst": 30, + "charge": 10, + "counter": 13, + "crit": 76, "dilemma": 4, - "disappear": 4, - "displace": 27, - "dodge": 8, - "explosion": 14, - "frostNova": 18, + "disappear": 9, + "displace": 28, + "dodge": 1, + "explosion": 13, + "frostNova": 20, "grow": 1, - "iceSpike": 96, + "iceSpike": 106, "overclock": 1, "pull": 4, "quadShot": 3, "ripple": 14, - "rockfall": 17, + "rockfall": 18, "sentry": 3, - "sermon": 1, + "sermon": 2, "shadowWeave": 4, - "shield": 4, - "soul": 6, - "sp": 11, - "stealth": 7, - "swordRain": 94, - "swordStorm": 13, + "shield": 6, + "soul": 4, + "sp": 12, + "stealth": 6, + "swordRain": 30, + "swordStorm": 6, "tentacle": 6, "tide": 5, "tornado": 4, "tornadoPulse": 20, "weightless": 4, - "zone": 220 + "zone": 310 }, - "snaps": "f65be30a bc31f339 1b1c4c63 56ac487f fff8ecab 7805bde3 3e168db0 a683f177 24c9beb1 d7d9b685 b76a4041 a9f88d9b b67bfa22 aee3585a 2c008ad3 2c0bd00b 4cc5c1c7 93fdb332 aa18ebd8 604257b4" + "snaps": "9d889e0e 2aa8b0fc 4b2e8efe c2d79a8a 25533bb4 fa205c51 73844653 f88f1ae4 1cc2dc7a 1168e6f5 92c37d3b f55e3aa8 fafdc7e9 1ed1c5d9 96f84e73 41fea066 cbb1e3d4 02ff499a 10756330 a1a973ca" }, "boss-boss_4-solo": { "about": "盐风主教昆图斯 solo pool 4200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", @@ -508,102 +513,100 @@ "round": 14, "seed": 2302764647, "waveId": "act2autochess_h07_05", - "time": 146.63, - "ticks": 4399, + "time": 145.7, + "ticks": 4371, "reason": "cleared", - "killed": 21, - "total": 21, + "killed": 22, + "total": 22, "unspawned": 0, "bossHpLeft": 0, - "rngDraws": 1222, + "rngDraws": 1094, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":21,"total":21,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":990106,"bossDmg":759275,"heal":19230,"deaths":2,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1069679,"bossDmg":800725,"heal":82891,"deaths":3,"layerGains":{}} + "p1": {"killed":22,"total":22,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":929767,"bossDmg":675510,"heal":23987,"deaths":4,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1140018,"bossDmg":884490,"heal":83685,"deaths":2,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",7216.72,1,7,1,54025,7729,11434,26,2], - ["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",3832.46,1,12,0,61955,3891,0,19,2], - ["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",4013.55,1,14,0,94215,9366,99,42,2], - ["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",1916.88,1,67,1,181615,1691,0,24,2], - ["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",2520.63,1,16,1,123013,1672,0,31,2], - ["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",2083.79,1,68,0,6227,3970,41,0,2], - ["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",1624.89,1,18,3,169565,4561,577,17,7], - ["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",2175.07,1,5,1,55584,2036,6337,47,3], - ["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",1192.36,1,20,2,154925,5171,604,27,27], - ["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",2468.47,1,9,1,63514,4482,0,114,4], + ["p1",1,"op","chess_char_6_03_b",2,"uniequip_002_yu",7216.72,1,7,0,53684,7148,12102,23,2], + ["p1",2,"op","chess_char_6_06_b",2,"uniequip_002_pepe",3653.38,1,12,0,78018,5467,0,19,2], + ["p1",3,"op","chess_char_6_07_b",2,"uniequip_002_siege2",4043.7,1,14,0,89619,10862,0,42,2], + ["p1",4,"op","chess_char_6_01_b",2,"uniequip_002_lemuen",1916.88,1,71,2,283232,2520,195,23,2], + ["p1",5,"op","chess_char_6_02_b",2,"uniequip_002_sbell2",2520.63,1,16,3,54883,1124,0,12,2], + ["p1",6,"op","chess_char_6_04_b",2,"uniequip_002_skadi2",2083.79,1,67,0,3832,4536,215,0,2], + ["p1",7,"op","chess_char_6_05_b",2,"uniequip_002_pasngr",1699.96,1,18,4,139120,5370,478,19,7], + ["p1",8,"op","chess_char_6_08_b",2,"uniequip_002_reed2",2175.07,1,5,1,61600,3592,10104,45,3], + ["p1",9,"op","chess_char_6_09_b",0,"uniequip_002_cello",0,0,20,1,124594,5390,505,20,20], + ["p1",10,"op","chess_char_6_11_b",2,"uniequip_002_mlyss",2468.47,1,69,0,27741,4407,195,48,2], ["p1",11,"token","token_10017_skadi2_dedant",null,null,130.4,0,22,0,0,0,0,0,null], - ["p1",12,"token","token_10030_mlyss_wtrman",null,null,0,0,10,0,10693,1668,0,21,1], - ["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",4168.39,1,62,5,394855,19803,0,139,5], - ["p2",14,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",3608.17,1,13,0,145337,10151,0,37,4], - ["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",0,0,15,0,26844,4224,1320,27,1], - ["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",4685.27,1,61,1,136880,13965,0,44,2], - ["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",5929.49,1,2,3,212269,2701,2275,29,2], - ["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",3760.26,1,17,0,45302,10162,2039,8,1], - ["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",2476.3,1,4,0,0,5297,17530,25,1], - ["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1876.46,1,19,1,21834,1047,0,35,3], - ["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",2009.46,1,65,0,78489,1541,0,13,2], - ["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1970.34,1,21,0,0,3099,59727,43,2], + ["p1",12,"token","token_10030_mlyss_wtrman",null,null,0,0,10,0,8925,2566,195,17,1], + ["p2",13,"op","chess_char_6_15_b",2,"uniequip_002_qiubai",4502.02,1,64,2,326610,17219,0,123,6], + ["p2",14,"op","chess_char_6_19_b",2,"uniequip_002_blkkgt",3608.17,1,13,2,158329,8867,0,51,5], + ["p2",15,"op","chess_char_5_01_b",1,"uniequip_002_excu2",2646.38,1,66,0,52083,4856,2171,50,2], + ["p2",16,"op","chess_char_6_17_b",2,"uniequip_002_nearl2",7020.72,1,72,4,163323,14376,0,51,3], + ["p2",17,"op","chess_char_6_12_b",1,"uniequip_002_rosmon",5929.49,1,2,3,245566,900,587,32,2], + ["p2",18,"op","chess_char_6_13_b",1,"uniequip_002_angel2",3899.77,1,17,0,71621,12161,3869,8,1], + ["p2",19,"op","chess_char_6_14_b",2,"uniequip_002_lumen",2476.3,1,4,0,0,2298,11544,19,1], + ["p2",20,"op","chess_char_6_16_b",2,"uniequip_002_halo2",1876.46,1,19,1,24094,4194,0,36,3], + ["p2",21,"op","chess_char_6_18_b",2,"uniequip_002_whitw2",0,0,6,0,83633,1541,0,0,2], + ["p2",22,"op","chess_char_6_20_b",2,"uniequip_002_agoat2",1970.34,1,21,0,0,4270,65514,45,2], ["p2","~1","token","token_10019_nearl2_sword",null,null,1468.72,0,32,0,7863,6355,0,11,null], - ["p1","~1","token","token_10030_mlyss_wtrman",null,null,2175.07,0,36,0,3057,0,0,10,null], - ["p1","~1","token","token_10040_siege2_vlion",null,null,2883.16,0,40,0,475,1239,0,1,null], - ["p2","~2","token","token_10019_nearl2_sword",null,null,0,0,46,0,5,6000,0,10,null], - ["p1","~1","token","token_10017_skadi2_dedant",null,null,100,0,50,0,0,0,0,0,null], - ["p1","~2","token","token_10030_mlyss_wtrman",null,null,1298.02,1,58,1,7177,2395,140,15,1], - ["p1","~2","token","token_10040_siege2_vlion",null,null,2158.7,0,60,0,1900,3057,0,4,null], - ["p1","~3","token","token_10030_mlyss_wtrman",null,null,2175.07,1,66,1,2164,0,0,6,null], - ["p1","~2","token","token_10017_skadi2_dedant",null,null,130.4,1,69,0,0,0,0,0,null] + ["p1","~1","token","token_10030_mlyss_wtrman",null,null,2175.07,0,36,0,2179,0,0,7,null], + ["p1","~1","token","token_10040_siege2_vlion",null,null,3173.37,0,39,0,0,1078,0,0,null], + ["p2","~2","token","token_10019_nearl2_sword",null,null,5622.56,0,46,0,0,857,0,0,null], + ["p2","~3","token","token_10019_nearl2_sword",null,null,5014.57,0,58,0,6895,2809,0,6,null], + ["p1","~2","token","token_10040_siege2_vlion",null,null,1810.54,1,62,0,1900,3405,0,4,null], + ["p1","~2","token","token_10030_mlyss_wtrman",null,null,2175.07,1,70,0,439,0,0,1,1] ], "enemies": { "enemy_1010_demon_2": [2,2,0,3615,128995], - "enemy_2009_csaudc": [4,4,0,2654,137594], - "enemy_2010_csdcr": [2,2,0,5433,103196], - "enemy_2016_csphtm": [2,2,0,116187,1560000], - "enemy_2017_csphts": [13,13,0,338,130000] + "enemy_2009_csaudc": [4,4,0,2146,137594], + "enemy_2010_csdcr": [2,2,0,8393,103196], + "enemy_2016_csphtm": [2,2,0,113964,1560000], + "enemy_2017_csphts": [14,14,0,1208,140000] }, - "hooks": [1,67,4399,915,915,2271,2644,1995,30,45,78,66,32,31084,1354,38,23,0,1,31,0,20,106], - "events": {"atk":1150,"deploy":44,"die":45,"dmg":2456,"engage":25,"fx":623,"heal":478,"skill":144,"spawn":54,"status":662}, + "hooks": [1,70,4371,792,792,2052,2441,2190,31,50,73,60,47,30868,1288,41,24,0,1,31,0,17,68], + "events": {"atk":992,"deploy":46,"die":50,"dmg":2257,"engage":22,"fx":624,"heal":525,"skill":133,"spawn":53,"status":617}, "fx": { - "airstrike": 11, - "blink": 22, - "bombard": 9, - "bombardShell": 9, - "burst": 20, - "cleanse": 2, + "airstrike": 21, + "blink": 27, + "bombard": 17, + "bombardShell": 17, + "burst": 17, + "cleanse": 1, "copy": 2, - "dodge": 106, - "dp": 4, - "drone": 132, - "droneLock": 6, + "dodge": 68, + "dp": 2, + "drone": 163, + "droneLock": 7, "drones": 2, - "emergency": 3, + "emergency": 1, "explode": 32, - "extraAttack": 10, + "extraAttack": 13, "finale": 4, "firewall": 2, "garrisonGrant": 1, - "lightning": 84, + "lightning": 70, "link": 3, - "lock": 11, + "lock": 18, "lure": 2, "palsy": 2, - "radiantSword": 2, - "scorchBurst": 3, - "shield": 12, - "slash": 44, - "snow": 30, - "split": 2, + "radiantSword": 3, + "scorchBurst": 5, + "shield": 11, + "slash": 35, + "snow": 24, + "split": 1, "steal": 1, "storm": 7, "strike": 3, - "summon": 17, - "sunBurst": 4, + "summon": 19, + "sunBurst": 7, "talent": 4, - "telegraph": 7, + "telegraph": 3, "tide": 2, - "wanted": 6 + "wanted": 7 }, - "snaps": "eca813c6 f271e40a c26e5584 bef353fb 7651d026 5d8b93be 56ac8971 a9ac7d9d bedc33d9 4f5a2d07 0471c094 e9ff3f18 5d56be08 186d3143 d265e706" + "snaps": "eca813c6 f271e40a c26e5584 293effd9 077f54d2 84de91d1 328757d8 6d0d975c d7505676 18d1a839 76efe5b2 2efd8a33 4dfdde12 51bd1ae5 2f1d799b" }, "boss-boss_5-solo": { "about": "卢西恩,“猩红血钻” solo pool 780000: chess_char_5_08_b chess_char_5_11_b chess_char_5_05_b chess_char_5_06_b chess_char_5_13_b chess_char_5_07_b chess_char_5_02_b chess_char_5_03_b chess_char_5_10_b chess_char_5_12_b", @@ -664,86 +667,86 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 4, + "killed": 5, "total": 6, "unspawned": 0, - "bossHpLeft": 6998038, - "rngDraws": 540, + "bossHpLeft": 6802825, + "rngDraws": 485, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":4,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":820428,"bossDmg":386403,"heal":0,"deaths":6,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":1063627,"bossDmg":575560,"heal":651,"deaths":17,"layerGains":{}} + "p1": {"killed":5,"total":6,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":952567,"bossDmg":513390,"heal":165,"deaths":5,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":1258837,"bossDmg":643785,"heal":2903,"deaths":15,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,2,122413,0,0,31,2], + ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,3,2,94747,0,0,22,3], ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,1,0,0,0,0,0,0], - ["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,5,0,56834,0,0,0,14], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,0,0,0,0,0,1], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,230848,0,0,70,12], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,196053,0,0,73,6], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,59,0,30054,1629,0,44,2], - ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",65.26,1,60,0,125710,4768,0,41,12], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,57,0,5827,4830,0,0,0], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,52689,0,0,39,2], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,45,0,4798,9594,208,10,1], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",3438.4,1,56,0,145744,8716,443,238,6], + ["p1",3,"op","chess_char_5_14_b",1,"none",1994,1,5,0,53734,0,0,0,15], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",4654.6,1,11,0,7010,0,0,7,1], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1170,1,7,2,345264,0,165,69,14], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,13,0,192606,0,0,73,6], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,15,0,32094,0,0,45,2], + ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,56,0,165863,3222,0,41,13], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",0,0,57,0,8257,4995,0,0,0], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,9,0,52991,0,0,39,2], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,44,0,4798,9594,208,10,1], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,50,0,227599,9235,961,261,6], ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",2383,1,6,0,0,0,0,0,0], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,61,0,62995,9147,0,213,6], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,196907,0,0,117,6], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,0,456796,0,0,128,2], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",0,0,52,0,69463,9367,220,134,6], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",2777.6,1,14,0,226001,0,0,117,6], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,8,1,403652,0,0,112,2], ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1664,1,12,0,0,0,0,0,0], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,52,0,29375,4464,0,74,3], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,51,0,94111,3978,0,90,22], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,55,0,72901,4878,0,25,4], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,16,0,96795,2232,0,122,4], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,18,0,148846,3502,1513,137,36], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,54,0,81683,4878,0,30,4], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ], "enemies": { - "enemy_10028_vtswd": [5,5,0,0,0], - "enemy_10029_vtshld": [4,3,0,0,0], - "enemy_10030_vtwand": [2,2,0,0,0], - "enemy_10085_hllevi_2": [2,0,2,0,721480], - "enemy_1010_demon": [4,4,0,9594,200612], - "enemy_9032_aclionk": [1,0,0,42410,961962] + "enemy_10028_vtswd": [3,3,0,0,0], + "enemy_10029_vtshld": [3,3,0,0,0], + "enemy_10030_vtwand": [4,4,0,0,0], + "enemy_10085_hllevi_2": [2,1,1,0,853617], + "enemy_1010_demon": [4,4,0,10445,200612], + "enemy_9032_aclionk": [1,0,0,36581,1157175] }, - "hooks": [1,60,6000,1178,1194,2073,2086,488,37,41,101,99,0,32592,1048,6,18,2,1,29,0,2,0], - "events": {"atk":1252,"deploy":42,"die":39,"dmg":2014,"engage":14,"fx":585,"leak":2,"skill":200,"spawn":40,"status":1106}, + "hooks": [1,55,6000,1207,1224,2194,2206,1747,35,38,121,119,0,37442,1459,8,17,1,1,27,0,3,0], + "events": {"atk":1277,"deploy":38,"die":37,"dmg":2175,"engage":15,"fx":654,"heal":1,"leak":1,"skill":240,"spawn":39,"status":1259}, "fx": { - "aoe": 32, + "aoe": 35, "appear": 4, "blink": 2, - "burst": 2, - "crit": 74, + "burst": 3, + "crit": 67, "dilemma": 6, "disappear": 4, "displace": 19, - "equip": 13, + "equip": 14, "explosion": 4, - "frostNova": 22, + "frostNova": 36, "garrisonGrant": 1, - "iceSpike": 37, + "iceSpike": 35, "overclock": 1, - "pull": 3, + "pull": 4, "quadShot": 2, "revive": 2, "ripple": 18, "sentry": 3, "shadowWeave": 3, "shield": 1, - "soul": 2, - "sp": 13, + "soul": 3, + "sp": 15, "stealth": 6, "sword": 2, - "swordRain": 30, + "swordRain": 42, "swordStorm": 6, - "telegraph": 18, - "tornado": 3, - "tornadoPulse": 15, + "telegraph": 17, + "tornado": 4, + "tornadoPulse": 20, "vest": 3, "weightless": 6, - "zone": 228 + "zone": 266 }, - "snaps": "cae05412 56f1df5c b303e8dd 6e92aa5e f5375cbb 426e773e 1c3e8fde 43e4f892 5b24fdc3 4601f715 9a82373a 99cf7957 1c1d6605 2113131d a1888b08 172df2c6 50f8c133 6942c4cf 5260d6e4 863b0a70" + "snaps": "8a1f8d78 5887f6a8 75e7640c 6c1fa52f 4ddd141b 2594dcd4 924bae70 2cc613b3 2fb7cdb8 c10e0a34 3a08fb0b 6c7097aa 37ef7454 d8b3ed9d 83074307 6a43c646 e680a0a7 74f9af2f dc36cfce 304c216b" }, "boss-boss_6-solo": { "about": "阿利斯泰尔,帝国余晖 solo pool 3980000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", @@ -922,94 +925,94 @@ "time": 200, "ticks": 6000, "reason": "forced", - "killed": 14, + "killed": 13, "total": 18, "unspawned": 0, - "bossHpLeft": 12665698, - "rngDraws": 598, + "bossHpLeft": 12722981, + "rngDraws": 595, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":14,"total":18,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":2195128,"bossDmg":1207681,"heal":47053,"deaths":19,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":745587,"bossDmg":526035,"heal":4818,"deaths":24,"layerGains":{}} + "p1": {"killed":13,"total":18,"perfect":false,"leaks":2,"leaksUncounted":0,"coins":0,"dmg":1802393,"bossDmg":894991,"heal":43213,"deaths":20,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":false,"leaks":1,"leaksUncounted":0,"coins":0,"dmg":978021,"bossDmg":781444,"heal":3433,"deaths":25,"layerGains":{}} }, "units": [ - ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",7814,1,89,2,120077,24045,603,32,2], - ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",8437.2,1,76,0,5623,9667,729,5,2], - ["p1",3,"op","chess_char_5_14_b",1,"none",3988,1,82,1,29703,13804,3227,11,7], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,70,1,46766,26913,6058,33,2], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",0,0,80,3,700961,5544,13241,84,10], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,83,2,446383,12140,475,35,3], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",0,0,56,1,290041,6525,9,12,1], - ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",2004.8,1,77,2,186932,4783,344,19,7], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",3220,1,86,0,0,10164,22367,19,2], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",3390,1,79,3,368642,6780,0,24,3], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,74,0,0,7929,173,0,2], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",2149,1,85,0,13000,15134,141,90,4], - ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,87,0,3762,14118,1608,4,4], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,88,0,85994,8095,0,30,6], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,65,1,115557,8307,220,37,4], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,71,1,296948,3122,0,74,1], - ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,20,0,65985,7323,531,69,2], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,75,0,24283,6609,2145,11,1], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,63,0,37871,3978,0,47,13], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,64,2,102187,3252,0,43,8], + ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",5080.92,1,79,2,43452,26519,344,15,2], + ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",8067.66,1,78,0,378,9736,453,3,2], + ["p1",3,"op","chess_char_5_14_b",1,"none",3988,1,88,1,48666,12855,2175,24,9], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",0,0,85,0,35959,29785,8006,59,3], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",89.23,1,82,2,849513,4961,12341,98,11], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",0,0,72,1,72754,10765,201,19,2], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",3258,1,91,1,288403,6516,0,12,1], + ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",0,0,74,1,98794,6444,0,9,5], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",3220,1,92,0,0,11772,19693,17,2], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",801.14,1,81,2,364473,10638,0,24,2], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",0,0,75,0,0,6071,137,0,1], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,84,1,8212,12720,5,56,4], + ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",4170.25,1,94,0,1799,9948,1608,2,2], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",974.55,1,90,0,92340,16538,16,44,9], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",0,0,69,0,77253,8291,204,21,3], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",0,0,87,2,597129,3122,0,130,2], + ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,20,0,56567,7585,264,58,2], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",0,0,2,0,27214,2956,724,13,2], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",0,0,66,1,30081,4162,184,41,12], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",0,0,67,2,87426,3543,291,33,6], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,21,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,22,0,0,0,0,0,null] ], "enemies": { - "enemy_10027_vtsk": [6,2,3,140713,875660], + "enemy_10027_vtsk": [6,1,3,137988,778076], "enemy_1005_yokai": [4,4,0,0,1600], - "enemy_1229_darmy_2": [8,8,0,2851,294231], - "enemy_9013_acstmk_2": [1,0,0,42072,1734302], - "enemy_9014_acstma": [5,4,0,5511,19394], - "enemy_9015_acstmb": [2,1,0,7087,41208], - "enemy_9016_acstmr": [8,7,0,0,49] + "enemy_1229_darmy_2": [8,8,0,3462,294231], + "enemy_9013_acstmk_2": [1,0,0,48118,1677019], + "enemy_9014_acstma": [4,3,0,2847,23452], + "enemy_9015_acstmb": [3,2,0,12510,31442], + "enemy_9016_acstmr": [8,7,0,0,40] }, - "hooks": [1,88,6000,772,776,2617,2723,5757,69,73,84,82,5,21577,675,18,34,3,1,71,0,4,9], - "events": {"atk":950,"deploy":54,"die":70,"dmg":2712,"engage":17,"fx":550,"heal":116,"leak":3,"skill":166,"spawn":56,"status":765}, + "hooks": [1,92,6000,770,773,2576,2742,4023,70,75,82,80,3,18982,560,15,34,3,1,69,0,3,5], + "events": {"atk":856,"deploy":58,"die":72,"dmg":2741,"engage":17,"fx":601,"heal":101,"leak":3,"skill":162,"spawn":56,"status":559}, "fx": { - "aoe": 22, - "appear": 7, - "beam": 46, + "aoe": 23, + "appear": 9, + "beam": 48, "blink": 13, - "burst": 4, - "charge": 11, - "counter": 5, - "crit": 46, - "dilemma": 4, - "disappear": 7, - "dodge": 9, - "explode": 5, - "explosion": 8, - "frostNova": 13, + "burst": 3, + "charge": 8, + "counter": 3, + "crit": 83, + "dilemma": 3, + "disappear": 9, + "dodge": 5, + "explode": 6, + "explosion": 6, + "frostNova": 12, "iceSpike": 12, - "overclock": 2, - "palsy": 2, - "phase": 3, + "overclock": 1, + "palsy": 1, + "phase": 2, "pull": 1, - "quadShot": 1, + "quadShot": 2, "revive": 2, - "ripple": 8, - "sentry": 4, + "ripple": 9, + "sentry": 5, "sermon": 2, - "shadowWeave": 9, + "shadowWeave": 7, "shell": 8, "shield": 5, "slippery": 2, - "soul": 4, - "sp": 8, - "spGain": 7, + "soul": 3, + "sp": 7, + "spGain": 4, "stealth": 4, "summon": 4, - "swordRain": 54, - "swordStorm": 6, + "swordRain": 77, + "swordStorm": 9, "telegraph": 6, - "tornado": 1, - "tornadoPulse": 5, - "weightless": 3, + "tornado": 2, + "tornadoPulse": 6, + "weightless": 2, "zone": 187 }, - "snaps": "1b4d1c90 f1b90f93 d01ad1d6 2ee4e787 1cac6b68 20190615 e3f51714 f2cd655d fcdf7ca4 8fcaa316 aeaf9068 cd02e1f0 11eab6b6 f732928e 58ea78dd 10b4ac05 dae7855b e132247e 09d16e00 30e3b85e" + "snaps": "1b4d1c90 20e38936 71e9763f 7ffd94a4 c4e7556e 7d48402b 3f617729 74aca08a e15a2b8a 2b4d5dbb 3e02a7fc 5be3a1bf 87746ccd 852e6a61 0740031f 2b7513e9 00d72aec 803d4249 d88d0da7 d13c04a9" }, "hidden-boss_8-solo": { "about": "假想敌:胄 solo pool 7200000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", @@ -1240,85 +1243,85 @@ "killed": 12, "total": 12, "unspawned": 0, - "bossHpLeft": 14528152, - "rngDraws": 992, + "bossHpLeft": 14515336, + "rngDraws": 1001, "errors": {"count":0,"kinds":[]}, "players": { - "p1": {"killed":12,"total":12,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":373937,"bossDmg":206696,"heal":8274,"deaths":1,"layerGains":{}}, - "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":632415,"bossDmg":465153,"heal":9111,"deaths":7,"layerGains":{}} + "p1": {"killed":12,"total":12,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":345274,"bossDmg":191755,"heal":8830,"deaths":1,"layerGains":{}}, + "p2": {"killed":0,"total":0,"perfect":true,"leaks":0,"leaksUncounted":0,"coins":0,"dmg":673893,"bossDmg":492908,"heal":10630,"deaths":9,"layerGains":{}} }, "units": [ ["p1",1,"op","chess_char_5_19_b",2,"uniequip_002_mlynar",3907,1,5,0,0,0,0,0,0], ["p1",2,"op","chess_char_4_01_b",2,"uniequip_002_rmixer",3537,1,9,0,0,0,0,0,0], ["p1",3,"op","chess_char_5_14_b",1,"none",3489.5,1,15,0,0,0,0,0,0], - ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,17,1,26217,3905,1966,49,1], - ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1989,1,11,5,147819,0,5165,28,5], - ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,19,1,60699,981,0,64,6], - ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,52,1,91742,4419,163,205,5], + ["p1",4,"op","chess_char_5_17_b",1,"uniequip_002_f12yin",2738,1,17,1,23679,4391,1668,44,1], + ["p1",5,"op","chess_char_5_15_b",1,"uniequip_002_thorn2",1989,1,11,2,130910,0,5168,22,4], + ["p1",6,"op","chess_char_5_20_b",2,"uniequip_002_aglina",1382,1,19,1,55119,2234,47,55,5], + ["p1",7,"op","chess_char_5_21_b",1,"uniequip_002_sntlla",1629,1,51,2,96506,3045,165,224,6], ["p1",8,"op","chess_char_5_22_b",1,"uniequip_002_nymph",1611,1,3,0,0,0,0,0,0], - ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,7,0,0,0,981,1,1], - ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,13,0,47460,0,0,30,3], - ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,6,0,0,0,0,0,0], - ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",0,0,38,0,115408,6658,364,177,5], - ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",0,0,49,0,5,5859,855,3,2], - ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,42,0,25789,4357,67,19,4], - ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",1287.6,1,18,3,201916,2142,652,85,6], - ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,12,2,156527,0,0,271,4], - ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",1137.33,1,20,1,12763,920,393,8,2], - ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",1142.27,1,22,0,52566,7870,6780,122,5], - ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,4,2,19197,0,0,23,7], - ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,8,0,48244,0,0,16,5], + ["p1",9,"op","chess_char_5_23_b",1,"uniequip_002_reckpr",1610,1,7,0,0,0,1782,5,1], + ["p1",10,"op","chess_char_4_02_b",2,"uniequip_002_mostma",1695,1,13,0,39060,0,0,30,3], + ["p2",11,"op","chess_char_4_11_b",1,"uniequip_002_cathy",2644,1,6,0,0,0,0,0,1], + ["p2",12,"op","chess_char_4_04_b",1,"uniequip_002_ines",1833,1,54,0,116137,6315,304,175,6], + ["p2",13,"op","chess_char_4_07_b",1,"uniequip_002_bpipe",173.43,1,55,0,10600,7264,765,2,2], + ["p2",14,"op","chess_char_4_16_b",2,"uniequip_002_texas2",1619,1,50,0,43462,6465,215,190,5], + ["p2",15,"op","chess_char_4_09_b",1,"uniequip_002_mizuki",1220.93,1,18,5,205704,2492,935,84,5], + ["p2",16,"op","chess_char_4_06_b",1,"uniequip_002_kroos2",1561,1,12,2,156558,0,0,271,4], + ["p2",17,"op","chess_char_4_10_b",1,"uniequip_002_aroma",0,0,20,1,9409,2333,669,8,2], + ["p2",18,"op","chess_char_4_12_b",2,"uniequip_002_glady",1082.27,1,22,0,50507,9340,7741,122,4], + ["p2",19,"op","chess_char_4_13_b",1,"uniequip_002_gnosis",1989,1,4,2,26546,0,0,33,11], + ["p2",20,"op","chess_char_4_14_b",1,"uniequip_002_lionhd",1626,1,8,0,54971,0,0,24,6], ["p2",21,"token","token_10041_cathy_catsld",null,null,100,1,23,0,0,0,0,0,null], ["p2",22,"token","token_10041_cathy_catsld",null,null,100,1,24,0,0,0,0,0,null], ["-","~1","device","trap_1105_accrate",null,null,100,1,1,0,0,0,0,0,null], ["-","~2","device","trap_1105_accrate",null,null,100,1,2,0,0,0,0,0,null] ], "enemies": { - "enemy_1402_tgshd_2": [2,2,0,7933,173864], - "enemy_9010_acpupp": [2,2,0,3279,160520], - "enemy_9021_acduml_2": [1,0,0,253,671848], - "enemy_9022_acdumm": [1,0,0,453,0], - "enemy_9023_acdums": [12,12,0,19334,120] + "enemy_1402_tgshd_2": [2,2,0,7463,173864], + "enemy_9010_acpupp": [2,2,0,4924,160520], + "enemy_9021_acduml_2": [1,0,0,0,684664], + "enemy_9022_acdumm": [1,0,0,478,0], + "enemy_9023_acdums": [12,12,0,25367,120] }, - "hooks": [1,50,6000,948,1072,2314,2488,5711,24,26,61,58,0,29668,1375,7,18,0,1,26,0,6,1], - "events": {"atk":1051,"deploy":30,"die":26,"dmg":2477,"engage":14,"fx":989,"heal":54,"skill":119,"spawn":42,"status":660}, + "hooks": [1,53,6000,1112,1250,2538,2725,6368,26,28,66,63,0,29865,1406,6,18,0,1,28,0,10,0], + "events": {"atk":1217,"deploy":33,"die":28,"dmg":2714,"engage":14,"fx":1020,"heal":66,"skill":129,"spawn":42,"status":675}, "fx": { "beam": 13, "blink": 2, - "burst": 6, + "burst": 10, "charge": 2, "crit": 134, - "dilemma": 6, - "dodge": 1, + "dilemma": 5, "ember": 2, - "explode": 194, - "explosion": 5, + "explode": 193, + "explosion": 6, "expose": 202, - "frostNova": 7, + "frostNova": 11, "garrisonGrant": 1, - "iceSpike": 165, + "iceSpike": 188, "levitate": 5, + "overclock": 1, "phase": 33, - "pull": 5, + "pull": 4, "quadShot": 4, "ripple": 30, "sentry": 3, - "shadowWeave": 4, + "shadowWeave": 5, "shield": 1, "shieldBreak": 1, "slippery": 2, "splash": 2, - "stealth": 5, + "stealth": 6, "summon": 8, - "swordRain": 9, - "swordStorm": 4, + "swordRain": 34, + "swordStorm": 5, "telegraph": 2, - "tornado": 5, - "tornadoPulse": 25, - "weightless": 6, - "zone": 95 + "tornado": 4, + "tornadoPulse": 20, + "weightless": 5, + "zone": 76 }, - "snaps": "b0e71fe9 6839e690 53810906 3bbc7e03 16c1e0c5 d4e7832b 851004e9 d0306da1 cd02e043 218f2d6c c82e3866 c2b72396 94720b23 604c4cdd a8852b35 c19b0f4d 6ed9b0a4 0b5476b0 7ed23652 78452347" + "snaps": "a3593c93 05df9199 329883cc 83065c46 6d189e2d d27e20b7 d0119d66 53c297b8 408cec99 65434e27 1d704b57 5517a58b dc7344d6 58d4ad2b b8585956 3bb8237c 89be2434 4474d986 12d9ba25 a4ab8999" }, "hidden-boss_10-solo": { "about": "假想敌:管 solo pool 7600000: chess_char_4_17_b chess_char_4_18_b chess_char_4_23_b chess_char_4_19_b chess_char_4_22_b chess_char_4_20_b chess_char_4_21_b chess_char_4_24_b chess_char_4_25_b chess_char_4_26_b", diff --git a/test/golden/matches.json b/test/golden/matches.json index 45bd3c1d..c31bb6bf 100644 --- a/test/golden/matches.json +++ b/test/golden/matches.json @@ -1142,7 +1142,7 @@ "title": {"id":"comment_6","name":"挥金如土","picId":"comment_icon_6","text":"消耗资金最多"}, "trophies": 1, "reward": 170, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1207746,"gold":75,"itemsEquipped":9,"kills":77,"leaks":39,"lpLost":35,"merges":1,"perfectRounds":5,"refreshes":12}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":1199483,"gold":75,"itemsEquipped":9,"kills":77,"leaks":39,"lpLost":35,"merges":1,"perfectRounds":5,"refreshes":12}, "lineup": [], "bonds": ["arcaneShip 0/4","kazimierzShip 0/21","kjeragShip 0/2","preciShip 0/30","sargonShip 0/4","steadShip 0/20","swiftShip 0/18"] }, @@ -1156,7 +1156,7 @@ "title": {"id":"comment_5","name":"万事俱备","picId":"comment_icon_5","text":"装备配发数量最多"}, "trophies": 2, "reward": 213, - "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2771253,"gold":102,"itemsEquipped":11,"kills":137,"leaks":31,"lpLost":31,"merges":3,"perfectRounds":5,"refreshes":7}, + "stats": {"activatedLayers":0,"bossDamage":0,"dmgDealt":2779516,"gold":102,"itemsEquipped":11,"kills":137,"leaks":31,"lpLost":31,"merges":3,"perfectRounds":5,"refreshes":7}, "lineup": [], "bonds": ["deputShip 0/48","emptyShip 0/2","investShip 0/2","kazimierzShip 0/4","kjeragShip 0/72","preciShip 0/16","raidShip 0/14","skillfulShip 0/21","soloShip 0/14","steadShip 0/22","suntShip 0/18","swiftShip 0/18","victoriaShip 0/64","visiShip 0/4","yanShip 0/12"] }, diff --git a/test/sim/facing-invariance.test.js b/test/sim/facing-invariance.test.js index 5b40d753..2c1548c9 100644 --- a/test/sim/facing-invariance.test.js +++ b/test/sim/facing-invariance.test.js @@ -117,8 +117,9 @@ test('战术家 援军 (伺夜): the tactical point is the tile in FRONT along t test('突袭 (raidShip): the landing tile beside the enemy turns with the member direction (equal candidates)', () => { // a diagonal-only range: two equally near landing tiles cover the enemy — the tie resolves in the member's frame. The - // enemy stands inside the player's own board (rows 9–12, cols 2–10): a member lands only there since 0.2.0 - // (Battle.onOwnBoard, DESIGN §25.18), so all four diagonal tiles around (10, 6) are candidates in every direction + // enemy stands inside the player's own board (rows 9–12, cols 2–10): a member lands only on a board of its field since + // 0.2.0 (Battle.onFieldBoard — on a one-player field its own; DESIGN §25.18, §26.1), so all four diagonal tiles around + // (10, 6) are candidates in every direction const ER = 10, EC = 6; const rec = chessRec({ id: 'r_diag', bonds: ['raidShip'], profession: 'WARRIOR', skill: null, rangeGrid: [[1, 1], [-1, 1]] }); const land = (dir) => { diff --git a/test/sim/feedback5-raid-own-board.test.js b/test/sim/feedback5-raid-own-board.test.js index 1e7a71cc..3484b34e 100644 --- a/test/sim/feedback5-raid-own-board.test.js +++ b/test/sim/feedback5-raid-own-board.test.js @@ -1,11 +1,15 @@ -// test/sim/feedback5-raid-own-board.test.js — 突袭 lands only on its player's own board (community reports of -// 2026-10-06, items 40 and 16.3; DESIGN §25.18): +// test/sim/feedback5-raid-own-board.test.js — where a 突袭 member may land (DESIGN §25.18.1, §26.1). +// Community reports of 2026-10-06, items 40 and 16.3 (fixed in 0.2.0): // 「…新约能天使在开了突袭之后蹦到了下方原本用来临时放置溢出的干员和道具的那一栏高台的最左侧位置」 — on a boss field the // battle rect (BOSS_RECT rows 0–5) holds the hand row (0) and the 临时整备区 row (1), high ground buildable ALL, so a // ranged member could land there; // 「单人联防时突袭也可以跑到对面的场地上」 — on the 联防 map of one helper (escaped_single) the right half (cols 11–18) // is in the rect but is nobody's board. -// raidTile now takes only tiles of Battle.onOwnBoard: the board region (rows 9–12, cols 2–10) mapped onto the field. +// 0.2.0 let raidTile take only tiles of the member's own board (Battle.onOwnBoard: the board region, rows 9–12 / cols +// 2–10, mapped onto the field). The owner's decision of 2026-10-07 (0.2.1) opens a teammate's half when both halves are +// taken — the two-helper 联防 field and a Final Assault / Hidden Core pair field: raidTile takes the tiles of +// Battle.onFieldBoard (the board of any player of the field). The lone helper's empty half, a solo boss field's other +// half and the hand rows stay closed; 乌尔比安's S3 【移动】 keeps his own board. // Run: node --test test/sim/feedback5-raid-own-board.test.js import { test } from 'node:test'; @@ -14,6 +18,8 @@ import { makeBattle, enemyRec, checkInvariants } from '../helpers/battleHarness. import { getDefaultSource } from '../../server/sim/simdata.js'; const ID = 'chess_char_6_13_a'; // 新约能天使 (RANGED), given the 突袭 bond as the 转职球 / 突袭手雷 would +const TANK = 'chess_char_1_02_a'; // 角峰: a teammate's piece (no 突袭) +const ULPIA = 'chess_char_5_05_a'; const raw = getDefaultSource().rawChess(ID); const raider = { ...raw, bonds: [...raw.bonds, 'raidShip'] }; const BONDS = { raidShip: { count: 2, active: true, tier: 1, layers: 0 } }; @@ -31,8 +37,10 @@ function jump({ kind, stageId, players, enemyPos, seconds = 11 }) { assert.equal(h.b.errors.length, 0, JSON.stringify(h.b.errors[0])); return { h, mine, homes }; } -const seat = (playerId, s, o = {}) => ({ playerId, seat: s, side: o.side ?? 'L', colOffset: o.colOffset ?? 0, bonds: BONDS, units: o.units ?? [] }); -const unitAt = (row, col, uid = 1) => ({ uid, kind: 'chess', chessId: ID, row, col }); +const seat = (playerId, s, o = {}) => ({ playerId, seat: s, side: o.side ?? 'L', colOffset: o.colOffset ?? 0, bonds: o.bonds ?? BONDS, units: o.units ?? [] }); +const unitAt = (row, col, uid = 1, chessId = ID) => ({ uid, kind: 'chess', chessId, row, col }); +/** A teammate with one 角峰 and no 突袭 (its half is taken). */ +const mate = (playerId, s, o = {}) => seat(playerId, s, { ...o, bonds: {}, units: [unitAt(12, 8, 9, TANK)] }); test('boss field (solo 最终攻势): a ranged 突袭 member never lands on the hand row 0 or the 临时整备区 row 1', () => { // 战场#01: the enemy on the telin (1,3); before the fix the member landed on the hand tile (0,3) @@ -44,24 +52,33 @@ test('boss field (solo 最终攻势): a ranged 突袭 member never lands on the for (let c = 0; c <= 20; c++) for (const r of [0, 1]) assert.equal(h.b.onOwnBoard(u.player, r, c), false, `(${r},${c})`); for (let r = 2; r <= 5; r++) for (let c = 2; c <= 10; c++) assert.equal(h.b.onOwnBoard(u.player, r, c), true, `(${r},${c})`); for (let r = 2; r <= 5; r++) for (let c = 11; c <= 20; c++) assert.equal(h.b.onOwnBoard(u.player, r, c), false, `(${r},${c}) is the right half`); + // no partner: the field's boards are its own (the right half stays closed) + for (let r = 0; r <= 5; r++) for (let c = 0; c <= 20; c++) assert.equal(h.b.onFieldBoard(r, c), h.b.onOwnBoard(u.player, r, c), `(${r},${c})`); // an enemy only the temp row could reach: it stays home and does not hop const far = jump({ kind: 'boss', stageId: 'act1autochess_m01', players: [seat('p1', 0, { units: [unitAt(12, 3)] })], enemyPos: [0, 9] }); assert.deepEqual([far.mine[0].tileR, far.mine[0].tileC], far.homes[0]); }); -test('boss field pair: the mirrored right player lands on its own half only', () => { - const { h, mine } = jump({ - kind: 'boss', stageId: 'act1autochess_m01', - players: [seat('p1', 0), seat('p2', 1, { side: 'R', units: [unitAt(12, 3)] })], enemyPos: [3, 9], - }); +test('boss field pair: a member lands on its partner\'s half — the right player\'s on the left, the left player\'s on the mirrored right (the owner\'s decision of 2026-10-07) — never on the hand rows', () => { + // the enemy on the left telin (1,3): the right player's member (board (12,3) → field (5,17)) takes the partner's board + // tile next to it (until 0.2.1 it stayed home: no tile of its own half reaches the telin) + const { h, mine, homes } = jump({ kind: 'boss', stageId: 'act1autochess_m01', players: [mate('p1', 0), seat('p2', 1, { side: 'R', units: [unitAt(12, 3)] })], enemyPos: [1, 3] }); const u = mine[0]; assert.equal(u.ownerId, 'p2'); - // the enemy stands on the partner's half next to the middle: the member takes a tile of its own half that reaches it - // (before the fix: (2,9), the partner's road) - assert.ok(u.tileR >= 2 && u.tileC >= 10, `landed on (${u.tileR},${u.tileC})`); - assert.ok(h.b.onOwnBoard(u.player, u.tileR, u.tileC)); - assert.equal(h.b.onOwnBoard(u.player, 3, 5), false, 'the left half is the partner\'s'); - assert.equal(h.b.onOwnBoard(u.player, 3, 15), true); + assert.deepEqual(homes[0], [5, 17]); + assert.deepEqual([u.tileR, u.tileC], [2, 3], 'the partner\'s board tile next to the telin'); + const partner = h.b.getPlayer('p1'); + assert.ok(!h.b.onOwnBoard(u.player, 2, 3) && h.b.onOwnBoard(partner, 2, 3) && h.b.onFieldBoard(2, 3)); + // both halves are the field's boards, the hand / 临时整备区 rows of either side never + for (let c = 0; c <= 20; c++) for (const r of [0, 1]) assert.equal(h.b.onFieldBoard(r, c), false, `(${r},${c})`); + for (let r = 2; r <= 5; r++) for (let c = 2; c <= 18; c++) assert.equal(h.b.onFieldBoard(r, c), true, `(${r},${c})`); + // the mirror: the left player's member (field (5,3)) lands on the right player's half, next to the right telin + const left = jump({ kind: 'boss', stageId: 'act1autochess_m01', players: [seat('p1', 0, { units: [unitAt(12, 3)] }), mate('p2', 1, { side: 'R' })], enemyPos: [1, 17] }); + assert.deepEqual([left.mine[0].tileR, left.mine[0].tileC], [2, 17], 'the mirrored right half'); + assert.ok(!left.h.b.onOwnBoard(left.mine[0].player, 2, 17) && left.h.b.onOwnBoard(left.h.b.getPlayer('p2'), 2, 17)); + // an enemy only the partner's hand row could reach: it stays home and does not hop + const far = jump({ kind: 'boss', stageId: 'act1autochess_m01', players: [mate('p1', 0), seat('p2', 1, { side: 'R', units: [unitAt(12, 3)] })], enemyPos: [0, 3] }); + assert.deepEqual([far.mine[0].tileR, far.mine[0].tileC], far.homes[0]); }); test('联防 with one helper (escaped_single): 突袭 does not jump onto the right half', () => { @@ -71,17 +88,39 @@ test('联防 with one helper (escaped_single): 突袭 does not jump onto the rig assert.ok(u.tileC <= 10, `enemy ${pos}: landed on (${u.tileR},${u.tileC})`); assert.ok(h.b.onOwnBoard(u.player, u.tileR, u.tileC), `enemy ${pos}`); if (pos[1] >= 13) assert.deepEqual([u.tileR, u.tileC], homes[0], `enemy ${pos}: out of reach from the left half, it stays`); + // a lone helper: the right half is nobody's board, not even the field's + for (let r = 9; r <= 12; r++) for (let c = 11; c <= 20; c++) assert.equal(h.b.onFieldBoard(r, c), false, `(${r},${c})`); } // an enemy the left half can reach: it still jumps (onto the left half) const { mine } = jump({ kind: 'unite', stageId: 'act1autochess_escaped_single', players: [seat('H', 0, { units: [unitAt(12, 3)] })], enemyPos: [9, 9] }); assert.ok(mine[0].tileC <= 10 && mine[0].tileC >= 7, `landed on (${mine[0].tileR},${mine[0].tileC})`); }); -test('联防 with two helpers (escaped_multi): each helper lands on its own half', () => { - const players = [seat('L', 0, { units: [unitAt(12, 3, 1)] }), seat('R', 1, { colOffset: 8, units: [unitAt(12, 9, 2)] })]; - const { h, mine } = jump({ kind: 'unite', stageId: 'act1autochess_escaped_multi', players, enemyPos: [10, 15] }); - const right = mine.find((u) => u.ownerId === 'R'), left = mine.find((u) => u.ownerId === 'L'); - assert.ok(right.tileC >= 11, `the right helper lands on its half: (${right.tileR},${right.tileC})`); - assert.ok(h.b.onOwnBoard(right.player, right.tileR, right.tileC)); - assert.ok(left.tileC <= 10, `the left helper stays on its half: (${left.tileR},${left.tileC})`); +test('联防 with two helpers (escaped_multi): a member lands on its teammate\'s half (the owner\'s decision of 2026-10-07); 乌尔比安\'s S3 【移动】 still keeps to his own', () => { + // the enemy on the right helper's half: the left helper's member jumps onto it — the enemy's own road tile, the + // nearest that covers it (this map's road takes ranged units too); until 0.2.1 it stayed home + const players = [seat('L', 0, { units: [unitAt(12, 3, 1)] }), mate('R', 1, { colOffset: 8 })]; + const { h, mine, homes } = jump({ kind: 'unite', stageId: 'act1autochess_escaped_multi', players, enemyPos: [10, 15] }); + const u = mine[0]; + assert.deepEqual(homes[0], [12, 3]); + assert.deepEqual([u.tileR, u.tileC], [10, 15], 'the right helper\'s half'); + assert.ok(!h.b.onOwnBoard(u.player, 10, 15) && h.b.onOwnBoard(h.b.getPlayer('R'), 10, 15) && h.b.onFieldBoard(10, 15)); + // the right-hand helper (board col 9 → field col 17) lands on the left helper's half the same way + const right = jump({ kind: 'unite', stageId: 'act1autochess_escaped_multi', players: [mate('L', 0), seat('R', 1, { colOffset: 8, units: [unitAt(12, 9, 1)] })], enemyPos: [10, 5] }); + assert.deepEqual(right.homes[0], [12, 17]); + assert.deepEqual([right.mine[0].tileR, right.mine[0].tileC], [10, 5], 'the left helper\'s half'); + // 乌尔比安 beside a teammate: an anchor that meets no enemy flies 6 tiles ahead to (10,13), the teammate's half — a + // field board but not his: he stays where he stands (DESIGN §25.17.2, a separate community report) + const ul = makeBattle({ + kind: 'unite', stageId: 'act1autochess_escaped_multi', seed: 5, autoFinish: false, timeLimit: 120, defs, + players: [seat('L', 0, { bonds: {}, units: [unitAt(10, 7, 1, ULPIA)] }), mate('R', 1, { colOffset: 8 })], + }); + ul.step(); + const a = ul.unit(ULPIA); + a.skill.gainSp(999, 'test'); + if (!a.skill.active) assert.ok(a.skill.activate('test'), 'S3 cast'); + ul.run(0.2); + checkInvariants(ul.b); + assert.ok(ul.b.onFieldBoard(10, 13) && !ul.b.onOwnBoard(a.player, 10, 13)); + assert.deepEqual([a.tileR, a.tileC], [10, 7], 'he stays on his own half'); });