feedback5: merge feedback4 (beb0296) — PR #73 (operator battle voices) ported to the split layout (the voice setting into ui/gameLogic/settings.js, the gameLogic.js shim unchanged; onResult and DetailPanel voice stay in screens/game.js, which needed its store import back; the sim's 'engage' in server/sim/ai.js performAttack, still the one battle/combat.js and devices.js call; plan.mjs / fetch-assets.mjs merged with --add-only, extraOperators and moduleTypes; the 干员语音 slider through t() with English); golden: roster / bonds / fields / standins / diy differ only in events.engage, matches unchanged
Ported by hand: - public/js/ui/gameLogic.js is a re-export shim on feedback5: #73's DEFAULT_SETTINGS / sanitizeSettings `voice` hunk went into public/js/ui/gameLogic/settings.js. - public/js/screens/game.js: MatchScreen still lives there, so #73's onResult (battleRunner 'result' → resultSpeaker / resultVoiceSlot) and `voice=${combat}` on the DetailPanel auto-merged in place. feedback5's game.js no longer imported `store` (the split moved its other users), so onResult's store.get() would have thrown into its try/catch and the 结算 line would never have played: `store` is imported again. `localAsset` stays dropped. - public/js/ui/settings.js (i18n phase 1): the slider is `label=${t('干员语音')}`, public/i18n/en.json "干员语音": "Operator Voices" (next to Music / Sound Effects). - tools/assets/plan.mjs: buildPlan takes #73's charword / voiceLang / voiceSlots and feedback5's extraOperators / moduleTypes; the template has `modules` and audio { bgm, bossBgm, voice, sfx }. `chars` now includes the 自选 picks, so the voice loop's comment says so (the next `npm run assets` plans their lines too). - tools/fetch-assets.mjs: parseArgs keeps --add-only beside --voice-lang / --voice-all. - data/assets.json: feedback5's manifest plus #73's audio.voice (120 operators, after bossBgm, the plan order); stats files +1680 and bytes +42 041 118 as measured on feedback4, voiceChars 120; the hash is recomputed with the generator's contentHash. No other entry changed. - docs/ASSETS.md: the stats line lists modules and voiceChars. DESIGN §21.30 stays where feedback4 put it; SIM.md's 'engage' line and docs-consistency's §21.30 test auto-merged (game.js / detailPanel.js still hold the pinned code). - Auto-merged and checked: audio.js, battle/runner.js emit('result'), components.js mic icon, detailPanel.js voice prop, shared/protocol.js EV.ENGAGE, server/sim/ai.js, tools/assets/audio.mjs / cache.mjs, #73's tests. Where #73 met feedback5 work: - 补位: a chess fielded as its stand-in shows the stand-in in the detail card, and audio.js keys battle lines by UnitInfo spine (the stand-in's model). The 选中干员 line now takes detail.standIn.charId first, so the stand-in speaks, not the operator it replaces (test/ui/standin-ui.test.js pins it). A 自选 record is already the pick's. - The sim's 'engage': stand-in and 自选 units attack through the same performAttack, so it fires for them as well. Golden regenerated: every moved scenario differs only in events.engage (the new event's count; no gameplay change), proven by a field-path diff against feedback5: - roster: all 49; bonds: all 46; fields: all 22; standins: all 10 (the stand-ins engage). - diy: 101 of 109. Unmoved: diy-010/011/012/092/093 (闪灵, 夜莺, 凯尔希 squads: they only heal, and a heal never engages) and diy-077 (薇薇安娜), diy-080/081 (赫德雷), whose picks make no attack in those battles (already so on feedback5). - matches: unchanged.
This commit is contained in:
commit
c5e8d13636
29 files changed
+1059
-278
No files matched your search
+1
-1
@@ -1 +1 @@
|
||||
{"version":1,"hash":"9f8bca0934cd","generator":"tools/fetch-assets.mjs","stats":{"files":5313,"bytes":420556090,"chars":210,"charsWithBack":207,"enemies":252,"enemiesWithSpine":251,"tokens":58,"tokensWithSpine":13,"spineModels":673,"bonds":23,"items":59,"bands":40,"skills":525,"modules":131,"ui":602,"sfxUnits":484},"chars":{"char_003_kalts":{"avatar":"/assets/char/avatar/char_003_kalts.png","avatarE2":"/assets/char/avatar/char_003_kalts_2.png","portrait":"/assets/char/portrait/char_003_kalts_1.png","portraitE2":"/assets/char/portrait/char_003_kalts_2.png","spine":{"front":{"skel":"/assets/spine/op/char_003_kalts/front/char_003_kalts.skel","atlas":"/assets/spine/op/char_003_kalts/front/char_003_kalts.atlas","textures":["/assets/spine/op/char_003_kalts/front/char_003_kalts.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"die":"Die","move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"1":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":1,"idle":null},"2":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":2,"idle":null}}},"animations":{"Attack":1,"Default":0,"Die":1,"Idle":9,"Start":1},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433]},"bounds":{"x":-227.579,"y":-138.244,"width":532.04,"height":551.479}},"back":{"skel":"/assets/spine/op/char_003_kalts/back/char_003_kalts.skel","atlas":"/assets/spine/op/char_003_kalts/back/char_003_kalts.atlas","textures":["/assets/spine/op/char_003_kalts/back/char_003_kalts.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"die":null,"move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"1":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":1,"idle":null},"2":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":2,"idle":null}}},"animations":{"Attack":1,"Default":0,"Idle":9,"Start":1},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433]},"bounds":{"x":410.785,"y":-2.26,"width":531.785,"height":416.492}}}},"char_010_chen":{"avatar":"/assets/char/avatar/char_010_chen.png","avatarE2":"/assets/char/avatar/char_010_chen_2.png","portrait":"/assets/char/portrait/char_010_chen_1.png","portraitE2":"/assets/char/portrait/char_010_chen_2.png","spine":{"front":{"skel":"/assets/spine/op/char_010_chen/front/char_010_chen.skel","atlas":"/assets/spine/op/char_010_chen/front/char_010_chen.atlas","textures":["/assets/spine/op/char_010_chen/front/char_010_chen.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"die":"Die","move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"1":{"begin":null,"loop":"Skill_2","end":null,"index":1,"idle":null},"2":{"begin":null,"loop":"Skill_3","end":null,"index":2,"idle":null}}},"animations":{"Attack":1.5,"Attack_End":0.6,"Attack_Pre":0.6,"Default":0,"Die":1,"Idle":2,"Skill":1,"Skill_2":1.167,"Skill_3":2.933,"Skill_End":0.6,"Skill_End_2":0.6,"Skill_End_3":0.3,"Start":0.833},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433,1],"Skill":[0.467],"Skill_2":[0.467],"Skill_3":[0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.833,2.933]},"bounds":{"x":-322.335,"y":-109.274,"width":663.549,"height":524.806}},"back":{"skel":"/assets/spine/op/char_010_chen/back/char_010_chen.skel","atlas":"/assets/spine/op/char_010_chen/back/char_010_chen.atlas","textures":["/assets/spine/op/char_010_chen/back/char_010_chen.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"die":null,"move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"1":{"begin":null,"loop":"Skill","end":"Skill_End","index":1,"idle":null},"2":{"begin":null,"loop":"Skill","end":"Skill_End","index":2,"idle":null}}},"animations":{"Attack":1.5,"Attack_End":0.6,"Attack_Pre":0.6,"Default":0,"Idle":2,"Skill":1,"Skill_End":0.6,"Start":0.833},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433,1],"Skill":[0.467]},"bounds":{"x":-173.082,"y":-13.829,"width":315.887,"height":404.623}}}},"char_017_huang":{"avatar":"/assets/char/avatar/char_017_huang.png","avatarE2":"/assets/char/avatar/char_017_huang_2.png","portrait":"/assets/char/portrait/char_017_huang_1.png","portraitE2":"/assets/char/portrait/char_017_huang_2.png","spine":{"front":{"skel":"/assets/spine/op/char_017_huang/front/char_017_huang.skel","atlas":"/assetLine truncated
|
||||
{"version":1,"hash":"c01aa739a2d3","generator":"tools/fetch-assets.mjs","stats":{"files":6993,"bytes":462597208,"chars":210,"charsWithBack":207,"enemies":252,"enemiesWithSpine":251,"tokens":58,"tokensWithSpine":13,"spineModels":673,"bonds":23,"items":59,"bands":40,"skills":525,"modules":131,"ui":602,"sfxUnits":484,"voiceChars":120},"chars":{"char_003_kalts":{"avatar":"/assets/char/avatar/char_003_kalts.png","avatarE2":"/assets/char/avatar/char_003_kalts_2.png","portrait":"/assets/char/portrait/char_003_kalts_1.png","portraitE2":"/assets/char/portrait/char_003_kalts_2.png","spine":{"front":{"skel":"/assets/spine/op/char_003_kalts/front/char_003_kalts.skel","atlas":"/assets/spine/op/char_003_kalts/front/char_003_kalts.atlas","textures":["/assets/spine/op/char_003_kalts/front/char_003_kalts.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"die":"Die","move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"1":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":1,"idle":null},"2":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":2,"idle":null}}},"animations":{"Attack":1,"Default":0,"Die":1,"Idle":9,"Start":1},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433]},"bounds":{"x":-227.579,"y":-138.244,"width":532.04,"height":551.479}},"back":{"skel":"/assets/spine/op/char_003_kalts/back/char_003_kalts.skel","atlas":"/assets/spine/op/char_003_kalts/back/char_003_kalts.atlas","textures":["/assets/spine/op/char_003_kalts/back/char_003_kalts.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"die":null,"move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":0,"idle":null},"1":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":1,"idle":null},"2":{"begin":null,"loop":"Attack","end":null,"via":"attack","index":2,"idle":null}}},"animations":{"Attack":1,"Default":0,"Idle":9,"Start":1},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433]},"bounds":{"x":410.785,"y":-2.26,"width":531.785,"height":416.492}}}},"char_010_chen":{"avatar":"/assets/char/avatar/char_010_chen.png","avatarE2":"/assets/char/avatar/char_010_chen_2.png","portrait":"/assets/char/portrait/char_010_chen_1.png","portraitE2":"/assets/char/portrait/char_010_chen_2.png","spine":{"front":{"skel":"/assets/spine/op/char_010_chen/front/char_010_chen.skel","atlas":"/assets/spine/op/char_010_chen/front/char_010_chen.atlas","textures":["/assets/spine/op/char_010_chen/front/char_010_chen.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"die":"Die","move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"1":{"begin":null,"loop":"Skill_2","end":null,"index":1,"idle":null},"2":{"begin":null,"loop":"Skill_3","end":null,"index":2,"idle":null}}},"animations":{"Attack":1.5,"Attack_End":0.6,"Attack_Pre":0.6,"Default":0,"Die":1,"Idle":2,"Skill":1,"Skill_2":1.167,"Skill_3":2.933,"Skill_End":0.6,"Skill_End_2":0.6,"Skill_End_3":0.3,"Start":0.833},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433,1],"Skill":[0.467],"Skill_2":[0.467],"Skill_3":[0.6,0.8,1,1.2,1.4,1.6,1.8,2,2.2,2.833,2.933]},"bounds":{"x":-322.335,"y":-109.274,"width":663.549,"height":524.806}},"back":{"skel":"/assets/spine/op/char_010_chen/back/char_010_chen.skel","atlas":"/assets/spine/op/char_010_chen/back/char_010_chen.atlas","textures":["/assets/spine/op/char_010_chen/back/char_010_chen.png"],"pma":false,"anims":{"idle":"Idle","deploy":"Start","attack":{"begin":null,"loop":"Attack","end":null},"attackDown":null,"skill":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"die":null,"move":null,"stun":null,"skills":{"0":{"begin":null,"loop":"Skill","end":"Skill_End","index":0,"idle":null},"1":{"begin":null,"loop":"Skill","end":"Skill_End","index":1,"idle":null},"2":{"begin":null,"loop":"Skill","end":"Skill_End","index":2,"idle":null}}},"animations":{"Attack":1.5,"Attack_End":0.6,"Attack_Pre":0.6,"Default":0,"Idle":2,"Skill":1,"Skill_End":0.6,"Start":0.833},"events":["OnAttack","OnStart"],"hits":{"Attack":[0.433,1],"Skill":[0.467]},"bounds":{"x":-173.082,"y":-13.829,"width":315.887,"height":404.623}}}},"char_017_huang":{"avatar":"/assets/char/avatar/char_017_huang.png","avatarE2":"/assets/char/avatar/char_017_huang_2.png","portrait":"/assets/char/portrait/char_017_huang_1.png","portraitE2":"/assets/char/portrait/char_017_huang_2.png","spine":{"front":{"skel":"/assets/spine/op/char_017_huang/front/char_017_huang.skelLine truncated
|
||||
+17
-4
@@ -19,7 +19,9 @@ npm run assets # = node tools/vendor.mjs && node tools/fetch-assets.mjs
|
||||
| `--force` | Re-download everything. |
|
||||
| `--offline` | No network. Re-runs post-processing (atlas fixes, skeleton parsing, WOFF2) on what is already on disk, then rebuilds `data/assets.json`. |
|
||||
| `--dry-run` | Print the plan (file and model counts, alias notes) and exit. |
|
||||
| `--refresh-index` | Re-download the two upstream indexes: `audio_data.json` and `models_data.json`. |
|
||||
| `--refresh-index` | Re-download the upstream indexes: `audio_data.json`, `charword_table.json` (the 干员战斗语音 slots) and `models_data.json`. |
|
||||
| `--voice-lang=cn` | 干员战斗语音 language: `cn` (default) | `jp` | `en` | `kr` — the same file names under `voice_cn/`, `voice/`, `voice_en/`, `voice_kr/`. |
|
||||
| `--voice-all` | Plan every official voice slot, including the prep-only lines no battle plays (干员报到 / 编入队伍 / 任命队长 — 360 files, one per operator and slot). Off by default: nothing requests them, so planning them only makes every run download more. |
|
||||
| `--prune` | Delete files under `public/assets/` that the manifest no longer references, for example after a mapping change. Without this flag they are only listed in the report. `public/assets/local/` (written by `tools/local-extract`) is never pruned. Implies `--allow-shrink`. |
|
||||
| `--allow-shrink` | Write `data/assets.json` even when it loses entries the current one has (see "The manifest never shrinks by accident" below). |
|
||||
| `--add-only` | For a checkout whose `public/assets/` and `public/fonts/` are shared with another one (a git worktree with symlinked asset folders): download only the files missing on disk and never re-download, rewrite or delete an existing file — atlases already on disk are left as they are, the fonts are not rebuilt (the manifest keeps its current `fonts`). Not with `--prune` / `--force`. |
|
||||
@@ -32,7 +34,9 @@ audio entries short — all 42 still resolve upstream; PR #7). When the rebuilt
|
||||
one, the run keeps the current file, prints the entries it would drop (also in the report: `droppedEntries`,
|
||||
`manifestWritten: false`) and exits 1. Re-run to retry the downloads, or pass `--allow-shrink` (or `--prune`) when the
|
||||
smaller manifest is intended, for example after a mapping change. Build fields (`version`, `hash`, `generator`,
|
||||
`stats`), new entries and a changed value are never a drop (`tools/assets/manifest.mjs droppedEntries`).
|
||||
`stats`), new entries and a changed value are never a drop (`tools/assets/manifest.mjs droppedEntries`). A run whose
|
||||
plan legitimately narrows — like the 干员战斗语音 default, which no longer plans the three prep-only slots (360 entries,
|
||||
DESIGN §21.30) — reports exactly those entries and needs `--allow-shrink` once; the list it prints is the check.
|
||||
|
||||
The script is **idempotent**. A file on disk is kept, not re-downloaded, when any one of these holds:
|
||||
- its size matches the ledger entry from a previous download (`.cache/assets-ledger.json`);
|
||||
@@ -49,7 +53,7 @@ How downloads are fetched:
|
||||
- A manifest entry with fallbacks (for example an enemy icon that falls back to its base enemy's icon) only moves on to the next alternative after a **definitive 404**. When the primary fails transiently (network error, 5xx or an invalid payload after all retries), no fallback is fetched. The path is listed under `downloadErrors` in the report, and the next run retries the primary.
|
||||
- A skeleton that fails to parse is deleted and removed from the ledger, so the next online run downloads it again.
|
||||
|
||||
The first run downloads about **269 MiB in about 4,000 files** (it took 134 s on a ~3 MB/s link before the 55 emote and 玩法说明 files, 21.3 MiB, were added). A re-run takes about 1 s.
|
||||
The first run downloads about **309 MiB in about 5,690 files** (it took 134 s on a ~3 MB/s link before the 55 emote and 玩法说明 files, 21.3 MiB, and the 1,680 干员战斗语音 files, 40.1 MiB, were added). A re-run takes about 1 s. The voice count is the twelve slots a battle plays; the three prep-only slots the official client uses elsewhere (干员报到 / 编入队伍 / 任命队长, 360 more files, 18.4 MiB) are left out unless `--voice-all` is passed.
|
||||
|
||||
Outputs:
|
||||
- `data/assets.json`: the manifest (committed).
|
||||
@@ -88,6 +92,7 @@ The research JSONs in `docs/research/` (03, 05, 07) define **which** ids are nee
|
||||
| Enemy Spine that no dump carries (灼热源石虫 / 炽焰源石虫) | the local client only (`tools/local-extract/extract.py ENEMY_SPINES`, optional); never downloaded and never required: an overlay of the web alias (`enemies[id].spineLocal`) | `local/spine/enemy/{enemyId}/{stem}.*` (listed in `data/local-assets.json`) |
|
||||
| BGM | AA2 `voice` branch `audio/sound_beta_2/music/**` (大厅/休整期 `act1autochess`, 开战 `act13side/m_bat_kazimierz2_{1,2}` — 骑士之日 / 无畏者; the 开战 track follows the round: `_2` 无畏者 rounds 1–7, `_1` 骑士之日 from round 8) | `audio/bgm/{file}.mp3` |
|
||||
| SFX (UI, battle, per unit) | AA2 `voice` `audio/sound_beta_2/**`, mapped from `audio_data.json` banks | `audio/sfx/{same sub-path}.mp3` |
|
||||
| 干员战斗语音 | AA2 `voice` `audio/sound_beta_2/voice_cn/{charId}/cn_nn.mp3` — the lines `charword_table.json` lists (`placeType` = when the game plays one, `voiceAsset` = the path); `--voice-lang=jp|en|kr` takes the same file names from `voice/`, `voice_en/`, `voice_kr/` | `audio/voice/{lang}/{charId}/{cn_nn}.mp3` |
|
||||
| Fonts: Bender Regular and Light, Novecento Wide | TimWangZi/The-font-of-Arknights | `public/fonts/*.{otf,ttf,woff2}`, `public/fonts/fonts.css` |
|
||||
|
||||
The `stem` of a Spine model is the upstream file name. Two examples: `char_107_liskam` has the stem `char_107_liskarm`, and `enemy_9032_aclionk` uses `enemy_1559_vtlionk`. The skel and atlas of a model always share one stem. pixi-spine locates the atlas by swapping the extension, so this matters.
|
||||
@@ -138,7 +143,7 @@ All paths are URL paths relative to the site root, for example `/assets/char/ava
|
||||
hash: 'a1b2c3d4e5f6', // content hash (cache busting)
|
||||
generator: 'tools/fetch-assets.mjs',
|
||||
stats: { files, bytes, chars, charsWithBack, enemies, enemiesWithSpine, tokens, tokensWithSpine,
|
||||
spineModels, bonds, items, bands, skills, modules, ui, sfxUnits },
|
||||
spineModels, bonds, items, bands, skills, modules, ui, sfxUnits, voiceChars },
|
||||
chars: { [charId]: { avatar, avatarE2?, portrait, portraitE2?, spine: { front: Spine, back?: Spine } } },
|
||||
enemies: { [enemyId]: { icon, spine?: Spine, spineAliasOf?: enemyId,
|
||||
spineLocal?: { group, skel, atlas, textures, …Spine } } },
|
||||
@@ -165,6 +170,14 @@ All paths are URL paths relative to the site root, for example `/assets/char/ava
|
||||
// `bgmEvent = corrosion` (卡西米尔 act13d5d0), so the rescue phase does not reuse the 作战's track
|
||||
// (audio.js bgmKeyFor 'unite', falling back to `bgm.combat` for a manifest that lacks it)
|
||||
bossBgm: { [bossId]: { intro?, loop } }, // per-boss track of its R14/R15 level
|
||||
voice: { [charId]: { start, faceEnemy, select, place, skill1…skill4,
|
||||
resultFour, resultThree, resultTwo, resultLose } },
|
||||
// 干员战斗语音: an operator's official battle lines (charword_table.json placeType → slot,
|
||||
// tools/assets/audio.mjs VOICE_SLOTS); a slot with several lines is an array and the client
|
||||
// draws one (public/js/audio.js voice). Only these twelve ever play (DESIGN §21.30): the
|
||||
// prep-only slots 干员报到 / 编入队伍 / 任命队长 are left out of the plan by default —
|
||||
// nothing requests them and they cost 360 files (19.3 MB) per run — and `--voice-all` adds
|
||||
// them (audio.mjs VOICE_PREP_SLOTS) for the complete official set
|
||||
sfx: {
|
||||
ui: { click, back, confirm, tab, pick, drop, error, buy, sell, income, refresh, freeze, levelup,
|
||||
merge, equip, itemMerge, bondUp, artPlace, ready, timer, draft, yourTurn, yourTurnCircle,
|
||||
|
||||
@@ -1506,6 +1506,20 @@ Two public GitHub issues after 0.1.0, both client-only. Normative lines rewritte
|
||||
- Tests: `test/sim/feedback1-tank-triggers.test.js` (the data, kit = data, the real battle for the six and for every other MANUAL 重装 record), `test/data.test.js`, `kits_t1t2` / `kits_alt_t1` (PR #12's), `kits_alt_t2` (灰毫 S2), `kits_t5` / `kits_alt_t5` (号角), `test/docs-consistency.test.js`.
|
||||
- Extended 2026-10-04: 余 S2 (SKILL_RANGE on its x-1, §22.10); 14 records deviate now.
|
||||
|
||||
### 21.30 干员战斗语音: an operator's official lines, in battle only (user request, 2026-10-03) — `tools/assets/plan.mjs` (`voiceSlots`), `tools/assets/audio.mjs` (`indexVoice` / `VOICE_SLOTS` / `VOICE_BATTLE_SLOTS` / `VOICE_PREP_SLOTS` / `VOICE_DIRS`), `tools/assets/cache.mjs`, `tools/fetch-assets.mjs --voice-lang / --voice-all`, `public/js/audio.js` (`VOICE_PRIORITY` / `VOICE_COOLDOWN_MS` / `VoiceGate` / `resultVoiceSlot` / `resultSpeaker` / `voice()`), `server/sim/ai.js performAttack 'engage'`, `battle/runner.js emit('result')`, `screens/game.js onResult`, `ui/detailPanel.js voice`, `ui/settings.js`, `ui/gameLogic.js sanitizeSettings`
|
||||
|
||||
User: 「给每个卫戍干员都加语音」, then, after the first build, 「整备阶段不需要干员语音,战斗开始后才需要语音,也就是只需要作战中语音」.
|
||||
|
||||
**Where the lines come from.** Every operator the mode can field already has official battle lines in the same voice dump the BGM and SFX come from — `voice_cn/{charId}/cn_nn.mp3` (JP/EN/KR: `voice/`, `voice_en/`, `voice_kr/`, the same file names, `tools/fetch-assets.mjs --voice-lang=jp|en|kr`). `charword_table.json`'s `placeType` says when each line is used, and `indexVoice()` turns it into the manifest's `audio.voice[charId]`: 行动出发 `start` (BATTLE_START), 行动开始 `faceEnemy` (BATTLE_FACE_ENEMY), 选中干员 `select`, 部署 `place`, 作战中1-4 `skill1..skill4` (BATTLE_SKILL_N), 编入队伍 `squad`, 任命队长 `squadFirst`, 结算 `resultFour/Three/Two/Lose` (完成高难行动 / 3星结束行动 / 非3星结束行动 / 行动失败) and 干员报到 `gacha`. A slot with several lines stays an array and the client draws one. Only the base word key is planned (`wordKey === charId`): the dump has no folder for a skin variant's word key (`char_x_ita`, `char_x_epoque#28`), so those lines 404. **Only the slots a battle can play are planned** (`audio.mjs VOICE_BATTLE_SLOTS`): 干员报到 / 编入队伍 / 任命队长 are lines of the official client's own 养成 / 编队 UI, nothing in this mode ever requests them (`test/docs-consistency.test.js` checks the client's `voice(...)` call sites), and downloading them cost 360 files (19.3 MB) on every run — `--voice-all` adds them back for the complete official set. Measured: 120 of the 121 in-mode charIds have a full set — the 17 预备干员 and the mode's own 盟约·辅助干员 have no battle voice at all, so they simply get no entry — 1680 lines of the 2040 upstream, in a manifest of 5694 files / 324.2 MB (files and `stats.voiceChars` in `data/assets.json`).
|
||||
|
||||
**Where each line plays — battle only.** Every line comes from a running battle's own event stream or from its settlement, so no hook needs a phase check and the 休整期 stays silent: the shop does not say 干员报到 (a merge-completing buy neither says 任命队长), a retreat does not say 编入队伍 and dragging a piece onto the board in prep says nothing. In battle: 开战 — the first operator deployed says 行动出发 and the others 部署 (the sim's `deploy` events; `setFieldUnits` resets the flag per field — in this mode every piece enters at once, which is why the gate below exists, and a knocked-out operator's redeploy says 部署 again); 接敌 — the sim's new `['engage', id]` (a unit's first attack that hits an enemy, official ENCOUNTER_ENEMY); 技能 — `skillN` from the unit's `skillIndex` (作战中1-4); 选中 — the detail panel opening on an operator **while a battle runs** (`DetailPanel voice` = the game screen's `combat`); 结算 — `resultVoiceSlot()`: 完美作战 ⇒ 3星结束行动 (绝境 / 终极 ⇒ 完成高难行动), 有漏怪 ⇒ 非3星结束行动, 一个没杀 ⇒ 行动失败, spoken by a drawn operator **of that battle's own field** (`resultSpeaker`, from the result's `perPlayer.unitsEnd`: the operators of that field, survivors first, a summon piece never), driven by the runner's new `emit('result', …)` — never the field on screen, so watching a teammate cannot put their operator's voice on the viewer's settlement line (review on #73).
|
||||
|
||||
**Why a channel, not SFX.** Voices are 1–4 s long and a battle deploys eight operators, then fires dozens of skills; playing them like SFX would flood the mix. `VoiceGate` copies the official scheduling data (`audio_data.json battleVoice.voiceTypeOptions`): one line at a time, a 1.2 s global gap, a per-unit per-slot cooldown (10 s for 作战中, 3 s for 接敌, 1.5 s for 选中) and takeover when a line's priority beats the playing one by a margin (the official 0.1 s `crossfade`) — the priorities are the official ones (BATTLE_START 100, ENCOUNTER_ENEMY 90, SKILL_ACTIVE 70, PLACE_CHAR 20, FOCUS_CHAR 10) and the settlement lines get 85, above 作战中 but below 接敌. Every deferred step of a line — its decode, its `onended`, the safety timer — carries its own token and returns without touching the gate once it is stale, so a line taken over while it was still loading can never free the channel its replacement just took (review on #73). The channel has its own gain and its own slider (设置 干员语音 / VOICE; `sanitizeSettings` adds `voice`, so a saved profile without it keeps the default and players can turn voices down without losing SFX). The buffer cache also gained a decoded-PCM budget (64 MB) beside its 180-entry cap: a voice decodes to ~0.4–1.3 MB, and 180 of them would be ~100 MB.
|
||||
|
||||
**[ASSUMED].** 接敌 as "the unit's first attack on an enemy" (the official trigger is the first enemy it encounters, not necessarily one it hits) and the settlement mapping (漏怪 ⇒ 非3星, 完美作战 in 绝境 / 终极 ⇒ 完成高难行动) are our readings. Lines follow the field on screen: watching a teammate's battle (前往查看) plays *their* operators' lines, while the settlement line fires for the player's own battle only (`e.own`, `battle/runner.js`) and is spoken by an operator of that battle's own field (`resultSpeaker`). 部署 and 选中干员 stay in the plan although the official groups them with the prep lines: a battle *does* play them (the first operator says 行动出发 and the others 部署, and the detail panel says 选中 while a battle runs), so only the three slots no call site ever asks for are dropped — `VOICE_PRIORITY` / `VOICE_COOLDOWN_MS` keep every level, so `--voice-all` restores 编入队伍 / 任命队长 / 干员报到 for the day the 休整期 speaks again.
|
||||
|
||||
- Tests: `test/ui/audio.test.js` (the priority table, the settlement slot and its speaker, the gate's global gap / per-unit cooldown / takeover, the stale-callback regression, and the battle events that drive the lines against a fake Web Audio), `test/ui/gameLogic.test.js` (the `voice` setting), `test/sim/battle.test.js` (the wire format: every emitted tuple is a known `EV` — the new `engage` included); the manifest's 1680 voice paths are covered by `test/assets.test.js`.
|
||||
|
||||
## 22. GitHub issues after 0.1.1 (v0.1.2)
|
||||
|
||||
Public GitHub issues filed after the 0.1.1 release (2026-10-03), each triaged against 0.1.1 first; the real ones were fixed for 0.1.2 in fix branches WA–WL, each independently reviewed before it was merged into `feedback2`. Where each is handled: #25 back-facing operators keep their attack pose when knocked out → §22.1; #51 突袭's idle redeploy → §22.2; #33 items 1–2 阿戈尔's devour and 乌尔比安 S3 → §22.3; #33 item 6 活性源石, with the 沼泽 and 深水区 terrain → §22.4; #42 emotes and guide pages without a local client, and the English title (#38) → §22.5; #32 item 4 钩索师 / 推击手 on 高台 → §22.6; #52 史尔特尔's 余烬 → §22.7; #43 an enemy's 隐匿 after a block, and the 深池逐火 ember window → §22.8; #32 item 7 荒芜拉普兰德 S3's drones → §22.9; #32 item 1 余 S2 → §22.10; #44 归溟幽灵鲨's 替身 → §22.11; #32 item 6 enemy splash against a 隐匿 operator → §22.12; #35 / #16 (PR #48) 要塞 against air units and 莫斯提马's slow icon → §22.13; #58 / #60 / #64 follow in §22.14–§22.16. Decisions of the owner, 2026-10-04: 荒芜拉普兰德's drones measure the distance to an enemy's position, a huge enemy's centre (§22.9); 余 S2 casts with an enemy on its x-1 — a deliberate deviation from the official TAKE_DAMAGE row, added to §21.29's six (§22.10); 乌尔比安 keeps the devour gains through his 【移动】 — the deviation stays (§22.3).
|
||||
|
||||
+2
-1
@@ -1254,7 +1254,8 @@ Unknown subprofessions fall back to the profession default (test `professions.te
|
||||
(`none|arrow|bolt|bomb|lob|orb|drone|enemy|boomerang|droneBomb|chain|chainHeal`; a boomerang's way back has no event — the
|
||||
renderer flies it back to the thrower at `BOOMERANG_RETURN_SPEED`; an enemy's `profile.shot` may name another kind,
|
||||
e.g. `mortar` for 帝国炮火先兆者, which the renderer does not draw — its fx `bombardShell` is the shell), `['dmg', tgt, amount, type]` (`phys|arts|true|burn|neural|necrosis|apoptosis`),
|
||||
`['heal', tgt, amount]`, `['skill', id, 1|0]`, `['die', id, reason]`, `['leak', id]`, `['status', id, key, 1|0]`,
|
||||
`['heal', tgt, amount]`, `['skill', id, 1|0]`, `['engage', id]` (an ally's first attack that hits an enemy — the client's
|
||||
行动开始 voice, DESIGN §21.30), `['die', id, reason]`, `['leak', id]`, `['status', id, key, 1|0]`,
|
||||
`['fx', kind, x, y, extra]` (`hitCap` `{ id, n }`: a leader's hit cancelled by 限伤 — the renderer draws nothing;
|
||||
`extra.form` = the unit's model form from then on — an enemy's `content/enemies/helpers.js setForm`, a 傀儡师's 替身 — `shared/protocol.js fxForm`),
|
||||
`['layer', playerId, bondId, n]` (n = the layers actually added, capped at 999), `['bounty', playerId, coins]`.
|
||||
|
||||
@@ -132,6 +132,7 @@
|
||||
"设置": "Settings",
|
||||
"完成": "Done",
|
||||
"背景音乐": "Music",
|
||||
"干员语音": "Operator Voices",
|
||||
"音效": "Sound Effects",
|
||||
"静音": "Mute",
|
||||
"显示伤害数字": "Damage Numbers",
|
||||
|
||||
+288
-13
@@ -1,21 +1,28 @@
|
||||
// Audio manager (Web Audio): BGM per phase, UI SFX, per-unit battle SFX. Never throws.
|
||||
// Audio manager (Web Audio): BGM per phase, UI SFX, per-unit battle SFX, operator battle voice. Never throws.
|
||||
//
|
||||
// Sources: data/assets.json → audio (docs/ASSETS.md):
|
||||
// bgm { lobby, prep, combat, combatAlts?: [ {intro?, loop}, … ], boss: { intro?, loop } },
|
||||
// bossBgm { [bossId]: { intro?, loop } },
|
||||
// voice { [charId]: { start, faceEnemy, select, place, skill1…skill4, squad, squadFirst, result*, gacha } },
|
||||
// sfx.ui { click, buy, sell, refresh, freeze, levelup, merge, equip, ready, timer, yourTurn, … },
|
||||
// sfx.battle { deploy, tokenDeploy, charDie, tokenDie?, enemyDie, enemyHit, heal, killCoin, … },
|
||||
// sfx.units { [charId|tokenId|enemyId]: { attack?, hit?, skill?, die?, born?, mix?: { [role]: { p?, vol? } } } }.
|
||||
//
|
||||
// - The AudioContext is created on the first user gesture (pointerdown/keydown/touchend), so browsers
|
||||
// never block or warn; everything requested before that is remembered (BGM) or dropped (SFX).
|
||||
// - Channels: master → { bgm, sfx } gains; volumes from settings (0..1) + mute. Tab hidden ⇒ suspend.
|
||||
// - Channels: master → { bgm, sfx, voice } gains; volumes from settings (0..1) + mute. Tab hidden ⇒ suspend.
|
||||
// - BGM: `intro` then `loop` (1 s crossfade); switching tracks fades out/in (0.8 s). The same loop URL
|
||||
// keeps playing across phases (prep and combat share a track).
|
||||
// - 开战 BGM: `bgm.combatAlts` are the mode's own battle tracks (塞壬唱片 骑士之日 / 无畏者). The track is fixed per
|
||||
// round, not drawn: 无畏者 through rounds 1–7 and 骑士之日 from round 8 on (`combatTrackFor`, the official
|
||||
// schedule), so every client of a match hears the same one, a fight never switches track halfway through and the
|
||||
// 联防 that follows a 作战 keeps its round's track.
|
||||
// - 干员战斗语音 (`audio.voice`, user request): an operator says the official line of the moment it is in —
|
||||
// 行动出发 start, 行动开始 faceEnemy, 选中干员 select, 部署 place, 作战中1-4 skillN and the settlement's
|
||||
// 结算 result* (all battle-only; the 休整期 is silent). Voices are seconds long and a battle deploys eight
|
||||
// operators, then fires dozens of skills, so they run on their own channel (own gain, settings 干员语音) through
|
||||
// VoiceGate: one line at a time, a global gap, a per-unit per-slot cooldown, and a higher-priority line taking the
|
||||
// channel over — the official scheduling of `audio_data.json battleVoice.voiceTypeOptions`.
|
||||
// - Battle SFX from `b.ev` tuples (`handleBattleEvents`): at most MAX_VOICES concurrent unit sounds, at most
|
||||
// MAX_PER_URL overlapping copies of one sound (the official banks' maxSoundAllowed 2), a per-unit cooldown and a
|
||||
// per-URL minimum gap (SfxLimiter), so a 60-unit fight stays listenable.
|
||||
@@ -47,8 +54,13 @@ const UNIT_COOLDOWN_MS = 160;
|
||||
const URL_GAP_MS = 45;
|
||||
const MAX_PER_URL = 2;
|
||||
const BUFFER_CACHE = 180;
|
||||
/** Decoded-PCM budget of the buffer cache beside its entry count: a voice line decodes to 0.4–1.3 MB (see _buffer). */
|
||||
const BUFFER_BYTES = 64 * 1024 * 1024;
|
||||
const XFADE_S = 1;
|
||||
const FADE_S = 0.8;
|
||||
/** Voice: shortest gap between two lines, and the crossfade of a higher-priority line taking the channel (official 0.1 s). */
|
||||
const VOICE_GAP_MS = 1200;
|
||||
const VOICE_XFADE_S = 0.1;
|
||||
/** 'atk' projectile kinds whose first id is the previous bounce target (sim ai.js), not the attacker. */
|
||||
const CHAIN_KINDS = new Set(['chain', 'chainHeal']);
|
||||
/** 'dmg' types that are an attack's impact (element gauge fills / 元素伤害 carry the element's name instead). */
|
||||
@@ -224,6 +236,67 @@ export function unitSoundPlays(mix, roll) {
|
||||
return !(Number.isFinite(p) && p >= 0 && p < 1) || roll < p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Voice priorities — the official battle voice types (`audio_data.json battleVoice.voiceTypeOptions`) mapped onto the
|
||||
* manifest's slots: BATTLE_START 100, BATTLE_FACE_ENEMY 90, SKILL_ACTIVE 70, PASSIVE_IMP 60, PASSIVE_NOR 50,
|
||||
* PLACE_CHAR 20, FOCUS_CHAR 10. The settlement lines are no battle voice of the official scheduler: they sit at 85,
|
||||
* above 作战中 (70) but below 接敌 (90), so a battle's last word is never cut off by an ordinary line. The four prep
|
||||
* slots (部署 / 编入队伍 / 任命队长 / 干员报到) keep their levels although the 休整期 is silent (see the header).
|
||||
*/
|
||||
export const VOICE_PRIORITY = Object.freeze({
|
||||
start: 100, faceEnemy: 90,
|
||||
skill1: 70, skill2: 70, skill3: 70, skill4: 70,
|
||||
resultFour: 85, resultThree: 85, resultTwo: 85, resultLose: 85,
|
||||
gacha: 60, squadFirst: 45, squad: 30, place: 20, select: 10,
|
||||
});
|
||||
|
||||
/** Per-unit per-slot cooldowns (ms): the official 10 s of the 作战中 (passive skill) lines, 3 s between 接敌 lines. */
|
||||
export const VOICE_COOLDOWN_MS = Object.freeze({
|
||||
start: 0, faceEnemy: 3000,
|
||||
skill1: 10000, skill2: 10000, skill3: 10000, skill4: 10000,
|
||||
resultFour: 0, resultThree: 0, resultTwo: 0, resultLose: 0,
|
||||
gacha: 0, squadFirst: 0, squad: 0, place: 0, select: 1500,
|
||||
});
|
||||
|
||||
/**
|
||||
* The settlement slot of a finished 作战: 完美作战 ⇒ 3星结束行动 (绝境 / 终极 ⇒ 完成高难行动 instead), a leaked enemy
|
||||
* ⇒ 非3星结束行动, nothing killed at all ⇒ 行动失败.
|
||||
* @param {{perfect?:boolean, leaked?:number, killed?:number, total?:number, hard?:boolean}} [o]
|
||||
* @returns {'resultFour'|'resultThree'|'resultTwo'|'resultLose'}
|
||||
*/
|
||||
export function resultVoiceSlot(o = {}) {
|
||||
const leaked = Number.isFinite(o.leaked) ? o.leaked : 0;
|
||||
const killed = Number.isFinite(o.killed) ? o.killed : 0;
|
||||
const total = Number.isFinite(o.total) ? o.total : 0;
|
||||
if (o.perfect) return o.hard ? 'resultFour' : 'resultThree';
|
||||
if (total > 0 && killed <= 0) return 'resultLose';
|
||||
if (leaked > 0) return 'resultTwo';
|
||||
return o.hard ? 'resultFour' : 'resultThree';
|
||||
}
|
||||
|
||||
/**
|
||||
* Who says a battle's **result** line (结算): an operator of THAT battle's own field. Never the field the player happens
|
||||
* to be looking at (review on #73): reading the tracked units of the field on screen made a teammate's operator say the
|
||||
* viewer's 作战结束 line while the viewer was watching them.
|
||||
* `pp` is that battle's own `perPlayer` entry (BattleResult, sim/Battle.js): `unitsEnd` lists what stood on its field
|
||||
* when the battle ended, `defId` being an operator (`char_*`) or a summon piece (`token_*`, which does not talk).
|
||||
* Survivors speak first — the line reports how the battle went, and a wiped-out squad is the only case where a fallen
|
||||
* operator ends up saying it. Ties are drawn like every other unit sound.
|
||||
* @param {{ unitsEnd?: Array<{ defId?: string|null, alive?: boolean }> } | null | undefined} pp that battle's perPlayer
|
||||
* @param {() => number} [random]
|
||||
* @returns {string|null} charId, or null when that battle fielded no operator at all
|
||||
*/
|
||||
export function resultSpeaker(pp, random = Math.random) {
|
||||
const ops = [];
|
||||
for (const u of Array.isArray(pp?.unitsEnd) ? pp.unitsEnd : []) {
|
||||
if (u && typeof u.defId === 'string' && u.defId.startsWith('char_')) ops.push({ id: u.defId, alive: !!u.alive });
|
||||
}
|
||||
const standing = ops.filter((o) => o.alive);
|
||||
const pool = standing.length ? standing : ops; // only a wiped-out squad is spoken for by a fallen operator
|
||||
if (!pool.length) return null;
|
||||
return pool[Math.min(pool.length - 1, Math.floor(random() * pool.length))].id;
|
||||
}
|
||||
|
||||
/** Concurrency + cooldown gate for battle SFX. Pure (time is passed in). */
|
||||
/** Gestures that may unlock audio: iOS Safari only accepts touchend / click / keydown; pointerdown covers the rest. */
|
||||
const UNLOCK_EVENTS = ['pointerdown', 'touchend', 'click', 'keydown'];
|
||||
@@ -275,6 +348,63 @@ export class SfxLimiter {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Voice gate: one line at a time, a global gap between two lines, a per-unit per-slot cooldown, and takeover by a
|
||||
* clearly more important line (the caller fades the playing one out first). Pure — the clock is passed in.
|
||||
*/
|
||||
export class VoiceGate {
|
||||
/** @param {{ gapMs?: number, preemptMargin?: number, maxUnits?: number }} [o] */
|
||||
constructor(o = {}) {
|
||||
this.gapMs = Number.isFinite(o.gapMs) ? o.gapMs : VOICE_GAP_MS;
|
||||
// a line only takes the channel over when its priority beats the playing one by this margin: an equal-priority
|
||||
// line (two 作战中 of different operators) waits for its turn instead of cutting the other off
|
||||
this.preemptMargin = Number.isFinite(o.preemptMargin) ? o.preemptMargin : 10;
|
||||
this.maxUnits = Number.isFinite(o.maxUnits) ? o.maxUnits : 400;
|
||||
this.playing = null; // { slot, pri } of the line on air
|
||||
this.lastAt = -Infinity;
|
||||
this.unitUntil = new Map();
|
||||
}
|
||||
|
||||
/** Drop all state (a new field must not inherit the previous battle's cooldowns). */
|
||||
reset() {
|
||||
this.playing = null;
|
||||
this.lastAt = -Infinity;
|
||||
this.unitUntil.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* May a `slot` line from `unitKey` start now?
|
||||
* @param {string} slot
|
||||
* @param {string|number|null} unitKey the cooldown key (a battle unit id; null = no per-unit cooldown)
|
||||
* @param {number} now ms
|
||||
* @returns {'play'|'preempt'|'drop'}
|
||||
*/
|
||||
request(slot, unitKey, now) {
|
||||
const pri = VOICE_PRIORITY[slot] ?? 0;
|
||||
if (this.playing) {
|
||||
if (pri < this.playing.pri + this.preemptMargin) return 'drop';
|
||||
return 'preempt'; // a clearly more important line takes the channel
|
||||
}
|
||||
if (now - this.lastAt < this.gapMs) return 'drop';
|
||||
if (unitKey != null && now < (this.unitUntil.get(`${unitKey}:${slot}`) || 0)) return 'drop';
|
||||
return 'play';
|
||||
}
|
||||
|
||||
/** Record a line that started (call right after request() answered play / preempt). */
|
||||
start(slot, unitKey, now) {
|
||||
this.playing = { slot, pri: VOICE_PRIORITY[slot] ?? 0 };
|
||||
this.lastAt = now;
|
||||
const cd = VOICE_COOLDOWN_MS[slot] ?? 0;
|
||||
if (unitKey != null && cd > 0) {
|
||||
if (this.unitUntil.size > this.maxUnits) this.unitUntil.clear();
|
||||
this.unitUntil.set(`${unitKey}:${slot}`, now + cd);
|
||||
}
|
||||
}
|
||||
|
||||
/** The line ended (naturally, by takeover or by a stop). */
|
||||
release() { this.playing = null; }
|
||||
}
|
||||
|
||||
// ---- manager -----------------------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
@@ -303,10 +433,16 @@ export class AudioManager {
|
||||
this.master = null;
|
||||
this.bgmGain = null;
|
||||
this.sfxGain = null;
|
||||
this.volumes = { bgm: 0.6, sfx: 0.8, muted: false };
|
||||
this.voiceGain = null;
|
||||
this.volumes = { bgm: 0.6, sfx: 0.8, voice: 0.8, muted: false };
|
||||
this.buffers = new Map(); // url → Promise<AudioBuffer|null> (insertion order = LRU)
|
||||
this.bufBytes = new Map(); // url → decoded PCM bytes (the byte budget of the LRU, see _buffer)
|
||||
this.warned = new Set();
|
||||
this.limiter = new SfxLimiter();
|
||||
this.voiceGate = new VoiceGate();
|
||||
this.voiceNode = null; // { src, gain, url, token } of the line on air
|
||||
this.voiceToken = 0;
|
||||
this.startVoiceDone = false; // 行动出发 of this field (the first operator deployed says it)
|
||||
this.uiVoices = 0;
|
||||
this.wantBgm = null; // desired key (kept while locked)
|
||||
this.bgm = null; // { key, loopUrl, nodes: [{src, gain}], gain }
|
||||
@@ -359,8 +495,10 @@ export class AudioManager {
|
||||
this.master = this.ctx.createGain();
|
||||
this.bgmGain = this.ctx.createGain();
|
||||
this.sfxGain = this.ctx.createGain();
|
||||
this.voiceGain = this.ctx.createGain();
|
||||
this.bgmGain.connect(this.master);
|
||||
this.sfxGain.connect(this.master);
|
||||
this.voiceGain.connect(this.master);
|
||||
this.master.connect(this.ctx.destination);
|
||||
// iOS / iPadOS: a call, Siri or another app's audio moves a running context to 'interrupted' (or 'suspended');
|
||||
// a resume without a gesture may then be refused — listen for the next gesture again (dropped once it runs)
|
||||
@@ -430,11 +568,16 @@ export class AudioManager {
|
||||
|
||||
/**
|
||||
* Set channel volumes (0..1) and mute.
|
||||
* @param {{ bgm?: number, sfx?: number, muted?: boolean }} v
|
||||
* @param {{ bgm?: number, sfx?: number, voice?: number, muted?: boolean }} v
|
||||
*/
|
||||
setVolumes(v) {
|
||||
const n = (x, d) => (Number.isFinite(x) ? Math.max(0, Math.min(1, x)) : d);
|
||||
this.volumes = { bgm: n(v?.bgm, this.volumes.bgm), sfx: n(v?.sfx, this.volumes.sfx), muted: typeof v?.muted === 'boolean' ? v.muted : this.volumes.muted };
|
||||
this.volumes = {
|
||||
bgm: n(v?.bgm, this.volumes.bgm),
|
||||
sfx: n(v?.sfx, this.volumes.sfx),
|
||||
voice: n(v?.voice, this.volumes.voice),
|
||||
muted: typeof v?.muted === 'boolean' ? v.muted : this.volumes.muted,
|
||||
};
|
||||
this._applyVolumes();
|
||||
}
|
||||
|
||||
@@ -446,6 +589,8 @@ export class AudioManager {
|
||||
// perceptual curve
|
||||
this.bgmGain.gain.setTargetAtTime(this.volumes.bgm ** 2 * 0.55, t, 0.05);
|
||||
this.sfxGain.gain.setTargetAtTime(this.volumes.sfx ** 2 * 0.9, t, 0.03);
|
||||
// no 0.9: a voice line is already mastered as loud as the rest of the official mix (settings 干员语音 tunes it)
|
||||
this.voiceGain.gain.setTargetAtTime(this.volumes.voice ** 2, t, 0.03);
|
||||
} catch { /* ignore */ }
|
||||
}
|
||||
|
||||
@@ -482,15 +627,35 @@ export class AudioManager {
|
||||
}
|
||||
})();
|
||||
this.buffers.set(url, p);
|
||||
while (this.buffers.size > BUFFER_CACHE) {
|
||||
const first = this.buffers.keys().next().value;
|
||||
// never evict the playing BGM
|
||||
if (this.bgm && first === this.bgm.loopUrl) { const v = this.buffers.get(first); this.buffers.delete(first); this.buffers.set(first, v); break; }
|
||||
this.buffers.delete(first);
|
||||
}
|
||||
p.then((buf) => {
|
||||
if (!buf) return;
|
||||
try {
|
||||
this.bufBytes.set(url, (buf.length || 0) * (buf.numberOfChannels || 1) * 4);
|
||||
this._trimBuffers();
|
||||
} catch { /* ignore */ }
|
||||
}, () => {});
|
||||
this._trimBuffers();
|
||||
return p;
|
||||
}
|
||||
|
||||
/**
|
||||
* Evict least-recently-used buffers until both the entry count and the decoded-PCM budget hold. The count alone is
|
||||
* not enough once voice lines are in the cache: 180 of them are ~100 MB of PCM (a voice decodes to 0.4–1.3 MB).
|
||||
*/
|
||||
_trimBuffers() {
|
||||
let bytes = 0;
|
||||
for (const n of this.bufBytes.values()) bytes += n;
|
||||
if (this.buffers.size <= BUFFER_CACHE && bytes <= BUFFER_BYTES) return;
|
||||
for (const url of [...this.buffers.keys()]) {
|
||||
if (this.buffers.size <= BUFFER_CACHE && bytes <= BUFFER_BYTES) break;
|
||||
// never evict the playing BGM (a voice keeps its own reference to its buffer)
|
||||
if (this.bgm && url === this.bgm.loopUrl) continue;
|
||||
bytes -= this.bufBytes.get(url) || 0;
|
||||
this.buffers.delete(url);
|
||||
this.bufBytes.delete(url);
|
||||
}
|
||||
}
|
||||
|
||||
/** Preload a list of URLs (e.g. UI SFX) once unlocked. */
|
||||
preload(urls) {
|
||||
if (!this.ctx) return;
|
||||
@@ -640,6 +805,93 @@ export class AudioManager {
|
||||
} catch { return false; }
|
||||
}
|
||||
|
||||
// ---- operator battle voice ----------------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Play an operator's battle line (`audio.voice[charId][slot]`; a slot with several lines draws one at random).
|
||||
* Only in battle: every caller is a running battle's own event stream or its settlement (user request — the 休整期
|
||||
* is silent). The line must pass VoiceGate: one at a time, a global gap, a per-unit cooldown, higher priority wins.
|
||||
* @param {string} charId e.g. 'char_263_skadi'
|
||||
* @param {'start'|'faceEnemy'|'select'|'place'|'skill1'|'skill2'|'skill3'|'skill4'|'squad'|'squadFirst'
|
||||
* |'resultFour'|'resultThree'|'resultTwo'|'resultLose'|'gacha'} slot
|
||||
* @param {{ unitKey?: string|number|null, volume?: number }} [o] `unitKey` = the cooldown key (a battle unit id)
|
||||
* @returns {boolean} whether such a line exists and started
|
||||
*/
|
||||
voice(charId, slot, o = {}) {
|
||||
try {
|
||||
if (!this.ctx || !this.voiceGain || this.volumes.muted || this.volumes.voice <= 0) return false;
|
||||
if (typeof charId !== 'string' || typeof slot !== 'string') return false;
|
||||
const line = this.getManifest()?.audio?.voice?.[charId]?.[slot];
|
||||
const url = Array.isArray(line) ? line[Math.floor(Math.random() * line.length)] : line;
|
||||
if (typeof url !== 'string' || !url) return false;
|
||||
const now = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
||||
const verdict = this.voiceGate.request(slot, o.unitKey ?? null, now);
|
||||
if (verdict === 'drop') return false;
|
||||
if (verdict === 'preempt') this._stopVoice();
|
||||
this.voiceGate.start(slot, o.unitKey ?? null, now);
|
||||
const token = ++this.voiceToken;
|
||||
this._playVoice(url, token, o.volume);
|
||||
return true;
|
||||
} catch (err) { this._warn('voice', err); return false; }
|
||||
}
|
||||
|
||||
/** Fetch/decode and start one voice line through the voice channel. */
|
||||
_playVoice(url, token, volume) {
|
||||
// `token` is the line's own `voiceToken`. Every deferred step below — the decode, a failed fetch, `onended` and the
|
||||
// safety timer — can land AFTER this line was taken over or stopped: `voiceToken` has moved on and the channel then
|
||||
// belongs to the line that replaced it. So each step re-checks its token and, when it is stale, touches NOTHING:
|
||||
// `_stopVoice` (takeover / stop) and `setFieldUnits` released the gate themselves. An unconditional release here let
|
||||
// a stale callback free the channel the NEW line had just taken, and the next line walked in on top of it (review
|
||||
// on #73).
|
||||
this._buffer(url).then((buf) => {
|
||||
if (token !== this.voiceToken) return; // taken over / stopped while it decoded: not ours to release
|
||||
if (!buf || !this.ctx || !this.voiceGain) { this.voiceGate.release(); return; }
|
||||
try {
|
||||
const src = this.ctx.createBufferSource();
|
||||
src.buffer = buf;
|
||||
const gain = this.ctx.createGain();
|
||||
gain.gain.value = Math.max(0, Math.min(1.5, Number.isFinite(volume) ? volume : 1));
|
||||
src.connect(gain); gain.connect(this.voiceGain);
|
||||
const node = { src, gain, url, token };
|
||||
let done = false;
|
||||
const end = () => {
|
||||
if (done) return;
|
||||
done = true;
|
||||
// this line's own end (natural, or the safety timer): only the line that still owns the channel may free it.
|
||||
// A stale end is the takeover's leftovers — `_stopVoice` already faded it out and released the gate.
|
||||
if (token === this.voiceToken) {
|
||||
if (this.voiceNode === node) this.voiceNode = null;
|
||||
this.voiceGate.release();
|
||||
}
|
||||
try { gain.disconnect(); } catch { /* ignore */ }
|
||||
};
|
||||
src.onended = end;
|
||||
setTimeout(end, (buf.duration + 0.3) * 1000); // safety if onended never fires
|
||||
src.start();
|
||||
this.voiceNode = node;
|
||||
} catch (err) {
|
||||
this._warn('voice-play', err);
|
||||
if (token === this.voiceToken) this.voiceGate.release();
|
||||
}
|
||||
}, () => { if (token === this.voiceToken) this.voiceGate.release(); });
|
||||
}
|
||||
|
||||
/** Fade the line on air out (a higher priority line is taking the channel over). */
|
||||
_stopVoice() {
|
||||
const cur = this.voiceNode;
|
||||
this.voiceNode = null;
|
||||
this.voiceToken += 1; // a line still decoding must not start afterwards
|
||||
this.voiceGate.release();
|
||||
if (!cur || !this.ctx) return;
|
||||
try {
|
||||
const t = this.ctx.currentTime;
|
||||
cur.gain.gain.cancelScheduledValues(t);
|
||||
cur.gain.gain.setValueAtTime(cur.gain.gain.value, t);
|
||||
cur.gain.gain.linearRampToValueAtTime(0, t + VOICE_XFADE_S);
|
||||
cur.src.stop(t + VOICE_XFADE_S + 0.02);
|
||||
} catch { /* ignore */ }
|
||||
}
|
||||
|
||||
// ---- battle events ------------------------------------------------------------------------------------------
|
||||
|
||||
/** Reset the unit map for a new field (m.field.units = UnitInfo[]). */
|
||||
@@ -647,6 +899,9 @@ export class AudioManager {
|
||||
this.units.clear();
|
||||
this.lastAttacker.clear();
|
||||
this.consumed.clear();
|
||||
// a new field is a new battle: the first operator deployed says 行动出发 again and no cooldown carries over
|
||||
this.startVoiceDone = false;
|
||||
try { this.voiceGate.reset(); this._stopVoice(); } catch { /* ignore */ }
|
||||
for (const u of Array.isArray(units) ? units : []) this._track(u);
|
||||
}
|
||||
|
||||
@@ -693,7 +948,18 @@ export class AudioManager {
|
||||
this.battle('heal', { unitKey: `heal:${e[1]}`, volume: 0.35 });
|
||||
} else if (kind === 'skill' && e[2]) {
|
||||
const u = this.units.get(e[1]);
|
||||
if (u) this.unit(u.def, 'skill', e[1], u.skillIndex ?? undefined);
|
||||
if (u) {
|
||||
this.unit(u.def, 'skill', e[1], u.skillIndex ?? undefined);
|
||||
// 作战中N: the equipped skill's own slot (0-based; 作战中4 is the fallback of a 4th slot)
|
||||
if (unitSoundClass(u) === 'char') {
|
||||
const n = Number.isInteger(u.skillIndex) ? Math.min(4, u.skillIndex + 1) : 1;
|
||||
this.voice(u.def, `skill${n}`, { unitKey: e[1] });
|
||||
}
|
||||
}
|
||||
} else if (kind === 'engage') {
|
||||
// 行动开始: the first attack a unit makes on an enemy (the sim's ENGAGE, official ENCOUNTER_ENEMY, 3 s apart)
|
||||
const u = this.units.get(e[1]);
|
||||
if (u && unitSoundClass(u) === 'char') this.voice(u.def, 'faceEnemy', { unitKey: e[1] });
|
||||
} else if (kind === 'die') {
|
||||
const u = this.units.get(e[1]);
|
||||
if (!u) continue;
|
||||
@@ -710,6 +976,15 @@ export class AudioManager {
|
||||
if (!u || u.side === 'enemy') continue;
|
||||
const m = this.getManifest();
|
||||
const url = deploySfxUrl(m, u);
|
||||
// 行动出发 / 部署: the first operator of the battle says the battle-start line, the others their deploy line
|
||||
// (a knocked-out operator redeploying in the same battle is one of the others; a summon says nothing).
|
||||
// Kept ahead of the deploy-SFX guards below: the voice channel is independent of the unit sound's roll.
|
||||
if (unitSoundClass(u) === 'char') {
|
||||
if (!this.startVoiceDone) {
|
||||
this.startVoiceDone = true;
|
||||
if (!this.voice(u.def, 'start')) this.voice(u.def, 'place', { unitKey: e[1] });
|
||||
} else this.voice(u.def, 'place', { unitKey: e[1] });
|
||||
}
|
||||
if (!url) continue;
|
||||
const own = url === m?.audio?.sfx?.units?.[u.def]?.born;
|
||||
const mix = own ? m.audio.sfx.units[u.def].mix?.born : null;
|
||||
@@ -739,7 +1014,7 @@ export const audio = new AudioManager({ getManifest: () => manifestGetter() });
|
||||
/**
|
||||
* Wire the singleton to the app (called once by main.js): manifest source, settings and store-driven BGM.
|
||||
* @param {{ getManifest: () => any, subscribe: (fn: (s:any, prev:any) => void) => () => void, getState: () => any,
|
||||
* selectRoute: (s:any) => string, settings?: { bgm:number, sfx:number, muted:boolean } }} deps
|
||||
* selectRoute: (s:any) => string, settings?: { bgm:number, sfx:number, voice:number, muted:boolean } }} deps
|
||||
*/
|
||||
export function installAudio(deps) {
|
||||
try {
|
||||
|
||||
@@ -452,6 +452,9 @@ export function createBattleRunner(deps) {
|
||||
} catch (err) { console.warn('[runner] result failed', err); }
|
||||
if (result) {
|
||||
e.result = result;
|
||||
// the view answers with the settlement voice of this battle (screens/game.js → audio.voice result*): the
|
||||
// compact result carries the leaks and the kill count the slot is picked from
|
||||
emit('result', { fieldId: e.fieldId, battleId: e.battleId, own: !!e.own, result });
|
||||
deliver(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,12 +103,12 @@ import { BriefingScreen } from './briefing.js';
|
||||
import { BandDraftScreen } from './bandDraft.js';
|
||||
import { ResultScreen } from './result.js';
|
||||
import { net } from '../net.js';
|
||||
import { useStore, shallowEqual, serverNow, isSpectating } from '../store.js';
|
||||
import { store, useStore, shallowEqual, serverNow, isSpectating } from '../store.js';
|
||||
import { battleRunner } from '../battle/runner.js';
|
||||
import { isClientCombat, observeTarget, teammateProgress, cameraLayers, layerCamera, sidesOf, resumedWatch } from '../battle/observe.js';
|
||||
import { screenStrip, playerBonds, playerLayer, detailBondOwner, toggleBond, popupView } from '../ui/watchBonds.js';
|
||||
import { data, getMode } from '../data.js';
|
||||
import { audio } from '../audio.js';
|
||||
import { audio, resultSpeaker, resultVoiceSlot } from '../audio.js';
|
||||
import { useDocClass, FullscreenButton } from '../ui/device.js';
|
||||
// MatchEnded, PausedOverlay, the highlight styles and keepEarly live in ./game/*.js.
|
||||
import { HUD_HZ_MS, MERGE_HL, SEL_RANGE, cx } from './game/marks.js';
|
||||
@@ -466,8 +466,30 @@ function MatchScreen() {
|
||||
view?.pushEvents(msg);
|
||||
audio.handleBattleEvents(msg.ev);
|
||||
};
|
||||
// 干员语音 (结算): the own battle's result just came in — the operator's line depends on how it went
|
||||
// (完美作战 ⇒ 3星结束行动, 绝境 / 终极 ⇒ 完成高难行动, 有漏怪 ⇒ 非3星结束行动, 一个没杀 ⇒ 行动失败)
|
||||
const onResult = (msg) => {
|
||||
try {
|
||||
if (!msg || !msg.result) return;
|
||||
const st = store.get();
|
||||
const pid = st.me?.playerId;
|
||||
const mine = (pid && msg.result.perPlayer && msg.result.perPlayer[pid]) || null;
|
||||
const diff = st.match?.public?.difficulty;
|
||||
// the speaker comes from THIS battle's own field (`mine.unitsEnd`), not from the field on screen: watching a
|
||||
// teammate used to make THEIR operator say the viewer's line (review on #73)
|
||||
const charId = resultSpeaker(mine);
|
||||
if (!charId) return;
|
||||
audio.voice(charId, resultVoiceSlot({
|
||||
perfect: !!(mine?.perfect),
|
||||
leaked: Array.isArray(mine?.leaked) ? mine.leaked.length : 0,
|
||||
killed: mine?.killed ?? msg.result.killed,
|
||||
total: mine?.total ?? msg.result.total,
|
||||
hard: diff === 'HARD' || diff === 'ABYSS',
|
||||
}));
|
||||
} catch { /* ignore */ }
|
||||
};
|
||||
const offs = [net.on('m.field', onFieldMeta), net.on('b.snap', onSnap), net.on('b.ev', onEv)];
|
||||
if (battleRunner) offs.push(battleRunner.on('field', onFieldMeta), battleRunner.on('snap', onSnap), battleRunner.on('ev', onEv));
|
||||
if (battleRunner) offs.push(battleRunner.on('field', onFieldMeta), battleRunner.on('snap', onSnap), battleRunner.on('ev', onEv), battleRunner.on('result', onResult));
|
||||
return () => { for (const off of offs) { try { off(); } catch { /* ignore */ } } clearTimeout(pending); };
|
||||
}, [view]);
|
||||
|
||||
@@ -1286,7 +1308,7 @@ function MatchScreen() {
|
||||
onClose=${() => setBondOpen(null)} onMember=${(id, items, standInFor) => setDetail({ kind: 'chess', id, owner: bondPop.ownerId, items: items || null, standInFor: standInFor || null })} />` : null}
|
||||
|
||||
${resolved ? html`<${DetailPanel} detail=${resolved} snapHp=${snapHp} onClose=${() => { setDetail(null); setSel(null); }}
|
||||
bonds=${detailBonds} offBonds=${offBonds} loadout=${detailLoadout} side=${dSide} shopOpen=${shopOpen} live=${liveStats}
|
||||
bonds=${detailBonds} offBonds=${offBonds} loadout=${detailLoadout} side=${dSide} shopOpen=${shopOpen} live=${liveStats} voice=${combat}
|
||||
onBond=${(id) => openBond(id, detailOwner, 'detail')} />` : null}
|
||||
|
||||
${selEntry && editable && !facing && !drag && showPrep ? html`<${Underframe} key=${sel.uid} view=${view} uid=${sel.uid}
|
||||
|
||||
@@ -67,6 +67,7 @@ export const ICONS = {
|
||||
info: { d: 'M12 2a10 10 0 1 1 0 20 10 10 0 0 1 0-20zm-1 8v7h2v-7zm0-3v2h2V7z', eo: true },
|
||||
warn: { d: 'M12 2 1 21h22zm-1 7v6h2V9zm0 7.5v2h2v-2z', eo: true },
|
||||
play: { d: 'M7 4v16l13-8z' },
|
||||
mic: { d: 'M12 14a3 3 0 0 0 3-3V5a3 3 0 0 0-6 0v6a3 3 0 0 0 3 3zm5-3a5 5 0 0 1-10 0H5a7 7 0 0 0 6 6.9V21H8v2h8v-2h-3v-3.1A7 7 0 0 0 19 11z' },
|
||||
edit: { d: 'M3 17.2V21h3.8l11-11-3.8-3.8zM20.7 7.1a1 1 0 0 0 0-1.4l-2.4-2.4a1 1 0 0 0-1.4 0l-1.8 1.8 3.8 3.8z' },
|
||||
sword: { d: 'M20 3h1v4L10.4 17.6l1.4 1.4-1.4 1.4-2.1-2.1-3.5 3.5-1.4-1.4 3.5-3.5L4.8 14.8l1.4-1.4 1.4 1.4L18 4z' },
|
||||
shield: { d: 'M12 2 4 5v6c0 5 3.4 9.3 8 11 4.6-1.7 8-6 8-11V5z' },
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
// The stats block (chessStatsBlock), the 特性 text (traitText) and the talent list (chessTalents) are exported: the 干员调配
|
||||
// screen's 局内数值 section draws the same ones for the chosen skill / module, without a live entry (GitHub issue #64).
|
||||
|
||||
import { useEffect } from '../../vendor/hooks.module.js';
|
||||
import { html, Icon, TierChip, MicroLabel, Button, confirmDialog, useTicker } from './components.js';
|
||||
import { Img, RichText, UnitThumb, BondGlyph, GIcon, diyToken } from './gameComponents.js';
|
||||
import { attackInterval, rangeGridBox, fmtNum, tileKey, chessLoadout, nextThreshold, bondTier, briefingBondTip, pieceBondIds, grantedBonds, morphPairings, ownStandIn, standInOf, standInLoadout, standInLabel, standInTip, standInForText, ownDiyRecord, ownDiyPick, diyRecordFor, pickGetter } from './gameLogic.js';
|
||||
@@ -41,6 +42,7 @@ import { attackRangeGrid } from '../../../shared/loadoutRecord.js';
|
||||
import { SKILL_SUMMON_START_DEPLOY } from '../../../shared/constants.js';
|
||||
import { moduleBadge } from './loadoutModel.js';
|
||||
import { t } from '../../../shared/i18n.js';
|
||||
import { audio } from '../audio.js';
|
||||
|
||||
const cx = (...p) => p.flat().filter(Boolean).join(' ');
|
||||
|
||||
@@ -695,10 +697,21 @@ export function resolveDetail(target, pieces, { priv = null, backups = data.get(
|
||||
* = the defaults
|
||||
* live: the unit's live stats (unitStatsEntry + src 'battle' | 'prep') — an object, or a getter the panel re-reads 4×
|
||||
* a second (the battle's own sim, battle/runner.js unitStats); null ⇒ the record's numbers
|
||||
* voice: whether the panel may speak — 选中干员 (audio.voice 'select') plays only while a battle runs (user request:
|
||||
* 整备期不播干员语音), so the game screen passes its combat flag
|
||||
*/
|
||||
export function DetailPanel({ detail, editable, snapHp, onClose, onSell, onDestroy, bonds = [], offBonds = null, loadout = null, onBond = null, side = 'left', shopOpen = false, live = null }) {
|
||||
export function DetailPanel({ detail, editable, snapHp, onClose, onSell, onDestroy, bonds = [], offBonds = null, loadout = null, onBond = null, side = 'left', shopOpen = false, live = null, voice = false }) {
|
||||
const getter = typeof live === 'function' ? live : null;
|
||||
useTicker(detail && getter ? 250 : 0);
|
||||
// 选中干员 voice (audio.voice 'select'): once per opened operator — the panel stays mounted while the target changes,
|
||||
// so the key carries what identifies it (its chess record and its piece / battle unit id)
|
||||
const selectKey = voice && detail?.type === 'chess' ? `${detail.chess?.chessId || ''}:${detail.unitId ?? detail.piece?.uid ?? ''}` : null;
|
||||
// 0.2.0 补位: a chess fielded as its stand-in is spoken for by the stand-in (the operator on the field, whose model, name
|
||||
// and battle lines the card and audio.js show), never by the operator it replaces; a 自选 record is already the pick's
|
||||
const selectChar = voice && detail?.type === 'chess' ? detail.standIn?.charId || detail.chess?.charId || null : null;
|
||||
useEffect(() => {
|
||||
if (selectKey && selectChar) audio.voice(selectChar, 'select');
|
||||
}, [selectKey, selectChar]);
|
||||
if (!detail) return null;
|
||||
let liveNow = null;
|
||||
try { liveNow = getter ? getter() : live && typeof live === 'object' ? live : null; } catch { liveNow = null; }
|
||||
|
||||
@@ -5,13 +5,13 @@ import { clamp, isObj } from './shared.js';
|
||||
|
||||
// ---- settings ------------------------------------------------------------------------------------------------------
|
||||
|
||||
export const DEFAULT_SETTINGS = Object.freeze({ bgm: 0.6, sfx: 0.8, muted: false, damageNumbers: true, quality: 'high' });
|
||||
export const DEFAULT_SETTINGS = Object.freeze({ bgm: 0.6, sfx: 0.8, voice: 0.8, muted: false, damageNumbers: true, quality: 'high' });
|
||||
const QUALITIES = ['high', 'medium', 'low'];
|
||||
|
||||
/**
|
||||
* Sanitize persisted settings.
|
||||
* @param {any} raw
|
||||
* @returns {{ bgm: number, sfx: number, muted: boolean, damageNumbers: boolean, quality: 'high'|'medium'|'low' }}
|
||||
* @returns {{ bgm: number, sfx: number, voice: number, muted: boolean, damageNumbers: boolean, quality: 'high'|'medium'|'low' }}
|
||||
*/
|
||||
export function sanitizeSettings(raw) {
|
||||
const r = isObj(raw) ? raw : {};
|
||||
@@ -19,6 +19,7 @@ export function sanitizeSettings(raw) {
|
||||
return {
|
||||
bgm: vol(r.bgm, DEFAULT_SETTINGS.bgm),
|
||||
sfx: vol(r.sfx, DEFAULT_SETTINGS.sfx),
|
||||
voice: vol(r.voice, DEFAULT_SETTINGS.voice),
|
||||
muted: typeof r.muted === 'boolean' ? r.muted : DEFAULT_SETTINGS.muted,
|
||||
damageNumbers: typeof r.damageNumbers === 'boolean' ? r.damageNumbers : DEFAULT_SETTINGS.damageNumbers,
|
||||
quality: QUALITIES.includes(r.quality) ? r.quality : DEFAULT_SETTINGS.quality,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Player settings (BGM/SFX volume, mute, damage numbers, render quality): a tiny observable store
|
||||
// Player settings (BGM/SFX/voice volume, mute, damage numbers, render quality): a tiny observable store
|
||||
// persisted in localStorage (`sp.pref.settings`), applied to the audio manager on every change, plus
|
||||
// the settings modal — which also holds the language switch (ui/lang.js; kept apart in `sp.pref.lang`).
|
||||
|
||||
@@ -12,7 +12,7 @@ import { detectFeatures } from './device.js';
|
||||
import { LangToggle } from './lang.js';
|
||||
import { t, tc, N_ } from '../../../shared/i18n.js';
|
||||
|
||||
/** Settings store: { bgm, sfx, muted, damageNumbers, quality }. */
|
||||
/** Settings store: { bgm, sfx, voice, muted, damageNumbers, quality }. */
|
||||
export const settingsStore = createStore(sanitizeSettings(loadPref('settings', null)));
|
||||
|
||||
settingsStore.subscribe((s) => {
|
||||
@@ -69,6 +69,7 @@ export function SettingsModal({ open, onClose }) {
|
||||
<${LangToggle} class="set-lang" />
|
||||
</div>
|
||||
<${Slider} label=${t('背景音乐')} micro="BGM" icon="play" value=${s.bgm} onInput=${(v) => updateSettings({ bgm: v })} />
|
||||
<${Slider} label=${t('干员语音')} micro="VOICE" icon="mic" value=${s.voice} onInput=${(v) => updateSettings({ voice: v })} />
|
||||
<${Slider} label=${t('音效')} micro="SFX" icon="signal" value=${s.sfx}
|
||||
onInput=${(v) => { updateSettings({ sfx: v }); if (!tested) { setTested(true); setTimeout(() => setTested(false), 400); audio.sfx('click'); } }} />
|
||||
<${Toggle} label=${t('静音')} micro="MUTE" value=${s.muted} onChange=${(v) => updateSettings({ muted: v })} />
|
||||
|
||||
@@ -155,6 +155,12 @@ export function performAttack(b, u, prof, targets, opts = null) {
|
||||
u.stats.attacks++;
|
||||
const attackId = ++b._attackSeq; // every damage instance of this attack (all targets, splash, chain) carries it
|
||||
const isHeal = !!(prof.heal && prof.dmgType === 'heal');
|
||||
// 首次接敌 (official voice type ENCOUNTER_ENEMY, ≥ 3 s between two such lines): one event the first time a unit
|
||||
// attacks an enemy, whatever the attack is — the client answers with that operator's 行动开始 line (audio.js voice).
|
||||
if (!isHeal && u.side === 'ally' && !u.mem.engaged && targets.some((t) => t && t.side === 'enemy')) {
|
||||
u.mem.engaged = true;
|
||||
b._ev(['engage', u.id]);
|
||||
}
|
||||
const ranged = !prof._fortressMelee && prof.attack === 'ranged' && prof.projectile && prof.projectile !== 'none' && prof.projectile !== 'beam';
|
||||
const vis = prof._fortressMelee ? 'none' : (prof.projectile || 'none');
|
||||
for (let i = 0; i < targets.length; i++) {
|
||||
|
||||
+1
-1
@@ -427,7 +427,7 @@ export function validateC2S(msg) {
|
||||
|
||||
// Event tuple kinds inside `b.ev` (DESIGN §8.2).
|
||||
export const EV = Object.freeze({
|
||||
SPAWN: 'spawn', ATK: 'atk', DMG: 'dmg', HEAL: 'heal', SKILL: 'skill', DIE: 'die', LEAK: 'leak',
|
||||
SPAWN: 'spawn', ATK: 'atk', DMG: 'dmg', HEAL: 'heal', SKILL: 'skill', ENGAGE: 'engage', DIE: 'die', LEAK: 'leak',
|
||||
STATUS: 'status', FX: 'fx', LAYER: 'layer', BOUNTY: 'bounty', DEPLOY: 'deploy',
|
||||
});
|
||||
|
||||
|
||||
@@ -19,8 +19,9 @@
|
||||
// feedback after 0.1.0 (DESIGN §21, v0.1.1) including batch 6 (§21.21–§21.25: 坚固维式重锤 once per deployment, 起飞,
|
||||
// fenced tiles, knocked-out bodies, the dispatcher snapshot and the manifest shrink guard credited to PR #2 / PR #7) and
|
||||
// the 突变细胞 bench rule (§21.1: the carrier destroyed, its new operator gained into the 整备区 — official footage, PR #2),
|
||||
// the closing additions §21.26–§21.28 (GitHub issues #1 / #5 / #8) and the owner's deliberate trigger deviation for six
|
||||
// 重装 skills (§21.29, GitHub issue #4 / PR #12).
|
||||
// the closing additions §21.26–§21.28 (GitHub issues #1 / #5 / #8), the owner's deliberate trigger deviation for six
|
||||
// 重装 skills (§21.29, GitHub issue #4 / PR #12) and the operator battle voice the user asked for the same day (§21.30,
|
||||
// battle only — the 休整期 is silent).
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { readFileSync, readdirSync } from 'node:fs';
|
||||
@@ -857,3 +858,57 @@ test('the deliberate trigger deviation (DESIGN §21.29): six 重装 skills DEFAU
|
||||
assert.match(PLAYING, /深巡、雷蛇的二技能,号角的二、三技能,灰毫的一、二技能按玩家反馈改为攻击范围内有敌人时就释放/);
|
||||
assert.match(doc('CHANGELOG.md'), /深巡、雷蛇的二技能,号角的二、三技能,灰毫的一、二技能改为攻击范围内有敌人时就释放/);
|
||||
});
|
||||
|
||||
test('干员战斗语音 (DESIGN §21.30): the manifest data, the official priorities, and the 休整期 stays silent', async () => {
|
||||
const { VOICE_PRIORITY, VOICE_COOLDOWN_MS, resultVoiceSlot } = await import('../public/js/audio.js');
|
||||
const manifest = JSON.parse(readFileSync(join(ROOT, 'data/assets.json'), 'utf8'));
|
||||
const voice = manifest.audio?.voice ?? {};
|
||||
const charIds = Object.keys(voice);
|
||||
assert.ok(charIds.length >= 100, `${charIds.length} operators carry official battle voice`);
|
||||
assert.equal(manifest.stats.voiceChars, charIds.length, 'stats.voiceChars counts them');
|
||||
// one operator carries every slot a battle can play — and none of the prep-only ones (plan.mjs VOICE_BATTLE_SLOTS):
|
||||
// 干员报到 / 编入队伍 / 任命队长 are never requested by the client, so planning them only made every `npm run assets`
|
||||
// download 360 files (19.3 MB, one per operator and slot) nobody hears. `--voice-all` brings the complete set back.
|
||||
const slots = ['start', 'faceEnemy', 'select', 'place', 'skill1', 'skill2', 'skill3', 'skill4', 'resultFour', 'resultThree', 'resultTwo', 'resultLose'];
|
||||
const prepOnly = ['gacha', 'squad', 'squadFirst'];
|
||||
const lines = [];
|
||||
const walk = (x) => {
|
||||
if (typeof x === 'string') lines.push(x);
|
||||
else if (Array.isArray(x)) x.forEach(walk);
|
||||
else if (x && typeof x === 'object') Object.values(x).forEach(walk);
|
||||
};
|
||||
for (const id of charIds) {
|
||||
for (const s of slots) assert.ok(voice[id][s], `${id}.${s}`);
|
||||
for (const s of prepOnly) assert.equal(voice[id][s], undefined, `${id}.${s} is not planned by default`);
|
||||
walk(voice[id]);
|
||||
}
|
||||
// a battle slot usually carries several lines (选中干员 / 部署 have two), so the battle set alone stays well above 10 each
|
||||
assert.ok(lines.length >= charIds.length * 10, `${lines.length} voice lines for ${charIds.length} operators`);
|
||||
for (const u of lines) assert.match(u, /^\/assets\/audio\/voice\/cn\/char_[^/]+\/cn_\d+\.mp3$/);
|
||||
// the official scheduling numbers (audio_data.json battleVoice.voiceTypeOptions)
|
||||
assert.equal(VOICE_PRIORITY.start, 100);
|
||||
assert.equal(VOICE_PRIORITY.faceEnemy, 90);
|
||||
assert.equal(VOICE_PRIORITY.skill1, 70);
|
||||
assert.equal(VOICE_PRIORITY.place, 20);
|
||||
assert.equal(VOICE_PRIORITY.select, 10);
|
||||
assert.equal(VOICE_COOLDOWN_MS.skill1, 10000);
|
||||
assert.equal(VOICE_COOLDOWN_MS.faceEnemy, 3000);
|
||||
assert.equal(VOICE_COOLDOWN_MS.select, 1500);
|
||||
assert.equal(resultVoiceSlot({ perfect: true }), 'resultThree');
|
||||
// the docs
|
||||
assert.match(DESIGN, /### 21\.30 /);
|
||||
assert.match(DESIGN, /\*\*Where each line plays — battle only\.\*\*/);
|
||||
assert.match(doc('docs/ASSETS.md'), /\| 干员战斗语音 \|/);
|
||||
assert.match(doc('docs/ASSETS.md'), /voiceChars/);
|
||||
assert.match(SIM, /\['engage', id\]/);
|
||||
// the code: every slot the client asks for comes from a running battle's own stream — the three prep-only lines
|
||||
// (干员报到 / 编入队伍 / 任命队长) are never requested, and 选中干员 sits behind the panel's combat flag
|
||||
const panel = doc('public/js/ui/detailPanel.js');
|
||||
const game = doc('public/js/screens/game.js');
|
||||
for (const [name, src] of [['audio.js', doc('public/js/audio.js')], ['game.js', game], ['detailPanel.js', panel]]) {
|
||||
assert.ok(!/voice\([^)]*'(gacha|squad|squadFirst)'/.test(src), `${name}: no prep slot is played`);
|
||||
}
|
||||
assert.match(panel, /const selectKey = voice && detail\?\.type === 'chess'/);
|
||||
assert.match(game, /voice=\$\{combat\}/);
|
||||
assert.match(game, /audio\.voice\(charId, resultVoiceSlot\(/);
|
||||
});
|
||||
@@ -68,6 +68,10 @@ test('fetch-assets shrink guard: the committed manifest minus some audio entries
|
||||
assert.deepEqual(shrinkGuard(null, next, parseArgs([])), { dropped: [], write: true }, 'no current manifest: written');
|
||||
assert.equal(parseArgs(['--allow-shrink']).allowShrink, true);
|
||||
assert.throws(() => parseArgs(['--allow-shrinks']), /unknown option/);
|
||||
// 干员战斗语音: the prep-only slots are opt-in (DESIGN §21.30 — no battle requests them)
|
||||
assert.equal(parseArgs([]).voiceAll, false, 'the battle slots are what a plain run plans');
|
||||
assert.equal(parseArgs(['--voice-all']).voiceAll, true);
|
||||
assert.equal(parseArgs(['--voice-lang=jp']).voiceLang, 'jp');
|
||||
assert.equal(statSync(MANIFEST).mtimeMs, before, 'importing the tool runs nothing');
|
||||
});
|
||||
|
||||
|
||||
+46
-46
@@ -42,7 +42,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot":[5,5,0,513,10368],"enemy_1043_zomsbr":[18,18,0,351,54677],"enemy_1299_ymkilr":[1,1,0,2251,9792]},
|
||||
"hooks": [1,35,1535,152,152,200,200,1064,24,24,3,1,0,6482,0,19,24,0,1,24,0,0,0],
|
||||
"events": {"atk":152,"deploy":8,"die":24,"dmg":200,"fx":4,"skill":6,"spawn":35,"status":1},
|
||||
"events": {"atk":152,"deploy":8,"die":24,"dmg":200,"engage":5,"fx":4,"skill":6,"spawn":35,"status":1},
|
||||
"fx": {"buff":1,"coin":3},
|
||||
"snaps": "6a513536 c150215b 81084fd8 9870355a f707b691 df63fdcd"
|
||||
},
|
||||
@@ -80,7 +80,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[9,9,0,0,129890],"enemy_1381_winman_2":[5,5,0,0,97044],"enemy_1387_winshd":[4,4,0,0,119439]},
|
||||
"hooks": [1,29,2013,67,67,100,100,0,18,18,5,3,0,2605,44,0,18,0,1,18,0,0,0],
|
||||
"events": {"atk":79,"deploy":8,"die":18,"dmg":100,"fx":4,"skill":8,"spawn":29,"status":29},
|
||||
"events": {"atk":79,"deploy":8,"die":18,"dmg":100,"engage":4,"fx":4,"skill":8,"spawn":29,"status":29},
|
||||
"fx": {"crit":2,"dilemma":1,"shield":1},
|
||||
"snaps": "db18b5ac a7e81526 897c5e72 065cee09 e78d2988 e1d0e7f9 cab65b67"
|
||||
},
|
||||
@@ -117,7 +117,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,3,2,346,24167],"enemy_1251_lysyta":[15,13,2,48,35396],"enemy_1328_cbjedi":[1,1,0,1940,9000]},
|
||||
"hooks": [1,31,1739,175,175,223,218,4,18,22,15,15,0,9423,15,9,21,4,1,18,0,0,0],
|
||||
"events": {"atk":192,"deploy":8,"die":18,"dmg":218,"fx":36,"leak":4,"skill":30,"spawn":31,"status":25},
|
||||
"events": {"atk":192,"deploy":8,"die":18,"dmg":218,"engage":8,"fx":36,"leak":4,"skill":30,"spawn":31,"status":25},
|
||||
"fx": {"aoe":1,"displace":11,"pull":11,"shieldBreak":5,"strike":3,"taunt":1,"volley":3,"zone":1},
|
||||
"snaps": "b677776a 05df3ce3 3f4ea1ef 7c86ba28 c343548f 5e5789b8"
|
||||
},
|
||||
@@ -157,7 +157,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[4,4,0,96,5357],"enemy_1005_yokai_3":[2,2,0,862,69120],"enemy_9009_acfort":[2,2,0,685,55296]},
|
||||
"hooks": [1,21,2948,217,217,357,357,2132,8,8,13,11,0,11234,107,0,8,0,1,7,0,0,0],
|
||||
"events": {"atk":217,"deploy":10,"die":8,"dmg":357,"fx":36,"heal":74,"skill":24,"spawn":21,"status":80},
|
||||
"events": {"atk":217,"deploy":10,"die":8,"dmg":357,"engage":5,"fx":36,"heal":74,"skill":24,"spawn":21,"status":80},
|
||||
"fx": {"beam":2,"counter":16,"pull":1,"slippery":2,"taunt":4,"tornado":1,"tornadoPulse":5,"zone":5},
|
||||
"snaps": "f66ffc26 e4eea262 37ff890d e451ff33 28b10f94 47d55e15 7cf8b2aa 7d1d7e17 11c2118a 7599f2fd"
|
||||
},
|
||||
@@ -207,7 +207,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr":[15,15,0,774,51840],"enemy_1169_duphlx":[5,5,0,659,23040],"enemy_1170_dushld":[2,2,0,3575,16128]},
|
||||
"hooks": [1,32,2893,350,350,602,603,0,23,23,10,7,0,10075,41,15,22,0,1,24,7,0,0],
|
||||
"events": {"atk":404,"deploy":10,"die":23,"dmg":603,"fx":11,"layer":7,"skill":17,"spawn":31,"status":46},
|
||||
"events": {"atk":404,"deploy":10,"die":23,"dmg":603,"engage":6,"fx":11,"layer":7,"skill":17,"spawn":31,"status":46},
|
||||
"fx": {"devour":1,"dp":1,"garrison":3,"volley":3,"wolfShadow":2,"wolfShadowLost":1},
|
||||
"snaps": "d0724fb0 dc731840 afc7b763 306d88e1 16e7c1f4 157932c4 1b271b3a 007b9084 be400fd1 2fa15d8c"
|
||||
},
|
||||
@@ -244,7 +244,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[10,10,0,4638,104509],"enemy_1229_darmy_2":[7,7,0,18088,95800],"enemy_9007_acelem":[2,2,0,4609,179159]},
|
||||
"hooks": [1,29,2221,148,148,256,276,251,20,21,21,20,0,4154,485,13,19,0,1,20,5,3,0],
|
||||
"events": {"atk":167,"deploy":10,"die":21,"dmg":276,"fx":34,"layer":5,"skill":41,"spawn":27,"status":132},
|
||||
"events": {"atk":167,"deploy":10,"die":21,"dmg":276,"engage":4,"fx":34,"layer":5,"skill":41,"spawn":27,"status":132},
|
||||
"fx": {"beam":2,"blink":1,"burst":3,"devour":4,"dilemma":2,"frostNova":15,"garrison":5,"swordStorm":2},
|
||||
"snaps": "066fec91 aec41fca b75071e0 478fe370 a68e442a 1b0b0907 cc527129 08c4150f"
|
||||
},
|
||||
@@ -279,7 +279,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10042_prtrop":[4,4,0,2093,21600],"enemy_10042_prtrop_2":[2,2,0,421,14400],"enemy_10043_sailor":[11,11,0,484,54450]},
|
||||
"hooks": [1,25,1945,179,179,261,261,234,19,19,7,5,0,7219,13,10,17,0,1,19,0,0,0],
|
||||
"events": {"atk":215,"deploy":8,"die":19,"dmg":260,"fx":32,"heal":1,"skill":12,"spawn":25,"status":44},
|
||||
"events": {"atk":215,"deploy":8,"die":19,"dmg":260,"engage":6,"fx":32,"heal":1,"skill":12,"spawn":25,"status":44},
|
||||
"fx": {"crit":5,"displace":8,"ripple":7,"shadowWeave":7,"shield":2,"shieldBreak":1,"stealth":2},
|
||||
"snaps": "190730ef 965c573a bfec9b7d 015e7710 d6c7785b 1a172028 577310dd"
|
||||
},
|
||||
@@ -316,7 +316,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[2,1,1,8552,38604],"enemy_1061_zomshd":[11,11,0,983,179484]},
|
||||
"hooks": [1,23,4184,327,327,641,632,9770,13,14,16,15,0,6375,15,29,13,1,1,15,0,0,2],
|
||||
"events": {"atk":422,"deploy":8,"die":13,"dmg":622,"fx":104,"heal":22,"leak":1,"skill":33,"spawn":23,"status":44},
|
||||
"events": {"atk":422,"deploy":8,"die":13,"dmg":622,"engage":6,"fx":104,"heal":22,"leak":1,"skill":33,"spawn":23,"status":44},
|
||||
"fx": {"block":7,"dodge":2,"flame":1,"garrisonGrant":1,"riposte":1,"rockslide":7,"shieldBreak":10,"slash":40,"thorns":33,"truesilver":2},
|
||||
"snaps": "48d2a0bc 7a5c72a3 37963453 9c6110e3 fcf46ff8 04b08d2c c03bf731 3792e3d9 e4639ebf decf37ce a41ea7f2 bd40f194 8e5c993d 300fcece"
|
||||
},
|
||||
@@ -358,7 +358,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1158_divman":[15,15,0,2119,57024],"enemy_1160_hvyslr":[2,2,0,5090,23040],"enemy_1161_tidmag":[1,1,0,2691,6912]},
|
||||
"hooks": [1,32,2039,172,172,261,269,1137,21,21,12,12,0,5972,102,9,18,0,1,21,1,1,3],
|
||||
"events": {"atk":222,"deploy":11,"die":21,"dmg":269,"fx":26,"layer":1,"skill":24,"spawn":31,"status":80},
|
||||
"events": {"atk":222,"deploy":11,"die":21,"dmg":269,"engage":6,"fx":26,"layer":1,"skill":24,"spawn":31,"status":80},
|
||||
"fx": {"burst":1,"dilemma":1,"dodge":3,"explosion":5,"frostNova":2,"garrison":1,"levitate":7,"overclock":1,"shield":2,"slippery":1,"splash":2},
|
||||
"snaps": "910f43b9 691d4675 7aa329ef 265d3e05 a0f84586 b0546a70 a29372ef"
|
||||
},
|
||||
@@ -393,7 +393,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[14,11,3,27513,136496],"enemy_1170_dushld_2":[4,1,3,36563,52797],"enemy_9011_acrefr":[4,1,2,57607,114879]},
|
||||
"hooks": [1,52,5700,834,834,1143,1124,3859,35,43,29,28,102,4003,202,60,22,8,1,35,0,0,19],
|
||||
"events": {"atk":1176,"deploy":30,"die":35,"dmg":1121,"fx":177,"heal":193,"leak":8,"skill":57,"spawn":30,"status":530},
|
||||
"events": {"atk":1176,"deploy":30,"die":35,"dmg":1121,"engage":4,"fx":177,"heal":193,"leak":8,"skill":57,"spawn":30,"status":530},
|
||||
"fx": {"bandage":4,"dodge":19,"extraAttack":54,"garrisonGrant":1,"mote":40,"redistribute":30,"revive":19,"reweave":2,"sandChains":3,"shield":4,"spGift":1},
|
||||
"snaps": "a5613700 ec9cb900 84379a83 c02cd949 c7444986 f9e23c1c e0aa99f1 eeea552b 24eb1e39 15dcee36 e5d5538f fbefb93b 04cf81c1 90a2259d 859536f6 b9c7eade fb8513f0 ac9b1324 54084832"
|
||||
},
|
||||
@@ -446,7 +446,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1158_divman":[15,15,0,1399,44550],"enemy_1160_hvyslr":[2,2,0,3890,18000],"enemy_1161_tidmag":[1,1,0,1463,5400]},
|
||||
"hooks": [1,45,2498,223,223,306,307,478,21,33,12,12,0,6503,44,10,18,0,1,22,0,0,9],
|
||||
"events": {"atk":234,"deploy":25,"die":33,"dmg":303,"fx":89,"skill":28,"spawn":44,"status":70},
|
||||
"events": {"atk":234,"deploy":25,"die":33,"dmg":303,"engage":7,"fx":89,"skill":28,"spawn":44,"status":70},
|
||||
"fx": {"aoe":6,"coin":19,"dodge":9,"explode":13,"featherArrow":1,"flame":1,"garrisonGrant":1,"revive":1,"riposte":7,"rockslide":1,"shieldBreak":4,"summon":16,"swordRain":6,"swordStorm":3,"zone":1},
|
||||
"snaps": "1ecc8642 832be356 348fd8fd 002fcccf 012b93d9 f75ce414 18574635 facf960a abfbfba2"
|
||||
},
|
||||
@@ -484,7 +484,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[10,10,0,0,48384],"enemy_1229_darmy_2":[7,7,0,0,44352],"enemy_1275_dwlock_2":[3,3,0,3570,48384],"enemy_5601_entlec":[2,2,0,0,5786]},
|
||||
"hooks": [1,33,2143,108,108,161,354,291,22,23,7,5,42,3991,0,3,22,0,1,62,0,0,0],
|
||||
"events": {"atk":118,"deploy":8,"die":23,"dmg":199,"fx":55,"skill":14,"spawn":33,"status":3},
|
||||
"events": {"atk":118,"deploy":8,"die":23,"dmg":199,"engage":4,"fx":55,"skill":14,"spawn":33,"status":3},
|
||||
"fx": {"anchor":2,"aoe":1,"beam":1,"candle":2,"coin":4,"downed":1,"ember":1,"revive":1,"splash":42},
|
||||
"snaps": "62c7bcd4 674c8844 6a9bd237 91a64467 cba2cbbe e9220cd3 1da987ee fb3307c8"
|
||||
},
|
||||
@@ -524,7 +524,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,4898,69696],"enemy_1116_liprr_2":[4,4,0,179,34560],"enemy_1121_lifbos":[1,1,0,8539,23040]},
|
||||
"hooks": [1,27,2084,242,242,384,384,1800,18,18,8,7,0,7493,12,17,16,0,1,18,1,0,0],
|
||||
"events": {"atk":265,"deploy":8,"die":18,"dmg":376,"fx":59,"heal":48,"layer":1,"skill":15,"spawn":27,"status":49},
|
||||
"events": {"atk":265,"deploy":8,"die":18,"dmg":376,"engage":5,"fx":59,"heal":48,"layer":1,"skill":15,"spawn":27,"status":49},
|
||||
"fx": {"displace":16,"garrison":1,"healField":1,"liberate":4,"redistribute":15,"reweave":1,"sandChains":2,"shield":1,"slash":17,"truesilver":1},
|
||||
"snaps": "ad09e96f 6bdb7b5b 6eeee792 1fcaf8dd 4f9ad0eb 979b5a35 added99f"
|
||||
},
|
||||
@@ -561,7 +561,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[2,2,0,4508,124416],"enemy_1043_zomsbr":[23,23,0,20,147057],"enemy_1061_zomshd":[5,5,0,4181,132516]},
|
||||
"hooks": [1,41,2585,237,237,430,545,3521,33,33,15,13,0,5133,998,10,30,0,1,46,0,0,5],
|
||||
"events": {"atk":237,"deploy":9,"die":33,"dmg":425,"fx":55,"skill":28,"spawn":40,"status":123},
|
||||
"events": {"atk":237,"deploy":9,"die":33,"dmg":425,"engage":7,"fx":55,"skill":28,"spawn":40,"status":123},
|
||||
"fx": {"aoe":25,"displace":15,"dodge":5,"flame":2,"overload":2,"riposte":1,"shield":2,"volley":3},
|
||||
"snaps": "5a72bba9 0659d371 b8310d82 76b71b85 cf872b16 b13b69ba 59b7c64f 9c4213f3 8327e347"
|
||||
},
|
||||
@@ -608,7 +608,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1000_gopro_2":[19,19,0,0,29070],"enemy_1325_cbgpro":[5,5,0,0,17100],"enemy_1325_cbgpro_2":[3,3,0,0,12420]},
|
||||
"hooks": [1,47,1315,63,63,120,120,0,27,35,3,3,0,5130,1,0,27,0,1,27,1,0,0],
|
||||
"events": {"atk":63,"deploy":17,"die":35,"dmg":120,"fx":50,"layer":1,"skill":8,"spawn":47,"status":2},
|
||||
"events": {"atk":63,"deploy":17,"die":35,"dmg":120,"engage":4,"fx":50,"layer":1,"skill":8,"spawn":47,"status":2},
|
||||
"fx": {"buff":1,"coin":12,"explode":8,"garrison":1,"garrisonGrant":1,"spGift":14,"strike":2,"summon":9,"volley":2},
|
||||
"snaps": "907cbf77 fce5049b cd63c811 19d26f73 4b87ef36"
|
||||
},
|
||||
@@ -644,7 +644,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[11,11,0,2752,69696],"enemy_1270_nhstlk_2":[4,4,0,0,73728],"enemy_1272_nhtank_2":[2,2,0,2359,34560]},
|
||||
"hooks": [1,26,2174,74,74,125,125,16,18,18,29,29,0,7659,1586,4,17,0,1,18,0,0,0],
|
||||
"events": {"atk":78,"deploy":9,"die":18,"dmg":125,"fx":41,"heal":16,"skill":58,"spawn":26,"status":23},
|
||||
"events": {"atk":78,"deploy":9,"die":18,"dmg":125,"engage":6,"fx":41,"heal":16,"skill":58,"spawn":26,"status":23},
|
||||
"fx": {"coldWind":2,"frostNova":3,"healAoe":4,"strike":9,"summon":1,"volley":9,"zone":13},
|
||||
"snaps": "89cecaf9 38614dcd 7761e0b8 9aeebba4 1f07677c 0a06c2c1 3c72c25c f68984bb"
|
||||
},
|
||||
@@ -681,7 +681,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr":[11,11,0,4618,57024],"enemy_1267_nhpbr_2":[5,5,0,1141,31680],"enemy_1272_nhtank":[1,1,0,1689,13824]},
|
||||
"hooks": [1,25,1853,134,134,486,486,0,20,20,7,4,15,7704,0,2,17,0,1,20,1,0,0],
|
||||
"events": {"atk":173,"deploy":8,"die":20,"dmg":486,"fx":24,"layer":1,"skill":11,"spawn":25,"status":1},
|
||||
"events": {"atk":173,"deploy":8,"die":20,"dmg":486,"engage":7,"fx":24,"layer":1,"skill":11,"spawn":25,"status":1},
|
||||
"fx": {"buff":1,"displace":2,"garrison":1,"pull":2,"zone":18},
|
||||
"snaps": "c9571e9b 447301c4 210539b8 00f65df0 cca396c8 6e1a7a83 293704b2"
|
||||
},
|
||||
@@ -716,7 +716,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[3,3,0,1931,298598],"enemy_1043_zomsbr":[23,23,0,121,156433],"enemy_1402_tgshd_2":[4,4,0,6002,129393]},
|
||||
"hooks": [1,38,2421,453,453,791,791,5319,32,32,15,13,240,5046,38,9,30,0,1,39,0,0,0],
|
||||
"events": {"atk":543,"deploy":8,"die":32,"dmg":786,"fx":331,"skill":28,"spawn":38,"status":131},
|
||||
"events": {"atk":543,"deploy":8,"die":32,"dmg":786,"engage":8,"fx":331,"skill":28,"spawn":38,"status":131},
|
||||
"fx": {"aoe":6,"buff":2,"counter":6,"displace":38,"expose":264,"reload":1,"ripple":9,"sermon":1,"shield":3,"substitute":1},
|
||||
"snaps": "86f46177 a7754041 6fc8742b 4d308e37 34864b3b d2cbfa1a b15764a7 406381fc"
|
||||
},
|
||||
@@ -754,7 +754,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1195_sfyin":[11,11,0,0,19800],"enemy_1196_msfyin":[22,22,0,0,44],"enemy_1197_sfshu":[5,5,0,0,11250],"enemy_1198_msfshu":[15,15,0,0,45]},
|
||||
"hooks": [1,64,1377,123,123,188,188,0,53,53,13,10,0,7888,30,0,53,0,1,53,0,0,0],
|
||||
"events": {"atk":159,"deploy":9,"die":53,"dmg":188,"fx":25,"skill":23,"spawn":64,"status":47},
|
||||
"events": {"atk":159,"deploy":9,"die":53,"dmg":188,"engage":7,"fx":25,"skill":23,"spawn":64,"status":47},
|
||||
"fx": {"copy":1,"dp":1,"sleep":3,"strike":2,"summon":16,"volley":2},
|
||||
"snaps": "5711acf3 3aaf6dc4 ebdfdc7e a54fcb41 1044a950"
|
||||
},
|
||||
@@ -796,7 +796,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1288_duskls":[11,11,0,210,63415],"enemy_1288_duskls_2":[7,7,0,0,48419],"enemy_1292_duskld":[5,5,0,1224,57650]},
|
||||
"hooks": [1,38,2463,282,321,531,531,506,23,25,19,15,0,11343,240,29,23,0,1,53,0,0,0],
|
||||
"events": {"atk":345,"deploy":12,"die":25,"dmg":531,"fx":193,"skill":34,"spawn":38,"status":429},
|
||||
"events": {"atk":345,"deploy":12,"die":25,"dmg":531,"engage":12,"fx":193,"skill":34,"spawn":38,"status":429},
|
||||
"fx": {"aoe":2,"copy":1,"crit":4,"dp":2,"ember":23,"iceSpike":64,"palsy":3,"sleep":3,"split":3,"weightless":2,"zone":86},
|
||||
"snaps": "d611730f 72f36081 7a911555 25fc0ca4 0aadc409 dc3e520f d329d385 26552ded 45a5a690"
|
||||
},
|
||||
@@ -831,7 +831,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,1505,69696],"enemy_1116_liprr_2":[4,4,0,774,34560],"enemy_1118_lidbox_2":[2,2,0,965,21888]},
|
||||
"hooks": [1,25,1454,162,162,365,365,0,18,18,7,5,0,4647,11,12,17,0,1,18,0,0,0],
|
||||
"events": {"atk":203,"deploy":8,"die":18,"dmg":364,"fx":12,"skill":12,"spawn":25,"status":74},
|
||||
"events": {"atk":203,"deploy":8,"die":18,"dmg":364,"engage":5,"fx":12,"skill":12,"spawn":25,"status":74},
|
||||
"fx": {"buff":1,"displace":4,"ripple":1,"shield":2,"shieldBreak":1,"volley":3},
|
||||
"snaps": "303551a0 a1b61e4e c83edf58 01ae4382 9c1b79e7"
|
||||
},
|
||||
@@ -871,7 +871,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[9,9,0,408,129890],"enemy_1381_winman_2":[5,5,0,2615,97044],"enemy_1387_winshd":[4,4,0,2027,119439]},
|
||||
"hooks": [1,33,4584,493,493,803,817,0,20,22,39,36,13,11439,77,9,18,0,1,21,3,3,0],
|
||||
"events": {"atk":520,"deploy":13,"die":22,"dmg":804,"fx":166,"layer":3,"skill":75,"spawn":31,"status":160},
|
||||
"events": {"atk":520,"deploy":13,"die":22,"dmg":804,"engage":11,"fx":166,"layer":3,"skill":75,"spawn":31,"status":160},
|
||||
"fx": {"aoe":12,"buff":1,"burst":3,"charge":17,"counter":13,"crit":59,"displace":21,"garrison":3,"quadShot":2,"ripple":9,"sentry":1,"sermon":1,"shadowWeave":11,"shield":1,"soul":3,"stealth":4,"substitute":1,"summon":3,"swap":1},
|
||||
"snaps": "ae3e9ee4 e795ca48 af286313 5aa3428e 6e5316b8 959e25b3 4a8f8f76 e74c3a44 496ccf66 d9ba6888 55757f23 aa695997 2dac6dad 8ad5fbdb 83692eb8 8299c089"
|
||||
},
|
||||
@@ -911,7 +911,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,0,27000],"enemy_1251_lysyta":[15,15,0,0,37125],"enemy_1328_cbjedi":[1,1,0,898,9000]},
|
||||
"hooks": [1,34,1620,96,96,157,152,0,21,21,10,7,0,6646,33,1,21,0,1,21,2,0,0],
|
||||
"events": {"atk":119,"deploy":10,"die":21,"dmg":152,"fx":61,"layer":2,"skill":17,"spawn":34,"status":46},
|
||||
"events": {"atk":119,"deploy":10,"die":21,"dmg":152,"engage":5,"fx":61,"layer":2,"skill":17,"spawn":34,"status":46},
|
||||
"fx": {"charge":4,"dilemma":2,"displace":14,"garrison":2,"levitate":11,"pull":1,"shadowWeave":11,"shieldBreak":5,"slippery":1,"splash":2,"stealth":2,"tornado":1,"tornadoPulse":5},
|
||||
"snaps": "c27c0600 1d169021 02c1eb1d 8ea4ebf1 57022adf 39e3da22"
|
||||
},
|
||||
@@ -951,7 +951,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[7,7,0,3373,21773],"enemy_1299_ymkilr_2":[3,3,0,1837,38016],"enemy_1422_lrsldr_2":[14,14,0,0,88704]},
|
||||
"hooks": [1,37,2071,84,84,166,166,663,26,26,7,6,0,4290,103,10,24,0,1,26,0,0,0],
|
||||
"events": {"atk":84,"deploy":10,"die":26,"dmg":166,"fx":21,"skill":13,"spawn":37,"status":10},
|
||||
"events": {"atk":84,"deploy":10,"die":26,"dmg":166,"engage":5,"fx":21,"skill":13,"spawn":37,"status":10},
|
||||
"fx": {"crit":2,"frostNova":1,"levitate":7,"overclock":1,"pull":1,"slippery":1,"strike":2,"tornado":1,"tornadoPulse":5},
|
||||
"snaps": "1c35197a b5a550c2 449f2d84 3e5d7032 3c466668 15903287 c2362cab"
|
||||
},
|
||||
@@ -1002,7 +1002,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,443,69696],"enemy_1116_liprr_2":[4,4,0,757,34560],"enemy_1118_lidbox_2":[2,2,0,521,21888]},
|
||||
"hooks": [1,30,1604,201,201,235,230,80,17,20,12,11,0,4816,246,18,17,0,1,17,2,0,8],
|
||||
"events": {"atk":214,"deploy":11,"die":20,"dmg":215,"fx":40,"heal":49,"layer":2,"skill":25,"spawn":27,"status":63},
|
||||
"events": {"atk":214,"deploy":11,"die":20,"dmg":215,"engage":6,"fx":40,"heal":49,"layer":2,"skill":25,"spawn":27,"status":63},
|
||||
"fx": {"aoe":3,"blink":3,"dodge":8,"flame":2,"frostNova":4,"garrison":2,"garrisonGrant":1,"liberate":3,"riposte":8,"rockslide":2,"shieldBreak":4},
|
||||
"snaps": "f6e5416c 58911567 9a06225b ca1af778 00aa1906 6c2de306"
|
||||
},
|
||||
@@ -1042,7 +1042,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[7,7,0,2139,130637],"enemy_1422_lrsldr_2":[14,14,0,0,191601],"enemy_1425_lrcmra_2":[3,3,0,2803,186624]},
|
||||
"hooks": [1,45,1845,107,107,111,119,74,24,34,13,12,0,2316,0,16,24,0,1,24,1,0,0],
|
||||
"events": {"atk":109,"deploy":18,"die":34,"dmg":113,"fx":23,"heal":58,"layer":1,"skill":27,"spawn":35,"status":9},
|
||||
"events": {"atk":109,"deploy":18,"die":34,"dmg":113,"engage":4,"fx":23,"heal":58,"layer":1,"skill":27,"spawn":35,"status":9},
|
||||
"fx": {"aoe":8,"blink":10,"explosion":3,"garrison":1,"garrisonGrant":1},
|
||||
"snaps": "1131be33 27e0b982 bfaeaa73 76dfd40e 79e7f64e f4827c69 435ba556"
|
||||
},
|
||||
@@ -1079,7 +1079,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr":[11,10,0,4389,43172],"enemy_1267_nhpbr_2":[5,5,0,1428,24750],"enemy_1272_nhtank":[1,0,0,11242,2493]},
|
||||
"hooks": [1,25,3300,235,235,525,525,2310,15,15,20,20,0,14437,0,5,17,0,1,15,1,0,0],
|
||||
"events": {"atk":327,"deploy":8,"die":15,"dmg":484,"fx":112,"heal":166,"layer":1,"skill":40,"spawn":25,"status":237},
|
||||
"events": {"atk":327,"deploy":8,"die":15,"dmg":484,"engage":3,"fx":112,"heal":166,"layer":1,"skill":40,"spawn":25,"status":237},
|
||||
"fx": {"buff":1,"counter":15,"garrison":1,"healField":1,"mote":38,"redistribute":15,"reweave":1,"slash":17,"spGift":1,"truesilver":1,"zone":21},
|
||||
"snaps": "0bdd9351 b24b323e bd7fa0e6 9082ff11 2ec2d408 d77ed103 82e40b03 8f2326cd 3ebba6a7 7ce5233b e938b951"
|
||||
},
|
||||
@@ -1114,7 +1114,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[3,3,0,5125,138240],"enemy_1043_zomsbr":[23,23,0,48,70867],"enemy_1402_tgshd_2":[4,4,0,1710,59904]},
|
||||
"hooks": [1,39,3442,191,191,497,653,1967,32,32,16,14,0,6394,0,15,30,0,1,46,0,1,0],
|
||||
"events": {"atk":225,"deploy":9,"die":32,"dmg":653,"fx":138,"skill":30,"spawn":38,"status":56},
|
||||
"events": {"atk":225,"deploy":9,"die":32,"dmg":653,"engage":4,"fx":138,"skill":30,"spawn":38,"status":56},
|
||||
"fx": {"aoe":5,"burst":1,"expose":63,"jungleSoul":1,"mote":20,"redistribute":25,"reweave":2,"slash":20,"truesilver":1},
|
||||
"snaps": "2c6321b4 cd26a52a 90107827 1e040533 bf55c7a2 587efe24 04e3a230 2316a1be 704aab56 d4f428ad 361a7d9c 9efe2d19"
|
||||
},
|
||||
@@ -1150,7 +1150,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[3,3,0,7516,25920],"enemy_1010_demon_2":[1,1,0,6145,17280],"enemy_1071_dftman":[15,15,0,880,48384]},
|
||||
"hooks": [1,28,2257,235,235,291,315,0,24,24,4,4,0,4413,27,28,19,0,1,24,0,0,0],
|
||||
"events": {"atk":235,"deploy":9,"die":24,"dmg":315,"fx":48,"skill":12,"spawn":28,"status":53},
|
||||
"events": {"atk":235,"deploy":9,"die":24,"dmg":315,"engage":8,"fx":48,"skill":12,"spawn":28,"status":53},
|
||||
"fx": {"aoe":7,"coin":4,"crit":6,"dp":1,"strike":29,"summon":1},
|
||||
"snaps": "d4f0d969 5a4a40d8 3c484b76 b9530121 cbe87f7f d5bacb4f 94dfe238 7e0baa1c"
|
||||
},
|
||||
@@ -1188,7 +1188,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1158_divman":[20,20,0,6116,164229],"enemy_1160_hvyslr_2":[3,3,0,0,104509],"enemy_1161_tidmag_2":[3,3,0,1507,59720]},
|
||||
"hooks": [1,39,2230,313,313,469,473,2,29,29,6,5,0,3754,38,2,26,0,1,31,3,0,0],
|
||||
"events": {"atk":314,"deploy":11,"die":29,"dmg":473,"fx":29,"heal":2,"layer":3,"skill":13,"spawn":37,"status":75},
|
||||
"events": {"atk":314,"deploy":11,"die":29,"dmg":473,"engage":5,"fx":29,"heal":2,"layer":3,"skill":13,"spawn":37,"status":75},
|
||||
"fx": {"aoe":3,"bondProc":9,"crit":5,"dp":4,"garrison":3,"wolfShadow":2,"wolfShadowLost":3},
|
||||
"snaps": "d1ead0d3 cda7c00c ccc1aada c0883850 2ba76678 a36bad1d 085c7f88 f7baafc7"
|
||||
},
|
||||
@@ -1226,7 +1226,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[3,3,0,208,20250],"enemy_1010_demon_2":[1,1,0,202,13500],"enemy_1071_dftman":[15,15,0,0,37800]},
|
||||
"hooks": [1,30,1601,160,160,234,234,0,19,19,8,7,0,8098,44,3,19,0,1,19,0,0,0],
|
||||
"events": {"atk":217,"deploy":8,"die":19,"dmg":234,"fx":45,"skill":15,"spawn":30,"status":70},
|
||||
"events": {"atk":217,"deploy":8,"die":19,"dmg":234,"engage":8,"fx":45,"skill":15,"spawn":30,"status":70},
|
||||
"fx": {"aoe":1,"displace":19,"pull":19,"sleep":2,"strike":2,"volley":2},
|
||||
"snaps": "ccacd2b6 245aa361 460d6c7e 6f4413db 6fc4040a f85f49f4"
|
||||
},
|
||||
@@ -1261,7 +1261,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[10,10,0,0,86400],"enemy_1119_vofsd":[5,5,0,0,63360],"enemy_1121_lifbos_2":[3,3,0,0,86400]},
|
||||
"hooks": [1,26,2220,154,154,260,495,800,19,20,9,6,0,4772,242,0,18,0,1,65,0,0,0],
|
||||
"events": {"atk":158,"deploy":8,"die":20,"dmg":260,"fx":11,"skill":15,"spawn":26,"status":109},
|
||||
"events": {"atk":158,"deploy":8,"die":20,"dmg":260,"engage":5,"fx":11,"skill":15,"spawn":26,"status":109},
|
||||
"fx": {"anchor":2,"aoe":1,"ember":1,"overload":1,"sleep":1,"wake":5},
|
||||
"snaps": "a670acd9 9001d709 b6201c30 2abbe338 097e73f6 82d908fd d1618a08 83c56b8b"
|
||||
},
|
||||
@@ -1313,7 +1313,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,95,69696],"enemy_1116_liprr_2":[4,4,0,950,34560],"enemy_1118_lidbox_2":[2,2,0,6964,21888]},
|
||||
"hooks": [1,28,1510,197,197,311,311,0,19,19,7,4,8,6749,23,21,17,0,1,23,4,0,0],
|
||||
"events": {"atk":231,"deploy":9,"die":19,"dmg":308,"fx":41,"layer":4,"skill":11,"spawn":28,"status":81},
|
||||
"events": {"atk":231,"deploy":9,"die":19,"dmg":308,"engage":8,"fx":41,"layer":4,"skill":11,"spawn":28,"status":81},
|
||||
"fx": {"aoe":1,"camouflage":1,"counter":8,"displace":14,"dp":2,"garrison":4,"liberate":3,"ripple":4,"sermon":1,"shield":2,"wolfShadow":1},
|
||||
"snaps": "d8f99986 1f9ccb87 8d923b06 2a970a47 57843389"
|
||||
},
|
||||
@@ -1358,7 +1358,7 @@
|
||||
"enemy_1208_msfji": [2,2,0,0,50]
|
||||
},
|
||||
"hooks": [1,79,2602,166,166,328,327,580,69,69,28,26,0,7729,63,15,66,0,1,77,0,0,1],
|
||||
"events": {"atk":209,"deploy":10,"die":69,"dmg":327,"fx":83,"heal":12,"skill":54,"spawn":77,"status":151},
|
||||
"events": {"atk":209,"deploy":10,"die":69,"dmg":327,"engage":8,"fx":83,"heal":12,"skill":54,"spawn":77,"status":151},
|
||||
"fx": {"aoe":10,"crit":6,"dodge":1,"dp":3,"sp":3,"substitute":2,"summon":21,"swap":1,"weightless":3,"zone":33},
|
||||
"snaps": "f2b40c86 9da76a91 42c31aa5 b26bba18 f1add42b f8c2e912 33c9db0c e33736db 6366980e"
|
||||
},
|
||||
@@ -1398,7 +1398,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr":[11,11,0,2950,44550],"enemy_1267_nhpbr_2":[5,5,0,800,24750],"enemy_1270_nhstlk":[2,2,0,1171,21600]},
|
||||
"hooks": [1,31,1533,82,82,273,273,1,20,20,7,3,0,6077,35,2,18,0,1,20,0,0,0],
|
||||
"events": {"atk":125,"deploy":10,"die":20,"dmg":273,"fx":52,"heal":1,"skill":10,"spawn":31,"status":61},
|
||||
"events": {"atk":125,"deploy":10,"die":20,"dmg":273,"engage":4,"fx":52,"heal":1,"skill":10,"spawn":31,"status":61},
|
||||
"fx": {"crit":3,"dilemma":2,"heal":1,"levitate":13,"sentry":1,"shadowWeave":12,"slippery":1,"splash":2,"stealth":1,"zone":16},
|
||||
"snaps": "22a08fb1 40471656 da322ae0 3a267de6 95a0c856 b8db98f3"
|
||||
},
|
||||
@@ -1435,7 +1435,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1251_lysyta_2":[19,19,0,112,70042],"enemy_1252_lysytb_2":[7,7,0,1943,72576],"enemy_1329_cbshld_2":[4,4,0,2771,59904]},
|
||||
"hooks": [1,40,3191,219,233,357,371,50,30,30,57,54,0,14240,61,4,30,0,1,30,0,1,0],
|
||||
"events": {"atk":257,"deploy":8,"die":30,"dmg":371,"fx":157,"heal":50,"skill":111,"spawn":40,"status":125},
|
||||
"events": {"atk":257,"deploy":8,"die":30,"dmg":371,"engage":4,"fx":157,"heal":50,"skill":111,"spawn":40,"status":125},
|
||||
"fx": {"aoe":9,"burst":1,"counter":5,"displace":32,"heal":35,"iceSpike":34,"ripple":16,"shadowWeave":20,"soul":1,"stealth":4},
|
||||
"snaps": "b3fec5d9 59ebb356 6d90ccd4 672b65be b58aec4b 60fa7afc 4d71ceab 1048946f 06425012 99d5d7f3 b20b2b93"
|
||||
},
|
||||
@@ -1473,7 +1473,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,453,34560],"enemy_1251_lysyta":[15,15,0,229,47520],"enemy_1328_cbjedi":[1,1,0,1182,11520]},
|
||||
"hooks": [1,32,1604,172,172,234,225,9,23,22,15,14,20,5887,502,14,21,0,1,23,0,0,0],
|
||||
"events": {"atk":172,"deploy":8,"die":22,"dmg":219,"fx":50,"heal":2,"skill":31,"spawn":32,"status":98},
|
||||
"events": {"atk":172,"deploy":8,"die":22,"dmg":219,"engage":6,"fx":50,"heal":2,"skill":31,"spawn":32,"status":98},
|
||||
"fx": {"block":4,"explosion":3,"frostNova":6,"rockslide":2,"shieldBreak":11,"swordRain":12,"swordStorm":2,"thorns":10},
|
||||
"snaps": "241cb7e7 200c57ef 07026ad0 06c49f0b 308a5472 31b270f1"
|
||||
},
|
||||
@@ -1508,7 +1508,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[14,9,5,5122,116437],"enemy_1169_duphlx_2":[7,1,6,2102,34836],"enemy_1172_dugago":[3,0,3,19205,79225]},
|
||||
"hooks": [1,36,4272,698,698,863,863,99,15,29,21,21,82,15296,266,12,24,14,1,17,0,0,0],
|
||||
"events": {"atk":780,"deploy":12,"die":15,"dmg":863,"fx":19,"heal":70,"leak":14,"skill":42,"spawn":32,"status":237},
|
||||
"events": {"atk":780,"deploy":12,"die":15,"dmg":863,"engage":7,"fx":19,"heal":70,"leak":14,"skill":42,"spawn":32,"status":237},
|
||||
"fx": {"counter":4,"featherArrow":2,"flame":3,"garrisonGrant":1,"healField":1,"revive":2,"stone":2,"taunt":4},
|
||||
"snaps": "e8a58cae cc93867c 83fa20df eba0ed1f 84da0944 45cc2dac 1c29b227 c757f725 c4a012a1 1581a672 c133e524 2d0211d9 3aa23054 943283cd dfda39c6"
|
||||
},
|
||||
@@ -1543,7 +1543,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,0,27000],"enemy_1251_lysyta":[15,15,0,0,37125],"enemy_1328_cbjedi":[1,1,0,0,9000]},
|
||||
"hooks": [1,29,1344,121,121,282,277,1,21,21,5,3,14,5768,33,0,21,0,1,21,1,0,0],
|
||||
"events": {"atk":144,"deploy":8,"die":21,"dmg":277,"fx":62,"layer":1,"skill":8,"spawn":29,"status":92},
|
||||
"events": {"atk":144,"deploy":8,"die":21,"dmg":277,"engage":5,"fx":62,"layer":1,"skill":8,"spawn":29,"status":92},
|
||||
"fx": {"buff":1,"displace":16,"garrison":1,"garrisonGrant":1,"mote":16,"sandChains":1,"shieldBreak":5,"slash":9,"sp":1,"spGift":10,"truesilver":1},
|
||||
"snaps": "5fab4324 4504ae6f ce2c7b3f 273640e9 88622454"
|
||||
},
|
||||
@@ -1580,7 +1580,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[7,7,0,1205,60480],"enemy_1422_lrsldr_2":[14,14,0,74,88704],"enemy_1425_lrcmra_2":[3,2,1,10147,70389]},
|
||||
"hooks": [1,34,3251,301,301,557,557,400,27,28,27,25,76,3567,117,10,24,1,1,27,0,0,0],
|
||||
"events": {"atk":349,"deploy":10,"die":27,"dmg":557,"fx":146,"leak":1,"skill":52,"spawn":34,"status":196},
|
||||
"events": {"atk":349,"deploy":10,"die":27,"dmg":557,"engage":7,"fx":146,"leak":1,"skill":52,"spawn":34,"status":196},
|
||||
"fx": {"charge":10,"crit":53,"dilemma":3,"displace":16,"garrisonGrant":1,"levitate":21,"overclock":1,"pull":1,"quadShot":2,"slippery":2,"sp":23,"splash":7,"tornado":1,"tornadoPulse":5},
|
||||
"snaps": "52481b26 a970d314 2696635b 9c15cc8e 501817d0 a8faf661 7e05b7cf ffceee93 c505d863 f99ccd20 1c4895d8"
|
||||
},
|
||||
@@ -1634,7 +1634,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,305,69696],"enemy_1116_liprr_2":[4,4,0,429,34560],"enemy_1118_lidbox_2":[2,2,0,9762,21888]},
|
||||
"hooks": [1,44,1985,210,210,367,394,52,18,34,6,3,0,6985,15,16,17,0,1,18,0,1,0],
|
||||
"events": {"atk":210,"deploy":25,"die":34,"dmg":394,"fx":114,"heal":42,"skill":11,"spawn":44,"status":48},
|
||||
"events": {"atk":210,"deploy":25,"die":34,"dmg":394,"engage":5,"fx":114,"heal":42,"skill":11,"spawn":44,"status":48},
|
||||
"fx": {"aoe":10,"burst":1,"coin":20,"counter":5,"explode":16,"liberate":3,"overload":1,"strike":40,"summon":17,"taunt":1},
|
||||
"snaps": "3a6154e2 bbed839c a9f7e3a7 0a1cc28d bec91f1f 6279cb1e 7645ebd2"
|
||||
},
|
||||
@@ -1674,7 +1674,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[4,4,0,1618,15428],"enemy_1041_lazerd_2":[3,3,0,5218,44790],"enemy_1042_frostd":[5,5,0,0,80870]},
|
||||
"hooks": [1,25,1933,76,76,78,78,17,12,12,10,9,0,5149,274,0,12,0,1,12,0,0,0],
|
||||
"events": {"atk":76,"deploy":10,"die":12,"dmg":78,"fx":12,"heal":12,"skill":19,"spawn":25,"status":19},
|
||||
"events": {"atk":76,"deploy":10,"die":12,"dmg":78,"engage":3,"fx":12,"heal":12,"skill":19,"spawn":25,"status":19},
|
||||
"fx": {"counter":3,"explosion":6,"overload":1,"taunt":2},
|
||||
"snaps": "aa5b6d09 8f0feb81 daa8eb15 c9edcd5a cd6e98ec b84b97e9 d78d8797"
|
||||
},
|
||||
@@ -1710,7 +1710,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr":[11,11,0,2113,54450],"enemy_1116_liprr_2":[4,4,0,932,27000],"enemy_1118_lidbox_2":[2,1,1,5973,16462]},
|
||||
"hooks": [1,28,1811,193,193,210,210,32,18,21,16,16,0,8197,3,27,17,1,1,18,0,0,0],
|
||||
"events": {"atk":228,"deploy":11,"die":20,"dmg":210,"fx":50,"heal":32,"leak":1,"skill":32,"spawn":26,"status":26},
|
||||
"events": {"atk":228,"deploy":11,"die":20,"dmg":210,"engage":6,"fx":50,"heal":32,"leak":1,"skill":32,"spawn":26,"status":26},
|
||||
"fx": {"aoe":1,"displace":19,"liberate":3,"pull":19,"strike":3,"summon":2,"volley":3},
|
||||
"snaps": "4f49e250 3e34819c 722978d2 a4f896f1 12fedc68 96a398c2"
|
||||
},
|
||||
@@ -1748,7 +1748,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1234_dsubrl_2":[2,2,0,9847,32256],"enemy_1433_dsbasi_2":[16,16,0,700,105062]},
|
||||
"hooks": [1,32,2169,163,163,249,300,41,22,23,12,11,0,2963,17,18,18,0,1,22,0,0,12],
|
||||
"events": {"atk":167,"deploy":12,"die":23,"dmg":300,"fx":94,"heal":24,"skill":25,"spawn":29,"status":31},
|
||||
"events": {"atk":167,"deploy":12,"die":23,"dmg":300,"engage":4,"fx":94,"heal":24,"skill":25,"spawn":29,"status":31},
|
||||
"fx": {"dodge":12,"featherArrow":1,"flame":3,"garrisonGrant":1,"healField":1,"pulse":43,"riposte":10,"summon":2,"swordRain":17,"swordStorm":4},
|
||||
"snaps": "849e61b3 b054e595 7736283f c3ff5997 f8df75cd d3a1062a ce887350 42803555"
|
||||
},
|
||||
@@ -1787,7 +1787,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr":[15,15,0,190,51840],"enemy_1169_duphlx":[5,5,0,116,23040],"enemy_1170_dushld":[2,2,0,2735,16128]},
|
||||
"hooks": [1,34,2311,222,222,323,323,109,24,24,10,9,0,8247,74,20,22,0,1,30,0,0,0],
|
||||
"events": {"atk":281,"deploy":9,"die":24,"dmg":323,"fx":10,"skill":19,"spawn":34,"status":171},
|
||||
"events": {"atk":281,"deploy":9,"die":24,"dmg":323,"engage":7,"fx":10,"skill":19,"spawn":34,"status":171},
|
||||
"fx": {"camouflage":1,"dp":3,"sleep":2,"volley":3,"wolfShadow":1},
|
||||
"snaps": "597235cf 9f561b3b 31cd9e82 d8fc0ce2 dd450279 dff65244 8d602ab6 b4f77692"
|
||||
},
|
||||
@@ -1839,7 +1839,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[7,7,0,1075,47029],"enemy_1381_winman":[9,9,0,0,129890],"enemy_1389_winbab_2":[5,5,0,5215,87091]},
|
||||
"hooks": [1,46,2270,120,120,188,222,1034,22,30,11,9,5,5355,1,4,21,0,1,23,0,0,0],
|
||||
"events": {"atk":120,"deploy":22,"die":30,"dmg":222,"fx":44,"heal":26,"skill":24,"spawn":46,"status":2},
|
||||
"events": {"atk":120,"deploy":22,"die":30,"dmg":222,"engage":6,"fx":44,"heal":26,"skill":24,"spawn":46,"status":2},
|
||||
"fx": {"coin":14,"downed":1,"explode":8,"splash":5,"summon":11,"yanyouFlame":3,"yanyouSummon":2},
|
||||
"snaps": "b2b94c31 1e5707be a1b26ab3 10db4b56 bcd4d5e3 2c5a291d 646238a4 8471a2e0"
|
||||
}
|
||||
|
||||
+101
-101
@@ -46,7 +46,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[36,0,35,9319,36291],"enemy_1270_nhstlk_2":[27,0,27,22708,32133],"enemy_9006_actoxi":[30,0,30,22834,7664]},
|
||||
"hooks": [1,125,6900,243,243,280,280,0,28,120,14,14,0,10303,0,52,93,92,1,28,0,0,0],
|
||||
"events": {"atk":260,"deploy":29,"die":28,"dmg":280,"fx":22,"leak":92,"skill":28,"spawn":108,"status":26},
|
||||
"events": {"atk":260,"deploy":29,"die":28,"dmg":280,"engage":12,"fx":22,"leak":92,"skill":28,"spawn":108,"status":26},
|
||||
"fx": {"aoe":10,"dp":12},
|
||||
"snaps": "11fd58d9 8c9b2fa6 4326c48e 207bf323 f5892cfd eb207b8b 716efaa3 73d27b32 157261e1 b639e83b 8c6960a9 594efc22 ede97e52 8c0b4015 9a8cdd7e 6bb87f5f 4bf762d2 9cd529d0 40b20b8e c21a56fc 4f34951d b94bd6bf 54fb0c18"
|
||||
},
|
||||
@@ -85,7 +85,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[21,0,21,20551,4442],"enemy_1043_zomsbr":[66,2,64,10572,58576],"enemy_1402_tgshd_2":[36,0,36,21072,3227]},
|
||||
"hooks": [1,156,6699,282,282,308,308,7543,28,149,22,22,0,17563,2,43,123,121,1,28,0,0,0],
|
||||
"events": {"atk":308,"deploy":33,"die":28,"dmg":308,"fx":70,"leak":121,"skill":44,"spawn":135,"status":28},
|
||||
"events": {"atk":308,"deploy":33,"die":28,"dmg":308,"engage":12,"fx":70,"leak":121,"skill":44,"spawn":135,"status":28},
|
||||
"fx": {"aoe":14,"dp":20,"expose":36},
|
||||
"snaps": "d7b739d1 f5e170c4 bc463f9c 6ebd80ed 93f8e1ae ea1947a7 9541a28f e8dbac5b b0b3c196 14ae4a64 46640828 01c55ea9 0f261678 f447848b 0aad3542 db5850a3 631cc5ca 455c1dbc 68ad7134 24c71ebb 34a3ee93 37b05130 7a58a87e"
|
||||
},
|
||||
@@ -127,7 +127,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[36,6,30,5084,68011],"enemy_1270_nhstlk_2":[27,3,24,14733,103691],"enemy_9006_actoxi":[30,2,28,29877,127524]},
|
||||
"hooks": [1,116,5790,273,273,606,600,0,31,113,34,34,0,631,18,42,93,82,1,31,0,0,6],
|
||||
"events": {"atk":273,"deploy":20,"die":31,"dmg":600,"fx":71,"leak":82,"skill":68,"spawn":108,"status":53},
|
||||
"events": {"atk":273,"deploy":20,"die":31,"dmg":600,"engage":12,"fx":71,"leak":82,"skill":68,"spawn":108,"status":53},
|
||||
"fx": {"blink":5,"dodge":6,"slash":52,"zone":8},
|
||||
"snaps": "c0c6f8e1 6c64f128 61514b6f 46ee8f6c 84d51550 9ee3c098 8569957a 6bb9daab d0311e31 fca0ef46 8d1a9e28 c8b74658 c1971197 68fcd05c afdf51bd 14f42e13 669d3436 677c7ede f0f2670f c9ea5ab6"
|
||||
},
|
||||
@@ -169,7 +169,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,1,53,33784,187121],"enemy_1320_wdrrl_2":[18,0,18,0,71694],"enemy_1422_lrsldr_2":[39,0,39,13418,151678]},
|
||||
"hooks": [1,135,6356,236,236,1879,1871,0,22,132,39,39,0,719,28,41,111,110,1,22,0,0,8],
|
||||
"events": {"atk":236,"deploy":21,"die":22,"dmg":1871,"fx":98,"leak":110,"skill":78,"spawn":126,"status":45},
|
||||
"events": {"atk":236,"deploy":21,"die":22,"dmg":1871,"engage":12,"fx":98,"leak":110,"skill":78,"spawn":126,"status":45},
|
||||
"fx": {"blink":8,"dodge":8,"slash":82},
|
||||
"snaps": "d6a5c53f ae3300a8 1ffd3c48 2427def3 4c73d038 931f02ac 2556ce0f a5b2a7b9 bf66be07 92ebcd65 16d71198 8548058c 6d8a4447 89144e13 e45915f2 a167fef1 df64689f 86f8feee 8bff36b9 0cecb541 74bb205b 8ed222c0"
|
||||
},
|
||||
@@ -208,7 +208,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[12,0,12,21621,27921],"enemy_1061_zomshd":[48,4,44,15761,146758]},
|
||||
"hooks": [1,82,6732,333,333,2268,2268,17205,18,74,21,21,0,210,52,68,60,56,1,18,0,0,0],
|
||||
"events": {"atk":333,"deploy":22,"die":18,"dmg":2268,"fx":18,"leak":56,"skill":42,"spawn":72,"status":103},
|
||||
"events": {"atk":333,"deploy":22,"die":18,"dmg":2268,"engage":7,"fx":18,"leak":56,"skill":42,"spawn":72,"status":103},
|
||||
"fx": {"aoe":15,"slash":3},
|
||||
"snaps": "f2e4e1e3 8c30fdcc 557a8393 406532d4 7aa31aa3 68d43c5f 019a1827 236a6172 d66d71f4 ad87c344 a9d21a1c 2d40e8d1 a4915bed b794b4b5 d87d935d a0175178 406634d2 21bc7515 b0dc286b 81540219 8a026ba1 f5e2bb11 9f9095b6"
|
||||
},
|
||||
@@ -247,7 +247,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[27,1,26,4347,24248],"enemy_1270_nhstlk_2":[36,0,36,21434,42822],"enemy_1272_nhtank_2":[18,0,18,26010,1646]},
|
||||
"hooks": [1,102,6271,180,180,348,348,0,21,101,3,3,0,76,3,29,81,80,1,21,0,0,0],
|
||||
"events": {"atk":180,"deploy":21,"die":21,"dmg":348,"fx":20,"leak":80,"skill":6,"spawn":93,"status":30},
|
||||
"events": {"atk":180,"deploy":21,"die":21,"dmg":348,"engage":10,"fx":20,"leak":80,"skill":6,"spawn":93,"status":30},
|
||||
"fx": {"zone":20},
|
||||
"snaps": "16306eea 7b1bbde4 ded5389d 5f6273a8 32245b03 240e682f f6e150f6 60750291 a6b1e2c1 27b9fee4 9a1f5086 c375a605 718dd47c 94e5d192 79e37726 741948bf c9188857 17283d09 c1f13791 cc1e7fc9 488fca57"
|
||||
},
|
||||
@@ -288,7 +288,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[21,0,21,37879,6411],"enemy_1043_zomsbr":[66,9,57,5142,94062],"enemy_1402_tgshd_2":[36,0,36,30701,9301]},
|
||||
"hooks": [1,146,6541,406,406,560,556,5439,30,144,24,24,0,3603,7,47,123,114,1,30,0,0,4],
|
||||
"events": {"atk":418,"deploy":21,"die":30,"dmg":556,"fx":165,"heal":172,"leak":114,"skill":48,"spawn":137,"status":33},
|
||||
"events": {"atk":418,"deploy":21,"die":30,"dmg":556,"engage":12,"fx":165,"heal":172,"leak":114,"skill":48,"spawn":137,"status":33},
|
||||
"fx": {"dodge":4,"expose":159,"slash":2},
|
||||
"snaps": "e26bce59 215f8f25 ee687b9b 804a4039 6b53c91e c7d15874 96a28215 6211da91 3821cb2e ef3d79e8 ea89ec94 f46807e6 667be59f 1167b5ef 92e3744c 494d470e c5eba32b ea039292 e24aef77 710cc985 d76c00e0 63f8d2b2"
|
||||
},
|
||||
@@ -327,7 +327,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,7,32,17767,116832],"enemy_1169_duphlx_2":[57,4,53,58408,110078],"enemy_1170_dushld_2":[51,0,51,57810,16441]},
|
||||
"hooks": [1,167,6701,978,978,1212,1193,918,30,166,74,73,0,12381,0,30,147,136,1,34,0,0,19],
|
||||
"events": {"atk":1056,"deploy":20,"die":30,"dmg":1193,"fx":23,"heal":853,"leak":136,"skill":147,"spawn":159,"status":147},
|
||||
"events": {"atk":1056,"deploy":20,"die":30,"dmg":1193,"engage":12,"fx":23,"heal":853,"leak":136,"skill":147,"spawn":159,"status":147},
|
||||
"fx": {"dodge":19,"undying":4},
|
||||
"snaps": "7f272ba7 3debf791 1552b043 e5673051 2a31733f ddde2cf0 5172c3bc 404d8953 6eeecaa1 2126ddc6 45873ba7 e5e82592 2f4b4237 7b847c95 df2b1332 af30a96c 1daa2f7e ab8bd9f1 9949f039 898d148b cf4f2c24 47d56ee7 2d43e9f7"
|
||||
},
|
||||
@@ -368,7 +368,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[27,5,22,7978,52595],"enemy_1270_nhstlk_2":[36,6,30,24943,203774],"enemy_9006_actoxi":[39,8,31,82815,417247]},
|
||||
"hooks": [1,122,6120,1054,1054,1505,1494,3892,30,113,81,79,0,16446,0,30,102,83,1,35,0,0,11],
|
||||
"events": {"atk":1184,"deploy":18,"die":30,"dmg":1473,"fx":38,"heal":829,"leak":83,"skill":160,"spawn":116,"status":160},
|
||||
"events": {"atk":1184,"deploy":18,"die":30,"dmg":1473,"engage":6,"fx":38,"heal":829,"leak":83,"skill":160,"spawn":116,"status":160},
|
||||
"fx": {"dodge":11,"shield":9,"undying":5,"zone":13},
|
||||
"snaps": "1afa3e85 a42c9c43 b7185f40 c33edc74 1a66f242 a0042849 d7671dd0 7ffed81d ac31fc99 7ec30e1f 4b39965c dd728478 04956ef0 f20d0551 2b2ed25e 9b0fe665 52d96316 c1396136 476c7670 d5abc325 11f69749"
|
||||
},
|
||||
@@ -532,7 +532,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,1,56,15011,14682],"enemy_1381_winman":[27,0,27,3180,12277],"enemy_1389_winbab_2":[48,0,48,45437,264]},
|
||||
"hooks": [1,159,6578,404,404,275,224,649,27,158,12,12,0,7864,0,24,132,131,1,27,0,0,51],
|
||||
"events": {"atk":417,"deploy":27,"die":27,"dmg":224,"fx":78,"heal":42,"leak":131,"skill":24,"spawn":144,"status":36},
|
||||
"events": {"atk":417,"deploy":27,"die":27,"dmg":224,"engage":6,"fx":78,"heal":42,"leak":131,"skill":24,"spawn":144,"status":36},
|
||||
"fx": {"aoe":3,"buff":16,"dodge":51,"dp":5,"dying":1,"shield":2},
|
||||
"snaps": "52b05b5f f22752af 0a9753b5 76d0ebb9 fd2291fe ff2c1a4d ba47168f 4d3f2f7c 0580bd3e 06df4477 57a732d6 7c19ed8b e36079b8 15e75a84 4792e70e 93d2efa1 bba44dad e1c8068a 9b0ec217 85a052ab c2760f40 eb222e59"
|
||||
},
|
||||
@@ -574,7 +574,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[18,0,18,27168,3796],"enemy_1043_zomsbr":[66,9,57,14627,148353],"enemy_1061_zomshd":[45,0,45,36738,16263]},
|
||||
"hooks": [1,164,6504,642,642,723,617,20102,39,159,21,21,0,18170,0,64,129,120,1,40,0,0,106],
|
||||
"events": {"atk":689,"deploy":32,"die":39,"dmg":617,"fx":172,"leak":120,"skill":42,"spawn":144,"status":69},
|
||||
"events": {"atk":689,"deploy":32,"die":39,"dmg":617,"engage":12,"fx":172,"leak":120,"skill":42,"spawn":144,"status":69},
|
||||
"fx": {"aoe":12,"buff":30,"dodge":106,"dp":15,"dying":9},
|
||||
"snaps": "139545f0 29393223 af71a5ff f0163efe a9da66a7 136d4411 c07df6f7 80c80aa5 9fb44dd7 4ebb38f0 5334365a 625edb1c 0c3fc668 a66e9ef9 dc0775ba 570d25e8 6398e94c ebde2a20 72f3754c bcb5d344 8311f146 9e54ae25"
|
||||
},
|
||||
@@ -616,7 +616,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[18,0,18,15861,120545],"enemy_1043_zomsbr":[66,31,35,1342,281173],"enemy_1061_zomshd":[45,2,43,33062,392464]},
|
||||
"hooks": [1,159,6707,1048,1048,3575,3461,59651,53,149,71,70,0,32282,0,54,129,96,1,68,0,0,114],
|
||||
"events": {"atk":1249,"deploy":27,"die":53,"dmg":3461,"fx":215,"leak":96,"skill":141,"spawn":144,"status":43},
|
||||
"events": {"atk":1249,"deploy":27,"die":53,"dmg":3461,"engage":12,"fx":215,"leak":96,"skill":141,"spawn":144,"status":43},
|
||||
"fx": {"aoe":11,"buff":13,"dodge":114,"dp":15,"dying":17,"explosion":45},
|
||||
"snaps": "16295416 fba275f2 635566cc 2e3e6a18 f20f8ef2 2aaccd2c aae17d6a 99cd3ff6 a1ee2f48 b38c7b9b 5a02d9fe dbd1ec17 05bbeb89 34b71379 e86b1ee6 770c6674 e962160f 957dc960 6f072e78 3ff4fbd4 4b247ed5 22f35900 d30acbaf"
|
||||
},
|
||||
@@ -655,7 +655,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,0,54,4332,549815],"enemy_1422_lrsldr_2":[39,1,38,4356,432755],"enemy_1425_lrcmra_2":[30,0,30,9915,499049]},
|
||||
"hooks": [1,143,6474,1007,1007,4602,4602,0,13,135,125,125,0,40054,0,13,123,122,1,13,0,0,0],
|
||||
"events": {"atk":1542,"deploy":20,"die":13,"dmg":4602,"fx":112,"leak":122,"skill":250,"spawn":135},
|
||||
"events": {"atk":1542,"deploy":20,"die":13,"dmg":4602,"engage":11,"fx":112,"leak":122,"skill":250,"spawn":135},
|
||||
"fx": {"explosion":112},
|
||||
"snaps": "4136957e ff979ac1 99dc17a0 464104ed 8a15871d 2caabc28 c1dd887f c102125c a2356aaf 89ad10f2 d1bc460f 5155ee77 e46c587b 76d21c4f bf7cfd91 0e98aef9 8f7c2eda be7d713c 3ea703db b7dfa36e b0f1fe1c 502a59af"
|
||||
},
|
||||
@@ -694,7 +694,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,10,17,2608,81818],"enemy_1119_vofsd":[48,19,29,12099,261141],"enemy_1121_lifbos_2":[30,11,19,15909,319418]},
|
||||
"hooks": [1,127,6489,566,566,919,919,638,60,125,49,49,0,18805,7,51,105,65,1,60,0,0,0],
|
||||
"events": {"atk":614,"deploy":22,"die":60,"dmg":919,"fx":45,"leak":65,"skill":98,"spawn":117,"status":143},
|
||||
"events": {"atk":614,"deploy":22,"die":60,"dmg":919,"engage":12,"fx":45,"leak":65,"skill":98,"spawn":117,"status":143},
|
||||
"fx": {"explosion":32,"liberate":13},
|
||||
"snaps": "d9c99b22 31e833b6 82cc3a13 e8197969 a2c825a4 4ca31cdb 4d13e180 36cd1df5 4d64afb5 1af3f651 d707d2c2 ec28710a d045ee1f ebcbf523 bc3891db e8e2e634 0d2e69cc 7d15e716 5b276fdc bb9ff685 14dea4eb e3a0a927"
|
||||
},
|
||||
@@ -735,7 +735,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[12,4,8,3982,10285],"enemy_1041_lazerd_2":[24,0,24,27210,24080],"enemy_1042_frostd":[30,1,28,0,35486]},
|
||||
"hooks": [1,91,6900,229,229,306,306,0,25,85,20,20,0,11356,24,0,66,60,1,25,0,0,0],
|
||||
"events": {"atk":229,"deploy":23,"die":25,"dmg":306,"leak":60,"skill":40,"spawn":80,"status":76},
|
||||
"events": {"atk":229,"deploy":23,"die":25,"dmg":306,"engage":12,"leak":60,"skill":40,"spawn":80,"status":76},
|
||||
"fx": {},
|
||||
"snaps": "7cee673a 0c2b1cbd 61954cdc 99fa1027 989a1ca1 13facebd b9342091 1a3a9947 c865ff92 b953ca9c df328f21 4e6260d5 014ffdab 8dd5a417 69d56480 cae4ce8e dffc6b60 ca2c08e2 a6178db4 1d338c05 58374fe8 d58f8ded c04611d9"
|
||||
},
|
||||
@@ -774,7 +774,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,0,57,23908,672],"enemy_1299_ymkilr_2":[27,0,27,8715,29589],"enemy_1422_lrsldr_2":[39,0,39,1650,47206]},
|
||||
"hooks": [1,146,6656,221,225,313,313,0,22,145,14,14,0,7462,38,14,123,123,1,22,0,0,0],
|
||||
"events": {"atk":253,"deploy":23,"die":22,"dmg":313,"fx":92,"leak":123,"skill":28,"spawn":135,"status":120},
|
||||
"events": {"atk":253,"deploy":23,"die":22,"dmg":313,"engage":12,"fx":92,"leak":123,"skill":28,"spawn":135,"status":120},
|
||||
"fx": {"tornado":86,"tornadoPulse":6},
|
||||
"snaps": "f7ae5bde 659eeb55 a6fea098 ecf9afaf c0c59203 97894aee 6216bbe1 40a32490 b1eae1a2 71ae2db4 3d794870 1e07a170 def7e30c 399c3318 6ec37466 2bb3307f 4907aa44 6aece016 d9da6c87 f487b5a6 0d581c19 6fac680f f372326b"
|
||||
},
|
||||
@@ -815,7 +815,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai":[51,11,40,0,33306],"enemy_1005_yokai_2":[54,4,50,20431,34319],"enemy_1112_emppnt":[12,0,12,0,35540]},
|
||||
"hooks": [1,142,6722,215,225,287,287,0,37,139,16,16,0,7863,184,0,117,102,1,37,0,0,0],
|
||||
"events": {"atk":332,"deploy":23,"die":37,"dmg":287,"fx":274,"leak":102,"skill":32,"spawn":131,"status":329},
|
||||
"events": {"atk":332,"deploy":23,"die":37,"dmg":287,"engage":11,"fx":274,"leak":102,"skill":32,"spawn":131,"status":329},
|
||||
"fx": {"bombard":30,"bombardShell":30,"tornado":192,"tornadoPulse":22},
|
||||
"snaps": "0ea317dd e4ef0efd 0f75b724 fb55e181 2df1c099 9065533e 709835ae 43639274 9b2e3494 903332a5 7d489728 c2b62f65 2eced12b 7bc988e3 9532960b 8d53c14b 2547c4d4 c6218f24 1a86704b 388176ba 379dffe2 cec0e88f eba2bd69"
|
||||
},
|
||||
@@ -857,7 +857,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[21,1,20,4778,347551],"enemy_1043_zomsbr":[66,32,34,1042,256175],"enemy_1402_tgshd_2":[36,5,31,10142,438158]},
|
||||
"hooks": [1,145,6295,795,883,1782,1782,19520,47,132,78,76,0,37103,1170,20,123,85,1,47,0,0,0],
|
||||
"events": {"atk":1681,"deploy":19,"die":47,"dmg":1782,"fx":1976,"leak":85,"skill":154,"spawn":138,"status":1242},
|
||||
"events": {"atk":1681,"deploy":19,"die":47,"dmg":1782,"engage":12,"fx":1976,"leak":85,"skill":154,"spawn":138,"status":1242},
|
||||
"fx": {"expose":327,"tornado":1507,"tornadoPulse":142},
|
||||
"snaps": "154c679b 3d6402ec 6e769538 6ab466ef 62867862 da8a1d4c b45529ad 173fec15 5cf39f28 50909bd4 9b896c35 f3a66c2e e37801fa 65130b32 aa798f03 165a46dc 8a61b747 404ad7d9 7f4ac4d0 e744d033 b0313af3"
|
||||
},
|
||||
@@ -898,7 +898,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[12,0,12,1619,164019],"enemy_1061_zomshd":[48,0,48,9714,387756]},
|
||||
"hooks": [1,80,6208,685,685,1203,1203,31970,7,67,28,25,0,39469,21,7,60,60,1,7,0,0,0],
|
||||
"events": {"atk":806,"deploy":18,"die":7,"dmg":1203,"fx":21,"leak":60,"skill":53,"spawn":74,"status":32},
|
||||
"events": {"atk":806,"deploy":18,"die":7,"dmg":1203,"engage":12,"fx":21,"leak":60,"skill":53,"spawn":74,"status":32},
|
||||
"fx": {"harpoon":21},
|
||||
"snaps": "6a0025a2 426819db 775d6cb5 dfe3f669 b26f6595 8b0e5a0e 72f7240c cdf7a042 d9a495e9 0c7b39f9 ff99b470 bf54eb6c 71799613 59d2013e 4183b241 ede97f16 814a1499 aa6ca3de e3f9536b 5e7fb6fc 512f6b19"
|
||||
},
|
||||
@@ -940,7 +940,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,14,25,4625,75458],"enemy_1170_dushld_2":[39,22,17,647,258699],"enemy_9011_acrefr":[39,11,28,18114,708404]},
|
||||
"hooks": [1,141,6633,717,717,937,937,0,61,131,25,23,0,34331,33,30,117,70,1,61,0,0,0],
|
||||
"events": {"atk":878,"deploy":21,"die":61,"dmg":937,"fx":33,"leak":70,"skill":48,"spawn":132,"status":173},
|
||||
"events": {"atk":878,"deploy":21,"die":61,"dmg":937,"engage":12,"fx":33,"leak":70,"skill":48,"spawn":132,"status":173},
|
||||
"fx": {"harpoon":33},
|
||||
"snaps": "2396b314 63475841 b7f68828 583dcd01 baa6c527 135c1f6a b2eb28ec ca0bbd88 28626132 14902c56 709ad698 2b948334 d225c05c 2937d4aa 74dc85c0 38aa9732 615938fb 65e596ac b7c9619d 84a20769 9badaec0 6314a7b9 88891e77"
|
||||
},
|
||||
@@ -979,7 +979,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,4,23,3761,85903],"enemy_1119_vofsd":[39,7,32,17860,206292],"enemy_1121_lifbos_2":[24,3,21,2649,339281]},
|
||||
"hooks": [1,111,6358,521,521,703,703,2097,29,105,18,14,37,22312,342,18,90,76,1,29,0,0,0],
|
||||
"events": {"atk":601,"deploy":21,"die":29,"dmg":703,"fx":47,"leak":76,"skill":32,"spawn":102,"status":561},
|
||||
"events": {"atk":601,"deploy":21,"die":29,"dmg":703,"engage":12,"fx":47,"leak":76,"skill":32,"spawn":102,"status":561},
|
||||
"fx": {"arrowRain":37,"liberate":4,"mark":6},
|
||||
"snaps": "fcc892a1 24babc47 f1bd2169 a922fe90 767ad48b 14dac19c 92ed3790 ea74ae16 5b021cd8 757d6cd8 694a1cb7 a9ff8f82 286d5dd9 edb66a8e 7f91bfd5 48adec92 55c6cafc 8d206ee2 f1afebad 13c83e66 06ea2918 4efe0d3e"
|
||||
},
|
||||
@@ -1021,7 +1021,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai":[33,8,25,0,23321],"enemy_1005_yokai_2":[48,8,39,12841,46424],"enemy_1005_yokai_3":[12,1,11,19059,171693]},
|
||||
"hooks": [1,118,6900,231,231,265,265,0,37,112,10,10,15,8638,108,0,93,75,1,37,0,0,0],
|
||||
"events": {"atk":255,"deploy":22,"die":37,"dmg":265,"fx":18,"leak":75,"skill":20,"spawn":108,"status":120},
|
||||
"events": {"atk":255,"deploy":22,"die":37,"dmg":265,"engage":12,"fx":18,"leak":75,"skill":20,"spawn":108,"status":120},
|
||||
"fx": {"arrowRain":15,"mark":3},
|
||||
"snaps": "bc5ea01e a44fc03a ec4c7ef4 2414807a 1f43caa7 df794d2c d51b39d2 4a509e38 aae784f7 27b8f3e7 62540756 71c1bb31 5367bad9 40b78ae0 1b2c2a4b 777a9d1e 9e4b2ee8 f9a7b944 d980c3ad 86b27eb4 27a7eabb 831168f4 86f9c7b0"
|
||||
},
|
||||
@@ -1063,7 +1063,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[60,11,49,10335,375992],"enemy_1251_lysyta":[51,15,36,2142,196661],"enemy_1254_lypa_2":[54,5,49,22380,676728]},
|
||||
"hooks": [1,192,6180,600,600,2654,2595,0,50,184,17,13,20,12914,350,33,165,134,1,50,0,0,14],
|
||||
"events": {"atk":669,"deploy":24,"die":50,"dmg":2595,"fx":354,"leak":134,"skill":30,"spawn":180,"status":405},
|
||||
"events": {"atk":669,"deploy":24,"die":50,"dmg":2595,"engage":12,"fx":354,"leak":134,"skill":30,"spawn":180,"status":405},
|
||||
"fx": {"aoe":15,"arrowRain":20,"bounce":232,"dodge":38,"mark":4,"shieldBreak":45},
|
||||
"snaps": "18c1d1a4 065f6e5c 4a5bb275 246f8b2e 13758717 4fed6070 4f439e1b e42aed66 265a15a2 189242c8 4207d100 eeb76745 6fda3d0d c8bcd6b5 5c225bd6 b1e4155f 596b59c6 89c2e1cd 4ab35ad8 2b8fefe1 f2370231"
|
||||
},
|
||||
@@ -1102,7 +1102,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,54,0,0,755827],"enemy_1320_wdrrl_2":[18,18,0,0,839808],"enemy_1422_lrsldr_2":[39,39,0,0,400308]},
|
||||
"hooks": [1,123,5908,1051,1051,2498,2498,0,111,111,26,21,0,10907,256,0,111,0,1,111,0,0,0],
|
||||
"events": {"atk":1051,"deploy":12,"die":111,"dmg":2498,"fx":509,"skill":47,"spawn":123,"status":251},
|
||||
"events": {"atk":1051,"deploy":12,"die":111,"dmg":2498,"engage":12,"fx":509,"skill":47,"spawn":123,"status":251},
|
||||
"fx": {"aoe":140,"bounce":369},
|
||||
"snaps": "00fbd370 8c991923 96dc2bea 8d706ab9 43830855 d2a46ee0 09d5fe80 fd5bcc83 a88f6aca 1077c610 42023519 3f71e919 f0900b6b 05d99ec6 f7f79850 b612552c 23d34fc4 0835ffb5 8536e543 3091e242"
|
||||
},
|
||||
@@ -1141,7 +1141,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon_2":[36,1,35,14202,495297],"enemy_1071_dftman":[51,14,37,5132,306556],"enemy_1072_dlancer":[60,9,51,21712,442917]},
|
||||
"hooks": [1,171,6505,468,468,1005,993,0,45,168,11,10,0,6647,224,37,147,123,1,45,0,0,12],
|
||||
"events": {"atk":468,"deploy":24,"die":45,"dmg":993,"fx":205,"leak":123,"skill":21,"spawn":159,"status":332},
|
||||
"events": {"atk":468,"deploy":24,"die":45,"dmg":993,"engage":12,"fx":205,"leak":123,"skill":21,"spawn":159,"status":332},
|
||||
"fx": {"aoe":46,"bounce":89,"dodge":43,"logosLexicon":27},
|
||||
"snaps": "908a1f91 4582d7f2 dd208a1a 134a98fb 67558ccf 5bad995e b3ce5027 65152964 2f0c174b dc8e2347 0a686aab cca266d7 2dfb1ca0 47547715 c67debba 8c8f23d2 b5a4d136 ca6db6ee 8d8f8837 eaa96e1d 7c2c78bb 4dcf0b88"
|
||||
},
|
||||
@@ -1182,7 +1182,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,17,1,0,335969],"enemy_1061_zomshd":[60,53,7,0,605288]},
|
||||
"hooks": [1,92,5859,598,598,1005,1065,11667,70,78,17,13,0,27522,283,0,78,8,1,70,0,0,0],
|
||||
"events": {"atk":694,"deploy":12,"die":70,"dmg":1065,"fx":318,"leak":8,"skill":30,"spawn":92,"status":376},
|
||||
"events": {"atk":694,"deploy":12,"die":70,"dmg":1065,"engage":8,"fx":318,"leak":8,"skill":30,"spawn":92,"status":376},
|
||||
"fx": {"logosExecute":28,"logosLexicon":290},
|
||||
"snaps": "d77c72cd 6367c5ba ea565f8f 5f5df428 169ff00e b82e9767 e24922a1 68f5d155 8ca60410 956071bb 9e055166 b0ff6b34 e4adebd6 233ce084 49d5f3a4 73fcf051 acd5e35f 3539ff89 a8c65166 61f6bc02"
|
||||
},
|
||||
@@ -1221,7 +1221,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1288_duskls":[27,22,5,2249,245694],"enemy_1288_duskls_2":[57,38,18,3884,586159],"enemy_1292_duskld":[51,35,15,13695,1059268]},
|
||||
"hooks": [1,153,6900,1188,1188,3029,4105,0,110,148,44,43,0,25246,17814,125,135,38,1,247,0,3,0],
|
||||
"events": {"atk":1438,"deploy":18,"die":110,"dmg":4105,"fx":1191,"leak":38,"skill":87,"spawn":147,"status":1475},
|
||||
"events": {"atk":1438,"deploy":18,"die":110,"dmg":4105,"engage":12,"fx":1191,"leak":38,"skill":87,"spawn":147,"status":1475},
|
||||
"fx": {"burst":3,"ember":137,"logosExecute":71,"logosLexicon":577,"mantraArc":300,"mantraGate":9,"mantraGrant":12,"palsy":47,"revive":35},
|
||||
"snaps": "ccefd180 74e321db 643097c1 db0e6e62 93c71528 cc5c27dc e099974a 9b647244 f1270822 4be2b7c9 98c43f6a 31a51556 caaffcdd 92411235 a7a659a0 b284a518 4614387d 684ed5e1 e41ab6bb d32ae971 855c5d18 4444222e 1b7941fe"
|
||||
},
|
||||
@@ -1262,7 +1262,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[12,12,0,1534,47800],"enemy_1005_yokai_3":[12,12,0,6840,1031956],"enemy_9009_acfort":[12,12,0,7359,825565]},
|
||||
"hooks": [1,55,5936,433,433,1812,2023,0,46,46,38,36,0,16252,187,0,36,0,1,44,0,24,0],
|
||||
"events": {"atk":458,"deploy":17,"die":46,"dmg":2023,"fx":206,"skill":74,"spawn":50,"status":97},
|
||||
"events": {"atk":458,"deploy":17,"die":46,"dmg":2023,"engage":10,"fx":206,"skill":74,"spawn":50,"status":97},
|
||||
"fx": {"beam":11,"burst":24,"mantraArc":59,"mantraGate":17,"mantraGrant":7,"palsy":88},
|
||||
"snaps": "51e27048 9cef1698 b61a98fa e92e9fb7 bc012497 8cfcc3ad 4bded9b4 c1266494 ed60128f 74df4566 d31c137a 998f967d 857e9ead 02820043 73d9434c e05a067e e0d63b9d c1e5b283 57132f29 b039284f"
|
||||
},
|
||||
@@ -1304,7 +1304,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[12,0,12,1215,103016],"enemy_1043_zomsbr":[72,22,50,4183,401369],"enemy_1061_zomshd":[30,1,29,10796,355420]},
|
||||
"hooks": [1,136,6081,591,591,3365,3365,45973,35,126,19,18,39,24319,0,14,114,91,1,35,0,0,0],
|
||||
"events": {"atk":591,"deploy":19,"die":35,"dmg":3365,"fx":96,"leak":91,"skill":37,"spawn":129},
|
||||
"events": {"atk":591,"deploy":19,"die":35,"dmg":3365,"engage":12,"fx":96,"leak":91,"skill":37,"spawn":129},
|
||||
"fx": {"veenBounce":42,"veenVolley":54},
|
||||
"snaps": "10719944 a54473e5 586c12a4 e8572e94 cd658a5e 022bbca2 6875176a 88f39323 fe22255b b8659b38 b3436607 2bff9df5 448c5d3c bae393b0 7569d588 d5f887b5 1075cb4d 45d53303 6b53b401 8529d78b ee4d40ec"
|
||||
},
|
||||
@@ -1345,7 +1345,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,26,1,4847,211170],"enemy_1229_darmy_2":[57,54,3,18063,574213],"enemy_9007_acelem":[12,9,3,27653,675207]},
|
||||
"hooks": [1,113,6612,1025,1025,3989,4048,900,95,102,97,91,41,38220,17,51,96,7,1,95,0,7,0],
|
||||
"events": {"atk":1067,"deploy":15,"die":95,"dmg":3811,"fx":130,"heal":562,"leak":7,"skill":188,"spawn":110,"status":122},
|
||||
"events": {"atk":1067,"deploy":15,"die":95,"dmg":3811,"engage":11,"fx":130,"heal":562,"leak":7,"skill":188,"spawn":110,"status":122},
|
||||
"fx": {"aoe":17,"beam":13,"burst":7,"shield":10,"veenBounce":32,"veenVolley":51},
|
||||
"snaps": "1000ac84 bfde9768 1f819e49 25e96f05 1071a35f 0d9629ec 0e08d06a 77a2be9b ebe26002 bde5c83c bedfbfc2 179b6ff4 b13c3719 6597d5b8 bc5984ad 7b4f1f2d bf619f74 1e2b2581 1e5e1d7a 304459b5 35cd4f5c 86400373"
|
||||
},
|
||||
@@ -1387,7 +1387,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,20,19,40402,659130],"enemy_1169_duphlx_2":[57,8,47,60703,754895],"enemy_1170_dushld_2":[51,1,50,55427,323691]},
|
||||
"hooks": [1,170,6900,1717,1717,3112,3124,2514,44,160,283,283,0,37911,127,55,147,116,1,48,0,0,0],
|
||||
"events": {"atk":1832,"deploy":20,"die":44,"dmg":2904,"fx":74,"heal":1427,"leak":116,"skill":566,"spawn":162,"status":473},
|
||||
"events": {"atk":1832,"deploy":20,"die":44,"dmg":2904,"engage":12,"fx":74,"heal":1427,"leak":116,"skill":566,"spawn":162,"status":473},
|
||||
"fx": {"aoe":58,"revive":4,"shield":12},
|
||||
"snaps": "c1b566a5 fde7175b e5771726 b555c511 d14ece62 4f0bddb1 bb49d82b 2af32cbf 59449b40 68887607 7ada4944 9e308e01 1c704504 710da9ea 9dade500 2b7a285d 59e9ccbe b858f755 afe523d6 06a23765 516992f3 96d52da5 8e55f916"
|
||||
},
|
||||
@@ -1426,7 +1426,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[60,23,37,4625,134112],"enemy_1251_lysyta":[51,13,38,109,45084],"enemy_1329_cbshld":[39,9,30,31844,97171]},
|
||||
"hooks": [1,167,6499,955,955,1155,1133,541,53,158,143,143,0,22797,15,46,150,105,1,53,0,0,0],
|
||||
"events": {"atk":955,"deploy":17,"die":53,"dmg":1101,"fx":63,"heal":343,"leak":105,"skill":286,"spawn":162,"status":63},
|
||||
"events": {"atk":955,"deploy":17,"die":53,"dmg":1101,"engage":7,"fx":63,"heal":343,"leak":105,"skill":286,"spawn":162,"status":63},
|
||||
"fx": {"aoe":27,"shield":7,"shieldBreak":29},
|
||||
"snaps": "9dd48aeb 768b6a62 67283489 1675f039 1f8fdd77 d21f5954 aa91e08a c2060be1 44623a43 bd545014 c169ebe7 352eb9fb d7840395 5ed9b33e bd4ea4fd aec07aa7 ff0367f3 4573ca99 2da154c2 258f245a 99df514b 22a7e2c8"
|
||||
},
|
||||
@@ -1474,7 +1474,7 @@
|
||||
"enemy_1207_sfji": [12,0,12,59748,20043]
|
||||
},
|
||||
"hooks": [1,222,6000,599,599,645,642,0,124,213,72,72,0,7162,0,58,188,89,1,124,0,0,3],
|
||||
"events": {"atk":599,"deploy":31,"die":124,"dmg":642,"fx":60,"leak":89,"skill":144,"spawn":203,"status":18},
|
||||
"events": {"atk":599,"deploy":31,"die":124,"dmg":642,"engage":12,"fx":60,"leak":89,"skill":144,"spawn":203,"status":18},
|
||||
"fx": {"aoe":22,"dodge":3,"summon":35},
|
||||
"snaps": "6b4e2791 428cc45f 73f71979 705fe1cc 88c45f49 10171942 ef3dcebe 7bd24710 ead572e7 7e986c1b 51582fa7 7a4788b2 c09ac907 c766ca8c e7aee44a d342840a 0c03efa0 df3009e6 7e7ff8fa bf670d42"
|
||||
},
|
||||
@@ -1516,7 +1516,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[27,6,21,4286,132326],"enemy_1381_winman_2":[48,5,43,30302,269426],"enemy_1387_winshd":[39,0,39,26648,145880]},
|
||||
"hooks": [1,143,6170,686,686,3001,2991,10,33,136,47,47,0,9690,13,55,114,103,1,33,0,0,12],
|
||||
"events": {"atk":812,"deploy":26,"die":33,"dmg":2911,"fx":60,"heal":10,"leak":103,"skill":94,"spawn":129,"status":30},
|
||||
"events": {"atk":812,"deploy":26,"die":33,"dmg":2911,"engage":12,"fx":60,"heal":10,"leak":103,"skill":94,"spawn":129,"status":30},
|
||||
"fx": {"aoe":38,"dodge":12,"heal":10},
|
||||
"snaps": "a9f4519d 1ad3f879 a31119e8 efe43dc2 efbe0f2c 6a981e55 4933de26 5fbc3d89 5cb5cb0f 0da91bd0 7f738e01 c04ed1d2 d268f7ab 9a0775ec bb28285b 8665972d 54ae3ad9 2b32d90e da6e4d45 1191e49c 0a4e359f"
|
||||
},
|
||||
@@ -1555,7 +1555,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,4,23,5611,95073],"enemy_1229_darmy_2":[57,0,56,25726,193587],"enemy_1275_dwlock_2":[21,0,21,38090,90346]},
|
||||
"hooks": [1,127,6900,286,286,3016,3089,17,21,121,8,6,0,10285,11,51,105,100,1,21,0,16,0],
|
||||
"events": {"atk":498,"deploy":22,"die":21,"dmg":2927,"fx":92,"heal":17,"leak":100,"skill":14,"spawn":117,"status":52},
|
||||
"events": {"atk":498,"deploy":22,"die":21,"dmg":2927,"engage":7,"fx":92,"heal":17,"leak":100,"skill":14,"spawn":117,"status":52},
|
||||
"fx": {"aoe":9,"beam":45,"buff":2,"burst":16,"explode":3,"heal":17},
|
||||
"snaps": "08ec0e9b d4419c45 56a2bcb4 9e752221 efa858fd 0b8e0f61 07fd1174 33d5625e 3bcffa82 6bdfc54a 70fb78b8 6b78ec10 bb3a00e7 79fe9836 bfc1fad7 93de838f 3b2411a2 2abcc04e 5ed202f1 f86b9678 44fac894 5dffdeda 38dc3675"
|
||||
},
|
||||
@@ -1594,7 +1594,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,13,44,5282,72855],"enemy_1381_winman":[27,7,20,1770,107737],"enemy_1389_winbab_2":[48,5,43,60081,115162]},
|
||||
"hooks": [1,154,6445,1018,1018,1137,1138,15,46,153,24,24,0,11532,35,51,132,107,1,46,0,0,0],
|
||||
"events": {"atk":1148,"deploy":22,"die":46,"dmg":687,"fx":60,"heal":15,"leak":107,"skill":48,"spawn":144,"status":43},
|
||||
"events": {"atk":1148,"deploy":22,"die":46,"dmg":687,"engage":9,"fx":60,"heal":15,"leak":107,"skill":48,"spawn":144,"status":43},
|
||||
"fx": {"aoe":13,"buff":1,"crit":31,"heal":15},
|
||||
"snaps": "63799646 193a03bc e02a11dc 263432bc 9f6b3637 9bf602dd c0f31b96 bae8b88d 6ca39ae3 684fe9a9 36891e10 66784112 997d4983 72fdd9e0 4d3f0646 362e0e80 435d205e cc2c1c2f 4c433ad5 66329e55 2c1a2ed6 6204ef02"
|
||||
},
|
||||
@@ -1641,7 +1641,7 @@
|
||||
"enemy_1207_sfji": [12,0,12,5081,61727]
|
||||
},
|
||||
"hooks": [1,140,6037,630,630,622,622,0,33,128,66,66,0,21144,179,7,124,95,1,33,0,0,0],
|
||||
"events": {"atk":630,"deploy":14,"die":33,"dmg":622,"fx":207,"leak":95,"skill":132,"spawn":138,"status":122},
|
||||
"events": {"atk":630,"deploy":14,"die":33,"dmg":622,"engage":12,"fx":207,"leak":95,"skill":132,"spawn":138,"status":122},
|
||||
"fx": {"crit":198,"summon":9},
|
||||
"snaps": "0554c5a8 47183f70 b38ddae7 9aa32de8 397cfcee 0eb2fab3 92870fae a81c8f73 c593f05b 8508b52f 83d476ce bd8afb76 619f5934 576b4968 a66f530c 086d4e37 0e4d5e5e 9cbe3d31 4a93cc40 518ac5ad db0490b7"
|
||||
},
|
||||
@@ -1680,7 +1680,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,0,18,12967,54170],"enemy_1061_zomshd":[60,10,50,18210,323150]},
|
||||
"hooks": [1,101,6589,610,610,620,620,22217,29,97,44,44,0,12461,157,26,78,68,1,29,0,0,0],
|
||||
"events": {"atk":610,"deploy":23,"die":29,"dmg":620,"fx":163,"leak":68,"skill":88,"spawn":90,"status":161},
|
||||
"events": {"atk":610,"deploy":23,"die":29,"dmg":620,"engage":12,"fx":163,"leak":68,"skill":88,"spawn":90,"status":161},
|
||||
"fx": {"crit":163},
|
||||
"snaps": "2c84fb54 99234134 07fd8ffd b1f4540d a6c32b3b 5ddfa840 fe8930b7 a622c62a f1623427 a85628cf aeeadcd6 a12ca12c 64a9cad1 bde230bb 5564c1fb a141bebf 15944e00 93033726 131e5452 ef7538c9 3b3a53d1 a577ce3d"
|
||||
},
|
||||
@@ -1721,7 +1721,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1165_duhond":[51,12,39,176,67202],"enemy_1174_duholy_2":[24,0,24,6171,156902],"enemy_1175_dushdo_2":[30,3,27,12769,81850]},
|
||||
"hooks": [1,129,6135,666,666,750,750,0,27,117,54,51,0,22377,0,16,105,90,1,27,0,0,0],
|
||||
"events": {"atk":666,"deploy":22,"die":27,"dmg":750,"fx":36,"leak":90,"skill":105,"spawn":119,"status":195},
|
||||
"events": {"atk":666,"deploy":22,"die":27,"dmg":750,"engage":12,"fx":36,"leak":90,"skill":105,"spawn":119,"status":195},
|
||||
"fx": {"crit":36},
|
||||
"snaps": "20b7fc37 08678156 135cc57c 89dbd854 b8ecd492 a19c7df4 24b1162b 55c5c742 28fd3c49 bfc80994 5c821609 77fc27bc 3f2ff411 6b8a048a 187c1e4b 9c39986d 0fa15a34 4ad95b9b 09abaf91 eb92a8c4 b64e626c"
|
||||
},
|
||||
@@ -1763,7 +1763,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,11,28,1544,288518],"enemy_1169_duphlx_2":[57,2,55,12402,317083],"enemy_1172_dugago":[21,0,21,0,184767]},
|
||||
"hooks": [1,138,6379,872,872,1020,1025,0,23,127,54,52,0,26374,0,10,117,104,1,23,0,0,0],
|
||||
"events": {"atk":911,"deploy":18,"die":23,"dmg":1025,"fx":64,"leak":104,"skill":106,"spawn":132,"status":117},
|
||||
"events": {"atk":911,"deploy":18,"die":23,"dmg":1025,"engage":11,"fx":64,"leak":104,"skill":106,"spawn":132,"status":117},
|
||||
"fx": {"aoe":4,"crit":55,"flame":5},
|
||||
"snaps": "91853125 06afd857 6529ba9a f61610bb 5a37fb46 84fbfac3 a7259db8 4abbf5aa 98dc5387 c2ef870c e54be7cc af4fa409 04b9c085 bc99cf63 66c832fd cf31a2ad 26ab8065 9070c369 a2bfad79 28042255 68a00a5e 4abf7baf"
|
||||
},
|
||||
@@ -1804,7 +1804,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,0,54,4632,542827],"enemy_1422_lrsldr_2":[39,1,38,1544,449425],"enemy_1425_lrcmra_2":[30,0,30,6176,427622]},
|
||||
"hooks": [1,143,6720,332,332,3525,4443,0,11,133,85,85,0,30704,0,8,123,122,1,11,0,0,0],
|
||||
"events": {"atk":1136,"deploy":18,"die":11,"dmg":4443,"fx":174,"leak":122,"skill":170,"spawn":137},
|
||||
"events": {"atk":1136,"deploy":18,"die":11,"dmg":4443,"engage":9,"fx":174,"leak":122,"skill":170,"spawn":137},
|
||||
"fx": {"aoe":72,"flame":102},
|
||||
"snaps": "4b47af19 26fae251 334aea64 90cf1356 632bd915 6b208509 56956bc7 fb0fde6c b8e1589a 5b0fd4fa 0a256b44 e3c05507 0d0fd3cb 6f50e0c0 1ebb781e d811c4ad 1c9aa388 05dc4236 151056b9 29a180ce 98531a71 1b1e582c db0bf003"
|
||||
},
|
||||
@@ -1846,7 +1846,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[60,34,26,5486,596279],"enemy_1251_lysyta":[51,35,16,909,240893],"enemy_1329_cbshld":[39,13,26,8801,530032]},
|
||||
"hooks": [1,171,6348,433,431,1867,2367,0,95,163,92,92,18,29289,22,25,150,68,1,95,0,0,0],
|
||||
"events": {"atk":1247,"deploy":18,"die":95,"dmg":2367,"fx":236,"leak":68,"skill":184,"spawn":165,"status":44},
|
||||
"events": {"atk":1247,"deploy":18,"die":95,"dmg":2367,"engage":12,"fx":236,"leak":68,"skill":184,"spawn":165,"status":44},
|
||||
"fx": {"aoe":73,"beam":3,"flame":100,"shieldBreak":60},
|
||||
"snaps": "43307da7 4ff2063f 2a153be0 3aba4c54 30fdf3ac 1f9215af cf66cfaa 8012d31d 985f38b3 a23ece2e 38d610e7 33eab3e4 0832bad4 fdd45552 4c989016 b99015e8 e5e90c65 02b8067a c5784c78 5f21d2f4 59cec77b fe00505d"
|
||||
},
|
||||
@@ -1885,7 +1885,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1009_lurker":[66,1,65,4068,23824],"enemy_1019_jshoot_2":[57,0,57,19510,13600],"enemy_1404_msnip":[48,0,48,5997,12869]},
|
||||
"hooks": [1,191,6474,95,94,146,146,0,20,190,5,5,0,5466,7,9,171,170,1,20,0,0,0],
|
||||
"events": {"atk":109,"deploy":20,"die":20,"dmg":146,"fx":4,"leak":170,"skill":10,"spawn":183,"status":14},
|
||||
"events": {"atk":109,"deploy":20,"die":20,"dmg":146,"engage":12,"fx":4,"leak":170,"skill":10,"spawn":183,"status":14},
|
||||
"fx": {"beam":4},
|
||||
"snaps": "08c9fbae 67a87bb0 a3072327 eccaf1f9 f8cc45b2 3a1ad7d5 e64c4b62 ab4241de 246cedcc 6587f984 c0ab6846 be85b076 9cb57eb2 08c0757d adab1273 206fd5e6 00edb24d ffef6b41 6f2fa874 cff77e70 c9148e99 27dc3559"
|
||||
},
|
||||
@@ -1927,7 +1927,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1148_dssbr":[63,63,0,0,169344],"enemy_1148_dssbr_2":[60,60,0,111,207360],"enemy_1439_dslntf":[12,3,9,17567,151428]},
|
||||
"hooks": [1,153,5992,470,470,918,2429,0,133,142,27,21,0,25469,300,15,135,9,1,133,0,22,0],
|
||||
"events": {"atk":843,"deploy":15,"die":133,"dmg":2411,"fx":161,"leak":9,"skill":48,"spawn":150,"status":575},
|
||||
"events": {"atk":843,"deploy":15,"die":133,"dmg":2411,"engage":12,"fx":161,"leak":9,"skill":48,"spawn":150,"status":575},
|
||||
"fx": {"aoe":43,"burst":22,"shield":96},
|
||||
"snaps": "64e9afd8 f7e3e19c 35675c6f 6529822b 79c0e605 6f9bb98a 7f7c9d88 bb8293ae 6fa5be86 2444d933 98c0b198 c38bac2f ab6665c7 3b336f16 31d08ef6 c2ac0db3 851538ad dff947cd e1b9cd7c 11a92dbf"
|
||||
},
|
||||
@@ -1969,7 +1969,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,19,38,15913,131511],"enemy_1299_ymkilr_2":[27,4,23,18724,121648],"enemy_1422_lrsldr_2":[39,22,17,836,285939]},
|
||||
"hooks": [1,147,6576,726,726,2486,2486,0,65,143,22,22,0,10635,102,34,123,78,1,65,0,0,0],
|
||||
"events": {"atk":1089,"deploy":21,"die":65,"dmg":2027,"fx":87,"leak":78,"skill":44,"spawn":138,"status":182},
|
||||
"events": {"atk":1089,"deploy":21,"die":65,"dmg":2027,"engage":11,"fx":87,"leak":78,"skill":44,"spawn":138,"status":182},
|
||||
"fx": {"aoe":29,"shield":58},
|
||||
"snaps": "8eac4d32 fa5c2376 bc1e9184 84fb1db6 b4b3b807 cc6f6399 c665e4ff 261094cd 5d5c61fd 1bf27396 b526ffa6 e433a3a2 7d8bd521 d7eb687d 4d18ecc9 f640c5fd 0912a7d6 cc22df71 1a833e56 d877d28b 8a887ef8 8014c7dd"
|
||||
},
|
||||
@@ -2008,7 +2008,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[12,0,12,22394,28372],"enemy_1061_zomshd":[48,0,41,33180,156554]},
|
||||
"hooks": [1,82,6900,590,590,3223,3223,20288,14,67,10,9,0,15635,505,70,60,53,1,14,0,0,0],
|
||||
"events": {"atk":590,"deploy":22,"die":14,"dmg":3175,"fx":67,"leak":53,"skill":19,"spawn":72,"status":142},
|
||||
"events": {"atk":590,"deploy":22,"die":14,"dmg":3175,"engage":7,"fx":67,"leak":53,"skill":19,"spawn":72,"status":142},
|
||||
"fx": {"buff":2,"counter":43,"shield":22},
|
||||
"snaps": "1ad2183e 31436dc6 162db746 33388938 61688d2f 0472b4ef 94c39e4b 95f61859 3a70fec9 11ddf128 538ff406 c6a3a4be fadf11ea 33b4744d 57e75bf3 8594a4d7 e618d366 40e9e04d 5a0b2dbb 92e0c87e 6e8be006 cf3a4f90 e2c51214"
|
||||
},
|
||||
@@ -2047,7 +2047,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1165_duhond":[51,0,51,4082,30703],"enemy_1174_duholy_2":[24,0,24,20164,2589],"enemy_1175_dushdo_2":[30,0,30,49591,9438]},
|
||||
"hooks": [1,126,6314,340,340,402,402,0,19,124,9,9,0,11443,375,58,105,105,1,19,0,0,0],
|
||||
"events": {"atk":340,"deploy":21,"die":19,"dmg":345,"fx":94,"leak":105,"skill":18,"spawn":117,"status":285},
|
||||
"events": {"atk":340,"deploy":21,"die":19,"dmg":345,"engage":8,"fx":94,"leak":105,"skill":18,"spawn":117,"status":285},
|
||||
"fx": {"buff":2,"counter":62,"shield":21,"shieldBreak":9},
|
||||
"snaps": "32c508d1 7fb27f91 1e862c88 ada7c060 c2899984 383b70f2 24fae586 47ebbe16 4b5a8eda 97692424 140fe8ca e3a306f9 4356fe33 a86a479a 3db4401e 2f7b03f7 27739027 66be9939 f23fd6ef 8db2c4d4 a3bacd91"
|
||||
},
|
||||
@@ -2088,7 +2088,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[42,42,0,19638,489888],"enemy_1320_wdrrl_2":[12,7,4,46424,337623],"enemy_1422_lrsldr_2":[45,45,0,3481,384912]},
|
||||
"hooks": [1,120,6900,1503,1503,3200,3200,3103,104,108,24,22,0,11731,719,105,99,4,1,104,0,0,0],
|
||||
"events": {"atk":1606,"deploy":19,"die":104,"dmg":2878,"fx":1024,"heal":549,"leak":4,"skill":46,"spawn":113,"status":281},
|
||||
"events": {"atk":1606,"deploy":19,"die":104,"dmg":2878,"engage":12,"fx":1024,"heal":549,"leak":4,"skill":46,"spawn":113,"status":281},
|
||||
"fx": {"counter":257,"explode":10,"strike":719,"undying":24,"zone":14},
|
||||
"snaps": "36780204 dac8d98e 6f2e981c 459ada1b 042719cc cf606764 a0f56997 4c425c7e b6159d94 a81a5366 644837d2 641691ef 2ba0a786 a89e77f0 a93a6da4 5a12d51a 6f311289 85cea690 c2c18a05 573f95c3 e900e46c 68d5d9a9 c98071e3"
|
||||
},
|
||||
@@ -2127,7 +2127,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,16,40,19520,370400],"enemy_1299_ymkilr_2":[27,0,27,45400,82470],"enemy_1422_lrsldr_2":[39,5,33,9769,345587]},
|
||||
"hooks": [1,144,6900,897,897,1833,1996,496,37,137,12,10,0,4815,357,66,123,100,1,37,0,7,0],
|
||||
"events": {"atk":961,"deploy":21,"die":37,"dmg":1718,"fx":421,"heal":160,"leak":100,"skill":22,"spawn":135,"status":366},
|
||||
"events": {"atk":961,"deploy":21,"die":37,"dmg":1718,"engage":12,"fx":421,"heal":160,"leak":100,"skill":22,"spawn":135,"status":366},
|
||||
"fx": {"burst":7,"counter":157,"shield":11,"strike":230,"undying":11,"zone":5},
|
||||
"snaps": "2bd122f0 7f3a3e53 db83e114 83767c40 20d3f45c f4dfdeb2 340c122b 1f62dd45 ece8fd99 c7fcae44 0cda025a 6a2aee1b d3b6c592 4c333590 783eb54c e9147860 4c8c0043 449dd30f dfdf76aa b7c82e21 799e1452 8a4cf506 6311a530"
|
||||
},
|
||||
@@ -2168,7 +2168,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[27,27,0,251,150336],"enemy_1381_winman_2":[48,48,0,194,359424],"enemy_1387_winshd":[39,39,0,154,449280]},
|
||||
"hooks": [1,128,6192,720,720,2873,4882,0,114,114,19,19,0,23406,929,121,114,0,1,114,0,190,0],
|
||||
"events": {"atk":870,"deploy":12,"die":114,"dmg":4489,"fx":702,"skill":38,"spawn":128,"status":2065},
|
||||
"events": {"atk":870,"deploy":12,"die":114,"dmg":4489,"engage":3,"fx":702,"skill":38,"spawn":128,"status":2065},
|
||||
"fx": {"burst":190,"displace":13,"shield":483,"zone":16},
|
||||
"snaps": "e16d0b90 f693a9bd 5dd37cf8 cfc3ad46 86781277 0cf687fc 6cb659b1 bea11a8b 531bad83 f4c188a4 0cc40431 c5bee9da 1dfca9f5 c0a3c672 c62826f9 91a3c8f1 ced13aba 2713fa0d ed8224a5 dbf85f5a a803461a"
|
||||
},
|
||||
@@ -2210,7 +2210,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[27,13,14,1821,104233],"enemy_1381_winman_2":[39,23,16,5409,250749],"enemy_1387_winshd":[30,19,8,12365,358755]},
|
||||
"hooks": [1,111,6900,2034,2034,2034,2034,2355,55,93,23,21,0,31899,6263,72,96,38,1,55,0,0,0],
|
||||
"events": {"atk":2034,"deploy":12,"die":55,"dmg":2034,"leak":38,"skill":52,"spawn":111,"status":44},
|
||||
"events": {"atk":2034,"deploy":12,"die":55,"dmg":2034,"engage":11,"leak":38,"skill":52,"spawn":111,"status":44},
|
||||
"fx": {},
|
||||
"snaps": "cb36bea0 1cd824a6 6a43a50d 9508d59d 6a1917f1 8acbaf11 844c253c 52c66ea3 e4174ffe f6e7c41b 17d085ee d1c58a79 ba1d806a 1053b109 f7d5124a 976506f1 8f0c88fa faf619a3 61481e1f 13074737 f7d0a827 e6615136 a8529840"
|
||||
},
|
||||
@@ -2251,7 +2251,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1158_divman":[51,1,50,2604,30331],"enemy_1160_hvyslr_2":[24,0,24,13229,320558],"enemy_1161_tidmag_2":[30,0,30,57982,23746]},
|
||||
"hooks": [1,126,6678,325,325,1709,1777,0,19,123,1,7,0,2867,12,18,105,104,1,19,0,16,0],
|
||||
"events": {"atk":385,"deploy":19,"die":19,"dmg":1777,"fx":16,"leak":104,"skill":16,"spawn":119,"status":173},
|
||||
"events": {"atk":385,"deploy":19,"die":19,"dmg":1777,"engage":11,"fx":16,"leak":104,"skill":16,"spawn":119,"status":173},
|
||||
"fx": {"burst":16},
|
||||
"snaps": "a19200d3 4973c74e b6f52e3a f889fc09 0a4c5c48 167c8c19 e715a600 ed4d3d2c bafc5621 f7da3e3c 490a2bdd e4d9bf49 50f035c4 a76887ac c57f6982 c6d4a59a 039e0c28 58668379 5994b8c5 49027346 e98709c2 faa91a0a 2b00021a"
|
||||
},
|
||||
@@ -2299,7 +2299,7 @@
|
||||
"enemy_1207_sfji": [12,0,12,58335,44589]
|
||||
},
|
||||
"hooks": [1,232,6900,656,656,864,864,1235,85,225,9,12,0,9517,141,71,210,140,1,85,0,0,0],
|
||||
"events": {"atk":656,"deploy":19,"die":85,"dmg":790,"fx":182,"leak":140,"skill":26,"spawn":225,"status":43},
|
||||
"events": {"atk":656,"deploy":19,"die":85,"dmg":790,"engage":12,"fx":182,"leak":140,"skill":26,"spawn":225,"status":43},
|
||||
"fx": {"aoe":20,"crit":2,"shield":36,"summon":42,"thorns":82},
|
||||
"snaps": "a3b5c55e 37edd08d 24bb351e 01dc0c5d daefa627 49f70c61 1f931bed eb370776 a94a36f9 e5a52b05 f92e5820 1923ff6c 182acdbb 351502ec dc6cb9d7 199ce1a5 a7df14d2 f784618a 39e1b3c5 00da186c 4a4d1bad 041793ab 7751f337"
|
||||
},
|
||||
@@ -2338,7 +2338,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,11,28,1946,111061],"enemy_1169_duphlx_2":[57,13,44,4989,189109],"enemy_1170_dushld_2":[51,7,43,46563,264134]},
|
||||
"hooks": [1,164,6900,1314,1314,3148,3148,0,45,160,71,71,0,18696,3,71,147,115,1,45,0,0,0],
|
||||
"events": {"atk":1314,"deploy":17,"die":45,"dmg":2712,"fx":653,"leak":115,"skill":142,"spawn":159,"status":201},
|
||||
"events": {"atk":1314,"deploy":17,"die":45,"dmg":2712,"engage":12,"fx":653,"leak":115,"skill":142,"spawn":159,"status":201},
|
||||
"fx": {"aoe":140,"crit":3,"shield":51,"thorns":459},
|
||||
"snaps": "c187fc5c 5dab19af 7acb0052 0c606473 987adbaf 4eceee2e 67a1e480 a5a45813 f2bab532 244d0df0 3c775c93 019c27d7 cfc22507 cbac9c83 64147de8 57473bf2 870493ab 7da17b9c fb0e7dec 3fb32228 82779b6e 97d0c536 18a59bb7"
|
||||
},
|
||||
@@ -2380,7 +2380,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,0,27,11588,88125],"enemy_1229_darmy_2":[57,0,57,32971,57927],"enemy_1275_dwlock_2":[21,0,21,45597,44027]},
|
||||
"hooks": [1,129,6242,300,300,611,693,1847,19,124,14,14,0,5562,2,38,105,105,1,19,0,13,0],
|
||||
"events": {"atk":308,"deploy":21,"die":19,"dmg":652,"fx":118,"heal":44,"leak":105,"skill":28,"spawn":120,"status":44},
|
||||
"events": {"atk":308,"deploy":21,"die":19,"dmg":652,"engage":9,"fx":118,"heal":44,"leak":105,"skill":28,"spawn":120,"status":44},
|
||||
"fx": {"aoe":22,"beam":24,"burst":13,"crit":2,"explode":1,"healField":9,"shield":7,"thorns":40},
|
||||
"snaps": "566706c5 cee551a1 b6f3ff43 98a30d55 78d17f28 ce3c2ac5 37c74c3e 5a52b434 7520e1d5 01cdc6ec d627c150 edb1403a 3eb50949 24ace5f3 85e9da3c 17c3f959 ea2a5487 40ce67eb 8b28c74a d50653e7 d373351f"
|
||||
},
|
||||
@@ -2422,7 +2422,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,17,7,52871,80586],"enemy_1229_darmy_2":[57,35,20,148941,223556],"enemy_9007_acelem":[12,1,8,74947,112069]},
|
||||
"hooks": [1,120,6900,1714,1714,4840,5166,27308,69,104,48,47,0,17916,0,105,96,35,1,69,0,41,0],
|
||||
"events": {"atk":1776,"deploy":21,"die":69,"dmg":5166,"fx":170,"heal":351,"leak":35,"skill":95,"spawn":111,"status":108},
|
||||
"events": {"atk":1776,"deploy":21,"die":69,"dmg":5166,"engage":12,"fx":170,"heal":351,"leak":35,"skill":95,"spawn":111,"status":108},
|
||||
"fx": {"beam":19,"burst":41,"healField":55,"teleport":55},
|
||||
"snaps": "5c632459 14793cab 77a534f8 70d4b39c f84a4105 c2e2b2dc 8596dd2c b7677642 156f5786 2138d829 1cf66223 b3ece3cb 12c6f876 bc62e21b 121a2081 3e5bd85f 09aec046 1e39e676 f98840f6 b64b7602 d2ef96e7 a0415358 32a50205"
|
||||
},
|
||||
@@ -2461,7 +2461,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[12,0,12,12963,21860],"enemy_1061_zomshd":[48,1,44,40188,237116]},
|
||||
"hooks": [1,83,6900,863,863,3289,3289,33321,15,71,73,72,0,15851,67,37,60,56,1,15,0,0,0],
|
||||
"events": {"atk":981,"deploy":23,"die":15,"dmg":3289,"heal":728,"leak":56,"skill":145,"spawn":72,"status":145},
|
||||
"events": {"atk":981,"deploy":23,"die":15,"dmg":3289,"engage":9,"heal":728,"leak":56,"skill":145,"spawn":72,"status":145},
|
||||
"fx": {},
|
||||
"snaps": "e3dab2f8 a8c39914 39b6bf69 0dbf0369 e1b8f315 8ea8bb4c 8256ffb3 6933f61a f1adf509 c90eb89a 8e05873b 8fe9d3de acfd9afa 4e5195c1 66014400 3d08642f 7f0dfed2 4aa002f8 7198b3e3 3a20e441 6b35057b 6017deef de2487e7"
|
||||
},
|
||||
@@ -2500,7 +2500,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,1,26,5523,74289],"enemy_1119_vofsd":[48,0,48,21117,49437],"enemy_1121_lifbos_2":[30,0,30,25356,31243]},
|
||||
"hooks": [1,130,6489,333,333,395,395,3945,23,127,28,28,0,7662,28,45,105,104,1,23,0,0,0],
|
||||
"events": {"atk":374,"deploy":25,"die":23,"dmg":395,"fx":24,"heal":302,"leak":104,"skill":56,"spawn":117,"status":219},
|
||||
"events": {"atk":374,"deploy":25,"die":23,"dmg":395,"engage":10,"fx":24,"heal":302,"leak":104,"skill":56,"spawn":117,"status":219},
|
||||
"fx": {"liberate":24},
|
||||
"snaps": "b9ffdd79 e14da129 ca1fbe62 2bd95c53 ee1604ae d0454351 3818ae71 f5cd0ad1 df304800 9c5dab33 d73acb42 c7af8d64 de528d7d 09b1746c 0fba3bd4 41288af6 d0bbd809 3a74b7f2 225487da 327e4be1 ad8d0b0b e306cc9e"
|
||||
},
|
||||
@@ -2547,7 +2547,7 @@
|
||||
"enemy_9010_acpupp": [30,0,30,55940,149861]
|
||||
},
|
||||
"hooks": [1,125,5791,321,321,357,357,0,45,122,17,24,0,4107,0,29,102,77,1,48,0,0,0],
|
||||
"events": {"atk":321,"deploy":21,"die":45,"dmg":357,"fx":12,"leak":77,"skill":34,"spawn":116,"status":68},
|
||||
"events": {"atk":321,"deploy":21,"die":45,"dmg":357,"engage":12,"fx":12,"leak":77,"skill":34,"spawn":116,"status":68},
|
||||
"fx": {"revive":3,"summon":9},
|
||||
"snaps": "f09ad148 7b9a0c7b 541c5c05 87e86c5e 2d038f87 4c6a0cab 9d7f5c13 500956b0 629db6af e4432b06 f39bcef1 57dbe0f1 7f7ab902 46d6269a 37bd1038 93e441f7 02d6511f 8f10caa5 b46579ca 6e64c5a2"
|
||||
},
|
||||
@@ -2586,7 +2586,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,0,18,13022,2254],"enemy_1061_zomshd":[60,3,56,70204,240809]},
|
||||
"hooks": [1,100,6900,527,527,565,565,18696,24,98,30,37,0,5057,1,25,78,74,1,28,0,0,0],
|
||||
"events": {"atk":527,"deploy":22,"die":24,"dmg":565,"fx":4,"leak":74,"skill":60,"spawn":90,"status":78},
|
||||
"events": {"atk":527,"deploy":22,"die":24,"dmg":565,"engage":12,"fx":4,"leak":74,"skill":60,"spawn":90,"status":78},
|
||||
"fx": {"revive":4},
|
||||
"snaps": "854a2458 374ded97 ff5c8f75 161eade0 47e2bc02 9e6aeb62 6d2f2dd0 80879eb9 548ac57c b83a5dd4 21ebfa97 78f495f5 1cff6fbf ae29ea53 afd0bf3b 80610759 9295d254 40dc1d49 1e2b699d 7d73f8d0 72992da5 f6b465b8 b27c4a9b"
|
||||
},
|
||||
@@ -2627,7 +2627,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[60,10,50,28054,598109],"enemy_1251_lysyta":[63,14,49,9044,281265],"enemy_1329_cbshld":[30,0,30,14853,78434]},
|
||||
"hooks": [1,199,6067,1292,1292,1745,1578,0,46,175,62,62,0,14235,0,59,153,129,1,52,0,0,129],
|
||||
"events": {"atk":1701,"deploy":44,"die":46,"dmg":1578,"fx":183,"leak":129,"skill":124,"spawn":167,"status":68},
|
||||
"events": {"atk":1701,"deploy":44,"die":46,"dmg":1578,"engage":12,"fx":183,"leak":129,"skill":124,"spawn":167,"status":68},
|
||||
"fx": {"dodge":129,"shieldBreak":38,"teleport":10,"undying":6},
|
||||
"snaps": "d7a4c4b8 d1b3d92e 8cf50abd f866abf9 96ede988 8cec9f3d f62404fe 6dc40d5b 799f0eb4 1efd07dc 63b0fb0a 13f97919 2848c1c0 939ec9a5 8033448c 27fbb548 e861cf3a a7167207 6073a250 b79fb995 7957b19c"
|
||||
},
|
||||
@@ -2710,7 +2710,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,27,0,33,194400],"enemy_1119_vofsd":[48,44,4,4602,483663],"enemy_1121_lifbos_2":[30,27,3,14081,659033]},
|
||||
"hooks": [1,196,6058,1390,1348,2328,2268,863,102,147,115,144,0,43125,166,80,105,7,1,102,0,0,60],
|
||||
"events": {"atk":1598,"deploy":88,"die":140,"dmg":2268,"fx":251,"leak":7,"skill":294,"spawn":161,"status":410},
|
||||
"events": {"atk":1598,"deploy":88,"die":140,"dmg":2268,"engage":12,"fx":251,"leak":7,"skill":294,"spawn":161,"status":410},
|
||||
"fx": {"aoe":56,"buff":6,"dodge":60,"liberate":10,"lock":27,"summon":32,"telegraph":29,"teleport":31},
|
||||
"snaps": "26812200 a2fa19cc b694ee05 7cc27c9c ffc5e78b 87d97e05 024fcece 26c15317 892ddec2 ee17b669 8eb5b83c 0b3b2ac3 c0bb05ce 15443ccb 9312eb29 d5a1826c 724fffdf de1245c4 054a1bc8 8b27ecc2 fa6ce84f"
|
||||
},
|
||||
@@ -2818,7 +2818,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,26,1,0,334858],"enemy_1119_vofsd":[48,11,36,2651,629001],"enemy_1121_lifbos_2":[30,0,30,6331,513934]},
|
||||
"hooks": [1,190,6900,773,689,3504,3486,4143,43,177,117,184,0,65115,582,10,105,67,1,43,0,0,18],
|
||||
"events": {"atk":689,"deploy":83,"die":110,"dmg":3486,"fx":339,"leak":67,"skill":368,"spawn":186,"status":872},
|
||||
"events": {"atk":689,"deploy":83,"die":110,"dmg":3486,"engage":12,"fx":339,"leak":67,"skill":368,"spawn":186,"status":872},
|
||||
"fx": {"aoe":109,"buff":15,"dodge":18,"liberate":20,"lock":43,"summon":67,"telegraph":67},
|
||||
"snaps": "c0921652 69589ea4 acea48b5 4aeac179 ca726377 46604709 c25eb30e 01b7e6dc e12be22b 1a384a2f f83c72b2 557921fd 479c3f08 5b13ef38 3fcffada d0ca6c43 616cf220 8e438dd7 349294bb e2d87b5c 98e4077f 1941c917 d2b616a0"
|
||||
},
|
||||
@@ -2896,7 +2896,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1166_dusbr_2":[39,34,5,2255,480947],"enemy_1169_duphlx_2":[57,7,50,3181,589353],"enemy_1170_dushld_2":[51,0,51,9202,476009]},
|
||||
"hooks": [1,206,6725,510,464,2342,3805,0,54,196,66,102,0,36503,485,15,147,106,1,54,0,0,0],
|
||||
"events": {"atk":464,"deploy":56,"die":90,"dmg":2342,"fx":174,"leak":106,"skill":204,"spawn":198,"status":903},
|
||||
"events": {"atk":464,"deploy":56,"die":90,"dmg":2342,"engage":12,"fx":174,"leak":106,"skill":204,"spawn":198,"status":903},
|
||||
"fx": {"aoe":66,"buff":6,"lock":30,"summon":36,"telegraph":36},
|
||||
"snaps": "99cae01b 88a3d7c2 eabad3c3 e4f64106 08a3675a 38e5c33e 0a935e4d 83773bd8 8c791877 903dfb2d d4151e04 dbc3b187 4a1b5f59 79ed95c7 2ca926d1 65bdac69 7879445d 9837e2fb c8233653 5dfab371 0b8f3dec 9471fb29 bbce7a0e"
|
||||
},
|
||||
@@ -2941,7 +2941,7 @@
|
||||
"enemy_9010_acpupp": [30,0,30,7915,469638]
|
||||
},
|
||||
"hooks": [1,127,6151,340,333,908,5450,0,49,122,14,13,0,248,0,16,108,73,1,50,0,0,0],
|
||||
"events": {"atk":333,"deploy":19,"die":49,"dmg":898,"fx":160,"leak":73,"skill":27,"spawn":120,"status":38},
|
||||
"events": {"atk":333,"deploy":19,"die":49,"dmg":898,"engage":12,"fx":160,"leak":73,"skill":27,"spawn":120,"status":38},
|
||||
"fx": {"aoe":103,"ember":1,"shieldBreak":2,"summon":11,"telegraph":1,"zone":42},
|
||||
"snaps": "e906bf06 dffa6b85 c8dda3e6 ae417c90 eb537c73 97195c71 4061dc66 cf4768a1 365fb9e6 df7afb74 995396ab d83633e1 811de2ae 4b6cf3c7 dc60bba6 5cc551b7 d820e151 a730ee11 38fd096e 1958853b d1730693"
|
||||
},
|
||||
@@ -2983,7 +2983,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[27,4,23,2285,148231],"enemy_1270_nhstlk_2":[36,1,35,3930,135479],"enemy_9006_actoxi":[39,0,39,4737,264101]},
|
||||
"hooks": [1,124,6120,368,357,690,5495,0,18,115,18,17,0,279,0,9,102,97,1,18,0,0,0],
|
||||
"events": {"atk":357,"deploy":19,"die":18,"dmg":690,"fx":195,"leak":97,"skill":35,"spawn":117,"status":44},
|
||||
"events": {"atk":357,"deploy":19,"die":18,"dmg":690,"engage":12,"fx":195,"leak":97,"skill":35,"spawn":117,"status":44},
|
||||
"fx": {"aoe":125,"zone":70},
|
||||
"snaps": "51c4bda9 21f0cc46 a82be1d6 0ac36531 168e3bb2 1bcf44f3 daef3e20 96d361ab baf1a5fb 80154bb3 89466bae 45c32b4b 9dca2298 f71584e0 c1723cd3 d34caa6d 0a21b07b e654bc71 300a8440 6f5228b4 4f4eb16b"
|
||||
},
|
||||
@@ -3031,7 +3031,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[42,11,31,6635,791759],"enemy_1422_lrsldr_2":[45,16,29,2525,873020],"enemy_1425_lrcmra_2":[24,0,24,25033,386922]},
|
||||
"hooks": [1,140,5957,411,411,8620,8620,0,47,131,88,88,19,21188,2107,18,111,84,1,47,0,0,0],
|
||||
"events": {"atk":515,"deploy":26,"die":47,"dmg":8620,"fx":245,"leak":84,"skill":176,"spawn":132,"status":1109},
|
||||
"events": {"atk":515,"deploy":26,"die":47,"dmg":8620,"engage":12,"fx":245,"leak":84,"skill":176,"spawn":132,"status":1109},
|
||||
"fx": {"aoe":161,"camouflage":1,"overload":2,"strike":51,"summon":6,"telegraph":24},
|
||||
"snaps": "2d9f8f73 d2731731 7ad6484b de506ad9 744afbb0 c80fca2f 66d47606 70a8ba35 d4329acf 5cb1fdbb 0f020029 88de71e9 8762bfc7 f80cf797 62fea1f7 63c7f32f 93829e16 17ab53e2 24bc8145 571b2e52"
|
||||
},
|
||||
@@ -3075,7 +3075,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[18,18,0,7491,432000],"enemy_1043_zomsbr":[66,66,0,22,165653],"enemy_1061_zomshd":[45,45,0,1341,519554]},
|
||||
"hooks": [1,147,5988,871,871,11238,11238,16721,131,131,149,144,15,33988,1855,30,129,0,1,131,0,0,0],
|
||||
"events": {"atk":1194,"deploy":18,"die":131,"dmg":11238,"fx":415,"skill":293,"spawn":146,"status":1195},
|
||||
"events": {"atk":1194,"deploy":18,"die":131,"dmg":11238,"engage":10,"fx":415,"skill":293,"spawn":146,"status":1195},
|
||||
"fx": {"aoe":283,"camouflage":1,"overload":8,"strike":110,"summon":5,"thorns":8},
|
||||
"snaps": "9847a5a5 564a7bc0 1e8dc4d6 7cf1b445 7ecfe44f efddcc39 dead53bd 2a30c02a 2da1518a 89d8ad3b 9fc7a9db 7ba6918f 7f2105fa 28b15aaa 05b765f0 0e9e3f0d 1e7e0e51 8139d8c9 1439c789 f4c1958b"
|
||||
},
|
||||
@@ -3114,7 +3114,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,0,18,16769,32318],"enemy_1061_zomshd":[60,0,60,31825,186577]},
|
||||
"hooks": [1,101,6539,598,598,1915,2344,23516,19,97,14,13,0,9782,3,40,78,78,1,19,0,0,0],
|
||||
"events": {"atk":598,"deploy":23,"die":19,"dmg":2344,"fx":27,"leak":78,"skill":27,"spawn":90,"status":6},
|
||||
"events": {"atk":598,"deploy":23,"die":19,"dmg":2344,"engage":12,"fx":27,"leak":78,"skill":27,"spawn":90,"status":6},
|
||||
"fx": {"thorns":27},
|
||||
"snaps": "f251b603 b64b2167 b37b9261 d5617ca3 e3a1fd94 8ce6f2e1 84292712 75cc7040 bd4fecc0 e41e936d f1e2a3e5 f770e310 dfa9d1b8 b7d6fac2 3952c796 5accfaf7 4d9eb087 94016144 1f3df616 5a8fd859 e66b35aa 76e4018a"
|
||||
},
|
||||
@@ -3161,7 +3161,7 @@
|
||||
"enemy_9010_acpupp": [39,6,33,42458,571918]
|
||||
},
|
||||
"hooks": [1,182,6152,381,381,1003,1085,465,86,171,18,18,0,16107,5,46,153,85,1,92,0,0,8],
|
||||
"events": {"atk":405,"deploy":27,"die":86,"dmg":1085,"fx":437,"heal":4,"leak":85,"skill":36,"spawn":167,"status":8},
|
||||
"events": {"atk":405,"deploy":27,"die":86,"dmg":1085,"engage":11,"fx":437,"heal":4,"leak":85,"skill":36,"spawn":167,"status":8},
|
||||
"fx": {"blink":5,"dash":12,"dodge":8,"ember":6,"shield":131,"shieldBreak":2,"slash":243,"summon":20,"telegraph":6,"thorns":4},
|
||||
"snaps": "8a3cfafb d17ada74 14edbc58 d8fa1fa9 21fc9472 5547dd82 cb7436e8 fe09dc23 b431d4f8 f267feb6 d47f7c8e e1e078a5 0ddd76df f2940500 cf2f3746 7ebd9419 0b8f7618 0d8de4bd c44f12f2 254b7d70 51f2cc5a"
|
||||
},
|
||||
@@ -3200,7 +3200,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,6,21,587,90296],"enemy_1229_darmy_2":[57,10,47,10226,206501],"enemy_1275_dwlock_2":[21,5,16,49900,269915]},
|
||||
"hooks": [1,132,6795,211,211,513,539,60,43,127,10,10,0,7956,12,29,105,84,1,43,0,1,21],
|
||||
"events": {"atk":227,"deploy":27,"die":43,"dmg":539,"fx":244,"leak":84,"skill":20,"spawn":117,"status":8},
|
||||
"events": {"atk":227,"deploy":27,"die":43,"dmg":539,"engage":12,"fx":244,"leak":84,"skill":20,"spawn":117,"status":8},
|
||||
"fx": {"beam":45,"blink":4,"burst":1,"dash":8,"dodge":21,"shield":60,"slash":105},
|
||||
"snaps": "45e32aa4 9e2f1376 c0152cae 9f741ff8 cc554332 cd3d8d95 e73ef0f3 3b182583 b13290ac 1ad128dd 247f28ef 02d233e2 e284f0bc dad6ce0b b37b0587 de541236 7ed7a8d3 fd46f9c7 41d01aa4 1c43a222 8635abfb 3725fd22 80d163ed"
|
||||
},
|
||||
@@ -3241,7 +3241,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[60,58,2,1482,555896],"enemy_1251_lysyta":[63,56,7,477,253833],"enemy_1329_cbshld":[30,22,8,16510,393975]},
|
||||
"hooks": [1,168,5540,321,321,2164,2104,0,139,156,74,70,0,42782,272,111,153,17,1,139,0,0,0],
|
||||
"events": {"atk":531,"deploy":13,"die":139,"dmg":2104,"fx":1630,"leak":17,"skill":144,"spawn":167,"status":265},
|
||||
"events": {"atk":531,"deploy":13,"die":139,"dmg":2104,"engage":8,"fx":1630,"leak":17,"skill":144,"spawn":167,"status":265},
|
||||
"fx": {"aoe":52,"lightning":1461,"pulse":57,"shieldBreak":60},
|
||||
"snaps": "2dc968cd 56750e4a 1ee2876e a2144941 fb2d3544 6ebea34c 32159a8a 6b3f865d e943e51b f925fc4b 8d788044 012c2ee5 63a6c5ce 7edff8fe 0255b86e 4f834581 71bb9edd c57f6ec9 d067a686"
|
||||
},
|
||||
@@ -3283,7 +3283,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1251_lysyta_2":[51,7,44,8056,222618],"enemy_1252_lysytb_2":[54,0,54,37418,231314],"enemy_1329_cbshld_2":[39,1,38,29343,203222]},
|
||||
"hooks": [1,172,6358,313,313,1196,1196,0,32,168,34,34,0,13997,170,61,144,136,1,32,0,0,0],
|
||||
"events": {"atk":360,"deploy":25,"die":32,"dmg":1196,"fx":295,"leak":136,"skill":68,"spawn":159,"status":207},
|
||||
"events": {"atk":360,"deploy":25,"die":32,"dmg":1196,"engage":10,"fx":295,"leak":136,"skill":68,"spawn":159,"status":207},
|
||||
"fx": {"aoe":12,"lightning":271,"pulse":12},
|
||||
"snaps": "57b0247f 709e3989 b59273f8 96badade e60d2e42 bb5c571b bf511a45 285716ba fdd2e6cb c13505bb f651147a 34f81088 56c11b0e 4cb01267 1445a90f aeb2d2d4 cb3a65a9 76eea771 f4b338c5 2c4e5087 623df3ae 8aa9c179"
|
||||
},
|
||||
@@ -3366,7 +3366,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,41,16,9154,183638],"enemy_1299_ymkilr_2":[27,10,17,47487,203959],"enemy_1422_lrsldr_2":[39,16,23,1386,172539]},
|
||||
"hooks": [1,149,6820,1026,1026,1315,1436,0,88,144,56,55,0,17849,892,94,123,56,1,88,0,6,0],
|
||||
"events": {"atk":1056,"deploy":23,"die":88,"dmg":1436,"fx":74,"leak":56,"skill":111,"spawn":138,"status":71},
|
||||
"events": {"atk":1056,"deploy":23,"die":88,"dmg":1436,"engage":12,"fx":74,"leak":56,"skill":111,"spawn":138,"status":71},
|
||||
"fx": {"aoe":20,"burst":6,"shield":24,"shieldBreak":24},
|
||||
"snaps": "45ecc41c 880ee0dd b36699bc 992f1255 23143b3d 3ba40a64 ead1143c 29b600b7 60ec6974 eff36649 bbaee861 b11de034 d58d5c37 63232bfe 4e305d69 848a4366 cd76bd35 ad1f8c0f 8e3f9ba5 2b3b69eb 71bc494b 17b62c2a 2f3b24a4"
|
||||
},
|
||||
@@ -3405,7 +3405,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,16,38,50373,545260],"enemy_1320_wdrrl_2":[18,0,18,0,277787],"enemy_1422_lrsldr_2":[39,14,25,1689,341462]},
|
||||
"hooks": [1,134,6637,368,368,1305,1305,0,47,128,19,17,0,24434,527,50,111,81,1,47,0,0,0],
|
||||
"events": {"atk":368,"deploy":23,"die":47,"dmg":1305,"fx":302,"leak":81,"skill":36,"spawn":123,"status":903},
|
||||
"events": {"atk":368,"deploy":23,"die":47,"dmg":1305,"engage":12,"fx":302,"leak":81,"skill":36,"spawn":123,"status":903},
|
||||
"fx": {"aoe":302},
|
||||
"snaps": "a43aa2ec 7ae1f2c9 13f07bb1 5f453175 ab0bd68f 60782fe7 3ca2f642 e772d677 9ba25d19 c9e1b218 d80aba95 5055465a 5f296d73 a338b0fb a699f6e6 f73d7f6e 79530136 7f95e25d ce966d84 17b6a1dc 866a5c57 38b805a5 f043e9a1"
|
||||
},
|
||||
@@ -3528,7 +3528,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[18,3,15,5699,34400],"enemy_1041_lazerd_2":[24,0,24,36681,54839],"enemy_1042_frostd":[30,0,30,0,14109]},
|
||||
"hooks": [1,92,6410,150,150,200,200,0,22,91,3,3,12,6644,0,0,72,69,1,22,0,0,0],
|
||||
"events": {"atk":215,"deploy":20,"die":22,"dmg":200,"fx":6,"leak":69,"skill":6,"spawn":84,"status":36},
|
||||
"events": {"atk":215,"deploy":20,"die":22,"dmg":200,"engage":12,"fx":6,"leak":69,"skill":6,"spawn":84,"status":36},
|
||||
"fx": {"reload":3,"zone":3},
|
||||
"snaps": "f6fa0106 e7d7f790 da41fbcd 79be412e 6a50ceb1 0f273552 f79e9380 4069bc36 855b6919 b766a5fa aa20a6fd 4feaee31 540d226f 7ec78984 07020c87 d519af22 60f79c2e a1fce2e9 93a053a4 b08df923 1a7bc2a9 18ec1c85"
|
||||
},
|
||||
@@ -3573,7 +3573,7 @@
|
||||
"enemy_9010_acpupp": [39,39,0,9862,461397]
|
||||
},
|
||||
"hooks": [1,271,5827,526,526,2566,1731,0,259,259,23,19,339,21133,0,17,255,0,1,299,0,0,0],
|
||||
"events": {"atk":2115,"deploy":16,"die":259,"dmg":1731,"fx":363,"skill":42,"spawn":267,"status":41},
|
||||
"events": {"atk":2115,"deploy":16,"die":259,"dmg":1731,"engage":10,"fx":363,"skill":42,"spawn":267,"status":41},
|
||||
"fx": {"ember":40,"reload":48,"revive":1,"shieldBreak":157,"summon":54,"telegraph":40,"zone":23},
|
||||
"snaps": "ce1454fd 14a61b8f f9a2bcaf 8c273236 4d7141ef c869d474 d5e368ba a4a61ee8 3f6e2c0e f6f1f292 c88a2147 d900808f 4c90faf8 60b8ccc9 bdc48574 8046fefe 2de920cc 0cedbbd1 c2137de1 9c0893cc"
|
||||
},
|
||||
@@ -3614,7 +3614,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[36,6,30,1350,79032],"enemy_1270_nhstlk_2":[27,5,22,2606,145450],"enemy_1272_nhtank_2":[12,2,10,31132,50600]},
|
||||
"hooks": [1,98,5790,199,199,412,412,0,33,95,13,13,0,7906,31,3,75,62,1,33,0,0,0],
|
||||
"events": {"atk":199,"deploy":21,"die":33,"dmg":412,"fx":28,"leak":62,"skill":26,"spawn":89,"status":40},
|
||||
"events": {"atk":199,"deploy":21,"die":33,"dmg":412,"engage":12,"fx":28,"leak":62,"skill":26,"spawn":89,"status":40},
|
||||
"fx": {"displace":4,"zone":24},
|
||||
"snaps": "6e3248e9 72c4fbbf 9543fa1e 70b4d06d e4899e45 bafab963 2dd9e470 41b96ccb 8f4078fd 174c7c0e 0ed669a8 5e579b2e d125723a cd717feb ea5fff6f da05543c 4041688a f747c66a 3c33dd58 80eb47e3"
|
||||
},
|
||||
@@ -3653,7 +3653,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1045_hammer_2":[18,0,18,7356,39805],"enemy_1061_zomshd":[60,2,58,28835,337387]},
|
||||
"hooks": [1,101,6792,439,439,439,439,20630,21,97,35,34,0,17284,59,21,78,76,1,21,0,0,0],
|
||||
"events": {"atk":439,"deploy":23,"die":21,"dmg":439,"fx":12,"leak":76,"skill":69,"spawn":90,"status":67},
|
||||
"events": {"atk":439,"deploy":23,"die":21,"dmg":439,"engage":12,"fx":12,"leak":76,"skill":69,"spawn":90,"status":67},
|
||||
"fx": {"displace":12},
|
||||
"snaps": "382cfb68 89fd2ef2 ae0983a2 52cf0a0f 0c120fc1 75e6c03a c61dd517 9fcfad0a a454c86c e4fd3f81 48826f23 92243937 1f31267b 37dac700 50875275 bd20cb01 e7b00ec0 d9e875e7 f0133d6d 82d0ebfc 401a1955 6d80a504 2a55d02e"
|
||||
},
|
||||
@@ -3694,7 +3694,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1251_lysyta_2":[54,25,29,0,284055],"enemy_1252_lysytb_2":[42,12,30,31857,424331],"enemy_1329_cbshld_2":[30,10,20,0,402283]},
|
||||
"hooks": [1,149,5907,351,351,3070,2978,23,68,147,33,33,0,13141,0,0,126,79,1,68,0,0,92],
|
||||
"events": {"atk":965,"deploy":21,"die":68,"dmg":2978,"fx":138,"heal":16,"leak":79,"skill":66,"spawn":140},
|
||||
"events": {"atk":965,"deploy":21,"die":68,"dmg":2978,"engage":12,"fx":138,"heal":16,"leak":79,"skill":66,"spawn":140},
|
||||
"fx": {"aoe":35,"dodge":103},
|
||||
"snaps": "f27e0385 dd73df32 e8d8c18c 58fe88a0 d321d506 d7741b8d f8590d2b a58179cb 0c2e0a26 485cbac2 1e6839a1 429fff2c 655317d1 2d0586dd 0663ee85 116eac80 19150b2c 0b0dc74f cece33a4 457ed1ac"
|
||||
},
|
||||
@@ -3736,7 +3736,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[54,54,0,0,755827],"enemy_1320_wdrrl_2":[18,18,0,0,839808],"enemy_1422_lrsldr_2":[39,39,0,0,400308]},
|
||||
"hooks": [1,126,6187,364,364,4867,4867,44,111,111,61,59,0,29355,0,0,111,0,1,111,0,0,0],
|
||||
"events": {"atk":1313,"deploy":12,"die":111,"dmg":4867,"fx":128,"skill":120,"spawn":126},
|
||||
"events": {"atk":1313,"deploy":12,"die":111,"dmg":4867,"engage":7,"fx":128,"skill":120,"spawn":126},
|
||||
"fx": {"aoe":128},
|
||||
"snaps": "c58a3354 0088be2f 9b417aea b12db011 204cabfe 6b77bd28 4275f3de 48c31853 7996459e 84e6878a cab22d6b 4f6e4875 373eca89 1da2800d 2a337d35 247543d4 2bd5fb12 dd85c84f 3d388cb7 8a8c3fce cc65b065"
|
||||
},
|
||||
@@ -3777,7 +3777,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai":[51,25,26,0,165289],"enemy_1005_yokai_2":[54,10,43,12342,186857],"enemy_1005_yokai_3":[12,0,12,47803,232188]},
|
||||
"hooks": [1,140,6900,1833,1833,1826,1703,0,53,134,15,15,92,27366,0,0,117,81,1,53,0,0,123],
|
||||
"events": {"atk":1833,"deploy":21,"die":53,"dmg":1703,"fx":123,"leak":81,"skill":30,"spawn":131},
|
||||
"events": {"atk":1833,"deploy":21,"die":53,"dmg":1703,"engage":12,"fx":123,"leak":81,"skill":30,"spawn":131},
|
||||
"fx": {"dodge":123},
|
||||
"snaps": "a4af358e 2d74006c 7d343c65 604f2a31 41f9b5e2 b9ddc97b 36ff6599 50b20367 2735eeb7 4506fd8c 89c456f5 1ae71fdf 6f731e01 05b1256c 8364d7bc fdb956d2 ed565398 c31cce3b 5b6675f6 79eeadca b49f6f03 5602c93a 6bbd127c"
|
||||
},
|
||||
@@ -3819,7 +3819,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr_2":[27,4,22,3562,23405],"enemy_1270_nhstlk_2":[36,4,31,23026,82028],"enemy_9006_actoxi":[39,2,37,40694,58631]},
|
||||
"hooks": [1,127,6900,779,779,946,899,0,31,121,7,7,17,13996,0,74,102,90,1,31,0,0,47],
|
||||
"events": {"atk":779,"deploy":22,"die":31,"dmg":899,"fx":53,"leak":90,"skill":14,"spawn":117,"status":33},
|
||||
"events": {"atk":779,"deploy":22,"die":31,"dmg":899,"engage":12,"fx":53,"leak":90,"skill":14,"spawn":117,"status":33},
|
||||
"fx": {"dodge":47,"zone":6},
|
||||
"snaps": "28a89271 d6f07ac5 33c54555 046091ce cbce11b3 5a2de649 1129247f bf8517df 90227946 cd9fe41e 3d4494e4 628ad936 d0faac20 469d837b 9df8648a acdc5555 336cd5be aedfd79a dfe81526 619917cc 8946d43f 5cb4f4d1 24dc1d5b"
|
||||
},
|
||||
@@ -3858,7 +3858,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1267_nhpbr":[45,14,31,6603,128688],"enemy_1267_nhpbr_2":[60,26,34,10734,236044],"enemy_1270_nhstlk_2":[36,6,30,25133,204208]},
|
||||
"hooks": [1,162,6200,665,665,1687,1687,0,59,154,14,12,29,10570,27,71,141,95,1,59,0,0,0],
|
||||
"events": {"atk":665,"deploy":21,"die":59,"dmg":1466,"fx":96,"leak":95,"skill":26,"spawn":153,"status":129},
|
||||
"events": {"atk":665,"deploy":21,"die":59,"dmg":1466,"engage":9,"fx":96,"leak":95,"skill":26,"spawn":153,"status":129},
|
||||
"fx": {"aoe":27,"shield":29,"zone":40},
|
||||
"snaps": "d172a453 97ac81a3 c32575d2 8223aa70 499419f8 82dd8a13 a71d6f90 6e99dd8a 24f0ef69 6d870ac2 719a1255 a4db2fe4 39221e84 fb3bf40f c1342345 ad847428 afc07fa1 70a8375a a21f129a 25cd3774 56948792"
|
||||
},
|
||||
@@ -3907,7 +3907,7 @@
|
||||
"enemy_1200_msfjin": [18,12,6,0,477]
|
||||
},
|
||||
"hooks": [1,360,6451,1468,1468,2624,2624,191,335,345,32,27,70,12630,54,103,345,10,1,335,0,0,0],
|
||||
"events": {"atk":1468,"deploy":12,"die":335,"dmg":2506,"fx":201,"heal":191,"leak":10,"skill":59,"spawn":360,"status":126},
|
||||
"events": {"atk":1468,"deploy":12,"die":335,"dmg":2506,"engage":6,"fx":201,"heal":191,"leak":10,"skill":59,"spawn":360,"status":126},
|
||||
"fx": {"aoe":74,"shield":22,"summon":105},
|
||||
"snaps": "a2f8043b 9a2ed045 bedbed46 f47665dc cd13f634 9dbe85a2 2a58d9da 5c3dd3ff a1b1590d f0af3dcc 0fc9db71 26910c93 1de67687 95fc5914 7f1a90ec 2e3409da 2f075f85 9aee2bbd ef3dd0c9 17a094ff 0349a6bd 4a4be773"
|
||||
},
|
||||
@@ -4027,7 +4027,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,0,27,11449,128156],"enemy_1119_vofsd":[39,0,38,19434,27023],"enemy_1121_lifbos_2":[24,0,24,9910,11597]},
|
||||
"hooks": [1,115,6900,613,613,695,695,2647,17,106,38,36,0,36447,9762,37,90,89,1,17,0,0,0],
|
||||
"events": {"atk":613,"deploy":25,"die":17,"dmg":695,"fx":85,"leak":89,"skill":74,"spawn":102,"status":630},
|
||||
"events": {"atk":613,"deploy":25,"die":17,"dmg":695,"engage":10,"fx":85,"leak":89,"skill":74,"spawn":102,"status":630},
|
||||
"fx": {"aoe":15,"dp":37,"liberate":5,"zone":28},
|
||||
"snaps": "4f65c948 a7488529 1d9ddd3a a390cb77 0a947f76 1dc3db1c cbb131ce 994c4d9d e44f2b9f 52317ea2 773ca0b8 170984fb dc69a94f 18859be4 00bcc557 5b677f3d 89caf568 f25479ae 2080aec0 f76455c8 bea56260 7851d186 4ed027e9"
|
||||
},
|
||||
@@ -4074,7 +4074,7 @@
|
||||
"enemy_9010_acpupp": [39,1,38,39217,92052]
|
||||
},
|
||||
"hooks": [1,185,6431,763,763,796,779,1390,65,176,29,25,0,29499,4162,55,156,111,1,69,0,0,0],
|
||||
"events": {"atk":763,"deploy":27,"die":65,"dmg":779,"fx":101,"leak":111,"skill":54,"spawn":170,"status":265},
|
||||
"events": {"atk":763,"deploy":27,"die":65,"dmg":779,"engage":12,"fx":101,"leak":111,"skill":54,"spawn":170,"status":265},
|
||||
"fx": {"aoe":12,"dp":34,"ember":4,"revive":3,"shieldBreak":3,"summon":21,"telegraph":4,"zone":20},
|
||||
"snaps": "9ab0f026 6e2404bb 82e309ea bd322e57 88d176da de473536 6db81985 19f56b81 1cf2cd96 7fd32e17 3c6c9ec6 212cebb4 c3a30087 8d564abf 593382de 45b19991 bc6c14c0 9e2aca3c 152124a7 fd5ecede 27b4af57 aad5f380"
|
||||
},
|
||||
@@ -4120,7 +4120,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1165_duhond":[63,33,30,8340,149464],"enemy_1174_duholy_2":[15,0,15,9879,23971],"enemy_1175_dushdo_2":[24,0,24,50243,37917]},
|
||||
"hooks": [1,146,6473,1233,1233,1728,1728,0,68,142,27,39,0,21120,0,72,102,69,1,68,0,0,0],
|
||||
"events": {"atk":1734,"deploy":44,"die":73,"dmg":1728,"fx":54,"leak":69,"skill":81,"spawn":121,"status":208},
|
||||
"events": {"atk":1734,"deploy":44,"die":73,"dmg":1728,"engage":12,"fx":54,"leak":69,"skill":81,"spawn":121,"status":208},
|
||||
"fx": {"disappear":8,"dp":32,"summon":14},
|
||||
"snaps": "adeb9475 8cde7ee7 c44273a7 7366543a 71a25809 18290070 6376b468 e56825c8 41cf0c93 a6ea1e48 5283dae2 93e68357 e62b6a6e 6056011c 7b0f92f1 fba9d9a0 3f0c0819 a1c79203 ec090c31 ce937d08 625572ba 4e09675a"
|
||||
},
|
||||
@@ -4164,7 +4164,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,4,23,6683,217791],"enemy_1119_vofsd":[48,0,48,32538,175639],"enemy_1121_lifbos_2":[30,0,30,39482,205179]},
|
||||
"hooks": [1,151,6660,1512,1512,2370,2370,6793,38,139,43,59,0,33344,50,66,105,101,1,38,0,0,0],
|
||||
"events": {"atk":2064,"deploy":44,"die":38,"dmg":2358,"fx":393,"leak":101,"skill":126,"spawn":122,"status":209},
|
||||
"events": {"atk":2064,"deploy":44,"die":38,"dmg":2358,"engage":12,"fx":393,"leak":101,"skill":126,"spawn":122,"status":209},
|
||||
"fx": {"disappear":20,"dp":40,"drone":202,"droneLock":34,"drones":5,"explode":22,"liberate":29,"shield":19,"summon":22},
|
||||
"snaps": "aefc11f0 65f0e3bc 55f21515 f77681c5 4da7991f 73a2a33f 93a7506d c5697857 fe16b7b2 881d16d1 b4deb0ba 88cfc955 cd4aea3e 55cc3ba2 65768d8a c6afb13f 461ce8a9 64138ccb f0ab5b31 91e8e0b0 da2eaee4 10935d20 e51cbfd2"
|
||||
},
|
||||
@@ -4206,7 +4206,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[12,1,11,4030,13179],"enemy_1041_lazerd_2":[24,0,24,24040,27900],"enemy_1042_frostd":[30,0,30,0,18904]},
|
||||
"hooks": [1,91,6884,192,192,367,367,0,21,86,7,7,0,12606,175,0,66,65,1,21,0,0,0],
|
||||
"events": {"atk":192,"deploy":22,"die":21,"dmg":367,"fx":300,"leak":65,"skill":14,"spawn":81,"status":167},
|
||||
"events": {"atk":192,"deploy":22,"die":21,"dmg":367,"engage":11,"fx":300,"leak":65,"skill":14,"spawn":81,"status":167},
|
||||
"fx": {"drone":159,"droneLock":120,"drones":7,"explode":14},
|
||||
"snaps": "ab6ec9e5 0cd29374 535b8f29 3a00102a 4e2f0e45 89bec34e 3229b975 60a9b6e7 f72a6124 fdcf62df d8ebef5d 58a1a24d 40484f5d 030d318d 2d3105b6 b2e4e0b0 fa368d3b a4d01055 23684e50 b6c74b76 de80150b 2b817302 aae3bd11"
|
||||
},
|
||||
@@ -4247,7 +4247,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10124_uashld_2":[18,0,18,3695,305556],"enemy_1043_zomsbr":[66,21,45,559,253330],"enemy_1061_zomshd":[45,5,39,11888,439378]},
|
||||
"hooks": [1,153,6900,959,959,3506,4432,54021,38,140,25,22,0,29534,647,8,129,102,1,38,0,0,0],
|
||||
"events": {"atk":959,"deploy":22,"die":38,"dmg":3506,"fx":1477,"heal":195,"leak":102,"skill":47,"spawn":143,"status":803},
|
||||
"events": {"atk":959,"deploy":22,"die":38,"dmg":3506,"engage":12,"fx":1477,"heal":195,"leak":102,"skill":47,"spawn":143,"status":803},
|
||||
"fx": {"crit":158,"drone":997,"droneLock":207,"drones":11,"explode":96,"volley":8},
|
||||
"snaps": "98413af2 2fa81246 d591e5bb d9cae5f7 c3e39e54 c1f740f5 59125806 78753917 da019f83 4a6274cd a16cbe1d ff744b46 40488fd0 bb0d16d1 2957f170 7877cf59 df091f23 945d5132 0e51d256 970e2332 8047d98c 05c5b16d 6648379d"
|
||||
},
|
||||
@@ -4289,7 +4289,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1009_lurker":[66,0,66,2255,32183],"enemy_1019_jshoot_2":[57,0,57,35466,12393],"enemy_1404_msnip":[48,0,48,11016,12436]},
|
||||
"hooks": [1,203,6590,196,196,215,459,16,28,199,7,7,0,5134,53,9,171,171,1,28,0,0,0],
|
||||
"events": {"atk":196,"deploy":29,"die":28,"dmg":215,"fx":32,"heal":15,"leak":171,"skill":14,"spawn":186,"status":76},
|
||||
"events": {"atk":196,"deploy":29,"die":28,"dmg":215,"engage":12,"fx":32,"heal":15,"leak":171,"skill":14,"spawn":186,"status":76},
|
||||
"fx": {"crit":28,"volley":4},
|
||||
"snaps": "4fd08fc1 4003dc33 8eef9078 71317e70 f00f3e81 3dbdaf3a 32b4db08 46f4ccd8 f11e1792 d1998c8f 91c73d4a 021d0f3f 9f00ecb4 da6fd4cc f6331b84 a0bf9dfd b544011e a7294c1e e9b0059f 53fe9fe6 555cde26 63e02c6a"
|
||||
},
|
||||
@@ -4328,7 +4328,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1381_winman":[27,6,21,198,66587],"enemy_1381_winman_2":[48,14,34,8018,171095],"enemy_1387_winshd":[39,0,36,32469,42164]},
|
||||
"hooks": [1,147,6900,1680,1680,1757,2511,205,47,138,15,31,0,11994,453,37,114,91,1,47,0,0,2],
|
||||
"events": {"atk":1680,"deploy":33,"die":47,"dmg":1743,"fx":266,"heal":197,"leak":91,"skill":71,"spawn":126,"status":676},
|
||||
"events": {"atk":1680,"deploy":33,"die":47,"dmg":1743,"engage":12,"fx":266,"heal":197,"leak":91,"skill":71,"spawn":126,"status":676},
|
||||
"fx": {"aoe":7,"buff":7,"crit":224,"displace":7,"dodge":2,"heal":3,"shield":7,"volley":9},
|
||||
"snaps": "6b767508 5d03a97a 2d0a8872 83b6bdf6 30c7f795 2280398a e3f7061e 37a4f460 5169880b 1d79c97a 7474fffa 0089c61d 4d424b28 963ea833 4c39a866 c407fce3 15948146 643a0451 02d7d711 c3432adf ca20a7f5 365b255e 2505dc85"
|
||||
},
|
||||
@@ -4370,7 +4370,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1006_shield_3":[18,0,18,15024,2518],"enemy_1043_zomsbr":[72,29,43,1115,132266],"enemy_1402_tgshd_2":[27,0,27,33237,8353]},
|
||||
"hooks": [1,153,6240,753,753,785,772,8968,61,149,0,32,0,0,32,63,117,88,1,61,0,0,13],
|
||||
"events": {"atk":753,"deploy":33,"die":61,"dmg":753,"fx":323,"leak":88,"skill":66,"spawn":132,"status":114},
|
||||
"events": {"atk":753,"deploy":33,"die":61,"dmg":753,"engage":12,"fx":323,"leak":88,"skill":66,"spawn":132,"status":114},
|
||||
"fx": {"aoe":11,"buff":10,"displace":15,"dodge":13,"expose":262,"shield":12},
|
||||
"snaps": "0b83bf08 e3cbec55 dbf28a7a 7290d54c 30785162 f37ddaa7 69c93760 67445b70 e91b1fab dd19c80c ac906355 31e16c17 4913717b bd5627a8 7ea314a7 a6868304 dd6a0e15 ba15048d 5e6cb7d2 41afc869 516fdedf"
|
||||
},
|
||||
@@ -4412,7 +4412,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1148_dssbr":[51,6,45,17620,134552],"enemy_1148_dssbr_2":[60,1,59,17407,124417],"enemy_1439_dslntf":[12,0,12,11733,88895]},
|
||||
"hooks": [1,160,6587,596,596,2180,2671,0,40,156,0,33,0,0,32,41,123,116,1,40,0,12,23],
|
||||
"events": {"atk":596,"deploy":34,"die":40,"dmg":2652,"fx":89,"leak":116,"skill":68,"spawn":138,"status":100},
|
||||
"events": {"atk":596,"deploy":34,"die":40,"dmg":2652,"engage":12,"fx":89,"leak":116,"skill":68,"spawn":138,"status":100},
|
||||
"fx": {"aoe":9,"buff":11,"burst":12,"displace":20,"dodge":23,"shield":14},
|
||||
"snaps": "04c8f385 d7b109b1 2b067eac 9fa119a2 05dc8e7b 3d1792e4 83e94026 703969fb 36239407 2cf0e563 fe7dabf3 99566ff9 0d501ee7 57ad0932 06695c20 852706de 5448c37b 22f489b5 e5b6f91e fb38acbf ae3846f9 4392eba7"
|
||||
},
|
||||
@@ -4451,7 +4451,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,0,27,7104,101485],"enemy_1119_vofsd":[39,0,38,14792,77994],"enemy_1121_lifbos_2":[24,0,24,11407,37016]},
|
||||
"hooks": [1,122,6900,598,598,2742,2738,3045,23,112,32,31,0,0,40,24,90,89,1,23,0,0,4],
|
||||
"events": {"atk":598,"deploy":32,"die":23,"dmg":2738,"fx":90,"leak":89,"skill":63,"spawn":102,"status":214},
|
||||
"events": {"atk":598,"deploy":32,"die":23,"dmg":2738,"engage":8,"fx":90,"leak":89,"skill":63,"spawn":102,"status":214},
|
||||
"fx": {"aoe":10,"dodge":10,"liberate":22,"stealth":8,"strike":40},
|
||||
"snaps": "b4a599d5 f0e7a0e6 67bb7e23 d947fe35 14a27831 67ab7140 151aec35 99d48975 6e0f3173 e7fbed65 83be7ed9 cfcf338b be6d7006 6d9bb357 576a726b 6a935307 c9318640 af79fb18 c9280591 a388c6a2 4d247744 c75bfcb1 7f2dee0e"
|
||||
},
|
||||
@@ -4490,7 +4490,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1116_liprr_2":[27,2,25,10560,92016],"enemy_1119_vofsd":[48,0,47,17542,33098],"enemy_1121_lifbos_2":[30,0,30,12525,13966]},
|
||||
"hooks": [1,137,6900,594,594,629,624,3574,28,130,32,31,0,0,31,28,105,102,1,28,0,0,5],
|
||||
"events": {"atk":594,"deploy":32,"die":28,"dmg":624,"fx":90,"leak":102,"skill":63,"spawn":117,"status":217},
|
||||
"events": {"atk":594,"deploy":32,"die":28,"dmg":624,"engage":11,"fx":90,"leak":102,"skill":63,"spawn":117,"status":217},
|
||||
"fx": {"aoe":9,"dodge":17,"liberate":26,"stealth":7,"strike":31},
|
||||
"snaps": "9e71a576 5f85bc01 c3ec0c6e 907b650d 8d0a1507 16eb2156 378d038b 6506577e 30807fb9 f2c86b9d ec752e72 d7303d83 83002a0a 01b70ca0 09e839c4 98d2358c 161de0dc 5f1fb139 3915cceb aeddf47d a8963bbe 76037450 84a29f92"
|
||||
},
|
||||
@@ -4531,7 +4531,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1251_lysyta_2":[54,0,54,8019,34461],"enemy_1252_lysytb_2":[42,0,42,35352,24551],"enemy_1329_cbshld_2":[30,0,30,5487,911]},
|
||||
"hooks": [1,153,5814,380,380,358,358,16,25,151,5,5,0,8987,28,10,126,126,1,25,0,0,0],
|
||||
"events": {"atk":380,"deploy":25,"die":25,"dmg":358,"heal":16,"leak":126,"skill":10,"spawn":140,"status":50},
|
||||
"events": {"atk":380,"deploy":25,"die":25,"dmg":358,"engage":10,"heal":16,"leak":126,"skill":10,"spawn":140,"status":50},
|
||||
"fx": {},
|
||||
"snaps": "57186c39 a89f274b e649d7d9 75621917 006f6ba9 7f3b8dda bb3864de e8193348 16cc7f17 db8194aa e07167eb 0946e952 5d27c316 103f7135 f7e98be4 ef855c6a d34a4bb6 5d39faae c6e66696 77bde8df"
|
||||
},
|
||||
@@ -4570,7 +4570,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1229_darmy":[27,27,0,3192,108864],"enemy_1229_darmy_2":[51,51,0,12310,269280],"enemy_9007_acelem":[12,12,0,36180,414720]},
|
||||
"hooks": [1,106,6099,594,594,1735,1777,160,97,97,28,27,0,32480,0,62,90,0,1,97,0,2,0],
|
||||
"events": {"atk":764,"deploy":16,"die":97,"dmg":1777,"fx":154,"heal":142,"skill":55,"spawn":102,"status":62},
|
||||
"events": {"atk":764,"deploy":16,"die":97,"dmg":1777,"engage":10,"fx":154,"heal":142,"skill":55,"spawn":102,"status":62},
|
||||
"fx": {"aoe":52,"beam":25,"burst":2,"dp":18,"slash":57},
|
||||
"snaps": "03984647 ace8dbe4 49520875 0ad8fbe6 ba7c56bb e58d0120 a539ef32 0e2bc9be 3b333b61 db04449a dace616b 63a39256 5c34a56e d1619dfd 63bd653a d74deb99 1d733ab1 6e8cbc08 04eb4bb7 74b3c8bb 80dc47fc"
|
||||
},
|
||||
@@ -4611,7 +4611,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[12,12,0,102,639],"enemy_1005_yokai_3":[12,0,11,29968,87430],"enemy_9009_acfort":[12,3,9,26331,135297]},
|
||||
"hooks": [1,73,6900,439,439,497,550,0,47,67,8,24,0,10810,814,0,36,20,1,35,0,0,17],
|
||||
"events": {"atk":472,"deploy":35,"die":47,"dmg":550,"fx":92,"leak":20,"skill":48,"spawn":50,"status":162},
|
||||
"events": {"atk":472,"deploy":35,"die":47,"dmg":550,"engage":4,"fx":92,"leak":20,"skill":48,"spawn":50,"status":162},
|
||||
"fx": {"beam":35,"dodge":21,"dp":4,"slash":32},
|
||||
"snaps": "7c7487b3 43a949cf 206930da 90551654 2113b5a2 a7c4855b 59932997 42395489 3f83a15d ffbd721d 646072f3 fc3be7c4 b210ec54 960a9e51 aa1af455 09ccfce3 50e6e3d0 380e639b 9eaf5bef 3b943f89 3933d1fc 3718a2f5 a8ae4307"
|
||||
},
|
||||
@@ -4653,7 +4653,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1019_jshoot_2":[57,10,47,52058,82202],"enemy_1299_ymkilr_2":[27,0,27,9819,9240],"enemy_1422_lrsldr_2":[39,5,34,9213,188819]},
|
||||
"hooks": [1,156,6460,632,632,849,850,92,43,151,7,20,0,9133,611,30,123,108,1,43,0,0,0],
|
||||
"events": {"atk":705,"deploy":30,"die":43,"dmg":822,"fx":36,"heal":76,"leak":108,"skill":42,"spawn":138,"status":149},
|
||||
"events": {"atk":705,"deploy":30,"die":43,"dmg":822,"engage":10,"fx":36,"heal":76,"leak":108,"skill":42,"spawn":138,"status":149},
|
||||
"fx": {"aoe":2,"displace":17,"dodge":2,"spGain":15},
|
||||
"snaps": "17351197 d85b764f 170d4969 276e2353 d5273c76 84c8775e 178ead82 e788140a 7761c24b 8d4c0668 9647f92d 7caa4901 24e1ffd3 00675a6a 82e3afd4 846d95f4 87dfd927 4f075077 94a7b0a4 a3a639d3 4179fb65 3ad0ed6c"
|
||||
}
|
||||
|
||||
+22
-22
@@ -78,7 +78,7 @@
|
||||
"enemy_9016_acstmr": [7,7,0,0,56]
|
||||
},
|
||||
"hooks": [1,70,5243,1013,1013,2476,2828,4586,34,41,83,79,18,33636,2653,14,28,0,1,33,0,20,0],
|
||||
"events": {"atk":1287,"deploy":36,"die":41,"dmg":2549,"fx":569,"heal":490,"skill":162,"spawn":66,"status":654},
|
||||
"events": {"atk":1287,"deploy":36,"die":41,"dmg":2549,"engage":16,"fx":569,"heal":490,"skill":162,"spawn":66,"status":654},
|
||||
"fx": {"airstrike":5,"beam":48,"blink":1,"bombard":18,"bombardShell":18,"burst":20,"copy":3,"dp":3,"drone":252,"droneLock":22,"drones":3,"firewall":1,"firewallBlock":1,"garrisonGrant":1,"lightning":101,"link":3,"lock":18,"phase":1,"radiantSword":3,"shell":7,"snow":5,"split":2,"storm":9,"summon":7,"talent":4,"tide":4,"wanted":9},
|
||||
"snaps": "2f04ec2a 74d41c45 4031c6ef a96de660 9552f4aa 1ece3dbd 8f25ac54 dd05aa98 6bef1daf bca39502 a45113d4 63ba6a17 2a08b32d ff18139b 858c8fb6 ba05f10b 4cc563eb dd22f08b"
|
||||
},
|
||||
@@ -121,7 +121,7 @@
|
||||
"enemy_9016_acstmr": [6,6,0,0,48]
|
||||
},
|
||||
"hooks": [1,34,4963,579,579,892,977,2263,24,24,52,50,139,18082,2121,0,24,0,1,23,0,0,0],
|
||||
"events": {"atk":595,"deploy":10,"die":24,"dmg":917,"fx":233,"heal":113,"skill":102,"spawn":34,"status":238},
|
||||
"events": {"atk":595,"deploy":10,"die":24,"dmg":917,"engage":6,"fx":233,"heal":113,"skill":102,"spawn":34,"status":238},
|
||||
"fx": {"anchor":4,"beam":46,"camouflage":1,"healAoe":29,"overload":1,"phase":1,"shell":6,"splash":137,"substitute":2,"summon":4,"swap":2},
|
||||
"snaps": "dc0d56b5 5ea2fc96 22a7c614 a844181b da3c3f7d 949d5dbc f7646a53 01f0d227 f3885c32 030b669b 1fb58b64 44930d09 d25240d2 f8eafa88 14aa67a5 9dfef3d2 753642cc"
|
||||
},
|
||||
@@ -173,7 +173,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1005_yokai_2":[6,6,0,2907,62190],"enemy_1430_lrrook":[2,2,0,0,802449],"enemy_9017_achunt":[2,0,0,37534,649142]},
|
||||
"hooks": [1,46,6000,1326,1334,3080,3125,4772,12,22,145,142,30,41390,1023,0,10,0,1,12,0,12,1],
|
||||
"events": {"atk":1360,"deploy":36,"die":22,"dmg":3119,"fx":674,"heal":100,"skill":287,"spawn":32,"status":493},
|
||||
"events": {"atk":1360,"deploy":36,"die":22,"dmg":3119,"engage":18,"fx":674,"heal":100,"skill":287,"spawn":32,"status":493},
|
||||
"fx": {
|
||||
"aoe": 43,
|
||||
"appear": 2,
|
||||
@@ -243,7 +243,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1249_lysdb_2":[5,5,0,9852,107495],"enemy_1430_lrrook":[2,0,2,0,58068],"enemy_9017_achunt":[1,0,0,20757,137787]},
|
||||
"hooks": [1,21,6000,385,385,1021,1424,4322,8,10,25,24,0,11667,66,5,8,2,1,12,0,3,1],
|
||||
"events": {"atk":400,"deploy":13,"die":8,"dmg":1420,"fx":263,"heal":39,"leak":2,"skill":52,"spawn":18,"status":410},
|
||||
"events": {"atk":400,"deploy":13,"die":8,"dmg":1420,"engage":7,"fx":263,"heal":39,"leak":2,"skill":52,"spawn":18,"status":410},
|
||||
"fx": {"bandage":2,"block":3,"burst":3,"charge":7,"dodge":1,"featherArrow":1,"flame":5,"garrisonGrant":1,"healField":1,"jungleSoul":3,"mote":102,"redistribute":45,"reweave":3,"riposte":1,"rockslide":2,"sandChains":3,"sandChainsCharged":2,"shieldBreak":9,"slash":55,"spGift":5,"thorns":6,"truesilver":3},
|
||||
"snaps": "c067d0c5 9f4c5a58 85fccb2d c89eed8f 09312c88 452b8138 ee2ad798 da21566b cb07f503 e1edca84 9e18d3aa dbfd29d7 66bcd79a 979872f8 086680fd 722ac503 c2d3bae4 480a95f5 140b0229 df277c2a"
|
||||
},
|
||||
@@ -312,7 +312,7 @@
|
||||
"enemy_9023_acdums": [6,5,0,8235,50]
|
||||
},
|
||||
"hooks": [1,53,3100,807,807,1766,1999,1481,19,26,39,32,197,23632,911,3,19,0,1,18,0,1,0],
|
||||
"events": {"atk":923,"deploy":30,"die":26,"dmg":1840,"fx":580,"heal":161,"skill":71,"spawn":51,"status":317},
|
||||
"events": {"atk":923,"deploy":30,"die":26,"dmg":1840,"engage":15,"fx":580,"heal":161,"skill":71,"spawn":51,"status":317},
|
||||
"fx": {"airstrike":88,"beam":5,"blink":2,"bombard":29,"bombardShell":29,"buff":2,"burst":1,"copy":2,"displace":1,"dp":3,"drone":160,"droneLock":20,"drones":2,"explode":88,"finale":1,"garrisonGrant":1,"lightning":45,"link":2,"lock":29,"lure":2,"phase":11,"radiantSword":2,"slash":11,"snow":11,"split":2,"steal":3,"storm":4,"summon":10,"sunBurst":1,"talent":4,"telegraph":3,"tide":3,"wanted":3},
|
||||
"snaps": "e7a827a7 3396c380 e8117486 1db9371a 66bbae78 d4dfefb8 2b76c77d 6fb604d2 938cd200 0f56d15f b30da21a"
|
||||
},
|
||||
@@ -363,7 +363,7 @@
|
||||
"enemy_9023_acdums": [9,8,0,3550,78]
|
||||
},
|
||||
"hooks": [1,45,4918,316,316,573,1279,644,23,26,58,55,21,14006,1016,1,22,0,1,101,0,1,0],
|
||||
"events": {"atk":344,"deploy":17,"die":26,"dmg":597,"fx":237,"heal":41,"skill":113,"spawn":39,"status":146},
|
||||
"events": {"atk":344,"deploy":17,"die":26,"dmg":597,"engage":8,"fx":237,"heal":41,"skill":113,"spawn":39,"status":146},
|
||||
"fx": {"anchor":1,"aoe":3,"beam":8,"burst":1,"candle":3,"ember":2,"explode":141,"healAoe":22,"overload":3,"phase":17,"revive":1,"splash":21,"substitute":1,"summon":9,"swap":1,"telegraph":1,"teleport":2},
|
||||
"snaps": "165e5292 c4adc9b7 d9efbe56 b04b7078 02908f60 4fd4ad05 065d2593 63d56b7a a53e0b0e e1fd3f2a b6534bb2 cac54dd4 80457fc1 f44190f2 fba20cd8 4fb50167 41e708fa"
|
||||
},
|
||||
@@ -415,7 +415,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon":[4,4,0,3991,200612],"enemy_1438_dspred":[10,6,4,14373,738747],"enemy_1521_dslily":[1,0,0,94162,997002]},
|
||||
"hooks": [1,65,6000,1201,1270,2930,3054,5119,44,50,117,115,15,31431,1146,14,15,4,1,46,0,30,4],
|
||||
"events": {"atk":1435,"deploy":50,"die":46,"dmg":3045,"fx":727,"heal":166,"leak":4,"skill":232,"spawn":37,"status":796},
|
||||
"events": {"atk":1435,"deploy":50,"die":46,"dmg":3045,"engage":17,"fx":727,"heal":166,"leak":4,"skill":232,"spawn":37,"status":796},
|
||||
"fx": {
|
||||
"aoe": 28,
|
||||
"appear": 8,
|
||||
@@ -490,7 +490,7 @@
|
||||
],
|
||||
"enemies": {"enemy_1010_demon_2":[2,2,0,7219,107495],"enemy_1438_dspred":[5,2,3,27889,136924],"enemy_1521_dslily":[1,0,0,68800,413498]},
|
||||
"hooks": [1,23,6000,568,568,962,1070,7648,8,11,25,24,0,13395,133,10,8,3,1,8,0,31,0],
|
||||
"events": {"atk":763,"deploy":13,"die":8,"dmg":1052,"fx":336,"heal":102,"leak":3,"skill":51,"spawn":20,"status":523},
|
||||
"events": {"atk":763,"deploy":13,"die":8,"dmg":1052,"engage":6,"fx":336,"heal":102,"leak":3,"skill":51,"spawn":20,"status":523},
|
||||
"fx": {"bandage":1,"block":18,"burst":31,"camouflage":1,"featherArrow":5,"garrisonGrant":1,"grow":1,"healField":2,"jungleSoul":1,"mote":68,"redistribute":45,"reweave":3,"rockfall":18,"rockslide":4,"sandChains":6,"shieldBreak":18,"slash":46,"spGift":3,"tentacle":6,"thorns":50,"tide":5,"truesilver":3},
|
||||
"snaps": "889b80ca 2554f68d 135727ee c74793bb 39ae3d9e 2f63625f 35d2d1d0 ab151905 58401106 8d34f3b8 1bed3837 592255cb 58e436d2 7cfc39b2 dd3f9d1c 6d83e822 e5e306e4 07c6dca8 5430994c 32254003"
|
||||
},
|
||||
@@ -553,7 +553,7 @@
|
||||
"enemy_2017_csphts": [6,6,0,57,60000]
|
||||
},
|
||||
"hooks": [1,48,2043,386,386,1039,1247,1441,12,23,46,33,25,14922,812,19,14,0,1,10,0,10,43],
|
||||
"events": {"atk":521,"deploy":34,"die":23,"dmg":1138,"fx":335,"heal":254,"skill":79,"spawn":41,"status":373},
|
||||
"events": {"atk":521,"deploy":34,"die":23,"dmg":1138,"engage":20,"fx":335,"heal":254,"skill":79,"spawn":41,"status":373},
|
||||
"fx": {
|
||||
"airstrike": 9,
|
||||
"blink": 13,
|
||||
@@ -634,7 +634,7 @@
|
||||
"enemy_5601_entlec": [2,2,0,0,4958]
|
||||
},
|
||||
"hooks": [1,24,3922,253,253,464,723,3549,12,13,44,41,63,12249,707,11,11,0,1,10,0,2,28],
|
||||
"events": {"atk":257,"deploy":13,"die":13,"dmg":541,"fx":143,"heal":160,"skill":85,"spawn":23,"status":140},
|
||||
"events": {"atk":257,"deploy":13,"die":13,"dmg":541,"engage":8,"fx":143,"heal":160,"skill":85,"spawn":23,"status":140},
|
||||
"fx": {"anchor":1,"aoe":1,"blink":3,"bloodBattle":1,"burst":2,"candle":2,"dodge":28,"explode":16,"healAoe":16,"overload":2,"shieldBreak":2,"splash":63,"summon":4,"telegraph":1,"teleport":1},
|
||||
"snaps": "1b2c287a 675f6516 fe7fec9f 7befc28b 5055ef2d f5a1b7d4 597e1735 157dd534 488e94fe b43c89ae cc11a2ec b2d6ae70 81dc7d36"
|
||||
},
|
||||
@@ -693,7 +693,7 @@
|
||||
"enemy_9032_aclionk": [1,0,0,30213,1275159]
|
||||
},
|
||||
"hooks": [1,49,6000,1361,1380,2376,2393,818,22,26,128,124,0,39025,1440,4,14,2,1,18,0,4,1],
|
||||
"events": {"atk":1441,"deploy":35,"die":24,"dmg":2375,"fx":660,"heal":25,"leak":2,"skill":252,"spawn":36,"status":926},
|
||||
"events": {"atk":1441,"deploy":35,"die":24,"dmg":2375,"engage":14,"fx":660,"heal":25,"leak":2,"skill":252,"spawn":36,"status":926},
|
||||
"fx": {
|
||||
"aoe": 46,
|
||||
"appear": 4,
|
||||
@@ -779,7 +779,7 @@
|
||||
"enemy_9032_aclionk": [1,0,0,40445,102806]
|
||||
},
|
||||
"hooks": [1,47,6000,190,190,281,479,1232,32,34,21,21,0,7024,68,2,20,2,1,23,0,0,2],
|
||||
"events": {"atk":220,"deploy":21,"die":32,"dmg":208,"fx":90,"leak":2,"skill":44,"spawn":36,"status":187},
|
||||
"events": {"atk":220,"deploy":21,"die":32,"dmg":208,"engage":7,"fx":90,"leak":2,"skill":44,"spawn":36,"status":187},
|
||||
"fx": {"dodge":2,"equip":12,"featherArrow":7,"flame":3,"garrisonGrant":1,"jungleSoul":2,"mote":9,"riposte":2,"rockslide":1,"sandChains":4,"slash":24,"summon":2,"sword":1,"telegraph":11,"truesilver":4,"vest":5},
|
||||
"snaps": "0bc7ed75 fd621b74 943602ec 1ce73978 7eacd037 6f2ca0e5 5c055acf 20ca0a27 1c880376 72dc5f46 b8f2dcf8 62ed54d6 fb3d8d3c 49c21d20 99bfce59 3443456c fa01dd99 a8e70810 51b46f88 c9b8fd8c"
|
||||
},
|
||||
@@ -843,7 +843,7 @@
|
||||
"enemy_9033_acdeer": [1,1,0,31682,2000000]
|
||||
},
|
||||
"hooks": [1,48,4336,1067,1067,2744,3021,1847,21,26,74,65,168,28153,1324,4,17,0,1,20,0,13,0],
|
||||
"events": {"atk":1253,"deploy":31,"die":26,"dmg":2760,"fx":408,"heal":397,"skill":139,"spawn":46,"status":489},
|
||||
"events": {"atk":1253,"deploy":31,"die":26,"dmg":2760,"engage":16,"fx":408,"heal":397,"skill":139,"spawn":46,"status":489},
|
||||
"fx": {"airstrike":56,"beam":3,"blink":2,"burst":13,"column":35,"copy":4,"dp":4,"drone":234,"droneLock":10,"drones":2,"explode":6,"garrisonGrant":1,"link":1,"phase":1,"scorchBurst":6,"shieldBreak":4,"snow":5,"split":2,"steal":4,"sunBurst":4,"talent":4,"tide":4,"wanted":3},
|
||||
"snaps": "527acd3d 92bc6ca9 876af6f6 ea8c9a0e f082d1da adde4620 f5961cc7 b435e7b1 7360837d 84873d28 88a49cde a00c3bbe 76703005 ae4ac41c 776d184f"
|
||||
},
|
||||
@@ -889,7 +889,7 @@
|
||||
"enemy_9033_acdeer": [1,0,0,79550,394112]
|
||||
},
|
||||
"hooks": [1,36,6000,403,403,570,1171,2220,17,22,68,68,0,14790,584,4,13,0,1,99,0,0,0],
|
||||
"events": {"atk":405,"deploy":23,"die":22,"dmg":570,"fx":126,"heal":157,"skill":136,"spawn":26,"status":132},
|
||||
"events": {"atk":405,"deploy":23,"die":22,"dmg":570,"engage":6,"fx":126,"heal":157,"skill":136,"spawn":26,"status":132},
|
||||
"fx": {"anchor":3,"aoe":2,"beam":5,"camouflage":1,"candle":1,"column":58,"ember":2,"explode":5,"healAoe":36,"overload":4,"phase":1,"reborn":2,"teleport":6},
|
||||
"snaps": "fb57a457 3421e2b8 dbddb577 aef7b23c d91bd1fa 3b8774f3 e60348ab e4ca3c93 a3da29b6 ff5e9594 61b7b3b6 fe058645 c5dfd928 9f980ca6 e767bfd0 564e23cc be96a5c2 f867fc1e fa98a005 402593b3"
|
||||
},
|
||||
@@ -949,7 +949,7 @@
|
||||
"enemy_9016_acstmr": [8,7,0,0,54]
|
||||
},
|
||||
"hooks": [1,89,6000,891,892,2797,3003,4207,66,69,96,92,9,23645,681,20,35,2,1,69,0,9,3],
|
||||
"events": {"atk":1042,"deploy":54,"die":67,"dmg":2998,"fx":569,"heal":157,"leak":2,"skill":188,"spawn":57,"status":603},
|
||||
"events": {"atk":1042,"deploy":54,"die":67,"dmg":2998,"engage":17,"fx":569,"heal":157,"leak":2,"skill":188,"spawn":57,"status":603},
|
||||
"fx": {
|
||||
"aoe": 34,
|
||||
"appear": 7,
|
||||
@@ -1040,7 +1040,7 @@
|
||||
"enemy_9016_acstmr": [7,7,0,0,25]
|
||||
},
|
||||
"hooks": [1,54,6000,267,267,494,540,687,39,46,13,13,0,5501,23,3,27,7,1,33,0,0,0],
|
||||
"events": {"atk":302,"deploy":23,"die":39,"dmg":534,"fx":159,"heal":53,"leak":7,"skill":27,"spawn":41,"status":85},
|
||||
"events": {"atk":302,"deploy":23,"die":39,"dmg":534,"engage":5,"fx":159,"heal":53,"leak":7,"skill":27,"spawn":41,"status":85},
|
||||
"fx": {"beam":30,"blink":9,"block":6,"charge":5,"explode":8,"garrisonGrant":1,"healField":4,"mote":3,"phase":1,"reweave":1,"rockslide":4,"sandChains":1,"shell":7,"shieldBreak":6,"slash":57,"spGift":4,"summon":5,"telegraph":3,"thorns":1,"truesilver":3},
|
||||
"snaps": "d1aaefe9 f284f922 d74a8f1d 9602e109 b0305cfc 7b811d98 c4991959 ad45bb9a c0314dcb 5738a584 6b481a5e e722f224 6c75c6d1 4ab59316 634e74cd 6b7487d0 c53dedc9 5845fde7 ed4678e2 1504d879"
|
||||
},
|
||||
@@ -1113,7 +1113,7 @@
|
||||
"enemy_9020_actrpc": [1,0,0,23518,779087]
|
||||
},
|
||||
"hooks": [1,64,6000,1437,1437,5817,10461,3760,37,44,94,90,273,39484,1919,13,13,0,1,43,0,20,0],
|
||||
"events": {"atk":1698,"deploy":45,"die":44,"dmg":10089,"fx":1996,"heal":518,"skill":184,"spawn":49,"status":715},
|
||||
"events": {"atk":1698,"deploy":45,"die":44,"dmg":10089,"engage":24,"fx":1996,"heal":518,"skill":184,"spawn":49,"status":715},
|
||||
"fx": {
|
||||
"airstrike": 85,
|
||||
"beam": 17,
|
||||
@@ -1203,7 +1203,7 @@
|
||||
"enemy_9020_actrpc": [1,0,0,18433,541946]
|
||||
},
|
||||
"hooks": [1,37,4603,736,736,2707,6478,4829,12,17,77,71,105,18169,2008,13,12,0,1,47,0,2,0],
|
||||
"events": {"atk":1087,"deploy":25,"die":17,"dmg":6098,"fx":663,"heal":361,"skill":148,"spawn":26,"status":224},
|
||||
"events": {"atk":1087,"deploy":25,"die":17,"dmg":6098,"engage":11,"fx":663,"heal":361,"skill":148,"spawn":26,"status":224},
|
||||
"fx": {"anchor":4,"aoe":2,"beam":17,"burst":2,"candle":5,"charge":5,"dash":9,"ember":1,"explode":1,"healAoe":20,"link":459,"overload":3,"palsy":2,"phase":9,"shieldBreak":8,"splash":105,"substitute":2,"summon":1,"swap":2,"teleport":6},
|
||||
"snaps": "3c1045a0 9d7d77a9 a1302e26 19ce8f60 d773ac92 c1604114 ce3ff643 dc9c2381 ee91c31a 0e7f8e4d 9af2b87d fb2021c1 ee17f723 6cc85d21 ddbddcf1 fef4d0f5"
|
||||
},
|
||||
@@ -1263,7 +1263,7 @@
|
||||
"enemy_9023_acdums": [12,12,0,16949,120]
|
||||
},
|
||||
"hooks": [1,50,6000,1176,1325,2523,2675,5575,22,24,65,60,0,30221,1487,5,18,0,1,24,0,5,0],
|
||||
"events": {"atk":1269,"deploy":30,"die":24,"dmg":2664,"fx":984,"heal":48,"skill":125,"spawn":42,"status":569},
|
||||
"events": {"atk":1269,"deploy":30,"die":24,"dmg":2664,"engage":14,"fx":984,"heal":48,"skill":125,"spawn":42,"status":569},
|
||||
"fx": {
|
||||
"beam": 12,
|
||||
"blink": 2,
|
||||
@@ -1341,7 +1341,7 @@
|
||||
"enemy_9023_acdums": [10,10,0,38449,100]
|
||||
},
|
||||
"hooks": [1,26,6000,602,602,1242,1839,4975,13,14,27,24,0,13945,59,10,15,1,1,17,0,11,0],
|
||||
"events": {"atk":703,"deploy":11,"die":13,"dmg":1826,"fx":463,"heal":151,"leak":1,"skill":53,"spawn":25,"status":257},
|
||||
"events": {"atk":703,"deploy":11,"die":13,"dmg":1826,"engage":6,"fx":463,"heal":151,"leak":1,"skill":53,"spawn":25,"status":257},
|
||||
"fx": {"bandage":4,"beam":15,"burst":11,"ember":2,"explode":189,"featherArrow":7,"garrisonGrant":1,"healField":2,"jungleSoul":5,"mote":61,"phase":30,"redistribute":43,"reweave":3,"rockslide":2,"sandChainsCharged":1,"shieldBreak":15,"slash":52,"spGift":7,"summon":8,"telegraph":2,"truesilver":3},
|
||||
"snaps": "94ed0146 7aa5e4e9 a874864d 30318786 bdfb16b6 6918b2ce 7730d01a d9e4bd51 7ee58629 31867138 dca52206 d53f4ec5 d7497fdf b13092f9 af40e2ec fbf47558 faca1653 c3c78c84 013d42c0 76aed4b1"
|
||||
},
|
||||
@@ -1379,7 +1379,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10028_vtswd":[1,0,0,0,0],"enemy_1158_divman":[4,4,0,322,15206],"enemy_1160_hvyslr":[3,3,0,242,34560],"enemy_1161_tidmag":[3,3,0,1639,20736]},
|
||||
"hooks": [1,25,5100,25,25,60,131,2350,12,15,6,5,1,9905,13,1,11,0,1,12,0,2,0],
|
||||
"events": {"atk":31,"bounty":1,"deploy":14,"die":15,"dmg":81,"fx":41,"skill":11,"spawn":22,"status":43},
|
||||
"events": {"atk":31,"bounty":1,"deploy":14,"die":15,"dmg":81,"engage":3,"fx":41,"skill":11,"spawn":22,"status":43},
|
||||
"fx": {"bombard":1,"bombardShell":1,"burst":2,"camouflage":1,"lightning":14,"lock":1,"lure":1,"snow":14,"storm":1,"talent":1,"tide":3,"wanted":1},
|
||||
"snaps": "bc4d9dee 6b989664 7f5f95f3 ac72ca97 5b36eba3 8848c44c 416a79d0 83d6a682 4c3c7071 4b0d1cf1 4bbc1a69 b1de6d6e 51937a76 d4866fb0 3c8dacc7 abd83c41 1113b931"
|
||||
},
|
||||
@@ -1427,7 +1427,7 @@
|
||||
],
|
||||
"enemies": {"enemy_10029_vtshld":[1,0,0,0,0],"enemy_1249_lysdb_2":[3,3,0,859,53748],"enemy_1251_lysyta":[4,4,0,0,32846],"enemy_1329_cbshld":[3,3,0,8987,89580]},
|
||||
"hooks": [1,34,6900,174,174,313,539,506,11,16,9,7,0,19291,439,5,11,0,1,11,0,0,0],
|
||||
"events": {"atk":274,"bounty":1,"deploy":23,"die":16,"dmg":310,"fx":164,"heal":199,"skill":16,"spawn":29,"status":89},
|
||||
"events": {"atk":274,"bounty":1,"deploy":23,"die":16,"dmg":310,"engage":5,"fx":164,"heal":199,"skill":16,"spawn":29,"status":89},
|
||||
"fx": {"blink":2,"copy":1,"drone":139,"droneLock":9,"drones":2,"garrisonGrant":1,"link":1,"radiantSword":1,"shieldBreak":3,"summon":1,"sunBurst":1,"talent":3},
|
||||
"snaps": "87a560e8 45db343c 0d5cd8db e792866d d5cc68e6 078f9bf4 c8fec815 474d7baf 079475d2 d3772234 c93b6998 574ad909 4ebd4b48 1081da2e 5c69184d e8708f8b 098ca455 4c75c9b4 eec01031 7a5056b5 087553f4 7686d406 9672a226"
|
||||
}
|
||||
|
||||
+49
-49
@@ -62,7 +62,7 @@
|
||||
"enemy_9010_acpupp": [1,0,0,0,959]
|
||||
},
|
||||
"hooks": [1,50,2700,403,403,633,637,325,34,34,25,21,19,14445,66,36,31,0,1,35,0,0,0],
|
||||
"events": {"atk":425,"bounty":4,"deploy":16,"die":34,"dmg":637,"fx":65,"heal":319,"skill":49,"spawn":47,"status":127},
|
||||
"events": {"atk":425,"bounty":4,"deploy":16,"die":34,"dmg":637,"engage":12,"fx":65,"heal":319,"skill":49,"spawn":47,"status":127},
|
||||
"fx": {"aoe":1,"bombard":9,"bombardShell":10,"counter":6,"crit":18,"dp":1,"ember":1,"explode":3,"heal":11,"liberate":1,"summon":1,"taunt":1,"telegraph":1,"zone":1},
|
||||
"snaps": "15544384 737544d2 e8326082 a526432e a0c50d61 50ebdcd8 bc51feb9 9efd18d0 e4933e87"
|
||||
},
|
||||
@@ -119,7 +119,7 @@
|
||||
"enemy_9011_acrefr": [1,0,0,0,1796]
|
||||
},
|
||||
"hooks": [1,62,3300,341,341,383,395,3119,45,56,13,16,31,7390,31,10,44,11,1,46,0,0,0],
|
||||
"events": {"atk":359,"bounty":4,"deploy":18,"die":45,"dmg":395,"fx":48,"heal":11,"leak":11,"skill":32,"spawn":56,"status":66},
|
||||
"events": {"atk":359,"bounty":4,"deploy":18,"die":45,"dmg":395,"engage":10,"fx":48,"heal":11,"leak":11,"skill":32,"spawn":56,"status":66},
|
||||
"fx": {"aoe":4,"crit":21,"displace":9,"dp":2,"ember":1,"pulse":7,"revive":1,"summon":1,"taunt":2},
|
||||
"snaps": "7504f6da cf86e400 f495d65e 8677c52e e9aa3eb9 d0a4f672 0c91538a 8ccd440e d7b188a3 c3e5957d 0ac4da56"
|
||||
},
|
||||
@@ -182,7 +182,7 @@
|
||||
"enemy_9016_acstmr": [1,1,0,0,8]
|
||||
},
|
||||
"hooks": [1,105,3300,574,574,636,728,216,87,91,21,20,0,15537,205,28,85,0,1,91,1,0,0],
|
||||
"events": {"atk":638,"bounty":7,"deploy":17,"die":91,"dmg":707,"fx":89,"heal":191,"layer":1,"skill":41,"spawn":101,"status":198},
|
||||
"events": {"atk":638,"bounty":7,"deploy":17,"die":91,"dmg":707,"engage":10,"fx":89,"heal":191,"layer":1,"skill":41,"spawn":101,"status":198},
|
||||
"fx": {"aoe":1,"blink":1,"displace":8,"ember":1,"explode":8,"garrison":1,"heal":3,"pulse":31,"reveal":1,"sleep":6,"summon":25,"undying":1,"zone":2},
|
||||
"snaps": "ba9efbdf a02eb193 460ac297 ade04e6a 7abe4489 4fa14e24 2d31bcf9 b7f6436a 82e99758 65a1db5b 88f5cc4f"
|
||||
},
|
||||
@@ -241,7 +241,7 @@
|
||||
"enemy_2009_csaudc": [1,0,1,0,490]
|
||||
},
|
||||
"hooks": [1,56,3296,431,431,1432,1451,1362,23,50,17,17,0,10435,29,27,36,27,1,30,0,2,0],
|
||||
"events": {"atk":493,"bounty":1,"deploy":17,"die":23,"dmg":1384,"fx":20,"heal":91,"leak":27,"skill":34,"spawn":52,"status":161},
|
||||
"events": {"atk":493,"bounty":1,"deploy":17,"die":23,"dmg":1384,"engage":11,"fx":20,"heal":91,"leak":27,"skill":34,"spawn":52,"status":161},
|
||||
"fx": {"aoe":4,"burst":2,"camouflage":2,"dodge":3,"dollEnd":1,"liberate":1,"overload":1,"shield":2,"shieldBreak":1,"substitute":1,"summon":1,"takeoff":1},
|
||||
"snaps": "7d5f4d88 88048f51 e9e719f0 b8d2b5ba a2a4bfe3 65d9b602 5dd73922 02ffbdd4 7bbdb4c0 21b1e9f8 6f1bc8cf"
|
||||
},
|
||||
@@ -296,7 +296,7 @@
|
||||
"enemy_2010_csdcr": [1,1,0,1414,9600]
|
||||
},
|
||||
"hooks": [1,102,4200,712,712,1693,1684,918,82,89,37,36,0,28924,152,52,84,1,1,82,0,0,0],
|
||||
"events": {"atk":893,"bounty":5,"deploy":18,"die":88,"dmg":1628,"fx":69,"heal":137,"leak":1,"skill":73,"spawn":97,"status":437},
|
||||
"events": {"atk":893,"bounty":5,"deploy":18,"die":88,"dmg":1628,"engage":7,"fx":69,"heal":137,"leak":1,"skill":73,"spawn":97,"status":437},
|
||||
"fx": {"counter":1,"explode":3,"expose":14,"overload":2,"phase":1,"shield":8,"shieldBreak":16,"sleep":7,"summon":5,"telegraph":5,"zone":7},
|
||||
"snaps": "de0d6fce 6d6804e9 7c63987a 5372ddc5 6318b9f9 8f5d84b6 0b837d52 c2d66a0b 1598e056 15aad829 332efbf8 dec13c8b 769c352f 59d742ad"
|
||||
},
|
||||
@@ -371,7 +371,7 @@
|
||||
"enemy_2017_csphts": [1,1,0,1838,9600]
|
||||
},
|
||||
"hooks": [1,108,4200,360,360,645,631,1626,77,93,21,21,0,19948,63,35,78,0,1,77,1,0,4],
|
||||
"events": {"atk":368,"bounty":5,"deploy":30,"die":93,"dmg":631,"fx":83,"heal":10,"layer":1,"skill":44,"spawn":108,"status":47},
|
||||
"events": {"atk":368,"bounty":5,"deploy":30,"die":93,"dmg":631,"engage":8,"fx":83,"heal":10,"layer":1,"skill":44,"spawn":108,"status":47},
|
||||
"fx": {"aoe":2,"buff":1,"coin":21,"dodge":9,"explode":18,"garrison":1,"phase":2,"shieldBreak":1,"sp":1,"summon":18,"takeoff":3,"zone":6},
|
||||
"snaps": "79c25635 2c57e2ca b98e04a2 8946ed61 cadfd56b 51cf42cb 5e3497b9 7a91ce48 dfbaac2d b12d3b6c e7817d41 5d4a2879 120fdfad e1177af4"
|
||||
},
|
||||
@@ -434,7 +434,7 @@
|
||||
"enemy_2021_syfish": [1,0,1,0,1177]
|
||||
},
|
||||
"hooks": [1,190,4200,653,653,915,920,449,116,179,30,29,0,19129,13,48,166,62,1,123,0,0,0],
|
||||
"events": {"atk":805,"bounty":2,"deploy":22,"die":117,"dmg":909,"fx":142,"leak":62,"skill":59,"spawn":182,"status":53},
|
||||
"events": {"atk":805,"bounty":2,"deploy":22,"die":117,"dmg":909,"engage":14,"fx":142,"leak":62,"skill":59,"spawn":182,"status":53},
|
||||
"fx": {"aoe":2,"camouflage":1,"displace":28,"dp":2,"explode":19,"pull":28,"revive":1,"sp":1,"strike":3,"summon":44,"volley":7,"wolfShadow":2,"wolfShadowLost":4},
|
||||
"snaps": "1e865453 bf5ab273 da567691 fe6968a3 154137f2 3b5be2d3 2bf6358c 68ab8b27 047d4e31 50a382a4 359d8bbe a898fdd8 7f9a5c3c 08b0e4de"
|
||||
},
|
||||
@@ -525,7 +525,7 @@
|
||||
"enemy_2025_syufo": [13,1,9,22098,66768]
|
||||
},
|
||||
"hooks": [1,132,5100,464,464,847,918,335,57,127,18,22,0,6797,72,39,88,45,1,62,11,8,0],
|
||||
"events": {"atk":527,"bounty":4,"deploy":44,"die":82,"dmg":907,"fx":153,"heal":334,"layer":11,"leak":45,"skill":44,"spawn":123,"status":116},
|
||||
"events": {"atk":527,"bounty":4,"deploy":44,"die":82,"dmg":907,"engage":12,"fx":153,"heal":334,"layer":11,"leak":45,"skill":44,"spawn":123,"status":116},
|
||||
"fx": {"blink":2,"buff":1,"burst":8,"coin":23,"displace":12,"explode":36,"garrison":6,"layer":5,"pull":12,"revive":5,"shield":1,"shieldBreak":1,"stone":1,"strike":8,"summon":24,"volley":8},
|
||||
"snaps": "6bb6de80 e2903552 baa8ca04 62661ec3 51af3c30 19b8edc3 c105c3a8 554d90a2 79ebbf55 4f31b823 17567113 3d634b42 d4660efa 6a69f79b c304311c cbf8817f 45df2010"
|
||||
},
|
||||
@@ -586,7 +586,7 @@
|
||||
"enemy_2034_sythef": [1,1,0,0,8640]
|
||||
},
|
||||
"hooks": [1,188,4746,738,738,1313,1297,115,173,173,64,62,0,21844,132,9,171,0,1,179,0,0,0],
|
||||
"events": {"atk":918,"bounty":6,"deploy":15,"die":173,"dmg":1296,"fx":184,"skill":126,"spawn":186,"status":261},
|
||||
"events": {"atk":918,"bounty":6,"deploy":15,"die":173,"dmg":1296,"engage":11,"fx":184,"skill":126,"spawn":186,"status":261},
|
||||
"fx": {"camouflage":2,"crit":24,"displace":33,"dp":5,"explode":3,"phase":1,"ripple":10,"shadowWeave":27,"shield":2,"shieldBreak":1,"stealth":4,"summon":51,"telegraph":3,"volley":9,"wolfShadow":4,"wolfShadowLost":4,"zone":1},
|
||||
"snaps": "666c3952 b094f1ea 38685430 9f090539 ee670c94 1074c7a5 93293922 a5617f28 5b7f9793 3c0a7490 14387936 dcb74c1a a58e1beb 82ecbe91 64e48fa5 85eef6b4"
|
||||
},
|
||||
@@ -649,7 +649,7 @@
|
||||
"enemy_2034_sythef_2": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,130,5100,419,419,1068,1050,388,57,119,20,21,0,7357,426,12,102,62,1,207,3,0,10],
|
||||
"events": {"atk":485,"bounty":2,"deploy":25,"die":57,"dmg":958,"fx":147,"heal":4,"layer":3,"leak":62,"skill":42,"spawn":119,"status":274},
|
||||
"events": {"atk":485,"bounty":2,"deploy":25,"die":57,"dmg":958,"engage":12,"fx":147,"heal":4,"layer":3,"leak":62,"skill":42,"spawn":119,"status":274},
|
||||
"fx": {"block":8,"catShield":1,"charge":1,"dilemma":1,"dodge":10,"explode":18,"explosion":2,"featherArrow":1,"flame":1,"frostNova":4,"garrison":3,"garrisonGrant":1,"overclock":1,"pull":1,"riposte":2,"rockslide":2,"shieldBreak":5,"slippery":1,"summon":11,"swordRain":48,"swordStorm":5,"telegraph":1,"thorns":6,"tornado":1,"tornadoPulse":5,"undying":7},
|
||||
"snaps": "57fe2e2f 05cb1dd6 05449e83 01d92a19 0c015524 660c9ef2 e1049717 fa7b12b0 10282468 a6f30d20 85d4d2ac b372d741 f5d4046d 46ea6a3e 85cf9d81 bf132acf 0b714eed"
|
||||
},
|
||||
@@ -709,7 +709,7 @@
|
||||
"enemy_9011_acrefr": [12,9,0,12173,320271]
|
||||
},
|
||||
"hooks": [1,103,5700,966,966,2478,2745,1747,87,87,48,46,29,27108,537,39,82,0,1,88,2,0,1],
|
||||
"events": {"atk":1847,"bounty":5,"deploy":19,"die":87,"dmg":2486,"fx":273,"heal":145,"layer":2,"skill":94,"spawn":96,"status":1262},
|
||||
"events": {"atk":1847,"bounty":5,"deploy":19,"die":87,"dmg":2486,"engage":9,"fx":273,"heal":145,"layer":2,"skill":94,"spawn":96,"status":1262},
|
||||
"fx": {"camouflage":2,"charge":19,"counter":29,"crit":32,"dilemma":4,"displace":14,"dodge":1,"explode":2,"garrison":2,"healField":2,"jungleSoul":3,"mote":20,"quadShot":1,"redistribute":30,"revive":1,"reweave":2,"ripple":14,"sandChains":5,"sentry":1,"sermon":1,"shadowWeave":33,"shield":4,"slash":32,"stealth":6,"summon":1,"telegraph":10,"truesilver":2},
|
||||
"snaps": "8355ba8e b483fc98 ddfdaa13 5fc4a7e3 87630e6b bb7676b5 602f1b6c deddef4d b644bbab d7cd7b43 7a00491d 0d4cf0e9 d59a8e71 047d45f8 dbb2b808 377bf9f1 21d2cfb1 b58b930c 1a1a80bc"
|
||||
},
|
||||
@@ -772,7 +772,7 @@
|
||||
"enemy_2050_smsha": [1,1,0,3030,46080]
|
||||
},
|
||||
"hooks": [1,120,4844,461,461,1342,1344,815,102,107,83,80,0,15613,1768,15,99,2,1,112,1,0,1],
|
||||
"events": {"atk":605,"bounty":5,"deploy":18,"die":105,"dmg":1336,"fx":233,"heal":207,"layer":1,"leak":2,"skill":165,"spawn":116,"status":877},
|
||||
"events": {"atk":605,"bounty":5,"deploy":18,"die":105,"dmg":1336,"engage":10,"fx":233,"heal":207,"layer":1,"leak":2,"skill":165,"spawn":116,"status":877},
|
||||
"fx": {"beam":6,"blink":2,"displace":15,"dodge":1,"explode":4,"explosion":23,"featherArrow":6,"flame":2,"frostNova":38,"garrison":1,"garrisonGrant":1,"healField":2,"overclock":2,"pull":2,"revive":3,"riposte":1,"rockslide":4,"shieldBreak":8,"slash":23,"summon":1,"swordStorm":1,"telegraph":3,"tornado":2,"tornadoPulse":10,"truesilver":3,"zone":69},
|
||||
"snaps": "a9c24b01 070a342d a4b58bdf 051cb577 59867a3f 61db8ba1 87293c19 3a21d440 1c33208d ee986ec5 cab0042a 1a4eb997 f60c3ff7 f078add6 9b09092c ae0c42e1 0666df4a"
|
||||
},
|
||||
@@ -843,7 +843,7 @@
|
||||
"enemy_5601_entlec": [7,7,0,0,83729]
|
||||
},
|
||||
"hooks": [1,126,5700,629,629,1969,2872,24047,107,114,27,24,9,27493,1483,27,111,5,1,196,29,2,0],
|
||||
"events": {"atk":1128,"bounty":5,"deploy":15,"die":109,"dmg":2310,"fx":296,"heal":47,"layer":29,"leak":5,"skill":51,"spawn":123,"status":818},
|
||||
"events": {"atk":1128,"bounty":5,"deploy":15,"die":109,"dmg":2310,"engage":8,"fx":296,"heal":47,"layer":29,"leak":5,"skill":51,"spawn":123,"status":818},
|
||||
"fx": {"anchor":3,"aoe":2,"bandage":2,"burst":2,"candle":7,"downed":2,"ember":2,"explode":1,"garrison":29,"garrisonGrant":1,"jungleSoul":2,"mote":96,"overload":2,"redistribute":41,"revive":1,"reweave":3,"sandChains":3,"sandChainsCharged":1,"spGift":45,"splash":9,"summon":1,"wake":41},
|
||||
"snaps": "ea6c7012 3aa0a7fb e02a58a5 f409a573 534e509d de926dcb 98cdab13 40abea2d 22c15b65 4b1d74ee 8b407e69 bff2877e 1e9e5d48 fd2e5755 f56f9880 32f27650 c5fbc11c 4cd3f7dd 685ecd07"
|
||||
},
|
||||
@@ -904,7 +904,7 @@
|
||||
"enemy_2085_skzjxd": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,216,6031,525,550,1869,1869,2845,48,212,63,63,11,12294,391,65,183,163,1,62,1,5,21],
|
||||
"events": {"atk":803,"bounty":1,"deploy":30,"die":49,"dmg":1868,"fx":194,"heal":72,"layer":1,"leak":163,"skill":126,"spawn":199,"status":659},
|
||||
"events": {"atk":803,"bounty":1,"deploy":30,"die":49,"dmg":1868,"engage":12,"fx":194,"heal":72,"layer":1,"leak":163,"skill":126,"spawn":199,"status":659},
|
||||
"fx": {"aoe":14,"burst":5,"charge":1,"crit":20,"dodge":21,"dollEnd":1,"extraAttack":6,"garrison":1,"healAoe":3,"iceSpike":31,"shieldBreak":43,"sp":25,"substitute":2,"summon":1,"swap":1,"weightless":1,"zone":18},
|
||||
"snaps": "68e6dd3e 63da606a 4161e13f 066974ae 19de63bd 496b03b3 59600df3 97c08443 71ac9a36 a1557d0e addf6a25 b1c99702 59f1984c d0eb0369 e064e08f 2e04710f cf6a2ade d559d33b 7017c3d2 aa09a7d9 fcb0c5c1"
|
||||
},
|
||||
@@ -984,7 +984,7 @@
|
||||
"enemy_9006_actoxi": [30,30,0,10167,699840]
|
||||
},
|
||||
"hooks": [1,141,5725,339,339,2212,3212,6331,111,121,173,172,0,17066,5320,40,110,0,1,297,2,0,0],
|
||||
"events": {"atk":387,"bounty":6,"deploy":28,"die":121,"dmg":2230,"fx":477,"heal":1708,"layer":2,"skill":345,"spawn":130,"status":744},
|
||||
"events": {"atk":387,"bounty":6,"deploy":28,"die":121,"dmg":2230,"engage":11,"fx":477,"heal":1708,"layer":2,"skill":345,"spawn":130,"status":744},
|
||||
"fx": {"anchor":6,"aoe":60,"candle":3,"ember":4,"garrison":2,"healAoe":82,"overload":4,"revive":4,"sp":119,"substitute":1,"summon":3,"swap":1,"telegraph":1,"teleport":7,"zone":180},
|
||||
"snaps": "2bf25774 e89ae498 49939303 0e8f4dce 3457bdba d3fff808 8af4db7d ac7d9792 415e57a9 c250ca36 03afe93a 5293a28c e631d206 2b5bf893 c6929980 8668ff14 896dd549 9388dc29 047ae0b3"
|
||||
},
|
||||
@@ -1058,7 +1058,7 @@
|
||||
"enemy_9006_actoxi": [1,0,1,0,2981]
|
||||
},
|
||||
"hooks": [1,154,6900,884,953,7381,7592,79141,82,140,42,37,17,36466,990,37,126,54,1,95,1,10,3],
|
||||
"events": {"atk":2068,"bounty":3,"deploy":28,"die":86,"dmg":7533,"fx":512,"heal":121,"layer":1,"leak":54,"skill":79,"spawn":143,"status":2296},
|
||||
"events": {"atk":2068,"bounty":3,"deploy":28,"die":86,"dmg":7533,"engage":10,"fx":512,"heal":121,"layer":1,"leak":54,"skill":79,"spawn":143,"status":2296},
|
||||
"fx": {"aoe":9,"blessing":1,"bombard":17,"bombardShell":17,"burst":10,"crit":42,"dodge":3,"explode":40,"firewall":2,"garrison":1,"iceSpike":90,"lightning":116,"lock":17,"lure":3,"revive":1,"snow":81,"soul":1,"sp":2,"storm":4,"talent":2,"telegraph":8,"tide":3,"wanted":37,"weightless":5},
|
||||
"snaps": "ee17d257 f73c3a0d be3c7aa5 3583cf57 7512d99f fdab36f1 1f943fd8 05948c2d 97eb7c1c 3fe70ec7 c591e18a b3506fd2 851f7f91 302c937e 46d42282 b50d23b1 1314447c 5a7ed13b 9b51c02e 58a2c59a 4ff3a973 3535e3d4 36e84421"
|
||||
},
|
||||
@@ -1130,7 +1130,7 @@
|
||||
"enemy_9007_acelem": [1,1,0,181,34560]
|
||||
},
|
||||
"hooks": [1,194,6010,906,906,1653,2078,433,186,188,43,40,122,32426,1307,176,174,0,1,207,3,1,0],
|
||||
"events": {"atk":946,"bounty":6,"deploy":20,"die":188,"dmg":1820,"fx":303,"heal":175,"layer":3,"skill":83,"spawn":188,"status":955},
|
||||
"events": {"atk":946,"bounty":6,"deploy":20,"die":188,"dmg":1820,"engage":11,"fx":303,"heal":175,"layer":3,"skill":83,"spawn":188,"status":955},
|
||||
"fx": {"airstrike":28,"beam":3,"burst":1,"displace":5,"dp":2,"drone":110,"droneLock":52,"drones":2,"emergency":3,"explode":16,"finale":4,"garrison":3,"link":2,"scorchBurst":36,"slash":23,"steal":3,"summon":3,"sunBurst":2,"talent":3,"undying":2},
|
||||
"snaps": "8cc6173f 78a2a3f2 980bca21 b3288370 5c15fa91 639f9db5 ae5c4d68 74b2e952 7aecbd45 849dad93 79159adc d8ac1ec0 699a0aeb 90dca295 88c56d4f 5582ad9a 42044794 bfeadfc7 6fc84b30 615d3974"
|
||||
},
|
||||
@@ -1213,7 +1213,7 @@
|
||||
"enemy_9008_acbunn": [1,1,0,2434,19907]
|
||||
},
|
||||
"hooks": [1,146,5863,534,534,1311,1464,3509,125,132,39,34,35,25836,360,5,122,0,1,125,11,3,0],
|
||||
"events": {"atk":625,"bounty":6,"deploy":22,"die":132,"dmg":1383,"fx":266,"heal":168,"layer":11,"skill":73,"spawn":146,"status":411},
|
||||
"events": {"atk":625,"bounty":6,"deploy":22,"die":132,"dmg":1383,"engage":13,"fx":266,"heal":168,"layer":11,"skill":73,"spawn":146,"status":411},
|
||||
"fx": {"beam":4,"bombard":35,"bombardShell":35,"burst":3,"camouflage":2,"copy":1,"dp":5,"garrison":8,"lightning":84,"link":1,"lock":35,"lure":2,"scorchBurst":22,"snow":7,"split":5,"storm":7,"summon":2,"talent":1,"tide":5,"wanted":2},
|
||||
"snaps": "7b9d49a2 b87cf735 893558ef e458b53f 64d49ed2 3bbe703e 3923b0ae 3bd711a9 d9ffc479 479fad4b b92e2786 5832a195 c11d4407 85cd8978 6fd262f1 8b9aaa3e 63abc537 d7cecaac 1998b3c2 b03b9fea"
|
||||
},
|
||||
@@ -1284,7 +1284,7 @@
|
||||
"enemy_9009_acfort": [1,1,0,4902,68797]
|
||||
},
|
||||
"hooks": [1,125,5939,879,879,2760,3081,656,109,113,27,24,73,21812,1249,75,108,0,1,109,2,1,0],
|
||||
"events": {"atk":1258,"bounty":6,"deploy":17,"die":113,"dmg":2875,"fx":520,"heal":524,"layer":2,"skill":51,"spawn":123,"status":382},
|
||||
"events": {"atk":1258,"bounty":6,"deploy":17,"die":113,"dmg":2875,"engage":11,"fx":520,"heal":524,"layer":2,"skill":51,"spawn":123,"status":382},
|
||||
"fx": {"airstrike":32,"aoe":8,"beam":22,"blink":2,"bombard":8,"bombardShell":8,"burst":1,"displace":8,"drone":335,"droneLock":50,"drones":3,"extraAttack":1,"finale":3,"garrison":2,"garrisonGrant":1,"link":7,"radiantSword":3,"slash":17,"steal":2,"summon":3,"sunBurst":1,"talent":3},
|
||||
"snaps": "381e890f 83da0424 e84cb294 9aca3c71 8eb135eb 7eb62d20 c56cee1a d218eb72 fd3bddc2 d2096f46 96c79df4 3c9930dc 6cd5aa44 9c2e4c0d ed477a09 1cfd1094 cc271668 5a0c1a1e af0dd5fa 47ccd4e9"
|
||||
},
|
||||
@@ -1337,7 +1337,7 @@
|
||||
"enemy_2005_axetro": [1,0,0,11649,0]
|
||||
},
|
||||
"hooks": [1,57,2700,557,556,691,741,5576,34,37,26,24,6,12712,51,37,43,3,1,34,0,2,0],
|
||||
"events": {"atk":620,"bounty":3,"deploy":12,"die":34,"dmg":725,"fx":44,"heal":55,"leak":3,"skill":50,"spawn":57,"status":146},
|
||||
"events": {"atk":620,"bounty":3,"deploy":12,"die":34,"dmg":725,"engage":12,"fx":44,"heal":55,"leak":3,"skill":50,"spawn":57,"status":146},
|
||||
"fx": {"buff":1,"burst":2,"crit":25,"dp":2,"explode":10,"summon":2,"telegraph":2},
|
||||
"snaps": "07710787 1b3ca690 e36a30ad 9a49b76a b9d22a50 0c289ee8 092e59ea 62398dd1 226b2339"
|
||||
},
|
||||
@@ -1391,7 +1391,7 @@
|
||||
"enemy_2085_skzjxd_2": [1,1,0,0,11700]
|
||||
},
|
||||
"hooks": [1,45,2942,615,615,727,734,928,32,33,49,47,32,9649,110,27,29,0,1,32,0,0,0],
|
||||
"events": {"atk":688,"bounty":4,"deploy":13,"die":33,"dmg":726,"fx":41,"heal":32,"skill":96,"spawn":44,"status":256},
|
||||
"events": {"atk":688,"bounty":4,"deploy":13,"die":33,"dmg":726,"engage":12,"fx":41,"heal":32,"skill":96,"spawn":44,"status":256},
|
||||
"fx": {"crit":26,"dp":3,"explode":1,"liberate":6,"shield":4,"telegraph":1},
|
||||
"snaps": "08475251 060e1404 a77d3fa6 74ab94fb 39ec40a8 4a899aaf 8a49b1ba b7ea4461 d110804c df9fa85e"
|
||||
},
|
||||
@@ -1443,7 +1443,7 @@
|
||||
"enemy_2002_bearmi": [1,0,1,9048,2918]
|
||||
},
|
||||
"hooks": [1,43,3300,363,363,888,880,767,22,33,31,31,0,12925,98,30,28,11,1,22,0,0,0],
|
||||
"events": {"atk":382,"bounty":2,"deploy":13,"die":22,"dmg":880,"fx":26,"heal":463,"leak":11,"skill":62,"spawn":42,"status":202},
|
||||
"events": {"atk":382,"bounty":2,"deploy":13,"die":22,"dmg":880,"engage":10,"fx":26,"heal":463,"leak":11,"skill":62,"spawn":42,"status":202},
|
||||
"fx": {"buff":1,"crit":1,"liberate":4,"shield":16,"zone":4},
|
||||
"snaps": "9001a773 d682bb23 8fbcd651 5df53986 07e3ac0f 0f7aa6b9 5acdf417 61e10070 400a77ca 652541a4 8bc87622"
|
||||
},
|
||||
@@ -1497,7 +1497,7 @@
|
||||
"enemy_2048_smgrd": [1,0,0,9276,5313]
|
||||
},
|
||||
"hooks": [1,52,3300,365,365,817,928,2024,35,35,21,19,0,10481,58,45,35,0,1,35,0,3,0],
|
||||
"events": {"atk":486,"bounty":2,"deploy":14,"die":35,"dmg":832,"fx":58,"heal":115,"skill":40,"spawn":50,"status":245},
|
||||
"events": {"atk":486,"bounty":2,"deploy":14,"die":35,"dmg":832,"engage":8,"fx":58,"heal":115,"skill":40,"spawn":50,"status":245},
|
||||
"fx": {"beam":44,"buff":3,"burst":3,"explode":1,"takeoff":1,"telegraph":6},
|
||||
"snaps": "dd24c30b 998fef35 24ef9a9d 15101150 c7878eb9 fbcb6d46 11141ecc 2e44951a fc393125 6a69d388 cafe9828"
|
||||
},
|
||||
@@ -1551,7 +1551,7 @@
|
||||
"enemy_1535_wlfmster": [1,0,1,8843,18291]
|
||||
},
|
||||
"hooks": [1,200,4200,794,794,1045,1112,2413,152,187,68,66,0,13905,1117,53,188,35,1,161,0,0,0],
|
||||
"events": {"atk":928,"bounty":3,"deploy":12,"die":152,"dmg":1066,"fx":77,"heal":172,"leak":35,"skill":134,"spawn":200,"status":544},
|
||||
"events": {"atk":928,"bounty":3,"deploy":12,"die":152,"dmg":1066,"engage":8,"fx":77,"heal":172,"leak":35,"skill":134,"spawn":200,"status":544},
|
||||
"fx": {"beam":3,"buff":5,"liberate":1,"summon":56,"undying":1,"zone":11},
|
||||
"snaps": "07ba544c 84f4ccbf 38166938 b925fca7 945f4b86 2aa6642d 96e01f04 a3185a51 b77953b3 fa7afb72 6d5be7ad a030c96f 78dbd4b6 8d3af5e8"
|
||||
},
|
||||
@@ -1607,7 +1607,7 @@
|
||||
"enemy_2021_syfish": [1,1,0,7,4608]
|
||||
},
|
||||
"hooks": [1,81,4200,900,900,1329,1334,5635,65,65,135,134,0,8882,236,90,66,0,1,122,1,0,0],
|
||||
"events": {"atk":960,"bounty":3,"deploy":12,"die":65,"dmg":1334,"fx":166,"heal":276,"layer":1,"skill":271,"spawn":81,"status":231},
|
||||
"events": {"atk":960,"bounty":3,"deploy":12,"die":65,"dmg":1334,"engage":8,"fx":166,"heal":276,"layer":1,"skill":271,"spawn":81,"status":231},
|
||||
"fx": {"buff":1,"coin":2,"ember":57,"garrison":1,"sp":91,"summon":1,"takeoff":1,"zone":12},
|
||||
"snaps": "82b4e917 5672134c 05d92f11 b2c7e239 c06462e0 d3ca46fc 31c8426f 343c2dd7 26111ac7 b16080df 5722eb2b ce7baf95 7afa6396 451c3e89"
|
||||
},
|
||||
@@ -1664,7 +1664,7 @@
|
||||
"enemy_9010_acpupp": [1,0,1,0,1540]
|
||||
},
|
||||
"hooks": [1,98,4200,350,350,1399,1458,9,34,91,27,27,0,8299,26,36,73,56,1,38,0,0,0],
|
||||
"events": {"atk":410,"bounty":3,"deploy":22,"die":35,"dmg":1457,"fx":20,"heal":9,"leak":56,"skill":54,"spawn":90,"status":52},
|
||||
"events": {"atk":410,"bounty":3,"deploy":22,"die":35,"dmg":1457,"engage":14,"fx":20,"heal":9,"leak":56,"skill":54,"spawn":90,"status":52},
|
||||
"fx": {"dp":3,"explode":3,"palsy":1,"revive":4,"shield":1,"sp":2,"strike":1,"summon":2,"telegraph":2,"wolfShadowLost":1},
|
||||
"snaps": "b8ad25ab 03f51213 f84a4bf7 9a29353d 19f6d9a9 5330fd8a f6dda9d3 43873b05 57a77a2a 94494c3a ade46bcb e1b4f57e 436600a0 c60c5a58"
|
||||
},
|
||||
@@ -1717,7 +1717,7 @@
|
||||
"enemy_9006_actoxi": [12,5,5,5143,137719]
|
||||
},
|
||||
"hooks": [1,67,5100,542,542,1917,1917,30,36,60,109,110,0,7620,40,31,53,22,1,38,3,0,0],
|
||||
"events": {"atk":737,"bounty":2,"deploy":14,"die":38,"dmg":1847,"fx":107,"heal":30,"layer":3,"leak":22,"skill":221,"spawn":65,"status":185},
|
||||
"events": {"atk":737,"bounty":2,"deploy":14,"die":38,"dmg":1847,"engage":12,"fx":107,"heal":30,"layer":3,"leak":22,"skill":221,"spawn":65,"status":185},
|
||||
"fx": {"blink":1,"buff":1,"coin":18,"explode":26,"garrison":3,"revive":2,"shield":19,"shieldBreak":1,"strike":10,"volley":7,"zone":19},
|
||||
"snaps": "757da7ba 23c3e301 44393780 5d33fca3 778ce26f 3e05a037 632c144a 3ebbae7b 227e6b37 c9fd5a40 c5d6aa3b a09e8b70 615646db 6a5ca35e d6831070 397bb5be 94e757e4"
|
||||
},
|
||||
@@ -1769,7 +1769,7 @@
|
||||
"enemy_9006_actoxi": [1,0,1,554,712]
|
||||
},
|
||||
"hooks": [1,90,5100,403,403,507,523,30,31,87,28,28,0,4426,16,27,62,56,1,34,0,0,18],
|
||||
"events": {"atk":429,"deploy":28,"die":31,"dmg":499,"fx":88,"leak":56,"skill":56,"spawn":75,"status":79},
|
||||
"events": {"atk":429,"deploy":28,"die":31,"dmg":499,"engage":11,"fx":88,"leak":56,"skill":56,"spawn":75,"status":79},
|
||||
"fx": {"camouflage":1,"crit":6,"dodge":18,"dp":4,"phase":1,"pulse":17,"revive":1,"sentry":9,"shadowWeave":9,"shield":4,"shieldBreak":2,"summon":3,"telegraph":1,"volley":6,"wolfShadowLost":5,"zone":1},
|
||||
"snaps": "7c092213 7eeed0b1 ac8f2ed3 3858c149 5c4c9042 6e0b6dfc ecb20138 7bcdcc30 87e0ab2d d6d96690 40c393bf c32baa7d e3c84877 885dfe2b 0445be42 4f286152 de0ce50d"
|
||||
},
|
||||
@@ -1825,7 +1825,7 @@
|
||||
"enemy_2002_bearmi_2": [1,1,0,1311,8800]
|
||||
},
|
||||
"hooks": [1,106,4641,470,470,920,1638,1314,82,91,48,48,0,22203,805,35,85,9,1,82,1,4,1],
|
||||
"events": {"atk":508,"bounty":2,"deploy":19,"die":82,"dmg":1628,"fx":45,"heal":418,"layer":1,"leak":9,"skill":99,"spawn":101,"status":149},
|
||||
"events": {"atk":508,"bounty":2,"deploy":19,"die":82,"dmg":1628,"engage":10,"fx":45,"heal":418,"layer":1,"leak":9,"skill":99,"spawn":101,"status":149},
|
||||
"fx": {"block":11,"burst":4,"dodge":1,"dp":4,"explode":1,"expose":1,"garrison":1,"garrisonGrant":1,"phase":1,"riposte":1,"shieldBreak":10,"swordRain":5,"zone":4},
|
||||
"snaps": "d1a66fbb 1e4c3412 cfa655f4 33ae5aea be858e5a e390032f a14b2f14 f815866a e4173185 0a72a5c9 f546a0e1 e7e58926 f223a279 820a4de9 842392b8 3e71a88c"
|
||||
},
|
||||
@@ -1877,7 +1877,7 @@
|
||||
"enemy_2050_smsha": [1,1,0,4186,46080]
|
||||
},
|
||||
"hooks": [1,66,5700,1218,1218,1660,1731,19394,51,51,149,147,0,18598,114,50,47,0,1,51,3,0,0],
|
||||
"events": {"atk":1455,"bounty":4,"deploy":19,"die":51,"dmg":1730,"fx":220,"heal":144,"layer":3,"skill":296,"spawn":59,"status":489},
|
||||
"events": {"atk":1455,"bounty":4,"deploy":19,"die":51,"dmg":1730,"engage":9,"fx":220,"heal":144,"layer":3,"skill":296,"spawn":59,"status":489},
|
||||
"fx": {"beam":3,"bloodBattle":3,"camouflage":7,"crit":63,"explode":6,"garrison":3,"mote":97,"shadowWeave":31,"shell":4,"shield":1,"spGift":1,"telegraph":1},
|
||||
"snaps": "9e38c03f 5a781a2c 1b1806a8 a01c69a5 5e27059e e016a7c8 394a5e32 f5daa420 227b9757 1759fa65 527083c5 14296518 5b398424 10a10b8d 9f80256b fbf96062 aabcdd6d 47516ac8 a1108a6e"
|
||||
},
|
||||
@@ -1933,7 +1933,7 @@
|
||||
"enemy_1539_reid": [1,0,1,7794,22227]
|
||||
},
|
||||
"hooks": [1,96,5384,1057,1057,1143,1129,145,68,81,196,193,0,16010,2319,60,76,13,1,74,1,0,10],
|
||||
"events": {"atk":1129,"bounty":3,"deploy":18,"die":68,"dmg":1111,"fx":87,"heal":137,"layer":1,"leak":13,"skill":392,"spawn":92,"status":423},
|
||||
"events": {"atk":1129,"bounty":3,"deploy":18,"die":68,"dmg":1111,"engage":10,"fx":87,"heal":137,"layer":1,"leak":13,"skill":392,"spawn":92,"status":423},
|
||||
"fx": {"block":5,"charge":4,"displace":19,"dodge":10,"dp":11,"explode":5,"garrison":1,"garrisonGrant":1,"riposte":10,"shieldBreak":18,"swordRain":2,"undying":1},
|
||||
"snaps": "70957ea7 12980bbe eb40080d c6a9d8b0 9fbf288c ce758920 f04d0223 eeb062ad 767c47e0 9f0398d9 f2c0ec15 dda8a114 61112f0b 78f7d894 0bcdbfa3 2ea72ee7 7c313f29 5ee2d05a"
|
||||
},
|
||||
@@ -2000,7 +2000,7 @@
|
||||
"enemy_2025_syufo": [1,0,1,6212,5995]
|
||||
},
|
||||
"hooks": [1,98,5700,905,905,3483,3735,5387,76,84,93,92,18,27937,433,79,80,8,1,80,14,3,0],
|
||||
"events": {"atk":1409,"bounty":3,"deploy":15,"die":76,"dmg":3735,"fx":220,"heal":1276,"layer":14,"leak":8,"skill":185,"spawn":95,"status":410},
|
||||
"events": {"atk":1409,"bounty":3,"deploy":15,"die":76,"dmg":3735,"engage":9,"fx":220,"heal":1276,"layer":14,"leak":8,"skill":185,"spawn":95,"status":410},
|
||||
"fx": {"anchor":20,"aoe":6,"bloodBattle":7,"burst":3,"camouflage":2,"displace":23,"explode":8,"extraAttack":14,"garrison":14,"garrisonGrant":1,"mote":58,"reborn":1,"shell":4,"spGift":56,"zone":3},
|
||||
"snaps": "0c53a603 0d7ad7ac 9445e929 64c533e5 32bdc764 cc2ac70f 4c0356bc 73be013d 9f0fe9dc 3be541c4 d8d80a0a e742b627 373df87e ddae8a79 96bdd892 20e5095a 3de3fba0 39018fe6 814c3e64"
|
||||
},
|
||||
@@ -2068,7 +2068,7 @@
|
||||
"enemy_9011_acrefr": [1,0,1,0,882]
|
||||
},
|
||||
"hooks": [1,198,6752,962,962,3366,3385,2323,67,190,57,57,0,21516,168,94,167,122,1,73,5,0,5],
|
||||
"events": {"atk":1041,"bounty":1,"deploy":29,"die":68,"dmg":3347,"fx":108,"heal":413,"layer":5,"leak":122,"skill":114,"spawn":182,"status":222},
|
||||
"events": {"atk":1041,"bounty":1,"deploy":29,"die":68,"dmg":3347,"engage":12,"fx":108,"heal":413,"layer":5,"leak":122,"skill":114,"spawn":182,"status":222},
|
||||
"fx": {"aoe":3,"crit":6,"dodge":5,"dollEnd":1,"garrison":5,"healAoe":6,"hpShare":1,"palsy":1,"reborn":2,"revive":5,"shield":37,"sp":6,"substitute":3,"summon":1,"swap":1,"zone":25},
|
||||
"snaps": "91b58e42 37d31be2 91cd7722 af8dc8a5 7a0ab7b1 00a04ed2 61d7898e a544c0ed 43288da4 e6195dd2 599c1a5a c401b769 3f0e7d85 75b46bd7 1b698841 4705af1a 294057a3 6a83173f a00b1736 a500c8c8 62fce22b 727a3b5c 73070d48"
|
||||
},
|
||||
@@ -2122,7 +2122,7 @@
|
||||
"enemy_2009_csaudc": [1,0,1,0,14920]
|
||||
},
|
||||
"hooks": [1,120,6900,2596,2596,4109,4111,9034,83,102,365,363,0,32944,5032,100,104,18,1,84,0,1,7],
|
||||
"events": {"atk":3103,"bounty":4,"deploy":13,"die":84,"dmg":4105,"fx":368,"heal":1365,"leak":18,"skill":728,"spawn":119,"status":813},
|
||||
"events": {"atk":3103,"bounty":4,"deploy":13,"die":84,"dmg":4105,"engage":12,"fx":368,"heal":1365,"leak":18,"skill":728,"spawn":119,"status":813},
|
||||
"fx": {"aoe":16,"burst":1,"crit":19,"dodge":7,"ember":1,"healAoe":36,"hpShare":5,"sp":146,"zone":137},
|
||||
"snaps": "9a2f8fd8 b37c8c61 72ae7f5f c691f7b8 4a5f8db0 a7695acd 266194ed 738f34a1 f2ba2aa5 addebbc5 011f5168 f82429d2 492abe6b 7c36fa7e 6ea85756 7c5b907f 32afa4fe b06f5efb 9fc667c0 a27d2510 65c67950 5907ddef 8264b472"
|
||||
},
|
||||
@@ -2180,7 +2180,7 @@
|
||||
"enemy_9007_acelem": [1,1,0,0,34560]
|
||||
},
|
||||
"hooks": [1,143,5571,319,319,517,777,875,126,129,73,70,0,13486,398,4,125,0,1,126,2,11,0],
|
||||
"events": {"atk":515,"bounty":4,"deploy":18,"die":129,"dmg":777,"fx":219,"heal":12,"layer":2,"skill":143,"spawn":142,"status":585},
|
||||
"events": {"atk":515,"bounty":4,"deploy":18,"die":129,"dmg":777,"engage":6,"fx":219,"heal":12,"layer":2,"skill":143,"spawn":142,"status":585},
|
||||
"fx": {"bombard":3,"bombardShell":3,"burst":11,"copy":1,"expose":116,"frostNova":1,"garrison":2,"heal":3,"phase":1,"shieldBreak":1,"snow":14,"sp":59,"talent":1,"wanted":3},
|
||||
"snaps": "378db087 da011039 a8cc5431 ce70c06e cf5b1676 dbc1481e 28dd8b53 faed642e bb75865b 35b8e3b0 83618c9a 52ecfd97 d5c1c2dc 83d8aab0 79bf4eff 439a8294 fbd199ef 85be5511 e5ea7c41"
|
||||
},
|
||||
@@ -2233,7 +2233,7 @@
|
||||
"enemy_2003_rockman": [1,0,1,2448,9451]
|
||||
},
|
||||
"hooks": [1,158,6900,477,477,931,1150,8737,44,148,27,26,23,15163,2600,22,130,104,1,45,0,5,0],
|
||||
"events": {"atk":494,"bounty":2,"deploy":25,"die":44,"dmg":971,"fx":378,"heal":414,"leak":104,"skill":53,"spawn":145,"status":525},
|
||||
"events": {"atk":494,"bounty":2,"deploy":25,"die":44,"dmg":971,"engage":9,"fx":378,"heal":414,"leak":104,"skill":53,"spawn":145,"status":525},
|
||||
"fx": {"airstrike":2,"aoe":3,"blessing":1,"burst":5,"displace":1,"explode":17,"expose":313,"frostNova":4,"healField":2,"link":1,"phase":1,"snow":11,"sunBurst":2,"talent":4,"telegraph":2,"wanted":9},
|
||||
"snaps": "be0b8d25 30c6d0d5 05ec9606 7be7f8fd dd4716ec 9b935dce e36e5e43 8f814ab9 4d9a1660 248c489e 50d850ed 29c9b215 cad03322 1c438ab5 8546c260 4b9eadf7 a5cf0d6d 923927c5 24300fdb 0d39a3a4 0273b8b7 4d641969 c7abfcb8"
|
||||
},
|
||||
@@ -2308,7 +2308,7 @@
|
||||
"enemy_2052_smgia": [1,0,1,1324,55095]
|
||||
},
|
||||
"hooks": [1,170,6516,387,387,2346,2517,23510,68,163,61,58,26,9160,870,23,131,94,1,45,1,4,0],
|
||||
"events": {"atk":515,"bounty":2,"deploy":36,"die":69,"dmg":2438,"fx":75,"heal":43,"layer":1,"leak":94,"skill":119,"spawn":153,"status":628},
|
||||
"events": {"atk":515,"bounty":2,"deploy":36,"die":69,"dmg":2438,"engage":15,"fx":75,"heal":43,"layer":1,"leak":94,"skill":119,"spawn":153,"status":628},
|
||||
"fx": {"airstrike":5,"aoe":9,"burst":4,"copy":6,"explode":24,"garrison":1,"heal":3,"healField":4,"link":2,"revive":1,"stone":1,"summon":15},
|
||||
"snaps": "e39a4c3c 9b95e974 744e1d4b 1faf3d73 686f63c1 b07c8640 a7266319 559c83be 391689a8 1dcde99a 72f8a5c5 1366f98e 58e59c76 c803d07b b6480cf7 bc61adde 506940d2 7836989a 867da9d0 445541a4 57cf3503 706ab159"
|
||||
},
|
||||
@@ -2360,7 +2360,7 @@
|
||||
"enemy_2001_duckmi": [1,1,0,0,64497]
|
||||
},
|
||||
"hooks": [1,171,5928,875,875,4471,4472,570,160,160,28,22,57,16607,2339,99,157,0,1,162,2,0,0],
|
||||
"events": {"atk":1462,"bounty":4,"deploy":14,"die":160,"dmg":4472,"fx":109,"heal":476,"layer":2,"skill":50,"spawn":169,"status":484},
|
||||
"events": {"atk":1462,"bounty":4,"deploy":14,"die":160,"dmg":4472,"engage":11,"fx":109,"heal":476,"layer":2,"skill":50,"spawn":169,"status":484},
|
||||
"fx": {"aoe":13,"explode":1,"extraAttack":12,"garrison":2,"garrisonGrant":4,"overload":4,"reborn":2,"shieldBreak":60,"sleepGuard":3,"sunBurst":3,"talent":3,"undying":2},
|
||||
"snaps": "5650a99f 06b14bc4 3c7f90df cf359f4e 7f409ef5 957fdbbb 569273e2 cb682916 c0778723 26f39f3e 59c6cbf5 1587263b 4a25f8a0 ccfcceb6 e38b8fdd 7df9d9d7 fefbca2e 276eab30 e0bc20b3 d59aebb6"
|
||||
},
|
||||
@@ -2426,7 +2426,7 @@
|
||||
"enemy_2034_sythef": [1,1,0,139,8640]
|
||||
},
|
||||
"hooks": [1,74,5100,1436,1436,1954,1954,4047,48,55,66,63,0,16495,108,53,53,0,1,51,7,0,0],
|
||||
"events": {"atk":1436,"bounty":3,"deploy":21,"die":55,"dmg":1953,"fx":139,"heal":9,"layer":7,"skill":129,"spawn":66,"status":163},
|
||||
"events": {"atk":1436,"bounty":3,"deploy":21,"die":55,"dmg":1953,"engage":12,"fx":139,"heal":9,"layer":7,"skill":129,"spawn":66,"status":163},
|
||||
"fx": {"aoe":33,"blink":3,"bondMilestone":1,"buff":6,"camouflage":2,"coin":45,"displace":3,"dp":21,"garrison":7,"shield":1,"shieldBreak":1,"volley":15,"wolfShadow":1},
|
||||
"snaps": "abe7527f 54d37f93 efbcd554 1b821656 ac9c33a5 269cae9f 3f080e3a ac1ef736 a3e7f2b4 6db02653 6f34cc83 4cb3d2a7 22ba9134 7bd4222a 99114c8f cc0a8a71 3af49395"
|
||||
},
|
||||
@@ -2480,7 +2480,7 @@
|
||||
"enemy_9016_acstmr": [1,1,0,0,8]
|
||||
},
|
||||
"hooks": [1,95,5100,623,623,982,1032,890,52,86,31,31,15,8307,265,14,65,34,1,63,0,2,4],
|
||||
"events": {"atk":711,"bounty":1,"deploy":28,"die":52,"dmg":1021,"fx":92,"heal":2,"leak":34,"skill":62,"spawn":80,"status":161},
|
||||
"events": {"atk":711,"bounty":1,"deploy":28,"die":52,"dmg":1021,"engage":12,"fx":92,"heal":2,"leak":34,"skill":62,"spawn":80,"status":161},
|
||||
"fx": {"beam":4,"block":6,"buff":2,"burst":2,"coldWind":1,"dodge":4,"dp":1,"explode":1,"liberate":1,"overclock":1,"overload":1,"palsy":2,"revive":3,"ripple":1,"rockfall":1,"sentry":6,"shadowWeave":11,"shield":7,"shieldBreak":7,"stone":1,"swordStorm":8,"telegraph":3,"volley":10,"wake":1,"wolfShadow":2,"wolfShadowLost":4,"zone":1},
|
||||
"snaps": "b82d753d c1224ffa 2d897565 74a8e929 046afe0b 75038b5d 5f2916e2 8335adba f033f2bd 01cd1644 28e6e00b 23057f96 cb63f907 cd02b5d1 70389501 b9dc0523 663a48bf"
|
||||
},
|
||||
@@ -2533,7 +2533,7 @@
|
||||
"enemy_2010_csdcr": [1,1,0,960,9600]
|
||||
},
|
||||
"hooks": [1,66,5700,768,768,1222,1218,23194,53,54,30,25,70,28131,99,60,47,0,1,55,1,0,13],
|
||||
"events": {"atk":1079,"bounty":4,"deploy":19,"die":54,"dmg":1143,"fx":189,"heal":31,"layer":1,"skill":55,"spawn":60,"status":338},
|
||||
"events": {"atk":1079,"bounty":4,"deploy":19,"die":54,"dmg":1143,"engage":11,"fx":189,"heal":31,"layer":1,"skill":55,"spawn":60,"status":338},
|
||||
"fx": {"aoe":2,"beam":3,"buff":1,"devour":5,"displace":35,"dodge":13,"ember":2,"garrison":1,"garrisonGrant":1,"link":3,"mote":75,"overload":4,"revive":1,"reweave":3,"riposte":3,"ripple":2,"sentry":5,"shadowWeave":20,"shield":3,"snow":1,"summon":1,"wake":4,"zone":1},
|
||||
"snaps": "10b0fc57 1879e30f a24d840f f56b69d5 fe01ffb5 2b00a1f2 bccbdb42 61be28b4 65fb3286 2994327f 0e37070a c71c8c1a 60bbb02c 25591720 152ece36 27f67e48 ea1cc871 ea955985 f28f1cc0"
|
||||
},
|
||||
@@ -2600,7 +2600,7 @@
|
||||
"enemy_9008_acbunn": [1,1,0,1373,13824]
|
||||
},
|
||||
"hooks": [1,76,4847,498,498,1282,1296,2030,65,62,30,27,16,17319,1994,40,59,0,1,70,51,1,7],
|
||||
"events": {"atk":626,"bounty":4,"deploy":15,"die":62,"dmg":1130,"fx":198,"heal":161,"layer":51,"skill":57,"spawn":73,"status":274},
|
||||
"events": {"atk":626,"bounty":4,"deploy":15,"die":62,"dmg":1130,"engage":10,"fx":198,"heal":161,"layer":51,"skill":57,"spawn":73,"status":274},
|
||||
"fx": {"aoe":4,"bombard":5,"bombardShell":5,"burst":1,"coldWind":3,"devour":3,"dodge":7,"explode":26,"extraAttack":15,"garrison":27,"garrisonGrant":1,"iceSpike":3,"link":3,"mote":34,"overload":2,"revive":1,"reweave":3,"rockfall":1,"shieldBreak":2,"sleepGuard":3,"snow":1,"stone":1,"swordStorm":6,"telegraph":2,"zone":39},
|
||||
"snaps": "875d082b 2d4fe188 7fcebf0f 0527d505 bb63a101 48180fae 265505ed 9e4dc1bc 9ba5f9b2 78ac7755 8a05d44c 142de75f 53a7aa5d 12ee3255 c9643b48 a3e02d33 beb312d1"
|
||||
},
|
||||
@@ -2656,7 +2656,7 @@
|
||||
"enemy_9006_actoxi": [12,7,5,13669,196503]
|
||||
},
|
||||
"hooks": [1,93,5224,696,696,2178,2282,3687,67,81,15,13,17,26754,797,68,64,12,1,87,9,5,4],
|
||||
"events": {"atk":809,"bounty":2,"deploy":26,"die":69,"dmg":2262,"fx":131,"heal":966,"layer":9,"leak":12,"skill":28,"spawn":80,"status":456},
|
||||
"events": {"atk":809,"bounty":2,"deploy":26,"die":69,"dmg":2262,"engage":13,"fx":131,"heal":966,"layer":9,"leak":12,"skill":28,"spawn":80,"status":456},
|
||||
"fx": {"aoe":4,"beam":1,"bloodBattle":2,"burst":5,"crit":14,"displace":22,"dodge":4,"dollEnd":1,"downed":2,"ember":1,"explode":1,"garrison":9,"meltdown":3,"overload":2,"reborn":2,"revive":5,"steal":1,"substitute":5,"summon":1,"swap":3,"telegraph":2,"zone":41},
|
||||
"snaps": "841229ba 78357365 0f64454f cfa2277d 312af3a6 0f6c096a 137a59a0 e21e2561 e008b6e4 ca1f3b94 44950918 3f07ef67 2635da42 463f54f2 c47c12e4 d3ffa722 62111dc4 1a817cab"
|
||||
},
|
||||
@@ -2728,7 +2728,7 @@
|
||||
"enemy_2085_skzjxd": [1,0,1,0,46993]
|
||||
},
|
||||
"hooks": [1,170,6900,1918,1918,4902,4909,5719,132,154,47,45,0,25779,2989,124,119,22,1,137,0,0,0],
|
||||
"events": {"atk":2318,"bounty":4,"deploy":49,"die":132,"dmg":4909,"fx":157,"heal":184,"leak":22,"skill":92,"spawn":152,"status":994},
|
||||
"events": {"atk":2318,"bounty":4,"deploy":49,"die":132,"dmg":4909,"engage":31,"fx":157,"heal":184,"leak":22,"skill":92,"spawn":152,"status":994},
|
||||
"fx": {"blink":1,"crit":32,"displace":50,"explode":5,"sp":11,"substitute":5,"summon":19,"swap":4,"teleport":7,"zone":23},
|
||||
"snaps": "a39ea9a8 bfa57bde 89563252 8ba66818 998a211d 76b14513 de620c53 552a0e22 d75b8428 6c8176a4 0236875a e53ed4ed 7b8341a1 b6f98849 903b578d 1eafabb5 6a3bec05 50df365f f9cc0152 80b49859 38eb3ad9 89da21b3 f47d6380"
|
||||
},
|
||||
@@ -2790,7 +2790,7 @@
|
||||
"enemy_2001_duckmi_2": [1,1,0,0,9331]
|
||||
},
|
||||
"hooks": [1,91,5571,430,417,892,1379,11748,69,74,12,9,10,22982,748,15,68,0,1,69,2,49,0],
|
||||
"events": {"atk":525,"bounty":4,"deploy":20,"die":74,"dmg":1194,"fx":122,"layer":2,"skill":21,"spawn":90,"status":1426},
|
||||
"events": {"atk":525,"bounty":4,"deploy":20,"die":74,"dmg":1194,"engage":8,"fx":122,"layer":2,"skill":21,"spawn":90,"status":1426},
|
||||
"fx": {"airstrike":4,"anchor":1,"burst":49,"dp":3,"expose":6,"garrison":2,"link":2,"snow":5,"summon":2,"summonStun":2,"talent":1,"wanted":45},
|
||||
"snaps": "cf9f9e00 49608d3d 3a0639c2 1ddf8c0c 19afc470 1d6c8ab3 196fce42 7b208da3 98bc19c3 7b1d1f43 56e5bc3d d7806729 62cd4789 66b8df52 fe68c6b9 19c91063 fc542474 44843c49 5f48b585"
|
||||
},
|
||||
@@ -2844,7 +2844,7 @@
|
||||
"enemy_2034_sythef_2": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,164,6688,224,224,492,501,1455,25,162,10,9,5,3835,304,16,134,133,1,26,1,1,0],
|
||||
"events": {"atk":326,"bounty":1,"deploy":30,"die":29,"dmg":492,"fx":159,"heal":28,"layer":1,"leak":133,"skill":19,"spawn":148,"status":420},
|
||||
"events": {"atk":326,"bounty":1,"deploy":30,"die":29,"dmg":492,"engage":8,"fx":159,"heal":28,"layer":1,"leak":133,"skill":19,"spawn":148,"status":420},
|
||||
"fx": {"blessing":1,"blink":2,"burst":1,"camouflage":2,"displace":1,"explode":67,"garrison":1,"garrisonGrant":2,"link":1,"snow":7,"sunBurst":3,"talent":2,"telegraph":2,"zone":67},
|
||||
"snaps": "17f09123 c0131332 66f26d68 86af2dc5 8f4f279c 70a99c1c 96e8fe43 5999d0e0 bcc09d6c 6faf7e7a 036f63ea cdeb2d14 4dd070b4 a6114bb3 6c6dd9e4 35189b57 6e47c809 aeb15891 d23efffc 22ade03c 3f937772 67ad029b 0f4893b1"
|
||||
},
|
||||
@@ -2903,7 +2903,7 @@
|
||||
"enemy_1525_blkswb": [1,0,1,5492,26880]
|
||||
},
|
||||
"hooks": [1,177,6357,742,734,878,985,131,84,173,17,17,90,10740,766,44,142,85,1,88,0,0,0],
|
||||
"events": {"atk":743,"bounty":3,"deploy":32,"die":88,"dmg":893,"fx":65,"heal":32,"leak":85,"skill":34,"spawn":163,"status":192},
|
||||
"events": {"atk":743,"bounty":3,"deploy":32,"die":88,"dmg":893,"engage":12,"fx":65,"heal":32,"leak":85,"skill":34,"spawn":163,"status":192},
|
||||
"fx": {"airstrike":30,"anchor":1,"appear":1,"blink":1,"copy":1,"disappear":1,"ember":1,"explode":2,"garrisonGrant":2,"heal":4,"link":1,"revive":4,"strike":6,"summon":2,"summonStun":2,"sunBurst":2,"sword":2,"telegraph":1,"zone":1},
|
||||
"snaps": "019a26cc 5b05950a 0a971315 475e085c 336f2641 ef129a76 9765e8db 5eb77486 8001f9e6 69e956dd a08f5b49 0b8a729f 3d4648e1 6778b522 fd888cce feb01eca a6d8e49b 4973cd01 55d8f4c0 0f7b2c7b aaf03cab e8ccca57"
|
||||
},
|
||||
@@ -2963,7 +2963,7 @@
|
||||
"enemy_2017_csphts": [1,0,1,782,1260]
|
||||
},
|
||||
"hooks": [1,100,6410,284,284,2293,2300,22249,54,92,94,94,0,10841,608,45,86,38,1,69,11,0,0],
|
||||
"events": {"atk":526,"deploy":11,"die":54,"dmg":2300,"fx":182,"heal":62,"layer":11,"leak":38,"skill":188,"spawn":95,"status":876},
|
||||
"events": {"atk":526,"deploy":11,"die":54,"dmg":2300,"engage":5,"fx":182,"heal":62,"layer":11,"leak":38,"skill":188,"spawn":95,"status":876},
|
||||
"fx": {"dollEnd":1,"explode":1,"garrison":10,"layer":1,"lightning":68,"shield":8,"slash":32,"sp":50,"storm":4,"substitute":1,"telegraph":1,"weightless":5},
|
||||
"snaps": "94f68fc0 699b5957 74b1283d 3b83834f a3210271 89392766 01647ce4 ef4832d2 50b1d3df 464d3e8b 3b0659d2 ff5572c0 d04959d6 1a5f4ee2 aa11dd73 b2b4d570 01351b36 6d94c52d 6e684127 cbf7b7ff 35bcef0d b1048253"
|
||||
},
|
||||
@@ -3008,7 +3008,7 @@
|
||||
"enemy_9009_acfort": [1,0,1,7851,20555]
|
||||
},
|
||||
"hooks": [1,71,5700,366,366,1839,1839,0,31,65,30,31,0,3894,792,3,64,34,1,33,0,0,0],
|
||||
"events": {"atk":423,"bounty":3,"deploy":7,"die":31,"dmg":1838,"fx":45,"leak":34,"skill":64,"spawn":69,"status":304},
|
||||
"events": {"atk":423,"bounty":3,"deploy":7,"die":31,"dmg":1838,"engage":4,"fx":45,"leak":34,"skill":64,"spawn":69,"status":304},
|
||||
"fx": {"coin":8,"dilemma":2,"explode":2,"frostNova":25,"revive":2,"shield":1,"shieldBreak":1,"summon":1,"telegraph":3},
|
||||
"snaps": "3f2254f6 76b714eb 68b544c1 a849f2de 6daa55dd 94390a52 78fcc75a dbb3a5df fe0212ec 22d4a949 3536f432 9397e521 c2a1e9bf 3bdcfcc4 480c60b0 1b202712 7d195566 3149a793 c6f3c943"
|
||||
}
|
||||
|
||||
+10
-10
@@ -69,7 +69,7 @@
|
||||
"enemy_1121_lifbos_2": [9,1,7,11244,38577]
|
||||
},
|
||||
"hooks": [1,91,5100,870,870,1441,1438,3866,41,82,25,33,0,18850,26,37,50,30,1,42,5,0,6],
|
||||
"events": {"atk":1013,"bounty":2,"deploy":41,"die":52,"dmg":1438,"fx":62,"heal":35,"layer":5,"leak":30,"skill":47,"spawn":62,"status":126},
|
||||
"events": {"atk":1013,"bounty":2,"deploy":41,"die":52,"dmg":1438,"engage":11,"fx":62,"heal":35,"layer":5,"leak":30,"skill":47,"spawn":62,"status":126},
|
||||
"fx": {"beam":4,"blink":11,"dodge":6,"dp":5,"garrison":5,"liberate":14,"slash":16,"telegraph":1},
|
||||
"snaps": "dec536bc cbfb0e19 608df77d 4bc1be00 31528b18 50c15974 172a64b1 80ed52af 452e6c6e 2cbbaf73 d2893b65 71598545 0ff0a232 8497b8ca 56857b5a 512860f1 25c11ae9"
|
||||
},
|
||||
@@ -122,7 +122,7 @@
|
||||
"enemy_1006_shield": [1,0,1,0,760]
|
||||
},
|
||||
"hooks": [1,92,5700,337,337,558,523,0,32,88,5,5,0,12532,1,13,68,56,1,32,3,0,41],
|
||||
"events": {"atk":345,"deploy":24,"die":32,"dmg":523,"fx":81,"layer":3,"leak":56,"skill":10,"spawn":80,"status":2},
|
||||
"events": {"atk":345,"deploy":24,"die":32,"dmg":523,"engage":11,"fx":81,"layer":3,"leak":56,"skill":10,"spawn":80,"status":2},
|
||||
"fx": {"aoe":4,"dodge":41,"dp":4,"explode":27,"garrison":3,"garrisonGrant":1,"zone":1},
|
||||
"snaps": "9d2468c6 9a32f006 99b2aa33 a01ecc39 97bb00b0 2fcede4b fe594f15 377f7691 e87b0fd3 af44759d 7b13ea89 61cd9b40 4f9d1182 5905fb57 d697ca06 c37e9513 3102b854 296cdd49 4d5efa28"
|
||||
},
|
||||
@@ -173,7 +173,7 @@
|
||||
"enemy_9011_acrefr": [12,2,3,23060,125251]
|
||||
},
|
||||
"hooks": [1,93,5700,1154,1154,1775,1770,135,58,77,25,27,0,28761,3090,58,74,19,1,58,0,0,8],
|
||||
"events": {"atk":1247,"bounty":4,"deploy":19,"die":58,"dmg":1767,"fx":170,"heal":124,"leak":19,"skill":56,"spawn":86,"status":614},
|
||||
"events": {"atk":1247,"bounty":4,"deploy":19,"die":58,"dmg":1767,"engage":11,"fx":170,"heal":124,"leak":19,"skill":56,"spawn":86,"status":614},
|
||||
"fx": {"aoe":60,"displace":1,"dodge":18,"dp":30,"phase":1,"slash":48,"sp":2,"spGain":10},
|
||||
"snaps": "dbcb5cec 56a8a8f6 e8d97a5d d2594a66 b6f753a4 78a2f35e 80349f15 2cd292dd d7240cae 4f120b33 69d90058 45d5da9a ae0b244b 17b17251 4df0cf30 f2c7c569 baa94919 07ba89e9 e4a68e4d"
|
||||
},
|
||||
@@ -239,7 +239,7 @@
|
||||
"enemy_1072_dlancer": [60,45,15,19911,429319]
|
||||
},
|
||||
"hooks": [1,181,6051,918,918,1945,1944,62,148,170,25,24,0,31170,4160,44,158,22,1,149,2,0,13],
|
||||
"events": {"atk":1080,"bounty":4,"deploy":21,"die":148,"dmg":1944,"fx":87,"heal":45,"layer":2,"leak":22,"skill":49,"spawn":172,"status":440},
|
||||
"events": {"atk":1080,"bounty":4,"deploy":21,"die":148,"dmg":1944,"engage":11,"fx":87,"heal":45,"layer":2,"leak":22,"skill":49,"spawn":172,"status":440},
|
||||
"fx": {"aoe":7,"dodge":13,"dp":18,"garrison":2,"revive":1,"slash":29,"sp":12,"spGain":3,"telegraph":2},
|
||||
"snaps": "29a29463 6fc96b2d 184b448a fce3c126 45d67357 4c47175a 1292297b 3e42d44e b7bf91a6 dd4e2386 0b4615ac 81792172 a056e50b 7e87af96 dd9818ad 8c9001ef b2db6556 9bf17d05 66cf3ead 709fbe1f c88b2f46"
|
||||
},
|
||||
@@ -290,7 +290,7 @@
|
||||
"enemy_1387_winshd": [30,1,29,15960,140112]
|
||||
},
|
||||
"hooks": [1,134,6430,620,620,988,988,6,29,128,8,24,0,14868,2437,28,104,97,1,29,1,0,0],
|
||||
"events": {"atk":651,"deploy":27,"die":31,"dmg":901,"fx":58,"heal":3,"layer":1,"leak":97,"skill":47,"spawn":114,"status":514},
|
||||
"events": {"atk":651,"deploy":27,"die":31,"dmg":901,"engage":6,"fx":58,"heal":3,"layer":1,"leak":97,"skill":47,"spawn":114,"status":514},
|
||||
"fx": {"aoe":5,"blink":2,"camouflage":1,"displace":22,"dodge":3,"dp":2,"explode":6,"garrison":1,"garrisonGrant":2,"slash":8,"zone":6},
|
||||
"snaps": "8d7b3223 b6dafa64 3940bc8e fd79b9e2 e5e85618 6fcfc479 90958489 71bfbb91 d12c224c cd2c9c7f 4a9fff33 68e48a86 4b97e027 5f8e8dad da62239a 8601c0dc 73717b6d 9e4f784f 818e7ed1 c1f2a855 33118eab 9bafc0bc"
|
||||
},
|
||||
@@ -355,7 +355,7 @@
|
||||
"enemy_1329_cbshld_2": [12,1,11,35708,50755]
|
||||
},
|
||||
"hooks": [1,138,5482,523,523,776,802,93,78,137,24,36,0,6341,31,56,98,52,1,86,5,0,4],
|
||||
"events": {"atk":611,"bounty":4,"deploy":40,"die":85,"dmg":802,"fx":59,"heal":66,"layer":5,"leak":52,"skill":48,"spawn":110,"status":107},
|
||||
"events": {"atk":611,"bounty":4,"deploy":40,"die":85,"dmg":802,"engage":11,"fx":59,"heal":66,"layer":5,"leak":52,"skill":48,"spawn":110,"status":107},
|
||||
"fx": {"blink":7,"camouflage":1,"dodge":8,"dp":13,"explode":1,"garrison":5,"slash":24},
|
||||
"snaps": "32c77df2 e0a686fc 511e3625 2a2c9595 4d454cd6 ba68fe2a 509a2a40 0f18d74e 26c72bef 4d6d5cce 834f8ce9 462b0854 0fec1e43 fd1bd922 ab1c6896 53173cd5 dbdfb42d 6f942256 4207d16e"
|
||||
},
|
||||
@@ -422,7 +422,7 @@
|
||||
"enemy_1071_dftman": [1,0,1,0,0]
|
||||
},
|
||||
"hooks": [1,109,6689,304,304,581,573,378,30,102,13,13,0,8920,9,11,80,72,1,33,2,0,8],
|
||||
"events": {"atk":330,"bounty":2,"deploy":27,"die":30,"dmg":573,"fx":22,"layer":2,"leak":72,"skill":26,"spawn":94,"status":103},
|
||||
"events": {"atk":330,"bounty":2,"deploy":27,"die":30,"dmg":573,"engage":11,"fx":22,"layer":2,"leak":72,"skill":26,"spawn":94,"status":103},
|
||||
"fx": {"aoe":1,"dodge":8,"dp":6,"garrison":2,"garrisonGrant":1,"palsy":1,"revive":3},
|
||||
"snaps": "ef9ff66a 4f4ac6fc 133f7f1c a187a8c8 46d89701 4bb496a8 0dfccf57 81173658 8c42876d 4718c77c d3b80c8e df3c692d 0576a74b 7684de92 e59b0c43 849795d5 e99812de 3f883cd6 6bb9cdf6 b246f597 289cd790 2f34e6ff 997f51f3"
|
||||
},
|
||||
@@ -476,7 +476,7 @@
|
||||
"enemy_1254_lypa_2": [48,1,47,74560,442348]
|
||||
},
|
||||
"hooks": [1,205,6900,1764,1764,3493,3533,147,56,189,40,44,0,26478,16569,72,179,133,1,59,0,0,10],
|
||||
"events": {"atk":2013,"bounty":1,"deploy":23,"die":56,"dmg":3508,"fx":308,"heal":130,"leak":133,"skill":90,"spawn":194,"status":1297},
|
||||
"events": {"atk":2013,"bounty":1,"deploy":23,"die":56,"dmg":3508,"engage":11,"fx":308,"heal":130,"leak":133,"skill":90,"spawn":194,"status":1297},
|
||||
"fx": {"aoe":90,"displace":12,"dodge":31,"dp":24,"shieldBreak":59,"slash":80,"sp":1,"spGain":11},
|
||||
"snaps": "4d4dc5ab 00efc642 4dc3aa32 13e9533b a3617bdf 587927d0 9fe3b7b8 0b39dceb 2981edf9 2ba1ce8c ef825d5b 85fd9608 a83f0a12 9e6b1271 7c5bf7ee f6ad8d8e c76286f6 037365de bf979497 771a38f7 b74aaf11 518326a3 19e5e338"
|
||||
},
|
||||
@@ -532,7 +532,7 @@
|
||||
"enemy_1329_cbshld": [39,39,0,3019,374400]
|
||||
},
|
||||
"hooks": [1,174,5967,836,836,1660,1803,179,159,159,40,38,0,28209,2688,60,158,0,1,159,3,1,23],
|
||||
"events": {"atk":974,"bounty":4,"deploy":13,"die":159,"dmg":1782,"fx":330,"heal":135,"layer":3,"skill":78,"spawn":173,"status":334},
|
||||
"events": {"atk":974,"bounty":4,"deploy":13,"die":159,"dmg":1782,"engage":6,"fx":330,"heal":135,"layer":3,"skill":78,"spawn":173,"status":334},
|
||||
"fx": {"aoe":2,"burst":1,"dodge":28,"dp":68,"garrison":3,"shieldBreak":60,"slash":152,"sp":16},
|
||||
"snaps": "526d4c63 f04a2d68 53d511ef 5f8b4334 d796abdd 122e9876 81bad943 4c6a838a eb463850 1e1d2025 875b599b 2d763f55 51548a07 73b07326 88a8ea6f ec211cd8 e329b226 03d1aa7b 63fd2bb2 afee939a"
|
||||
},
|
||||
@@ -582,7 +582,7 @@
|
||||
"enemy_1402_tgshd_2": [36,2,34,29224,197345]
|
||||
},
|
||||
"hooks": [1,165,6486,549,549,865,877,6809,50,159,17,36,0,8308,1125,49,131,106,1,50,1,1,0],
|
||||
"events": {"atk":554,"deploy":32,"die":53,"dmg":802,"fx":530,"heal":21,"layer":1,"leak":106,"skill":74,"spawn":140,"status":378},
|
||||
"events": {"atk":554,"deploy":32,"die":53,"dmg":802,"engage":6,"fx":530,"heal":21,"layer":1,"leak":106,"skill":74,"spawn":140,"status":378},
|
||||
"fx": {"aoe":4,"blink":3,"burst":1,"displace":17,"dodge":3,"dp":17,"expose":414,"garrison":1,"garrisonGrant":3,"slash":67},
|
||||
"snaps": "80709a69 1b180600 2040e410 16970933 7ec28fab 061d6583 09f2da3e 98333fee 741e4051 c5f8165a 55db9474 b9b2bf46 d72aea5d 20d591d8 3077f062 ab32900d eb4540a2 37c492a6 3e3cd8f7 20a4cb8e 22ada53e b9ce62f2"
|
||||
}
|
||||
|
||||
@@ -392,6 +392,24 @@ test('snapshot / event wire format (DESIGN §8.2)', () => {
|
||||
JSON.stringify(snap); // serialisable
|
||||
});
|
||||
|
||||
test('one ENGAGE per unit, on its first attack that hits an enemy (the client\'s 行动开始 voice)', () => {
|
||||
const h = makeBattle({
|
||||
defs: { chess: { t_guard: guard({ stats: { atk: 100, maxHp: 5000 } }) }, enemies: { enemy_walker: walker({ atk: 100, hp: 3000 }) } },
|
||||
units: [{ chessId: 't_guard', row: 9, col: 5 }],
|
||||
enemies: [{ key: 'enemy_walker' }], content: 'generic', fieldId: 'n:p1',
|
||||
});
|
||||
h.run(60); // the walker (0.5 tiles/s) reaches the guard at ~9 s and is attacked from then on
|
||||
const id = h.unit('t_guard').id;
|
||||
const engage = h.eventsOf(EV.ENGAGE);
|
||||
assert.equal(engage.length, 1, 'one event for the whole battle');
|
||||
assert.deepEqual(engage[0], ['engage', id]);
|
||||
// it is emitted at the unit's first attack on an enemy — an earlier 命中的攻击 is impossible
|
||||
const first = h.events.findIndex((e) => e[0] === 'engage');
|
||||
const earlierAtk = h.events.slice(0, first).findIndex((e) => e[0] === 'atk' && e[1] === id);
|
||||
assert.equal(earlierAtk, -1, 'no attack of that unit precedes it');
|
||||
assert.ok(h.events.slice(first).some((e) => e[0] === 'atk' && e[1] === id), 'the attack it belongs to');
|
||||
});
|
||||
|
||||
test('determinism: same seed ⇒ identical result and event stream; different seed may differ', () => {
|
||||
const ds = getDefaultSource();
|
||||
const tpl = ds.getWave('act1autochess_05');
|
||||
|
||||
+192
-2
@@ -6,7 +6,7 @@ import assert from 'node:assert/strict';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { bgmKeyFor, resolveBgm, SfxLimiter, AudioManager, normalAttackSfx, installAudio, audio, combatTrackFor, COMBAT_TRACK_SWITCH_ROUND } from '../../public/js/audio.js';
|
||||
import { bgmKeyFor, resolveBgm, SfxLimiter, AudioManager, normalAttackSfx, installAudio, audio, combatTrackFor, COMBAT_TRACK_SWITCH_ROUND, VoiceGate, resultSpeaker, resultVoiceSlot, VOICE_PRIORITY, VOICE_COOLDOWN_MS } from '../../public/js/audio.js';
|
||||
import { mediaUrl } from '../../public/js/media.js';
|
||||
import { PHASE } from '../../shared/constants.js';
|
||||
|
||||
@@ -170,6 +170,196 @@ describe('SfxLimiter', () => {
|
||||
});
|
||||
});
|
||||
|
||||
// ---- operator battle voice (manifest audio.voice; official priorities, audio_data.json battleVoice) ---------
|
||||
|
||||
describe('operator battle voice', () => {
|
||||
test('resultVoiceSlot: 完美作战 / 高难 / 漏怪 / 全灭', () => {
|
||||
assert.equal(resultVoiceSlot({ perfect: true }), 'resultThree');
|
||||
assert.equal(resultVoiceSlot({ perfect: true, hard: true }), 'resultFour', '绝境 / 终极 报 完成高难行动');
|
||||
assert.equal(resultVoiceSlot({ perfect: false, leaked: 2, killed: 10, total: 12 }), 'resultTwo');
|
||||
assert.equal(resultVoiceSlot({ perfect: false, leaked: 0, killed: 0, total: 12 }), 'resultLose');
|
||||
assert.equal(resultVoiceSlot({ perfect: false, leaked: 0, killed: 5, total: 5 }), 'resultThree', 'no leak ⇒ the 完美 line');
|
||||
assert.equal(resultVoiceSlot(), 'resultThree');
|
||||
});
|
||||
|
||||
test('resultSpeaker: the operators of THAT battle (survivors first), never the field on screen', () => {
|
||||
// `mine.unitsEnd` of the finished own battle: operators (char_*) and the board's summon pieces (token_*, no voice)
|
||||
const mine = { unitsEnd: [
|
||||
{ defId: 'char_fallen', alive: false },
|
||||
{ defId: 'token_1001', alive: true },
|
||||
{ defId: 'char_a', alive: true },
|
||||
{ defId: 'char_b', alive: true },
|
||||
] };
|
||||
assert.equal(resultSpeaker(mine, () => 0), 'char_a');
|
||||
assert.equal(resultSpeaker(mine, () => 0.999), 'char_b', 'a drawn operator, still only the ones standing');
|
||||
assert.equal(resultSpeaker(mine, () => 0.4), 'char_a');
|
||||
const drawn = new Set([0, 0.2, 0.4, 0.6, 0.8, 1].map((r) => resultSpeaker(mine, () => r)));
|
||||
assert.deepEqual([...drawn].sort(), ['char_a', 'char_b'], 'a fallen operator or a summon never speaks');
|
||||
// the whole squad fell: only then does a fallen operator report the result
|
||||
const wiped = { unitsEnd: [{ defId: 'char_fallen', alive: false }, { defId: 'char_also', alive: false }] };
|
||||
assert.equal(resultSpeaker(wiped, () => 0), 'char_fallen');
|
||||
assert.equal(resultSpeaker(wiped, () => 0.999), 'char_also');
|
||||
// no operator on that field at all — summons only, an empty list, or a payload without `unitsEnd` (an older
|
||||
// server): no line. There is deliberately NO fallback to the operators currently tracked for the field on screen —
|
||||
// that fallback is what made a watched team-mate's operator say the viewer's line (review on #73).
|
||||
assert.equal(resultSpeaker({ unitsEnd: [{ defId: 'token_1', alive: true }] }, () => 0), null);
|
||||
assert.equal(resultSpeaker({ unitsEnd: [] }), null);
|
||||
assert.equal(resultSpeaker({}), null);
|
||||
assert.equal(resultSpeaker(null), null);
|
||||
assert.equal(resultSpeaker(undefined), null);
|
||||
assert.equal(resultSpeaker({ unitsEnd: [{ alive: true }] }, () => 0), null, 'a unit without a defId');
|
||||
assert.equal(resultSpeaker({ unitsEnd: [{ defId: 'enemy_1007_slime', alive: true }] }, () => 0), null, 'an enemy');
|
||||
});
|
||||
|
||||
test('VoiceGate: one line at a time, a global gap, per-unit cooldowns, higher priority takes over', () => {
|
||||
assert.ok(VOICE_PRIORITY.start > VOICE_PRIORITY.skill1 && VOICE_PRIORITY.skill1 > VOICE_PRIORITY.place, 'the official order');
|
||||
assert.ok(VOICE_PRIORITY.resultThree > VOICE_PRIORITY.skill1 && VOICE_PRIORITY.resultThree < VOICE_PRIORITY.faceEnemy);
|
||||
assert.equal(VOICE_COOLDOWN_MS.skill1, 10000, 'official SKILL_ACTIVE 10 s');
|
||||
const g = new VoiceGate({ gapMs: 1000 });
|
||||
assert.equal(g.request('start', 1, 0), 'play');
|
||||
g.start('start', 1, 0);
|
||||
assert.equal(g.request('skill1', 2, 500), 'drop', 'one voice at a time (a lower priority waits)');
|
||||
assert.equal(g.request('start', 3, 500), 'drop', 'the same priority does not interrupt');
|
||||
assert.equal(g.request('faceEnemy', 3, 500), 'drop', '90 < 100 + margin');
|
||||
g.release();
|
||||
assert.equal(g.request('place', 1, 900), 'drop', 'the global gap is not over');
|
||||
assert.equal(g.request('place', 1, 1000), 'play');
|
||||
g.release();
|
||||
const g2 = new VoiceGate({ gapMs: 0 });
|
||||
assert.equal(g2.request('skill1', 'u1', 0), 'play');
|
||||
g2.start('skill1', 'u1', 0);
|
||||
g2.release();
|
||||
assert.equal(g2.request('skill1', 'u1', 5000), 'drop', 'the unit cooldown');
|
||||
assert.equal(g2.request('skill1', 'u2', 5000), 'play', 'another unit is unaffected');
|
||||
g2.release();
|
||||
assert.equal(g2.request('skill1', 'u1', 10000), 'play', 'cooldown over');
|
||||
g2.release();
|
||||
g2.reset();
|
||||
assert.equal(g2.request('skill1', 'u1', 10001), 'play', 'a new battle inherits no cooldown');
|
||||
});
|
||||
|
||||
test('AudioManager.voice: manifest slots (a drawn array), the gate, and the battle events that drive them', async () => {
|
||||
const fw = fakeWindow();
|
||||
const origFetch = globalThis.fetch;
|
||||
const urls = [];
|
||||
globalThis.fetch = async (u) => { urls.push(u); return { ok: true, arrayBuffer: async () => new ArrayBuffer(8) }; };
|
||||
try {
|
||||
const vm = { audio: { sfx: { ui: {}, battle: {}, units: {} }, voice: {
|
||||
char_a: { start: '/v/a_start.mp3', place: ['/v/a_p1.mp3', '/v/a_p2.mp3'], skill3: '/v/a_s3.mp3', faceEnemy: '/v/a_face.mp3' },
|
||||
char_b: { place: '/v/b_p1.mp3', skill1: '/v/b_s1.mp3' },
|
||||
} } };
|
||||
const a = new AudioManager({ win: fw.win, getManifest: () => vm });
|
||||
a.voiceGate = new VoiceGate({ gapMs: 0 }); // the gap itself is covered above
|
||||
a.install();
|
||||
assert.equal(a.voice('char_a', 'place'), false, 'locked: nothing is requested');
|
||||
assert.equal(urls.length, 0);
|
||||
fw.fire('pointerdown');
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voice('char_a', 'start', { unitKey: 1 }), true);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.ok(asked(urls, '/v/a_start.mp3'));
|
||||
assert.equal(a.voice('char_b', 'place', { unitKey: 2 }), false, '部署 cannot interrupt 行动出发');
|
||||
assert.equal(a.voice('char_a', 'faceEnemy', { unitKey: 3 }), false, '接敌 cannot either');
|
||||
a._stopVoice();
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 1 }), true, 'the channel is free again');
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.ok(asked(urls, '/v/a_p1.mp3') || asked(urls, '/v/a_p2.mp3'), 'a drawn 部署 line');
|
||||
assert.equal(a.voice('char_a', 'nope', { unitKey: 1 }), false, 'unknown slot');
|
||||
assert.equal(a.voice('char_zz', 'place', { unitKey: 1 }), false, 'unknown operator');
|
||||
a._stopVoice(); a.voiceGate.reset();
|
||||
// the battle events drive the lines: 行动出发 (the first deploy), 部署 (the rest), 行动开始, 作战中N
|
||||
a.setFieldUnits([{ id: 11, side: 'ally', spine: 'char_a', kind: 'op', skillIndex: 2 }, { id: 12, side: 'ally', spine: 'char_b', kind: 'op' }]);
|
||||
a.handleBattleEvents([['deploy', 11]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/a_start.mp3', 'the first operator deployed says 行动出发');
|
||||
a.handleBattleEvents([['deploy', 12]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/a_start.mp3', 'a 部署 line never interrupts it (lower priority)');
|
||||
a._stopVoice(); a.voiceGate.reset();
|
||||
a.handleBattleEvents([['engage', 11], ['skill', 12, 1]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/a_face.mp3', '首次接敌 ⇒ 行动开始 (a 作战中 line never interrupts it)');
|
||||
a._stopVoice(); a.voiceGate.reset();
|
||||
a.handleBattleEvents([['skill', 11, 1]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/a_s3.mp3', '作战中N follows the unit skillIndex (2 ⇒ 作战中3)');
|
||||
a._stopVoice(); a.voiceGate.reset();
|
||||
a.handleBattleEvents([['skill', 12, 1]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/b_s1.mp3', 'a unit without skillIndex falls back to 作战中1');
|
||||
a._stopVoice(); a.voiceGate.reset();
|
||||
a.setFieldUnits([{ id: 21, side: 'ally', spine: 'char_a', kind: 'op' }]);
|
||||
a.handleBattleEvents([['deploy', 21]]);
|
||||
await new Promise((r) => setTimeout(r, 10));
|
||||
assert.equal(a.voiceNode?.url, '/v/a_start.mp3', 'a new battle starts with 行动出发 again');
|
||||
} finally {
|
||||
globalThis.fetch = origFetch;
|
||||
}
|
||||
});
|
||||
|
||||
test('voice: a stale callback never frees the channel the newest line holds (review on #73)', async () => {
|
||||
const fw = fakeWindow();
|
||||
const origFetch = globalThis.fetch;
|
||||
// holds named URLs open: the first request for one waits on the promise in `held`, later ones (the manager caches a
|
||||
// decoded URL) do not. `fail` answers 404, i.e. `_buffer` resolves null.
|
||||
const held = new Map();
|
||||
const fail = new Set();
|
||||
globalThis.fetch = async (u) => {
|
||||
if (fail.has(u)) return { ok: false, status: 404 };
|
||||
const h = held.get(u);
|
||||
if (h) { held.delete(u); await h; } // the manager caches per URL, so only the first call waits
|
||||
return { ok: true, arrayBuffer: async () => new ArrayBuffer(8) };
|
||||
};
|
||||
const tick = () => new Promise((r) => setTimeout(r, 10));
|
||||
try {
|
||||
const vm = { audio: { sfx: { ui: {}, battle: {}, units: {} }, voice: {
|
||||
char_a: { place: '/v/a_p1.mp3', start: '/v/a_start.mp3', faceEnemy: '/v/a_face.mp3', select: '/v/a_sel.mp3' },
|
||||
} } };
|
||||
const a = new AudioManager({ win: fw.win, getManifest: () => vm });
|
||||
a.voiceGate = new VoiceGate({ gapMs: 0 }); // the gap itself is covered above
|
||||
a.install();
|
||||
fw.fire('pointerdown');
|
||||
await tick();
|
||||
// 部署 (20) starts with its LOAD HELD OPEN, so 行动出发 (100) takes the channel over while it is still loading
|
||||
let openA;
|
||||
held.set('/v/a_p1.mp3', new Promise((r) => { openA = r; }));
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 1 }), true);
|
||||
assert.equal(a.voice('char_a', 'start', { unitKey: 2 }), true, 'a higher priority line takes the channel over');
|
||||
await tick();
|
||||
assert.equal(a.voiceNode?.url, '/v/a_start.mp3', 'the replacement is on air');
|
||||
openA(); // the preempted line's load finally finishes
|
||||
await tick();
|
||||
assert.equal(a.voiceNode?.url, '/v/a_start.mp3', 'a stale callback never starts its own line');
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 3 }), false, 'and never freed the channel it lost');
|
||||
|
||||
// the safety timer / onended of a line that was STOPPED must not free the line that replaced it either
|
||||
const ringing = a.voiceNode; // 行动出发 on air
|
||||
a._stopVoice(); // the stop path releases the gate itself and moves the token on
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 4 }), true, 'the channel is free again');
|
||||
await tick();
|
||||
const now = a.voiceNode;
|
||||
assert.equal(now?.url, '/v/a_p1.mp3');
|
||||
ringing.src.onended?.(); // the stopped line's own end lands late (or its safety timer fires)
|
||||
ringing.src.onended?.(); // …and a second time, like timer + onended both firing
|
||||
await tick();
|
||||
assert.equal(a.voiceNode, now, 'the line on air is untouched');
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 5 }), false, 'and its channel is still held');
|
||||
|
||||
// a load that FAILS after the takeover (404 ⇒ null buffer): same rule
|
||||
fail.add('/v/a_sel.mp3');
|
||||
a._stopVoice();
|
||||
assert.equal(a.voice('char_a', 'select', { unitKey: 6 }), true);
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 7 }), true, 'a higher priority line takes over while it loads');
|
||||
await tick();
|
||||
assert.equal(a.voiceNode?.url, '/v/a_p1.mp3');
|
||||
await tick();
|
||||
assert.equal(a.voice('char_a', 'place', { unitKey: 8 }), false, 'the failed load kept out of the newest line\'s way');
|
||||
} finally {
|
||||
globalThis.fetch = origFetch;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ---- fake Web Audio -------------------------------------------------------------------------------------
|
||||
|
||||
function fakeWindow() {
|
||||
@@ -209,7 +399,7 @@ describe('AudioManager', () => {
|
||||
assert.equal(a.unit('char_x', 'attack', 1), false);
|
||||
a.handleBattleEvents([['atk', 1, 2, 'arrow'], 'junk', null]);
|
||||
a.setVolumes({ bgm: 5, sfx: -1, muted: true });
|
||||
assert.deepEqual(a.volumes, { bgm: 1, sfx: 0, muted: true });
|
||||
assert.deepEqual(a.volumes, { bgm: 1, sfx: 0, voice: 0.8, muted: true });
|
||||
assert.equal(a.unlocked, false);
|
||||
});
|
||||
test('unlocks on the first gesture, then plays BGM and SFX from the manifest', async () => {
|
||||
|
||||
@@ -515,8 +515,9 @@ describe('keyboard & settings', () => {
|
||||
});
|
||||
test('sanitizeSettings', () => {
|
||||
assert.deepEqual(sanitizeSettings(null), { ...DEFAULT_SETTINGS });
|
||||
assert.deepEqual(sanitizeSettings({ bgm: 3, sfx: -1, muted: 'yes', damageNumbers: false, quality: 'ultra' }),
|
||||
{ bgm: 1, sfx: 0, muted: false, damageNumbers: false, quality: 'high' });
|
||||
assert.deepEqual(sanitizeSettings({ bgm: 3, sfx: -1, voice: 2, muted: 'yes', damageNumbers: false, quality: 'ultra' }),
|
||||
{ bgm: 1, sfx: 0, voice: 1, muted: false, damageNumbers: false, quality: 'high' });
|
||||
assert.equal(sanitizeSettings({ bgm: 0.5 }).voice, DEFAULT_SETTINGS.voice, 'a saved profile without `voice` gets the default');
|
||||
assert.equal(sanitizeSettings({ bgm: 0.333 }).bgm, 0.33);
|
||||
assert.equal(sanitizeSettings({ quality: 'low' }).quality, 'low');
|
||||
});
|
||||
|
||||
@@ -296,6 +296,10 @@ describe('match UI of a not-owned chess', () => {
|
||||
const ph = [...walk(plain.find((b) => b.key === 'head'))];
|
||||
assert.equal(ph.find((v) => hasClass(v, 'dhead__name')).props.children, '银灰');
|
||||
assert.equal(ph.find((v) => hasClass(v, 'dhead__for')), undefined);
|
||||
// PR #73's 选中干员 voice (DetailPanel `voice`, in battle): the stand-in speaks, like its battle lines (audio.js keys
|
||||
// them by UnitInfo spine, the stand-in's model) — never the operator it replaces
|
||||
assert.match(readFileSync(path.join(ROOT, 'public/js/ui/detailPanel.js'), 'utf8'),
|
||||
/const selectChar = voice && detail\?\.type === 'chess' \? detail\.standIn\?\.charId \|\| detail\.chess\?\.charId \|\| null : null;/);
|
||||
});
|
||||
|
||||
test('own prep pieces with stand-ins get a small 「替补」 tag (hand, temp, board); others none', () => {
|
||||
|
||||
@@ -268,3 +268,91 @@ export function resolveSpec(spec, bank) {
|
||||
if (spec?.bank) return bank(spec.bank);
|
||||
return [];
|
||||
}
|
||||
|
||||
// ---- operator battle voice (excel/charword_table.json) -------------------------------------------------
|
||||
//
|
||||
// Every playable operator has official battle lines (行动出发 / 行动开始 / 选中干员 / 部署 / 作战中 / 编入队伍 /
|
||||
// 任命队长 / 结算 / 干员报到) in `voice_cn/<charId>/cn_<n>.mp3` — JP: `voice/`, EN: `voice_en/`, KR: `voice_kr/`,
|
||||
// the same file names in every dump, only the folder differs. charword_table.json's `placeType` says when the game
|
||||
// plays each line; its `voiceAsset` is the path under the dump.
|
||||
|
||||
/** Voice dump folder per language (under sound_beta_2). */
|
||||
export const VOICE_DIRS = Object.freeze({ cn: 'voice_cn', jp: 'voice', en: 'voice_en', kr: 'voice_kr' });
|
||||
|
||||
/** Official `placeType` → the manifest's voice slot (public/js/audio.js VOICE_PRIORITY / VOICE_COOLDOWN_MS). */
|
||||
export const VOICE_SLOTS = Object.freeze({
|
||||
BATTLE_START: 'start', // 行动出发: 开战
|
||||
BATTLE_FACE_ENEMY: 'faceEnemy', // 行动开始: 首次接敌
|
||||
BATTLE_SELECT: 'select', // 选中干员1/2
|
||||
BATTLE_PLACE: 'place', // 部署1/2
|
||||
BATTLE_SKILL_1: 'skill1', // 作战中1-4: the equipped skill's own slot
|
||||
BATTLE_SKILL_2: 'skill2',
|
||||
BATTLE_SKILL_3: 'skill3',
|
||||
BATTLE_SKILL_4: 'skill4',
|
||||
SQUAD: 'squad', // 编入队伍
|
||||
SQUAD_FIRST: 'squadFirst', // 任命队长
|
||||
FOUR_STAR: 'resultFour', // 完成高难行动
|
||||
THREE_STAR: 'resultThree', // 3星结束行动 (完美作战)
|
||||
TWO_STAR: 'resultTwo', // 非3星结束行动
|
||||
LOSE: 'resultLose', // 行动失败
|
||||
GACHA: 'gacha', // 干员报到
|
||||
});
|
||||
|
||||
/**
|
||||
* The slots a running battle can actually request — the only ones `public/js/audio.js` ever asks for (the 休整期 is
|
||||
* silent, so nothing else is played): 行动出发 start, 首次接敌 faceEnemy, 作战中1-4 skillN, 部署 place (the deploy
|
||||
* events) and 选中干员 select (the detail panel, behind its combat flag), plus the settlement lines
|
||||
* resultFour / resultThree / resultTwo / resultLose (public/js/screens/game.js onResult).
|
||||
* `buildPlan` plans these by default; `--voice-all` widens it to every slot of VOICE_SLOTS.
|
||||
*/
|
||||
export const VOICE_BATTLE_SLOTS = Object.freeze(['start', 'faceEnemy', 'select', 'place',
|
||||
'skill1', 'skill2', 'skill3', 'skill4', 'resultFour', 'resultThree', 'resultTwo', 'resultLose']);
|
||||
|
||||
/**
|
||||
* Slots no battle plays: the lines the official client uses in its own 养成 / 编队 UI (干员报到 gacha, 编入队伍 squad,
|
||||
* 任命队长 squadFirst). `test/docs-consistency.test.js` proves the client never asks for one, so planning them only
|
||||
* makes every `npm run assets` download 360 files (19.3 MB, CN dub) that no player will ever hear — they are left out
|
||||
* unless `--voice-all` is passed. 部署 `place` and 选中干员 `select` deliberately stay in: the official client groups
|
||||
* them with the prep lines, but a battle does play them (the deploy events; the detail panel behind its combat flag).
|
||||
*/
|
||||
export const VOICE_PREP_SLOTS = Object.freeze(['gacha', 'squad', 'squadFirst']);
|
||||
|
||||
/**
|
||||
* Index charword_table.json into per-character voice slots, in voiceIndex order (one slot may have several lines).
|
||||
* Only the base word key (`wordKey === charId`) is used: the dump has no folder for a skin variant's word key
|
||||
* (`char_x_ita`, `char_x_epoque#28`, …) — those files simply do not exist upstream.
|
||||
* @param {any} charword parsed excel/charword_table.json
|
||||
* @param {string} [lang] voiceId prefix — the zh_CN table carries the `CN_*` lines; the other dubs share the numbering
|
||||
* @param {Iterable<string>|null} [only] slot names to keep; null/omitted keeps every slot (VOICE_BATTLE_SLOTS is what
|
||||
* the plan uses by default, so a battle's own lines are planned and the prep-only ones are not)
|
||||
* @returns {Map<string, Record<string, string[]>>} charId → slot → voiceAsset ('char_263_skadi/CN_023')
|
||||
*/
|
||||
export function indexVoice(charword, lang = 'CN', only = null) {
|
||||
const keep = only ? new Set(only) : null;
|
||||
const out = new Map();
|
||||
const words = charword?.charWords;
|
||||
if (!words || typeof words !== 'object') return out;
|
||||
/** @type {Map<string, Map<string, Map<string, {index:number, asset:string}>>>} */
|
||||
const seen = new Map();
|
||||
for (const e of Object.values(words)) {
|
||||
if (!e || typeof e !== 'object') continue;
|
||||
const charId = e.charId, slot = VOICE_SLOTS[e.placeType], vid = e.voiceId;
|
||||
if (!charId || !slot || (keep && !keep.has(slot)) || typeof vid !== 'string' || !vid.startsWith(`${lang}_`)) continue;
|
||||
if (e.wordKey !== charId) continue;
|
||||
if (typeof e.voiceAsset !== 'string' || !e.voiceAsset) continue;
|
||||
if (!seen.has(charId)) seen.set(charId, new Map());
|
||||
const slots = seen.get(charId);
|
||||
if (!slots.has(slot)) slots.set(slot, new Map());
|
||||
// the same line can be listed twice (an operator's 升变 / alt records): keep its lowest voiceIndex, once
|
||||
const m = slots.get(slot);
|
||||
const index = Number.isFinite(e.voiceIndex) ? e.voiceIndex : 0;
|
||||
const prev = m.get(vid);
|
||||
if (!prev || index < prev.index) m.set(vid, { index, asset: e.voiceAsset });
|
||||
}
|
||||
for (const [charId, slots] of seen) {
|
||||
const rec = {};
|
||||
for (const [slot, m] of slots) rec[slot] = [...m.values()].sort((a, b) => a.index - b.index).map((x) => x.asset);
|
||||
out.set(charId, rec);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
+15
-5
@@ -1,6 +1,7 @@
|
||||
// Cached upstream JSON indexes needed by the asset pipeline:
|
||||
// .cache/gamedata/excel/audio_data.json (Kengxxiao/ArknightsGameData, zh_CN)
|
||||
// .cache/ark-models/models_data.json (isHarryh/Ark-Models enemy Spine index)
|
||||
// .cache/gamedata/excel/audio_data.json (Kengxxiao/ArknightsGameData, zh_CN)
|
||||
// .cache/gamedata/excel/charword_table.json (same repo: the operators' voice slots and voice assets)
|
||||
// .cache/ark-models/models_data.json (isHarryh/Ark-Models enemy Spine index)
|
||||
// Downloaded once when missing (or with --refresh-index), then reused.
|
||||
|
||||
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
||||
@@ -46,10 +47,10 @@ export async function cachedJson({ cacheFile, url, refresh = false, offline = fa
|
||||
}
|
||||
|
||||
/**
|
||||
* Load audio_data.json (official) and Ark-Models models_data.json.
|
||||
* Load audio_data.json (official), charword_table.json (official voice slots) and Ark-Models models_data.json.
|
||||
* @param {string} root project root
|
||||
* @param {{refresh?:boolean, offline?:boolean, log?:(m:string)=>void}} [opts]
|
||||
* @returns {Promise<{ audioData: any, modelsData: any }>}
|
||||
* @returns {Promise<{ audioData: any, modelsData: any, charword: any }>}
|
||||
*/
|
||||
export async function loadIndexes(root, opts = {}) {
|
||||
const audioData = await cachedJson({
|
||||
@@ -59,6 +60,15 @@ export async function loadIndexes(root, opts = {}) {
|
||||
offline: opts.offline,
|
||||
log: opts.log,
|
||||
});
|
||||
// 11 MB, and raw.githubusercontent stalls on it often: the jsDelivr mirror cachedJson() falls back to is the
|
||||
// reliable path (the operator battle voice needs it, plan.mjs indexVoice).
|
||||
const charword = await cachedJson({
|
||||
cacheFile: join(root, '.cache', 'gamedata', 'excel', 'charword_table.json'),
|
||||
url: RAW.gamedata + 'excel/charword_table.json',
|
||||
refresh: opts.refresh,
|
||||
offline: opts.offline,
|
||||
log: opts.log,
|
||||
});
|
||||
const modelsData = await cachedJson({
|
||||
cacheFile: join(root, '.cache', 'ark-models', 'models_data.json'),
|
||||
url: RAW.arkModels + 'models_data.json',
|
||||
@@ -66,5 +76,5 @@ export async function loadIndexes(root, opts = {}) {
|
||||
offline: opts.offline,
|
||||
log: opts.log,
|
||||
});
|
||||
return { audioData, modelsData };
|
||||
return { audioData, modelsData, charword };
|
||||
}
|
||||
+53
-3
@@ -23,10 +23,16 @@
|
||||
|
||||
import { RAW, joinUrl, safeName, urlBase, urlDir } from './sources.mjs';
|
||||
import { kindOf } from './formats.mjs';
|
||||
import { pickUnitSfx, UI_SFX, BATTLE_SFX, resolveSpec } from './audio.mjs';
|
||||
import { pickUnitSfx, UI_SFX, BATTLE_SFX, resolveSpec, indexVoice, VOICE_DIRS, VOICE_BATTLE_SLOTS } from './audio.mjs';
|
||||
import { literal } from './manifest.mjs';
|
||||
import { EMOTE_CATALOG } from '../../shared/constants.js';
|
||||
|
||||
/**
|
||||
* The voice slots are read from the zh_CN charword table, whose voiceIds are always `CN_*`: the other dubs
|
||||
* (`--voice-lang=jp|en|kr`) share the very same slot numbering and file names, only the dump folder differs.
|
||||
*/
|
||||
const VOICE_ID_LANG = 'CN';
|
||||
|
||||
/**
|
||||
* Enemies whose Spine no community dump carries: the web model is another enemy's (research 07 §5.6). Their official
|
||||
* models come from the local client only (tools/local-extract ENEMY_SPINES): `localEnemySpines` adds them as the
|
||||
@@ -130,6 +136,14 @@ function leaf(...alts) {
|
||||
return list.length ? { alts: list } : null;
|
||||
}
|
||||
|
||||
/** One operator voice line: charword voiceAsset ('char_263_skadi/CN_023') → `audio/voice/<lang>/<charId>/cn_023.mp3`. */
|
||||
function voiceAlt(asset, lang) {
|
||||
const [charId, voiceId] = String(asset).split('/');
|
||||
if (!charId || !voiceId || !/^[a-z0-9_]+$/i.test(charId) || !/^[a-z]{2}_\d+$/i.test(voiceId)) return null;
|
||||
const file = `${charId}/${voiceId.toLowerCase()}.mp3`;
|
||||
return alt(`audio/voice/${lang}/${file}`, joinUrl(RAW.aa2voice, `${VOICE_DIRS[lang]}/${file}`));
|
||||
}
|
||||
|
||||
/** Sound path under sound_beta_2 → alternative under public/assets/audio/<sub>. */
|
||||
function soundAlt(path, sub = 'sfx') {
|
||||
const rel = `audio/${sub}/` + path.split('/').map(safeName).join('/');
|
||||
@@ -280,6 +294,11 @@ export function collectEnemyIds({ assets07, enemies05, maps05, ops03 }) {
|
||||
* @param {any} p.maps05 docs/research/05-maps.json
|
||||
* @param {ReturnType<import('./audio.mjs').indexAudio>} p.audio indexed audio_data.json
|
||||
* @param {any} p.modelsData Ark-Models models_data.json
|
||||
* @param {any} [p.charword] parsed excel/charword_table.json — the operators' official voice slots (voice)
|
||||
* @param {string} [p.voiceLang] voice dump to plan: cn (default) | jp | en | kr
|
||||
* @param {Iterable<string>|null} [p.voiceSlots] which voice slots to plan: VOICE_BATTLE_SLOTS (default) plans only the
|
||||
* lines a battle can play, null plans every slot of audio.mjs VOICE_SLOTS (`--voice-all`). The prep-only slots
|
||||
* (干员报到 / 编入队伍 / 任命队长) are never requested by the client and cost 360 files / 19.3 MB of downloads.
|
||||
* @param {string[]} [p.extraEnemyIds] more enemy ids that can spawn (e.g. keys of data/enemies.json)
|
||||
* @param {string[]} [p.extraTokenIds] more token ids (e.g. token_* keys of data/tokens.json)
|
||||
* @param {Record<string,string>} [p.extraHandbook] enemyId → handbook/model id (e.g. from data/bosses.json)
|
||||
@@ -293,7 +312,9 @@ export function collectEnemyIds({ assets07, enemies05, maps05, ops03 }) {
|
||||
* official type icon (arts/ui/uniequiptype) the 干员调配 / 自选 module tiles draw when the local-client art lacks it
|
||||
* @returns {{ template: any, models: Map<string, any>, notes: string[] }}
|
||||
*/
|
||||
export function buildPlan({ assets07, ops03, enemies05, maps05, audio, modelsData, extraEnemyIds = [], extraTokenIds = [], extraHandbook = {}, localEnemySpines = {}, extraOperators = {}, moduleTypes = [] }) {
|
||||
export function buildPlan({ assets07, ops03, enemies05, maps05, audio, modelsData, charword = null, voiceLang = 'cn',
|
||||
voiceSlots = VOICE_BATTLE_SLOTS,
|
||||
extraEnemyIds = [], extraTokenIds = [], extraHandbook = {}, localEnemySpines = {}, extraOperators = {}, moduleTypes = [] }) {
|
||||
const notes = [];
|
||||
/** @type {Map<string, any>} */
|
||||
const models = new Map();
|
||||
@@ -578,9 +599,38 @@ export function buildPlan({ assets07, ops03, enemies05, maps05, audio, modelsDat
|
||||
modules[t] = leaf(alt(`module/${safeName(t)}.png`, [...new Set([t, t.toLowerCase()])].map((n) => joinUrl(RAW.aa2, `arts/ui/uniequiptype/${n}.png`))));
|
||||
}
|
||||
|
||||
// --- 干员战斗语音 (excel/charword_table.json → audio.voice) ---------------------------------------------
|
||||
// The official lines of every operator the mode can field, for the slots a battle can actually play: 行动出发 start /
|
||||
// 行动开始 faceEnemy / 选中干员 select / 部署 place / 作战中1-4 skillN / 结算 result* (charword `placeType`,
|
||||
// audio.mjs VOICE_BATTLE_SLOTS). A slot with several lines stays an array — the client draws one at random
|
||||
// (public/js/audio.js voice). Operators without official battle voice keep no entry at all: the 17 预备干员
|
||||
// (char_60x_c*, char_617_sharp2) and the mode's own 盟约·辅助干员 (char_616_pithst).
|
||||
// The three prep-only slots (干员报到 gacha / 编入队伍 squad / 任命队长 squadFirst) are NOT planned by default: the
|
||||
// client never requests them, and downloading them adds 360 files / 19.3 MB to every `npm run assets` — pass --voice-all for
|
||||
// the complete official set (`voiceSlots: null`, reviewer note on the voice PR).
|
||||
const voice = {};
|
||||
for (const [charId, slots] of indexVoice(charword, VOICE_ID_LANG, voiceSlots)) {
|
||||
if (!chars[charId]) continue; // only the operators this game can field (`chars`: the 138 pool charIds and the 自选 picks)
|
||||
const v = {};
|
||||
for (const [slot, assets] of Object.entries(slots)) {
|
||||
// one leaf per line (部署1 / 部署2 …): an array stays an array so the client can draw one — chaining them as
|
||||
// alternatives of a single leaf would keep only the first line that landed on disk.
|
||||
const lines = assets.map((a) => leaf(voiceAlt(a, voiceLang))).filter(Boolean);
|
||||
if (!lines.length) continue;
|
||||
v[slot] = lines.length === 1 ? lines[0] : lines;
|
||||
}
|
||||
if (Object.keys(v).length) voice[charId] = v;
|
||||
}
|
||||
if (!Object.keys(voice).length) notes.push('battle voice: charword_table.json has no slots (index missing?)');
|
||||
|
||||
const template = {
|
||||
chars, enemies, tokens, bonds, items, bands, skills, skillsById, modules, ui, prof,
|
||||
audio: { bgm, bossBgm: Object.fromEntries(Object.entries(bossBgm).sort(([a], [b]) => a.localeCompare(b, 'en', { numeric: true }))), sfx: { ui: sfxUi, battle: sfxBattle, units: unitsSfx } },
|
||||
audio: {
|
||||
bgm,
|
||||
bossBgm: Object.fromEntries(Object.entries(bossBgm).sort(([a], [b]) => a.localeCompare(b, 'en', { numeric: true }))),
|
||||
voice,
|
||||
sfx: { ui: sfxUi, battle: sfxBattle, units: unitsSfx },
|
||||
},
|
||||
};
|
||||
return { template, models, notes };
|
||||
}
|
||||
+17
-7
@@ -46,7 +46,7 @@ import { dirname, join, relative, sep } from 'node:path';
|
||||
import { fileURLToPath, pathToFileURL } from 'node:url';
|
||||
import { Downloader } from './assets/downloader.mjs';
|
||||
import { loadIndexes } from './assets/cache.mjs';
|
||||
import { indexAudio } from './assets/audio.mjs';
|
||||
import { indexAudio, VOICE_DIRS } from './assets/audio.mjs';
|
||||
import { buildPlan } from './assets/plan.mjs';
|
||||
import { processModels, findLocalEnemyModels, localEnemySpineMeta, loadLocalEnemySpines, LOCAL_ENEMY_SPINES_FILE } from './assets/spine.mjs';
|
||||
import { collectLeaves, downloadLeaves, resolveTemplate, totalBytes, contentHash, droppedEntries, MANIFEST_VERSION } from './assets/manifest.mjs';
|
||||
@@ -66,7 +66,10 @@ const HELP = `Usage: node tools/fetch-assets.mjs [options]
|
||||
--force re-download files even when present
|
||||
--offline no network: post-process what is on disk and rebuild data/assets.json
|
||||
--dry-run print the plan and exit
|
||||
--refresh-index re-download audio_data.json / models_data.json indexes
|
||||
--refresh-index re-download the audio_data.json / charword_table.json / models_data.json indexes
|
||||
--voice-lang=cn operator battle voice language: cn (default) | jp | en | kr
|
||||
--voice-all plan every official voice slot, including the prep-only lines no battle plays
|
||||
(干员报到 / 编入队伍 / 任命队长; 360 files / 19.3 MB more per run — off by default)
|
||||
--prune delete files under public/assets that the manifest no longer references
|
||||
(public/assets/local/** of tools/local-extract is never deleted); implies --allow-shrink
|
||||
--allow-shrink write data/assets.json even when it loses entries the current one has
|
||||
@@ -80,10 +83,10 @@ const HELP = `Usage: node tools/fetch-assets.mjs [options]
|
||||
/**
|
||||
* Parse CLI flags.
|
||||
* @param {string[]} argv
|
||||
* @returns {{concurrency:number, force:boolean, offline:boolean, dryRun:boolean, refreshIndex:boolean, prune:boolean, allowShrink:boolean, addOnly:boolean, localSpines:boolean, help:boolean}}
|
||||
* @returns {{concurrency:number, force:boolean, offline:boolean, dryRun:boolean, refreshIndex:boolean, prune:boolean, allowShrink:boolean, addOnly:boolean, localSpines:boolean, voiceLang:string, voiceAll:boolean, help:boolean}}
|
||||
*/
|
||||
export function parseArgs(argv) {
|
||||
const o = { concurrency: 16, force: false, offline: false, dryRun: false, refreshIndex: false, prune: false, allowShrink: false, addOnly: false, localSpines: false, help: false };
|
||||
const o = { concurrency: 16, force: false, offline: false, dryRun: false, refreshIndex: false, prune: false, allowShrink: false, addOnly: false, localSpines: false, voiceLang: 'cn', voiceAll: false, help: false };
|
||||
for (const a of argv) {
|
||||
const [k, v] = a.split('=');
|
||||
if (k === '--concurrency') o.concurrency = Math.max(1, Math.min(64, parseInt(v, 10) || 16));
|
||||
@@ -95,6 +98,8 @@ export function parseArgs(argv) {
|
||||
else if (k === '--allow-shrink') o.allowShrink = true;
|
||||
else if (k === '--add-only') o.addOnly = true;
|
||||
else if (k === '--local-spines') o.localSpines = true;
|
||||
else if (k === '--voice-lang') { if (!VOICE_DIRS[v]) throw new Error(`unknown --voice-lang ${v} (cn | jp | en | kr)`); o.voiceLang = v; }
|
||||
else if (k === '--voice-all') o.voiceAll = true;
|
||||
else if (k === '--help' || k === '-h') o.help = true;
|
||||
else throw new Error(`unknown option ${a}\n${HELP}`);
|
||||
}
|
||||
@@ -198,6 +203,7 @@ function countStats(m, bytes, files) {
|
||||
modules: Object.keys(m.modules || {}).length,
|
||||
ui: Object.keys(m.ui || {}).length,
|
||||
sfxUnits: Object.keys(m.audio?.sfx?.units || {}).length,
|
||||
voiceChars: Object.keys(m.audio?.voice || {}).length,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -258,7 +264,7 @@ async function main() {
|
||||
readJson('docs/research/05-enemies.json'),
|
||||
readJson('docs/research/05-maps.json'),
|
||||
]);
|
||||
const { audioData, modelsData } = await loadIndexes(ROOT, { refresh: opts.refreshIndex && !opts.offline, offline: opts.offline, log });
|
||||
const { audioData, modelsData, charword } = await loadIndexes(ROOT, { refresh: opts.refreshIndex && !opts.offline, offline: opts.offline, log });
|
||||
const audio = indexAudio(audioData);
|
||||
// The game data built by tools/build-data.mjs (when present) may reference more
|
||||
// spawnable enemies/tokens than research lists (e.g. 机变 enemy swaps): cover them too.
|
||||
@@ -269,7 +275,9 @@ async function main() {
|
||||
for (const b of Object.values(dataBosses || {})) if (b?.enemyKey && typeof b.handbookId === 'string') extraHandbook[b.enemyKey] = b.handbookId;
|
||||
const localEnemySpines = await syncLocalEnemySpines(opts);
|
||||
const plan = buildPlan({
|
||||
assets07, ops03, enemies05, maps05, audio, modelsData,
|
||||
assets07, ops03, enemies05, maps05, audio, modelsData, charword, voiceLang: opts.voiceLang,
|
||||
// default: only the slots a battle can play (plan.mjs VOICE_BATTLE_SLOTS); --voice-all takes the whole official set
|
||||
voiceSlots: opts.voiceAll ? null : undefined,
|
||||
extraEnemyIds: Object.keys(dataEnemies || {}),
|
||||
extraTokenIds: [...Object.keys(dataTokens || {}), ...extras.tokenIds],
|
||||
extraHandbook,
|
||||
@@ -281,7 +289,8 @@ async function main() {
|
||||
log(`[plan] ${leaves.length} files + ${plan.models.size} Spine models ` +
|
||||
`(${Object.keys(plan.template.chars).length} chars, ${Object.keys(plan.template.enemies).length} enemies, ` +
|
||||
`${Object.keys(plan.template.tokens).length} tokens, ${Object.keys(plan.template.ui).length} UI sprites, ` +
|
||||
`${Object.keys(plan.template.audio.sfx.units).length} units with SFX)`);
|
||||
`${Object.keys(plan.template.audio.sfx.units).length} units with SFX, ` +
|
||||
`${Object.keys(plan.template.audio.voice).length} operators with ${opts.voiceLang.toUpperCase()} voice)`);
|
||||
if (opts.dryRun) {
|
||||
for (const n of plan.notes) log(` note: ${n}`);
|
||||
return 0;
|
||||
@@ -370,6 +379,7 @@ async function main() {
|
||||
log(`on disk (manifest) : ${mb(s.bytes)} in ${s.files} files`);
|
||||
log(`chars ${s.chars} (Back model ${s.charsWithBack}) · enemies ${s.enemies} (Spine ${s.enemiesWithSpine}) · tokens ${s.tokens} (Spine ${s.tokensWithSpine}) · Spine models ${s.spineModels}`);
|
||||
log(`bonds ${s.bonds} · items ${s.items} · bands ${s.bands} · skill icons ${s.skills} · UI ${s.ui} · units with SFX ${s.sfxUnits}`);
|
||||
log(`operator battle voice: ${s.voiceChars} charIds (--voice-lang=${opts.voiceLang})`);
|
||||
log(`fonts: ${Object.values(fonts.files).map((f) => f.woff2 || f.original).join(', ') || 'none'}`);
|
||||
if (resolved.fallbacks.length) { log(`fallbacks used (${resolved.fallbacks.length}):`); for (const f of resolved.fallbacks.slice(0, 20)) log(` ${f}`); }
|
||||
if (downloadErrors.length) log(`download errors (${downloadErrors.length}, re-run to retry): ${downloadErrors.slice(0, 10).join(', ')}`);
|
||||
|
||||
Reference in new issue
Block a user