From 0f71d1a62f042482c45fed831a7b2f01c42c95b1 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 12:54:59 +0000 Subject: [PATCH 01/22] Add a Timings tab with WuwaLAB ability frame data The Characters page gets a Timings tab next to Moves, laid out like WuwaLAB's Abilities tab: abilities grouped by section, with hits, total frames, cancel frame, no-swap window, time stop, motion stop, cooldown, WuwaLAB's chips (TIME STOP / MOTION STOP) and each hit's frame. It has a name filter and a frames/seconds toggle (60 fps), and credits WuwaLAB. - static/data/ww_timings.json: 39 characters, 954 abilities, keyed by the ids in ww_characters.json. Timing columns only, no damage. - tools/ww_import_timings.py rebuilds it from a WuwaLAB scrape. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01XnctbwSWKszAPHhVFMYjj4 --- README.md | 3 +- static/characters.css | 51 ++ static/characters.js | 131 +++- static/data/ww_timings.json | 1235 +++++++++++++++++++++++++++++++++++ tests/test_ww_timings.py | 48 ++ tools/ww_import_timings.py | 114 ++++ 6 files changed, 1578 insertions(+), 4 deletions(-) create mode 100644 static/data/ww_timings.json create mode 100644 tests/test_ww_timings.py create mode 100644 tools/ww_import_timings.py diff --git a/README.md b/README.md index b51eb64..32aa4d1 100644 --- a/README.md +++ b/README.md @@ -127,9 +127,10 @@ A built-in, NohBoard-style key display for streams and recordings: WASD, Shift, The **Characters** page (in the sidebar, or `http://localhost:8737/characters.html`) shows what each Wuthering Waves character's buttons do. It covers inputs only: no damage numbers. - **Moves**: the Basic Attack chain (A1, A2, ...), what holding LMB does, which hit LMB lands on after the Intro, Skill, Liberation, a Heavy, a Dodge Counter or a Mid-air Attack, and each move with its key. The timeline's move names use the same data. +- **Timings**: each ability's frame data from [WuwaLAB](https://wuwalab.com), laid out like WuwaLAB's Abilities tab: hits, total frames, the earliest cancel frame, how long until you can swap, time stop, motion stop, cooldown and the frame each hit lands on. Switch between frames and seconds (60 fps), and filter by name. - **Team rotations**: the community's team setups for that character with author and video, from [AntoCrasher's rotation compilation](https://docs.google.com/spreadsheets/d/1mdl9J08N-0_j-U2zNP5OTHGBKprwmJEmz_Iy4IOJfPk/edit). **Combo** opens the move-by-move rotation transcript, converts it to tracker inputs (swaps use the team's slot order; no timings), and **Save as combo** adds it to your combos with the video attached. -The move data ships with the app in `static/data/ww_characters.json`. It was drafted from the [encore.moe](https://encore.moe) API and checked by hand for the characters marked "Checked by hand"; edit that file to fix or add details. **Download raw data** saves encore.moe's unedited files to `data/encore_raw/` without changing anything shown; `python tools/ww_build_moves.py` then drafts any new characters from them (hand-checked entries are left alone). Rotations are downloaded when you open them and cached in `ww_library_cache/`. +The move data ships with the app in `static/data/ww_characters.json`. It was drafted from the [encore.moe](https://encore.moe) API and checked by hand for the characters marked "Checked by hand"; edit that file to fix or add details. **Download raw data** saves encore.moe's unedited files to `data/encore_raw/` without changing anything shown; `python tools/ww_build_moves.py` then drafts any new characters from them (hand-checked entries are left alone). The timings ship in `static/data/ww_timings.json`; to update them, scrape WuwaLAB's ability pages into one JSON file and run `python tools/ww_import_timings.py that-file.json` (damage columns are dropped). Rotations are downloaded when you open them and cached in `ww_library_cache/`. --- diff --git a/static/characters.css b/static/characters.css index fffe076..c813116 100644 --- a/static/characters.css +++ b/static/characters.css @@ -163,6 +163,7 @@ input[type="search"], select, textarea { border-radius: var(--radius); padding: 20px; min-height: 300px; + min-width: 0; /* let the wide Timings table scroll inside it instead of widening the page */ } .empty, .loading { color: var(--text-secondary); padding: 40px 0; text-align: center; } .error { color: var(--accent-red); padding: 20px 0; } @@ -214,6 +215,54 @@ input[type="search"], select, textarea { .other-moves { margin-top: 12px; font-size: 13px; } .other-moves h4 { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--text-secondary); margin: 0 0 4px; } +/* --- Timings (WuwaLAB frame data) --- */ +.toolbar #timingFilter { width: 220px; } +.seg { display: inline-flex; border: 1px solid var(--line-strong); border-radius: 6px; overflow: hidden; } +.seg button { border: none; border-radius: 0; padding: 4px 10px; font-size: 12px; background: transparent; color: var(--text-secondary); } +.seg button.on { background: #152E38; color: var(--text-primary); } +.timings-wrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-primary); } +.timings { border-collapse: collapse; width: 100%; font-size: 13px; } +.timings th { + font-family: ui-monospace, Consolas, monospace; + font-size: 11px; + font-weight: 500; + text-transform: uppercase; + letter-spacing: 0.06em; + color: var(--text-secondary); + text-align: left; + padding: 10px 10px; + border-bottom: 1px solid var(--line); + white-space: nowrap; + cursor: help; +} +.timings th.strong { color: var(--accent-yellow); } +.timings td { padding: 8px 10px; border-bottom: 1px solid var(--line); vertical-align: top; } +.timings .num { text-align: right; font-family: ui-monospace, Consolas, monospace; white-space: nowrap; } +.timings td.strong { font-weight: 700; color: var(--text-primary); } +.timings .zero { color: #4E5866; } +.timings .tname { min-width: 220px; } +.timings .hitf { font-family: ui-monospace, Consolas, monospace; font-size: 12px; color: var(--text-secondary); min-width: 140px; } +.timings .sep { color: #4E5866; } +.timings tr.tsection td { + font-family: ui-monospace, Consolas, monospace; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.06em; + color: var(--accent-red); + padding-top: 16px; +} +.timings tbody tr:not(.tsection):hover { background: var(--bg-secondary); } +.ttags { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; } +.ttag { + font-family: ui-monospace, Consolas, monospace; + font-size: 10px; + letter-spacing: 0.04em; + color: var(--accent-yellow); + border: 1px solid var(--accent-yellow); + border-radius: 3px; + padding: 0 5px; +} + /* --- Rotations --- */ .detail h3 { font-size: 15px; margin: 18px 0 10px; } .detail h3:first-child { margin-top: 0; } @@ -268,6 +317,8 @@ input[type="search"], select, textarea { .topbar { padding: 10px 12px; position: static; } .topbar input[type="search"] { flex: 1; width: auto; } .who { width: 70px; } + .toolbar #timingFilter { flex: 1; width: auto; } + .timings .tname { min-width: 170px; } } /* Embedded as the main app's Characters page (characters.html?embed=1): the app shell has the title and nav. */ diff --git a/static/characters.js b/static/characters.js index a0c95bc..34ac4e1 100644 --- a/static/characters.js +++ b/static/characters.js @@ -1,12 +1,14 @@ // Characters page: each character's key-input moves (static/data/ww_characters.json, drafted from -// encore.moe and checked by hand) and community team rotations (AntoCrasher's compilation + -// rotation transcripts, served by ui_server.py under /api/ww/). +// encore.moe and checked by hand), ability frame timings (static/data/ww_timings.json, from +// WuwaLAB) and community team rotations (AntoCrasher's compilation + rotation transcripts, +// served by ui_server.py under /api/ww/). // Shown inside the main app's Characters page: hide this page's own back link and title. if (new URLSearchParams(location.search).has('embed')) document.documentElement.classList.add('embed'); const ELEMENTS = ['Aero', 'Electro', 'Fusion', 'Glacio', 'Havoc', 'Spectro']; const MOVES_URL = 'data/ww_characters.json'; +const TIMINGS_URL = 'data/ww_timings.json'; // Abbreviations from AntoCrasher's rotation hub; each rotation's own list (if any) wins. const DEFAULT_GLOSSARY = { @@ -26,12 +28,23 @@ const state = { selectedId: null, tab: 'moves', moves: new Map(), // character id -> entry from ww_characters.json + timings: null, // ww_timings.json: {fps, fetched_at, characters: {id: {url, abilities}}} + timingFilter: '', + timingUnit: readPref('ww-timing-unit', 'f'), // 'f' frames or 's' seconds transcripts: new Map(), tracker: null, }; const $ = (id) => document.getElementById(id); +function readPref(key, fallback) { + try { return localStorage.getItem(key) || fallback; } catch { return fallback; } +} + +function writePref(key, value) { + try { localStorage.setItem(key, value); } catch { /* storage blocked: keep it for this visit only */ } +} + function esc(s) { return String(s ?? '').replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c])); } @@ -180,6 +193,7 @@ function detailHeader(c) { const icon = safeUrl(c.icon); const { main, featured } = rotationsFor(c.name); const count = (main ? main.teams.length : 0) + featured.length; + const t = timingsFor(c); return `
${icon ? `` : ''}
@@ -189,6 +203,7 @@ function detailHeader(c) {
+
`; } @@ -196,7 +211,9 @@ function detailHeader(c) { function renderDetail() { const c = state.roster.find((x) => x.id === state.selectedId); if (!c) return; - const body = state.tab === 'moves' ? renderMoves(c) : renderRotations(c); + const body = state.tab === 'moves' ? renderMoves(c) + : state.tab === 'timings' ? renderTimings(c) + : renderRotations(c); $('detail').innerHTML = detailHeader(c) + body; } @@ -255,6 +272,89 @@ function renderMoves(c) { ${follow ? `

Follow-ups

` : ''}`; } +// --- Timings (frame data from WuwaLAB; static/data/ww_timings.json) ------------ + +// Columns in WuwaLAB's order, timing columns only (no damage). +const TIMING_COLS = [ + { key: 'hits', label: 'Hits', tip: 'Number of hits', frames: false }, + { key: 'frames', label: 'Frames', tip: 'Full animation length', frames: true }, + { key: 'cancel', label: 'Cancel', tip: 'Earliest frame the next action can cancel this one', frames: true }, + { key: 'noswap', label: 'No swap', tip: "Frames before you can swap out", frames: true }, + { key: 'tstop', label: 'T.stop', tip: 'Time stop: the whole field freezes', frames: true }, + { key: 'mstop', label: 'M.stop', tip: 'Motion stop: hit-stop on the character', frames: true }, + { key: 'cd', label: 'CD', tip: 'Cooldown', frames: true }, +]; + +function timingsFor(c) { + return state.timings && state.timings.characters ? state.timings.characters[String(c.id)] : null; +} + +// 73 -> "73f" or "1.22s", per the unit toggle. Zero and missing values are dimmed. +function fmtFrames(n) { + if (n == null) return '—'; + const fps = (state.timings && state.timings.fps) || 60; + const text = state.timingUnit === 's' ? `${(n / fps).toFixed(2)}s` : `${n}f`; + return n === 0 ? `${text}` : text; +} + +function timingCell(a, col) { + const v = a[col.key]; + if (!col.frames) return v ? String(v) : `${v ?? '—'}`; + return fmtFrames(v); +} + +function timingRow(a) { + const tags = (a.tags || []).map((t) => `${esc(t)}`).join(''); + const cells = TIMING_COLS.map((col) => + `${timingCell(a, col)}`).join(''); + const hitFrames = (a.hit_frames || []).map((f) => fmtFrames(f)).join(' · '); + return ` +
${esc(a.name)}
${tags ? `
${tags}
` : ''} + ${cells} + ${hitFrames || '—'} + `; +} + +function timingRows(t) { + const q = state.timingFilter.toLowerCase(); + const list = t.abilities.filter((a) => !q || a.name.toLowerCase().includes(q) || a.section.toLowerCase().includes(q)); + const span = TIMING_COLS.length + 2; + let html = ''; + let section = null; + for (const a of list) { + if (a.section !== section) { + section = a.section; + html += `${esc(section)}`; + } + html += timingRow(a); + } + return html || `No abilities match.`; +} + +function renderTimings(c) { + const t = timingsFor(c); + if (!state.timings) return '

Loading timings…

'; + if (!t) return `

WuwaLAB has no frame data for ${esc(c.name)} yet.

`; + const fps = state.timings.fps || 60; + const head = TIMING_COLS.map((col) => + `${esc(col.label)}`).join(''); + const unit = (u, label) => + ``; + const url = safeUrl(t.url); + return `
+ +
${unit('f', 'Frames')}${unit('s', 'Seconds')}
+ ${fps} fps · 1f = ${(1000 / fps).toFixed(2)} ms +
+
+ + ${head} + ${timingRows(t)} +
NameHit frames
+
+

Frame data from ${url ? `WuwaLAB` : 'WuwaLAB'}${state.timings.fetched_at ? `, copied ${esc(state.timings.fetched_at.split(' ')[0])}` : ''}. Timing columns only. Hover a column name for what it means.

`; +} + // --- Rotations ---------------------------------------------------------------- function teamRow(t, idx, showMain) { @@ -404,6 +504,13 @@ function bindEvents() { renderDetail(); return; } + const unit = e.target.closest('[data-unit]'); + if (unit) { + state.timingUnit = unit.dataset.unit; + writePref('ww-timing-unit', state.timingUnit); + renderDetail(); + return; + } const act = e.target.closest('[data-act]'); if (!act) return; const teamEl = act.closest('.team'); @@ -416,6 +523,14 @@ function bindEvents() { ); } else if (act.dataset.act === 'save') saveAsCombo(teamEl); }); + // Filtering re-renders only the table body so the filter box keeps focus. + $('detail').addEventListener('input', (e) => { + if (e.target.id !== 'timingFilter') return; + state.timingFilter = e.target.value.trim(); + const c = state.roster.find((x) => x.id === state.selectedId); + const t = c && timingsFor(c); + if (t) $('timingRows').innerHTML = timingRows(t); + }); $('rawBtn').addEventListener('click', downloadRaw); window.addEventListener('hashchange', () => { const id = Number(location.hash.slice(1)); @@ -442,6 +557,16 @@ async function load() { const id = Number(location.hash.slice(1)) || state.selectedId; if (id) selectCharacter(id, { pushHash: false }); + try { + const res = await fetch(TIMINGS_URL); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + state.timings = await res.json(); + } catch (e) { + state.timings = { characters: {} }; + showNotice(`Couldn't load ability timings: ${e.message}`, 'warn'); + } + if (state.selectedId) renderDetail(); + try { const rot = await api('rotations'); state.rotations = rot.groups; diff --git a/static/data/ww_timings.json b/static/data/ww_timings.json new file mode 100644 index 0000000..f4f818c --- /dev/null +++ b/static/data/ww_timings.json @@ -0,0 +1,1235 @@ +{ + "about": "Ability frame data from WuwaLAB (https://wuwalab.com), timing columns only. Built by tools/ww_import_timings.py; keyed by the ids in ww_characters.json.", + "source": "https://wuwalab.com", + "fetched_at": "2026-10-01 08:51", + "fps": 60, + "characters": { + "1210": { + "name": "Aemeath", + "wuwalab_name": "Aemeath", + "url": "https://wuwalab.com/characters/aemeath/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Songs Across the Universe", "tags": ["MOTION STOP 5–49F"], "hits": 3, "frames": 72, "cancel": 59, "noswap": 60, "tstop": 0, "mstop": 44, "cd": null, "hit_frames": [52, 56, 59]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Debut of Meteoric Radiance", "tags": ["MOTION STOP 5–44F"], "hits": 2, "frames": 74, "cancel": 60, "noswap": 72, "tstop": 0, "mstop": 39, "cd": null, "hit_frames": [42, 60]}, + {"section": "INTRO / OUTRO", "name": "Outro: Silent Protection", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath 1", "tags": [], "hits": 1, "frames": 23, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath 2", "tags": [], "hits": 3, "frames": 43, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 11, 23]}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath 3", "tags": [], "hits": 5, "frames": 46, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [4, 12, 18, 25, 27]}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath 3 (Dodge Counter)", "tags": [], "hits": 5, "frames": 54, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [4, 12, 18, 25, 27]}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath 4", "tags": [], "hits": 6, "frames": 60, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0, 2, 11, 20, 29, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Aemeath (Mid-Air)", "tags": [], "hits": 1, "frames": 53, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [42]}, + {"section": "BASIC ATTACK", "name": "Basic: Mech 1", "tags": [], "hits": 3, "frames": 33, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 20, 28]}, + {"section": "BASIC ATTACK", "name": "Basic: Mech 2", "tags": [], "hits": 2, "frames": 47, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Mech 3", "tags": [], "hits": 8, "frames": 64, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0, 10, 14, 19, 23, 28, 32, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Mech 3 (Dodge Counter)", "tags": [], "hits": 8, "frames": 66, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0, 10, 14, 19, 23, 28, 32, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Mech 4", "tags": [], "hits": 2, "frames": 62, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [38, 71]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Aemeath Charged 2 (Instant Response)", "tags": [], "hits": 5, "frames": 95, "cancel": 81, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [44, 49, 60, 66, 81]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Mech Charged 2 (Instant Response)", "tags": [], "hits": 1, "frames": 56, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [40]}, + {"section": "RESONANCE SKILL", "name": "Skill: Form Switch (Mech)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Sync Strike (Armament Merge)", "tags": [], "hits": 3, "frames": 79, "cancel": 65, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 44, 65]}, + {"section": "RESONANCE SKILL", "name": "Skill: Form Switch (Aemeath)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Sync Strike (Call of Dawn)", "tags": [], "hits": 4, "frames": 72, "cancel": 59, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 52, 56, 59]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Heavenfall Edict - Overdrive", "tags": ["TIME STOP 262F", "MOTION STOP 262F"], "hits": 4, "frames": 262, "cancel": 262, "noswap": 0, "tstop": 262, "mstop": 262, "cd": 1500, "hit_frames": [214, 238, 245, 252]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Heavenfall Edict - Finale", "tags": ["TIME STOP 340F", "MOTION STOP 340F"], "hits": 1, "frames": 340, "cancel": 340, "noswap": 0, "tstop": 340, "mstop": 340, "cd": 1500, "hit_frames": [260]}, + {"section": "FORTE", "name": "Forte: Seraphic Duet - Overture", "tags": ["TIME STOP 99F", "MOTION STOP 99F"], "hits": 13, "frames": 180, "cancel": 180, "noswap": 180, "tstop": 99, "mstop": 99, "cd": null, "hit_frames": [0, 40, 44, 48, 52, 56, 60, 120, 124, 128, 153, 159, 165]}, + {"section": "FORTE", "name": "Forte: Seraphic Duet - Encore", "tags": ["TIME STOP 60F", "MOTION STOP 60F"], "hits": 8, "frames": 145, "cancel": 145, "noswap": 145, "tstop": 60, "mstop": 60, "cd": null, "hit_frames": [0, 6, 68, 80, 89, 101, 120, 124]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Aemeath", "tags": ["TIME STOP 89F", "MOTION STOP 68F"], "hits": 5, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 89, "mstop": 68, "cd": null, "hit_frames": [30, 36, 42, 48, 72]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Mech", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": null, "hit_frames": [4, 48, 74]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Rupture Response - Starburst", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0]} + ] + }, + "1306": { + "name": "Augusta", + "wuwalab_name": "Augusta", + "url": "https://wuwalab.com/characters/augusta/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Stride of Goldenflare", "tags": ["MOTION STOP 6–15F"], "hits": 2, "frames": 73, "cancel": 63, "noswap": 68, "tstop": 0, "mstop": 9, "cd": null, "hit_frames": [46, 63]}, + {"section": "INTRO / OUTRO", "name": "Outro: Battlesong of the Unyielding", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path 1", "tags": [], "hits": 1, "frames": 26, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path 2", "tags": [], "hits": 2, "frames": 51, "cancel": 33, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 33]}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path 2 (Dodge Counter)", "tags": [], "hits": 2, "frames": 51, "cancel": 33, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 33]}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path 3", "tags": [], "hits": 3, "frames": 62, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 25, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path 4", "tags": [], "hits": 3, "frames": 62, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [37, 42, 44]}, + {"section": "BASIC ATTACK", "name": "Basic: Hunter's Path (Mid-Air)", "tags": [], "hits": 2, "frames": 66, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [26, 45]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Hunter's Path", "tags": [], "hits": 3, "frames": 45, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [22, 31, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Thunderoar - Backstep", "tags": [], "hits": 1, "frames": 34, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Thunderoar - Spinslash", "tags": [], "hits": 3, "frames": 67, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [24, 45, 53]}, + {"section": "HEAVY ATTACK", "name": "Heavy 3: Thunderoar - Uppercut", "tags": [], "hits": 2, "frames": 46, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 30]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Warrior's Blade", "tags": [], "hits": 3, "frames": 43, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 900, "hit_frames": [24, 31, 43]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Undying Sunlight - Strike", "tags": [], "hits": 2, "frames": 48, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [27, 39]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Undying Sunlight - Leap", "tags": [], "hits": 3, "frames": 66, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 17, 58]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Undying Sunlight - Plunge", "tags": [], "hits": 2, "frames": 80, "cancel": 69, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [38, 69]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 1: Sword of Eternal Oath", "tags": [], "hits": 8, "frames": 106, "cancel": 85, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 1500, "hit_frames": [4, 10, 22, 28, 34, 62, 68, 85]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 2: Sublime is the Sun", "tags": ["TIME STOP 503F", "MOTION STOP 503F"], "hits": 21, "frames": 503, "cancel": 503, "noswap": 0, "tstop": 503, "mstop": 503, "cd": 1500, "hit_frames": [100, 116, 141, 161, 178, 204, 225, 241, 268, 389, 425, 435, 440, 444, 449, 454, 458, 463, 468, 472, 477]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": null, "hit_frames": [4, 26, 66]} + ] + }, + "1103": { + "name": "Baizhi", + "wuwalab_name": "Baizhi", + "url": "https://wuwalab.com/characters/baizhi/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Overflowing Frost", "tags": ["MOTION STOP 4–45F"], "hits": 1, "frames": 98, "cancel": 52, "noswap": 99, "tstop": 0, "mstop": 41, "cd": 11, "hit_frames": [52]}, + {"section": "INTRO / OUTRO", "name": "Outro: Rejuvinating Flow", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise 1", "tags": [], "hits": 1, "frames": 30, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise 2", "tags": [], "hits": 1, "frames": 43, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise 3", "tags": [], "hits": 7, "frames": 42, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [4, 6, 9, 12, 14, 17, 18]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise 4", "tags": [], "hits": 1, "frames": 45, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise (Dodge Counter)", "tags": [], "hits": 1, "frames": 55, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise (Swap-In)", "tags": [], "hits": 1, "frames": 70, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Destined Promise (Mid-Air)", "tags": [], "hits": 1, "frames": 60, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [13]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Destined Promise", "tags": [], "hits": 1, "frames": 66, "cancel": 66, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [66]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Destined Promise (Loop)", "tags": [], "hits": 1, "frames": 18, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [18]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Destined Promise (End)", "tags": [], "hits": 0, "frames": 50, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": []}, + {"section": "HEAVY ATTACK", "name": "Concentration (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "OTHER", "name": "Stimulus Feedback (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Emergency Plan", "tags": [], "hits": 1, "frames": 57, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [26]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Momentary Union", "tags": ["TIME STOP 132F", "MOTION STOP 133F"], "hits": 0, "frames": 132, "cancel": 132, "noswap": 0, "tstop": 132, "mstop": 133, "cd": 10, "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Remnant Entities", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Remnant Entities - S4", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + }, + "1307": { + "name": "Buling", + "wuwalab_name": "Buling", + "url": "https://wuwalab.com/characters/buling/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Summon and Smite", "tags": ["MOTION STOP 7–60F"], "hits": 1, "frames": 80, "cancel": 7, "noswap": 59, "tstop": 0, "mstop": 53, "cd": "0:11 70:2", "hit_frames": [61]}, + {"section": "INTRO / OUTRO", "name": "Outro: Exorcism Spell", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:11", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls 1", "tags": [], "hits": 2, "frames": 28, "cancel": 8, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [14, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls 2", "tags": [], "hits": 2, "frames": 45, "cancel": 2, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [8, 15]}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls 3", "tags": [], "hits": 2, "frames": 31, "cancel": 1, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [1, 10]}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls 3 (Dodge Counter)", "tags": [], "hits": 2, "frames": 31, "cancel": 1, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [1, 10]}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls 4", "tags": [], "hits": 1, "frames": 60, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Basic: Hexagram Calls, Lightning Falls (Mid-Air)", "tags": [], "hits": 1, "frames": 46, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:6 41:3", "hit_frames": [39]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Mountain Over Thunder", "tags": [], "hits": 1, "frames": 70, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 70:2", "hit_frames": [46]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Thunder Over Mountain", "tags": [], "hits": 1, "frames": 70, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 70:2", "hit_frames": [46]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Twin Mountains", "tags": [], "hits": 0, "frames": 60, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 60:2", "hit_frames": []}, + {"section": "HEAVY ATTACK", "name": "Heavy: Twin Thunders", "tags": [], "hits": 0, "frames": 60, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 60:2", "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: In Shadow Thunder Stirs", "tags": [], "hits": 11, "frames": 53, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 47:2", "hit_frames": [9, 60, 84, 108, 132, 156, 180, 204, 228, 252, 276]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Flashing Thunder Spell", "tags": ["TIME STOP 231F", "MOTION STOP 187F"], "hits": 1, "frames": 244, "cancel": 231, "noswap": 0, "tstop": 231, "mstop": 187, "cd": "0:10 238:2", "hit_frames": [187]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Flashing Thunder Spell - Harmony", "tags": ["TIME STOP 231F", "MOTION STOP 187F"], "hits": 1, "frames": 244, "cancel": 231, "noswap": 0, "tstop": 231, "mstop": 187, "cd": "0:10 238:2", "hit_frames": [187]}, + {"section": "RESONANCE LIBERATION", "name": "S3: Summoner of Spirits, Seeker of Fate (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Five Thunders Spell Array", "tags": [], "hits": 12, "frames": 1591, "cancel": 1591, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [271, 391, 511, 631, 751, 871, 991, 1111, 1231, 1351, 1471, 1591]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": "0:11", "hit_frames": [56]} + ] + }, + "1607": { + "name": "Cantarella", + "wuwalab_name": "Cantarella", + "url": "https://wuwalab.com/characters/cantarella/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Ripple", "tags": ["MOTION STOP 4–30F"], "hits": 4, "frames": 76, "cancel": 54, "noswap": 80, "tstop": 0, "mstop": 26, "cd": "INTRO", "hit_frames": [36, 42, 48, 54]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Tidal Surge", "tags": ["MOTION STOP 4–49F"], "hits": 4, "frames": 83, "cancel": 48, "noswap": 80, "tstop": 0, "mstop": 45, "cd": "INTRO", "hit_frames": [26, 32, 35, 48]}, + {"section": "INTRO / OUTRO", "name": "Outro: Gentle Tentacles", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Illusion Collapse 1", "tags": [], "hits": 1, "frames": 27, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Illusion Collapse 2", "tags": [], "hits": 4, "frames": 45, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 23, 29, 35]}, + {"section": "BASIC ATTACK", "name": "Basic: Illusion Collapse 2 (Dodge Counter)", "tags": [], "hits": 4, "frames": 44, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [16, 22, 28, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: Illusion Collapse 3", "tags": [], "hits": 2, "frames": 50, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [4, 19]}, + {"section": "BASIC ATTACK", "name": "Basic: Illusion Collapse (Mid-Air)", "tags": [], "hits": 2, "frames": 65, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Phantom Sting 1", "tags": [], "hits": 3, "frames": 47, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 21, 28]}, + {"section": "BASIC ATTACK", "name": "Basic: Phantom Sting 1 (Dodge Counter)", "tags": [], "hits": 3, "frames": 39, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [10, 21, 28]}, + {"section": "BASIC ATTACK", "name": "Basic: Phantom Sting 2", "tags": [], "hits": 2, "frames": 41, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 32]}, + {"section": "BASIC ATTACK", "name": "Basic: Phantom Sting 3", "tags": [], "hits": 4, "frames": 82, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [19, 25, 27, 45]}, + {"section": "BASIC ATTACK", "name": "Basic: Abysmal Vortex (Mid-Air)", "tags": [], "hits": 2, "frames": 65, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 51]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Illusion Collapse", "tags": [], "hits": 2, "frames": 50, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [6, 18]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Delusive Dive", "tags": [], "hits": 2, "frames": 43, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [10, 20]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Graceful Step", "tags": [], "hits": 2, "frames": 38, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [14, 22]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Flickering Reverie", "tags": [], "hits": 1, "frames": 28, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [12]}, + {"section": "FORTE", "name": "Forte: Perception Drain", "tags": [], "hits": 2, "frames": 80, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [41, 53]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Beneath the Sea", "tags": ["TIME STOP 214F", "MOTION STOP 170F"], "hits": 1, "frames": 214, "cancel": 214, "noswap": 0, "tstop": 214, "mstop": 170, "cd": "LIBERATION", "hit_frames": [170]}, + {"section": "RESONANCE LIBERATION", "name": "Jolt", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Dreamweaver", "tags": [], "hits": 1, "frames": 5, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [5]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": "TUNEBREAK", "hit_frames": [56]} + ] + }, + "1107": { + "name": "Carlotta", + "wuwalab_name": "Carlotta", + "url": "https://wuwalab.com/characters/carlotta/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Wintertime Aria", "tags": ["MOTION STOP 84F"], "hits": 3, "frames": 84, "cancel": 56, "noswap": 70, "tstop": 0, "mstop": 84, "cd": "INTRO", "hit_frames": [56, 65, 80]}, + {"section": "INTRO / OUTRO", "name": "Outro: Closing Remark", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": [0]}, + {"section": "INTRO / OUTRO", "name": "Outro: Kaleidoscope Sparks", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Silent Execution 1", "tags": [], "hits": 1, "frames": 16, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Basic: Silent Execution 2", "tags": [], "hits": 3, "frames": 44, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 30, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Customary Greetings", "tags": [], "hits": 2, "frames": 56, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [8, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Silent Execution (Mid-Air)", "tags": [], "hits": 1, "frames": 47, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [36]}, + {"section": "BASIC ATTACK", "name": "Basic: Silent Execution (Mid-Air) - Skill 2 FUA", "tags": [], "hits": 1, "frames": 50, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [39]}, + {"section": "BASIC ATTACK", "name": "Basic: Silent Execution (Swap-In)", "tags": [], "hits": 2, "frames": 56, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Necessary Measures 1", "tags": [], "hits": 1, "frames": 24, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Necessary Measures 2", "tags": [], "hits": 2, "frames": 46, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Necessary Measures 3", "tags": [], "hits": 5, "frames": 80, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 8, 12, 14, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Necessary Measures (Dodge Counter)", "tags": [], "hits": 2, "frames": 50, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [12, 42]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Silent Execution", "tags": [], "hits": 5, "frames": 54, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [15, 16, 18, 19, 38]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Containment Tactics", "tags": [], "hits": 5, "frames": 54, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [15, 16, 18, 19, 38]}, + {"section": "HEAVY ATTACK", "name": "Heavy 3: Imminent Oblivion", "tags": [], "hits": 6, "frames": 124, "cancel": 92, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [18, 25, 31, 38, 42, 92]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Art of Violence", "tags": [], "hits": 2, "frames": 46, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [8, 35]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Chromatic Splendor", "tags": [], "hits": 3, "frames": 121, "cancel": 82, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [40, 53, 82]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 1: Era of New Wave", "tags": ["TIME STOP 182F", "MOTION STOP 138F"], "hits": 1, "frames": 182, "cancel": 130, "noswap": 0, "tstop": 182, "mstop": 138, "cd": "LIBERATION", "hit_frames": [130]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 2: Death Knell", "tags": [], "hits": 5, "frames": 70, "cancel": 52, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "LIBERATION", "hit_frames": [40, 81, 81, 83, 83]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 2: Death Knell - S6", "tags": [], "hits": 9, "frames": 70, "cancel": 52, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "LIBERATION", "hit_frames": [40, 81, 81, 83, 83, 89, 89, 91, 91]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation 3: Fatal Finale", "tags": ["TIME STOP 170F", "MOTION STOP 140F"], "hits": 1, "frames": 170, "cancel": 138, "noswap": 0, "tstop": 170, "mstop": 140, "cd": "LIBERATION", "hit_frames": [138]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 96F", "MOTION STOP 70F"], "hits": 1, "frames": 96, "cancel": 72, "noswap": 96, "tstop": 96, "mstop": 70, "cd": "TUNEBREAK", "hit_frames": [72]}, + {"section": "DODGE", "name": "Dodge", "tags": [], "hits": 0, "frames": 25, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "DODGE", "hit_frames": []} + ] + }, + "1409": { + "name": "Cartethyia", + "wuwalab_name": "Cartethyia", + "url": "https://wuwalab.com/characters/cartethyia/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Sword to Mark Tide's Trace", "tags": ["MOTION STOP 6–34F"], "hits": 4, "frames": 56, "cancel": 35, "noswap": 40, "tstop": 0, "mstop": 28, "cd": 11, "hit_frames": [35, 47, 59, 65]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Sword to Call for Freedom", "tags": ["MOTION STOP 6–48F"], "hits": 2, "frames": 71, "cancel": 61, "noswap": 56, "tstop": 0, "mstop": 42, "cd": 11, "hit_frames": [48, 61]}, + {"section": "INTRO / OUTRO", "name": "Outro: Wind's Divine Blessing", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Sword to Carve My Forms 1", "tags": [], "hits": 1, "frames": 20, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Basic: Sword to Carve My Forms 2", "tags": [], "hits": 3, "frames": 49, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20, 30, 39]}, + {"section": "BASIC ATTACK", "name": "Basic: Sword to Carve My Forms 3", "tags": [], "hits": 4, "frames": 60, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 20, 32, 44]}, + {"section": "BASIC ATTACK", "name": "Basic: Sword to Carve My Forms 3 (Dodge Counter)", "tags": [], "hits": 4, "frames": 60, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [8, 20, 32, 44]}, + {"section": "BASIC ATTACK", "name": "Basic: Sword to Carve My Forms 4", "tags": [], "hits": 4, "frames": 62, "cancel": 11, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [17, 24, 31, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Plunging Attack", "tags": [], "hits": 1, "frames": 45, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [32]}, + {"section": "BASIC ATTACK", "name": "Basic: Plunging Attack 1", "tags": [], "hits": 1, "frames": 45, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [32]}, + {"section": "BASIC ATTACK", "name": "Basic: Plunging Attack 2", "tags": [], "hits": 3, "frames": 51, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [33, 41, 48]}, + {"section": "BASIC ATTACK", "name": "Basic: Plunging Attack 3", "tags": [], "hits": 3, "frames": 51, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [32, 42, 52]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 1", "tags": [], "hits": 1, "frames": 21, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 2", "tags": [], "hits": 4, "frames": 55, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16, 43, 49, 55]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 3", "tags": [], "hits": 4, "frames": 59, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20, 26, 30, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 3 (Dodge Counter)", "tags": [], "hits": 4, "frames": 61, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [20, 28, 33, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 4", "tags": [], "hits": 5, "frames": 60, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [22, 31, 40, 49, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 5", "tags": [], "hits": 2, "frames": 50, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest Upward Cut", "tags": [], "hits": 2, "frames": 39, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [24, 32]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 1 (Mid-Air)", "tags": [], "hits": 3, "frames": 48, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [11, 23, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 2 (Mid-Air)", "tags": [], "hits": 3, "frames": 71, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [16, 25, 53]}, + {"section": "BASIC ATTACK", "name": "Basic: Tempest 3 (Mid-Air)", "tags": [], "hits": 1, "frames": 48, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [38]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Sword to Carve My Forms", "tags": [], "hits": 4, "frames": 65, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [29, 36, 43, 56]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Tempest 1", "tags": [], "hits": 2, "frames": 51, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [34, 45]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Tempest 2", "tags": [], "hits": 3, "frames": 67, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [37, 44, 51]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Sword to Bear Their Names", "tags": [], "hits": 4, "frames": 61, "cancel": 4, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [4, 13, 22, 40]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Sword to Answer Waves' Call", "tags": [], "hits": 5, "frames": 69, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [5, 11, 17, 23, 54]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: May Tempest Break the Tides", "tags": [], "hits": 5, "frames": 101, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [50, 56, 80, 86, 92]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: A Knight's Heartfelt Prayers", "tags": ["TIME STOP 198F", "MOTION STOP 198F"], "hits": 0, "frames": 198, "cancel": 198, "noswap": 0, "tstop": 198, "mstop": 198, "cd": 10, "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Blade of Howling Squall", "tags": ["TIME STOP 301F", "MOTION STOP 301F"], "hits": 7, "frames": 301, "cancel": 301, "noswap": 0, "tstop": 301, "mstop": 301, "cd": 10, "hit_frames": [253, 263, 273, 284, 294, 304, 314]}, + {"section": "RESONANCE LIBERATION", "name": "Avatar: Fleurdelys", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Avatar: Cartethyia", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": []}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Cartethyia", "tags": ["TIME STOP 91F", "MOTION STOP 70F"], "hits": 5, "frames": 91, "cancel": 91, "noswap": 91, "tstop": 91, "mstop": 70, "cd": 11, "hit_frames": [30, 36, 42, 48, 72]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Fleurdelys", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": 11, "hit_frames": [4, 26, 66]} + ] + }, + "1205": { + "name": "Changli", + "wuwalab_name": "Changli", + "url": "https://wuwalab.com/characters/changli/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Obedience of Rules", "tags": ["MOTION STOP 5–44F"], "hits": 5, "frames": 45, "cancel": 6, "noswap": 46, "tstop": 0, "mstop": 39, "cd": 11, "hit_frames": [6, 18, 24, 29, 35]}, + {"section": "INTRO / OUTRO", "name": "Outro: Strategy of Duality", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 1", "tags": [], "hits": 2, "frames": 27, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12, 21]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 2", "tags": [], "hits": 2, "frames": 32, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 21]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 3", "tags": [], "hits": 3, "frames": 39, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [11, 21, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 39, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [11, 21, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 4", "tags": [], "hits": 5, "frames": 68, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 32, 36, 40, 44]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 24, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 2 (Mid-Air)", "tags": [], "hits": 2, "frames": 39, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [17, 27]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 3 (Mid-Air)", "tags": [], "hits": 3, "frames": 47, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16, 25, 35]}, + {"section": "BASIC ATTACK", "name": "Basic: Blazing Enlightment 4 (Mid-Air)", "tags": [], "hits": 5, "frames": 53, "cancel": 6, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [6, 18, 24, 29, 35]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Blazing Enlightment", "tags": [], "hits": 4, "frames": 47, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [14, 20, 26, 35]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Blazing Enlightment (Mid-air)", "tags": [], "hits": 1, "frames": 54, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [42]}, + {"section": "RESONANCE SKILL", "name": "Skill: Tripartite Flames", "tags": [], "hits": 4, "frames": 89, "cancel": 74, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [10, 18, 27, 74]}, + {"section": "FORTE", "name": "True Sight: Conquest", "tags": [], "hits": 4, "frames": 73, "cancel": 68, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [26, 51, 60, 68]}, + {"section": "FORTE", "name": "True Sight: Charge", "tags": [], "hits": 2, "frames": 40, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [13, 26]}, + {"section": "FORTE", "name": "Forte: Flaming Sacrifice", "tags": [], "hits": 6, "frames": 76, "cancel": 52, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [9, 15, 21, 27, 33, 52]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Radiance of Fealty", "tags": ["TIME STOP 189F", "MOTION STOP 158F"], "hits": 1, "frames": 191, "cancel": 191, "noswap": 0, "tstop": 189, "mstop": 158, "cd": 10, "hit_frames": [163]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 70F"], "hits": 5, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 70, "cd": 11, "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1508": { + "name": "Chisa", + "wuwalab_name": "Chisa", + "url": "https://wuwalab.com/characters/chisa/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Reverberance Return", "tags": ["MOTION STOP 5–36F"], "hits": 1, "frames": 55, "cancel": 39, "noswap": 54, "tstop": 0, "mstop": 31, "cd": "INTRO", "hit_frames": [39]}, + {"section": "INTRO / OUTRO", "name": "Outro: Unraveling Law Zero", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Reign of Silence 1", "tags": [], "hits": 2, "frames": 23, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [8, 17]}, + {"section": "BASIC ATTACK", "name": "Basic: Reign of Silence 2", "tags": [], "hits": 3, "frames": 55, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11, 21, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Reign of Silence 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 57, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [11, 22, 40]}, + {"section": "BASIC ATTACK", "name": "Basic: Rending Lunge", "tags": [], "hits": 5, "frames": 80, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [18, 24, 27, 32, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Rending Lunge (Mid-Air)", "tags": [], "hits": 5, "frames": 84, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [18, 24, 27, 32, 61]}, + {"section": "BASIC ATTACK", "name": "Basic: Death Snip", "tags": [], "hits": 3, "frames": 73, "cancel": 67, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 54, 65]}, + {"section": "BASIC ATTACK", "name": "Basic: Death Snip With Spread (Auto)", "tags": [], "hits": 4, "frames": 84, "cancel": 77, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 30, 64, 75]}, + {"section": "BASIC ATTACK", "name": "Basic: Death Snip With Spread", "tags": [], "hits": 4, "frames": 76, "cancel": 65, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [15, 32, 55, 65]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Withdrawn", "tags": [], "hits": 3, "frames": 56, "cancel": 6, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 15, 48]}, + {"section": "BASIC ATTACK", "name": "Basic: Reign of Silence (Mid-Air)", "tags": [], "hits": 1, "frames": 47, "cancel": 33, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [33]}, + {"section": "BASIC ATTACK", "name": "Basic: Hanging Finality", "tags": [], "hits": 4, "frames": 77, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 21, 64, 70]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Reign of Silence", "tags": [], "hits": 2, "frames": 44, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [12, 31]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Severed Facet (Mid-Air)", "tags": [], "hits": 2, "frames": 53, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [29, 36]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Eye of Unraveling", "tags": [], "hits": 1, "frames": 20, "cancel": 8, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [8]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Eye of Unraveling (Mid-Air)", "tags": [], "hits": 1, "frames": 21, "cancel": 8, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [8]}, + {"section": "RESONANCE SKILL", "name": "S1: Unseen Snare Fixed DMG", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [0]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Serrated Loop", "tags": [], "hits": 8, "frames": 83, "cancel": 78, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [27, 32, 39, 41, 46, 53, 63, 78]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Serrated Loop (Half Hold)", "tags": [], "hits": 16, "frames": 137, "cancel": 137, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [27, 32, 39, 41, 46, 53, 63, 78, 92, 98, 104, 110, 116, 122, 132, 137]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Serrated Loop (Hold)", "tags": [], "hits": 24, "frames": 174, "cancel": 174, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [27, 32, 39, 41, 46, 53, 63, 78, 92, 98, 104, 110, 116, 122, 128, 132, 134, 137, 145, 149, 157, 162, 169, 174]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Moment of Nihility", "tags": ["TIME STOP 220F", "MOTION STOP 170F"], "hits": 1, "frames": 220, "cancel": 220, "noswap": 0, "tstop": 220, "mstop": 170, "cd": "LIBERATION", "hit_frames": [160]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 1", "tags": [], "hits": 6, "frames": 31, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 13, 19, 21, 24, 26]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2", "tags": [], "hits": 8, "frames": 52, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [19, 21, 23, 25, 33, 38, 39, 43]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 (Dodge Counter)", "tags": [], "hits": 8, "frames": 52, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [19, 21, 23, 25, 33, 38, 39, 43]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 (After Plunge)", "tags": [], "hits": 8, "frames": 43, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11, 14, 14, 18, 25, 29, 32, 35]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 (Hold)", "tags": [], "hits": 18, "frames": 84, "cancel": 73, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [19, 21, 23, 25, 33, 38, 39, 43, 45, 51, 52, 57, 60, 65, 66, 71, 73, 78]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 (Hold Dodge Counter)", "tags": [], "hits": 18, "frames": 84, "cancel": 73, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [19, 21, 23, 25, 33, 38, 39, 43, 45, 51, 52, 57, 60, 65, 66, 71, 73, 78]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 (Hold After Plunge)", "tags": [], "hits": 18, "frames": 65, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11, 14, 14, 18, 25, 29, 32, 35, 37, 42, 42, 47, 48, 53, 53, 57, 57, 62]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 3", "tags": [], "hits": 8, "frames": 67, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [32, 38, 41, 47, 50, 56, 62, 66]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 3 (Hold)", "tags": [], "hits": 14, "frames": 99, "cancel": 96, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [32, 38, 41, 47, 50, 56, 62, 66, 73, 77, 84, 88, 96, 99]}, + {"section": "FORTE", "name": "Forte: Sawring Eradication", "tags": [], "hits": 2, "frames": 156, "cancel": 65, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [53, 68]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 2 Discordance", "tags": [], "hits": 3, "frames": 160, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [4, 8, 17]}, + {"section": "FORTE", "name": "Forte: Sawring Blitz 3 Falltone", "tags": [], "hits": 3, "frames": 45, "cancel": 9, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [2, 6, 9]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": "TUNEBREAK", "hit_frames": [4, 26, 66]} + ] + }, + "1407": { + "name": "Ciaccona", + "wuwalab_name": "Ciaccona", + "url": "https://wuwalab.com/characters/ciaccona/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Roaming with the Wind", "tags": ["MOTION STOP 6–44F"], "hits": 1, "frames": 54, "cancel": 40, "noswap": 61, "tstop": 0, "mstop": 38, "cd": 11, "hit_frames": [40]}, + {"section": "INTRO / OUTRO", "name": "Outro: Windcalling Tunes", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 1", "tags": [], "hits": 1, "frames": 18, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 2", "tags": [], "hits": 4, "frames": 63, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [19, 41, 47, 56]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 3", "tags": [], "hits": 4, "frames": 42, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 28, 34, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 3 (Dodge Counter)", "tags": [], "hits": 4, "frames": 42, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [14, 28, 28, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 4", "tags": [], "hits": 4, "frames": 90, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 26, 34, 67]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 1 (Mid-Air)", "tags": [], "hits": 2, "frames": 33, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [10, 26]}, + {"section": "BASIC ATTACK", "name": "Basic: Quadruple Time Steps 2 (Mid-Air)", "tags": [], "hits": 4, "frames": 43, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [36, 41, 48, 53]}, + {"section": "RESONANCE SKILL", "name": "Skill: Harmonic Allegro", "tags": [], "hits": 4, "frames": 39, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [12, 12, 24, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Quadruple Time Steps", "tags": [], "hits": 1, "frames": 42, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [24]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Quadruple Downbeat", "tags": [], "hits": 11, "frames": 75, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 7, "hit_frames": [45, 57, 69, 81, 93, 105, 117, 129, 141, 153, 165]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Improvised Symphonic Poem", "tags": ["TIME STOP 220F", "MOTION STOP 215F"], "hits": 21, "frames": 2240, "cancel": 2090, "noswap": 0, "tstop": 220, "mstop": 215, "cd": 10, "hit_frames": [200, 246, 326, 424, 522, 620, 718, 816, 914, 1012, 1110, 1208, 1306, 1404, 1502, 1600, 1698, 1796, 1894, 1992, 2090]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Select Yellow Tonic", "tags": ["TIME STOP 220F", "MOTION STOP 215F"], "hits": 21, "frames": 2240, "cancel": 2090, "noswap": 0, "tstop": 220, "mstop": 215, "cd": 10, "hit_frames": [200, 246, 326, 424, 522, 620, 718, 816, 914, 1012, 1110, 1208, 1306, 1404, 1502, 1600, 1698, 1796, 1894, 1992, 2090]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 97F", "MOTION STOP 70F"], "hits": 1, "frames": 97, "cancel": 97, "noswap": 96, "tstop": 97, "mstop": 70, "cd": 11, "hit_frames": [72]} + ] + }, + "1602": { + "name": "Danjin", + "wuwalab_name": "Danjin", + "url": "https://wuwalab.com/characters/danjin/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Vindication", "tags": ["MOTION STOP 4–51F"], "hits": 4, "frames": 103, "cancel": 81, "noswap": 92, "tstop": 0, "mstop": 47, "cd": 11, "hit_frames": [54, 64, 73, 81]}, + {"section": "INTRO / OUTRO", "name": "Outro: Duality", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Execution 1", "tags": [], "hits": 1, "frames": 16, "cancel": 9, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [9]}, + {"section": "BASIC ATTACK", "name": "Basic: Execution 2", "tags": [], "hits": 1, "frames": 25, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Execution 3", "tags": [], "hits": 1, "frames": 28, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Execution (Dodge Counter)", "tags": [], "hits": 3, "frames": 43, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [6, 15, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Execution (Mid-Air)", "tags": [], "hits": 1, "frames": 62, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [36]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Execution", "tags": [], "hits": 3, "frames": 40, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [9, 13, 17]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Carmine Gleam", "tags": [], "hits": 2, "frames": 29, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12, 21]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Crimson Erosion 1", "tags": [], "hits": 2, "frames": 37, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 18]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Crimson Erosion 2", "tags": [], "hits": 2, "frames": 46, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [11, 20]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Sanguine Pulse 1", "tags": [], "hits": 2, "frames": 33, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 20]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Sanguine Pulse 2", "tags": [], "hits": 3, "frames": 37, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [4, 8, 24]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Sanguine Pulse 3", "tags": [], "hits": 3, "frames": 59, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [6, 16, 36]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Crimson Bloom", "tags": ["TIME STOP 195F", "MOTION STOP 180F"], "hits": 9, "frames": 192, "cancel": 192, "noswap": 0, "tstop": 195, "mstop": 180, "cd": 10, "hit_frames": [74, 80, 91, 95, 102, 106, 120, 128, 169]}, + {"section": "FORTE", "name": "Forte: Chaoscleave", "tags": [], "hits": 7, "frames": 72, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [9, 17, 24, 31, 39, 46, 62]}, + {"section": "FORTE", "name": "Forte: Scatterbloom", "tags": [], "hits": 1, "frames": 49, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [19]}, + {"section": "FORTE", "name": "Forte: Chaoscleave (Full Energy)", "tags": [], "hits": 7, "frames": 72, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [9, 17, 24, 31, 39, 46, 62]}, + {"section": "FORTE", "name": "Forte: Scatterbloom (Full Energy)", "tags": [], "hits": 1, "frames": 49, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [19]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 91F", "MOTION STOP 70F"], "hits": 5, "frames": 91, "cancel": 91, "noswap": 90, "tstop": 91, "mstop": 70, "cd": 11, "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1211": { + "name": "Denia", + "wuwalab_name": "Denia", + "url": "https://wuwalab.com/characters/denia/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: It's Been A While!", "tags": ["MOTION STOP 5–46F"], "hits": 1, "frames": 53, "cancel": 28, "noswap": 47, "tstop": 0, "mstop": 41, "cd": null, "hit_frames": [28]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Knock Knock", "tags": ["MOTION STOP 5–43F"], "hits": 3, "frames": 81, "cancel": 49, "noswap": 75, "tstop": 0, "mstop": 38, "cd": null, "hit_frames": [73, 80, 87]}, + {"section": "INTRO / OUTRO", "name": "Outro: Unfinished Lies", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form Stage 1", "tags": [], "hits": 1, "frames": 16, "cancel": 3, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [9]}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form Stage 2", "tags": [], "hits": 2, "frames": 33, "cancel": 4, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form Stage 3", "tags": [], "hits": 3, "frames": 38, "cancel": 4, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [20, 29, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form Stage 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 38, "cancel": 4, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [20, 29, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form Stage 4", "tags": [], "hits": 1, "frames": 57, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Stagecraft Form (Mid-Air)", "tags": [], "hits": 2, "frames": 41, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [22, 37]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 1", "tags": [], "hits": 1, "frames": 21, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 2", "tags": [], "hits": 5, "frames": 52, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 26, 32, 38, 44]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Dodge Counter)", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 4", "tags": [], "hits": 2, "frames": 63, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 36]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 1 (Empowered)", "tags": [], "hits": 1, "frames": 21, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 2 (Empowered)", "tags": [], "hits": 5, "frames": 52, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 26, 32, 38, 44]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Empowered)", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Dodge Counter) (Empowered)", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 4 (Empowered)", "tags": [], "hits": 2, "frames": 63, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 36]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 21, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 2 (Mid-Air)", "tags": [], "hits": 5, "frames": 52, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 26, 32, 38, 44]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Mid-Air)", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Mid-Air Dodge Counter)", "tags": [], "hits": 1, "frames": 65, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 4 (Mid-Air)", "tags": [], "hits": 2, "frames": 57, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 36]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 1 (Mid-Air) (Empowered)", "tags": [], "hits": 1, "frames": 21, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 2 (Mid-Air) (Empowered)", "tags": [], "hits": 5, "frames": 52, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 26, 32, 38, 44]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Mid-Air) (Empowered)", "tags": [], "hits": 1, "frames": 36, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 3 (Mid-Air Dodge Counter) (Empowered)", "tags": [], "hits": 1, "frames": 65, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [23]}, + {"section": "BASIC ATTACK", "name": "Forte: Breakdown Form Stage 4 (Mid-Air) (Empowered)", "tags": [], "hits": 2, "frames": 57, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Stagecraft Form", "tags": [], "hits": 2, "frames": 94, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [42, 54]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Breakdown Form", "tags": [], "hits": 1, "frames": 74, "cancel": 63, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [63]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Breakdown Form (Empowered)", "tags": [], "hits": 1, "frames": 74, "cancel": 63, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [63]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Breakdown Form (Mid-Air)", "tags": [], "hits": 2, "frames": 48, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [22, 34]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Breakdown Form (Mid-Air) (Empowered)", "tags": [], "hits": 2, "frames": 48, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [22, 34]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Phantom Bubble", "tags": [], "hits": 4, "frames": 64, "cancel": 5, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 1200, "hit_frames": [5, 14, 23, 32]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Beckon", "tags": [], "hits": 6, "frames": 60, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 240, "hit_frames": [0, 9, 24, 39, 54, 69]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Banish - Stage 1", "tags": [], "hits": 3, "frames": 57, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 240, "hit_frames": [28, 35, 42]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Banish - Stage 2", "tags": [], "hits": 1, "frames": 71, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 30, "hit_frames": [23]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Final Act - Stagecraft Form", "tags": ["TIME STOP 251F", "MOTION STOP 251F"], "hits": 1, "frames": 259, "cancel": 259, "noswap": 0, "tstop": 251, "mstop": 251, "cd": 1500, "hit_frames": [257]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Final Act - Breakdown Form", "tags": ["TIME STOP 131F", "MOTION STOP 131F"], "hits": 4, "frames": 171, "cancel": 171, "noswap": 160, "tstop": 131, "mstop": 131, "cd": 1500, "hit_frames": [104, 111, 118, 125]}, + {"section": "RESONANCE LIBERATION", "name": "Erosion Field", "tags": [], "hits": 8, "frames": 1838, "cancel": 1838, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [158, 398, 638, 878, 1118, 1358, 1598, 1838]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Stagecraft Form", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": null, "hit_frames": [56]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill - Breakdown Form", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": null, "hit_frames": [56]} + ] + }, + "1203": { + "name": "Encore", + "wuwalab_name": "Encore", + "url": "https://wuwalab.com/characters/encore/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Woolies Helpers", "tags": ["MOTION STOP 56F"], "hits": 1, "frames": 80, "cancel": 60, "noswap": 75, "tstop": 0, "mstop": 56, "cd": 11, "hit_frames": [60]}, + {"section": "INTRO / OUTRO", "name": "Outro: Thermal Field", "tags": [], "hits": 4, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0, 90, 180, 270]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Attack 1", "tags": [], "hits": 1, "frames": 18, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Attack 2", "tags": [], "hits": 1, "frames": 22, "cancel": 11, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [11]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Attack 3", "tags": [], "hits": 2, "frames": 45, "cancel": 5, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [29, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Attack (Swap-In)", "tags": [], "hits": 2, "frames": 51, "cancel": 1, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [25, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Attack 4", "tags": [], "hits": 4, "frames": 46, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [13, 25, 37, 49]}, + {"section": "BASIC ATTACK", "name": "Basic: Wooly Strike", "tags": [], "hits": 1, "frames": 76, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [34]}, + {"section": "BASIC ATTACK", "name": "Basic: Frolicking 1", "tags": [], "hits": 2, "frames": 29, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [5, 22]}, + {"section": "BASIC ATTACK", "name": "Basic: Frolicking 2", "tags": [], "hits": 3, "frames": 43, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [11, 23, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Frolicking 3", "tags": [], "hits": 4, "frames": 47, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 24, 34, 43]}, + {"section": "BASIC ATTACK", "name": "Basic: Frolicking 4", "tags": [], "hits": 3, "frames": 110, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 50, 98]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Wooly Attack", "tags": [], "hits": 1, "frames": 56, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [24]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Frolicking", "tags": [], "hits": 1, "frames": 44, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [17]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Flaming Woolies", "tags": [], "hits": 8, "frames": 110, "cancel": 105, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [30, 42, 52, 63, 72, 83, 95, 105]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Energetic Welcome", "tags": [], "hits": 1, "frames": 48, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [14]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Rampage", "tags": [], "hits": 4, "frames": 47, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [35, 35, 35, 35]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Cosmos Rave", "tags": ["TIME STOP 140F", "MOTION STOP 137F"], "hits": 0, "frames": 140, "cancel": 140, "noswap": 0, "tstop": 140, "mstop": 137, "cd": 10, "hit_frames": []}, + {"section": "FORTE", "name": "Forte: Cloudy Frenzy", "tags": [], "hits": 1, "frames": 202, "cancel": 138, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [171]}, + {"section": "FORTE", "name": "Forte: Cosmos Rupture", "tags": [], "hits": 7, "frames": 239, "cancel": 203, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": [42, 72, 102, 132, 162, 192, 203]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + }, + "1108": { + "name": "Hiyuki", + "wuwalab_name": "Hiyuki", + "url": "https://wuwalab.com/characters/hiyuki/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Frostedge - Present Self", "tags": ["MOTION STOP 4–36F"], "hits": 1, "frames": 64, "cancel": 42, "noswap": 60, "tstop": 0, "mstop": 32, "cd": 0, "hit_frames": [42]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Frostedge - Foreclaimed Self", "tags": ["MOTION STOP 5–36F"], "hits": 1, "frames": 68, "cancel": 42, "noswap": 60, "tstop": 0, "mstop": 31, "cd": 0, "hit_frames": [42]}, + {"section": "INTRO / OUTRO", "name": "Outro: Snowlight Blessing", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Present Self 1", "tags": [], "hits": 2, "frames": 32, "cancel": 25, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [10, 25]}, + {"section": "BASIC ATTACK", "name": "Basic: Present Self 2", "tags": [], "hits": 1, "frames": 38, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [20]}, + {"section": "BASIC ATTACK", "name": "Basic: Present Self 2 (Dodge Counter)", "tags": [], "hits": 1, "frames": 38, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [20]}, + {"section": "BASIC ATTACK", "name": "Basic: Present Self 3", "tags": [], "hits": 6, "frames": 53, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [9, 15, 21, 27, 33, 40]}, + {"section": "BASIC ATTACK", "name": "Basic: Present Self (Mid-Air)", "tags": [], "hits": 1, "frames": 52, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [37]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 1", "tags": [], "hits": 1, "frames": 22, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 2", "tags": [], "hits": 2, "frames": 35, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [14, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 2 (Dodge Counter)", "tags": [], "hits": 2, "frames": 34, "cancel": 25, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [10, 25]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 3", "tags": [], "hits": 5, "frames": 74, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [10, 16, 22, 28, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 4", "tags": [], "hits": 5, "frames": 65, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [8, 16, 28, 36, 44]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 5", "tags": [], "hits": 2, "frames": 82, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [17, 70]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 1 (Mid-Air)", "tags": [], "hits": 3, "frames": 46, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [20, 30, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 2 (Mid-Air)", "tags": [], "hits": 4, "frames": 50, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [4, 17, 32, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Foreclaimed Self 3 (Mid-Air)", "tags": [], "hits": 1, "frames": 50, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [35]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Frost Splinter", "tags": [], "hits": 3, "frames": 132, "cancel": 105, "noswap": 120, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [28, 44, 105]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Foreclaimed Self", "tags": [], "hits": 1, "frames": 47, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [34]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Bitterfrost", "tags": ["TIME STOP 150F", "MOTION STOP 150F"], "hits": 9, "frames": 150, "cancel": 150, "noswap": 0, "tstop": 150, "mstop": 150, "cd": -3, "hit_frames": [10, 17, 24, 32, 39, 46, 53, 60, 132]}, + {"section": "RESONANCE SKILL", "name": "Skill: Present Self", "tags": [], "hits": 5, "frames": 85, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [12, 16, 20, 25, 61]}, + {"section": "RESONANCE SKILL", "name": "Skill: Jade Cleave", "tags": [], "hits": 4, "frames": 39, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [18, 23, 29, 34]}, + {"section": "RESONANCE SKILL", "name": "Skill: Petalfall (Mid-Air)", "tags": [], "hits": 5, "frames": 55, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [16, 20, 26, 29, 34]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Inward Vision", "tags": ["TIME STOP 240F", "MOTION STOP 240F"], "hits": 1, "frames": 240, "cancel": 240, "noswap": 0, "tstop": 240, "mstop": 240, "cd": -3, "hit_frames": [210]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Blade Liberation", "tags": ["TIME STOP 360F", "MOTION STOP 360F"], "hits": 2, "frames": 360, "cancel": 360, "noswap": 0, "tstop": 360, "mstop": 360, "cd": -3, "hit_frames": [216, 270]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Blade Liberation 1", "tags": ["TIME STOP 360F", "MOTION STOP 360F"], "hits": 2, "frames": 360, "cancel": 360, "noswap": 0, "tstop": 360, "mstop": 360, "cd": -3, "hit_frames": [216, 270]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Blade Liberation 2", "tags": ["TIME STOP 360F", "MOTION STOP 360F"], "hits": 2, "frames": 360, "cancel": 360, "noswap": 0, "tstop": 360, "mstop": 360, "cd": -3, "hit_frames": [216, 270]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Blade Liberation 3", "tags": ["TIME STOP 360F", "MOTION STOP 360F"], "hits": 2, "frames": 360, "cancel": 360, "noswap": 0, "tstop": 360, "mstop": 360, "cd": -3, "hit_frames": [216, 270]}, + {"section": "FORTE", "name": "Forte: Stance", "tags": [], "hits": 0, "frames": 30, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "FORTE", "name": "Forte: Iai", "tags": [], "hits": 5, "frames": 41, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [2, 15, 20, 26, 31]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 70F"], "hits": 5, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 70, "cd": 0, "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1410": { + "name": "Iuno", + "wuwalab_name": "Iuno", + "url": "https://wuwalab.com/characters/iuno/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Illuminated Manifestation", "tags": ["MOTION STOP 6–32F"], "hits": 8, "frames": 81, "cancel": 76, "noswap": 84, "tstop": 0, "mstop": 26, "cd": 11, "hit_frames": [48, 52, 55, 59, 62, 66, 70, 76]}, + {"section": "INTRO / OUTRO", "name": "Outro: From Gloom to Gleam", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Moon Ring 1", "tags": [], "hits": 1, "frames": 29, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Moon Ring 2", "tags": [], "hits": 3, "frames": 51, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [25, 32, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Moon Ring 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 51, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [25, 32, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Moon Ring 3", "tags": [], "hits": 3, "frames": 100, "cancel": 67, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [29, 56, 67]}, + {"section": "BASIC ATTACK", "name": "Basic: Moon Ring (Mid-Air)", "tags": [], "hits": 2, "frames": 63, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [29, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moon Ring 1", "tags": [], "hits": 1, "frames": 29, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moon Ring 2", "tags": [], "hits": 3, "frames": 51, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [25, 32, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moon Ring 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 51, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [25, 32, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moon Ring 3", "tags": [], "hits": 3, "frames": 100, "cancel": 67, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [29, 56, 67]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moon Ring (Mid-Air)", "tags": [], "hits": 2, "frames": 63, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [29, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Moonbow 1", "tags": [], "hits": 1, "frames": 34, "cancel": 15, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Moonbow 2", "tags": [], "hits": 3, "frames": 45, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 17, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Moonbow 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 45, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [10, 17, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Moonbow 3", "tags": [], "hits": 2, "frames": 92, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 53]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moonbow 1", "tags": [], "hits": 1, "frames": 34, "cancel": 15, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moonbow 2", "tags": [], "hits": 3, "frames": 45, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 17, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moonbow 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 45, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [10, 17, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Enhanced Moonbow 3", "tags": [], "hits": 2, "frames": 92, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 53]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Flux - Moonbow", "tags": [], "hits": 1, "frames": 86, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [70]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Flux - Moonring", "tags": [], "hits": 4, "frames": 114, "cancel": 97, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [66, 82, 90, 97]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Absolute Fullness", "tags": [], "hits": 1, "frames": 89, "cancel": 66, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [66]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Pulse of Origins", "tags": [], "hits": 8, "frames": 69, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [28, 32, 35, 39, 42, 46, 50, 58]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Closing Refrain", "tags": [], "hits": 3, "frames": 109, "cancel": 82, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [14, 74, 82]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Unfinished Refrain", "tags": [], "hits": 3, "frames": 109, "cancel": 82, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [14, 74, 82]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Arc Beyond the Edge", "tags": [], "hits": 2, "frames": 85, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [50, 78]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Enhanced Arc Beyond the Edge", "tags": [], "hits": 2, "frames": 85, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [50, 78]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Beneath Lunar Tides", "tags": ["TIME STOP 240F", "MOTION STOP 240F"], "hits": 1, "frames": 250, "cancel": 240, "noswap": 0, "tstop": 240, "mstop": 240, "cd": 10, "hit_frames": [196]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 92F", "MOTION STOP 70F"], "hits": 1, "frames": 92, "cancel": 92, "noswap": 92, "tstop": 92, "mstop": 70, "cd": 11, "hit_frames": [72]} + ] + }, + "1212": { + "name": "Jingran", + "wuwalab_name": "Jingran", + "url": "https://wuwalab.com/characters/jingran/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Question the Tombs", "tags": ["MOTION STOP 5–58F"], "hits": 1, "frames": 63, "cancel": 46, "noswap": 60, "tstop": 0, "mstop": 53, "cd": "INTRO", "hit_frames": [46]}, + {"section": "INTRO / OUTRO", "name": "Outro: Rising Fortune and Ebbing Evil", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Drink Soul 1", "tags": [], "hits": 1, "frames": 20, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Drink Soul 2", "tags": [], "hits": 2, "frames": 33, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 22]}, + {"section": "BASIC ATTACK", "name": "Basic: Drink Soul 3", "tags": [], "hits": 4, "frames": 46, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 20, 28, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Drink Soul 3 (Dodge Counter)", "tags": [], "hits": 4, "frames": 46, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [12, 20, 28, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Drink Soul 4", "tags": [], "hits": 4, "frames": 81, "cancel": 55, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 24, 51, 55]}, + {"section": "BASIC ATTACK", "name": "Basic: Devil's Bane 1", "tags": [], "hits": 1, "frames": 20, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Devil's Bane 2", "tags": [], "hits": 2, "frames": 43, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Devil's Bane 3", "tags": [], "hits": 3, "frames": 67, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 18, 43]}, + {"section": "BASIC ATTACK", "name": "Basic: Devil's Bane 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 67, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [6, 18, 43]}, + {"section": "BASIC ATTACK", "name": "Basic: Devil's Bane 4", "tags": [], "hits": 4, "frames": 52, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 14, 22, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Mid-air", "tags": [], "hits": 1, "frames": 48, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [38]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Soul Raid", "tags": [], "hits": 6, "frames": 81, "cancel": 77, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [16, 24, 48, 61, 69, 77]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Stardome Meander", "tags": [], "hits": 4, "frames": 90, "cancel": 80, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [20, 38, 67, 80]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Encroaching Yin", "tags": [], "hits": 4, "frames": 48, "cancel": 47, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [14, 24, 37, 47]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Netherworld Traverse", "tags": [], "hits": 7, "frames": 80, "cancel": 64, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [8, 24, 32, 64, 72, 80, 88]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Scorching Yang", "tags": [], "hits": 4, "frames": 47, "cancel": 47, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [14, 24, 37, 47]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Afterlife's Guide", "tags": [], "hits": 3, "frames": 79, "cancel": 71, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [12, 30, 71]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Burial of Thousand Souls", "tags": ["TIME STOP 280F", "MOTION STOP 280F"], "hits": 8, "frames": 280, "cancel": 280, "noswap": 0, "tstop": 280, "mstop": 280, "cd": "LIBERATION", "hit_frames": [184, 196, 208, 262, 270, 280, 290, 300]}, + {"section": "RESONANCE LIBERATION", "name": "Chimei Wangliang", "tags": [], "hits": 1, "frames": 54, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [54]}, + {"section": "DASH", "name": "Dodge: Shadow Step", "tags": [], "hits": 2, "frames": 20, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "DASH", "hit_frames": [4, 16]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": "TUNEBREAK", "hit_frames": [4, 26, 80]} + ] + }, + "1304": { + "name": "Jinhsi", + "wuwalab_name": "Jinhsi", + "url": "https://wuwalab.com/characters/jinhsi/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Loong's Halo", "tags": ["MOTION STOP 4–37F"], "hits": 1, "frames": 60, "cancel": 49, "noswap": 78, "tstop": 0, "mstop": 33, "cd": "0:11 60:1", "hit_frames": [49]}, + {"section": "INTRO / OUTRO", "name": "Outro: Temporal Bender", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Outro: Temporal Bender (Unison)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn 1", "tags": [], "hits": 1, "frames": 28, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [17]}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn 2", "tags": [], "hits": 4, "frames": 45, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [14, 27, 34, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn 3", "tags": [], "hits": 8, "frames": 47, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [15, 18, 21, 24, 27, 30, 33, 39]}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn 3 (Dodge Counter)", "tags": [], "hits": 8, "frames": 48, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [15, 18, 21, 24, 27, 30, 33, 39]}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn 4", "tags": [], "hits": 2, "frames": 74, "cancel": 33, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [25, 33]}, + {"section": "BASIC ATTACK", "name": "Basic: Slash of Breaking Dawn (Mid-Air)", "tags": [], "hits": 3, "frames": 95, "cancel": 52, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:6 71:2", "hit_frames": [7, 38, 52]}, + {"section": "BASIC ATTACK", "name": "Basic: Incarnation 1", "tags": [], "hits": 1, "frames": 26, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Incarnation 2", "tags": [], "hits": 3, "frames": 41, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [16, 25, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Incarnation 3", "tags": [], "hits": 2, "frames": 54, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [26, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Incarnation 4", "tags": [], "hits": 7, "frames": 87, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [0, 9, 18, 27, 36, 45, 71]}, + {"section": "BASIC ATTACK", "name": "Basic: Incarnation (Dodge Counter)", "tags": [], "hits": 4, "frames": 87, "cancel": 87, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [20, 48, 56, 71]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Slash of Breaking Dawn", "tags": [], "hits": 7, "frames": 106, "cancel": 90, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [15, 22, 29, 37, 44, 75, 90]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Incarnation", "tags": [], "hits": 2, "frames": 78, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 0:6 67:2", "hit_frames": [36, 48]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Trailing Lights of Eons", "tags": [], "hits": 5, "frames": 64, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 64:2", "hit_frames": [11, 16, 21, 26, 42]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Overflowing Radiance", "tags": [], "hits": 9, "frames": 84, "cancel": 74, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4", "hit_frames": [11, 16, 21, 26, 33, 41, 49, 56, 74]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Crescent Divinity", "tags": [], "hits": 4, "frames": 87, "cancel": 71, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4", "hit_frames": [20, 53, 60, 71]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Illuminous Epiphany", "tags": ["TIME STOP 132F", "MOTION STOP 174F"], "hits": 7, "frames": 174, "cancel": 174, "noswap": 0, "tstop": 132, "mstop": 174, "cd": "0:10", "hit_frames": [87, 93, 99, 105, 111, 117, 128]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Purge of Light", "tags": ["TIME STOP 231F", "MOTION STOP 231F"], "hits": 2, "frames": 231, "cancel": 231, "noswap": 0, "tstop": 231, "mstop": 231, "cd": "0:10 203:0", "hit_frames": [106, 114]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": "0:11", "hit_frames": [4, 26, 66]} + ] + }, + "1109": { + "name": "Lucilla", + "wuwalab_name": "Lucilla", + "url": "https://wuwalab.com/characters/lucilla/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Clip It", "tags": ["MOTION STOP 6–79F"], "hits": 1, "frames": 81, "cancel": 38, "noswap": 82, "tstop": 0, "mstop": 73, "cd": "INTRO", "hit_frames": [38]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Clip It: Hard Cut", "tags": ["MOTION STOP 5–51F"], "hits": 1, "frames": 52, "cancel": 27, "noswap": 52, "tstop": 0, "mstop": 46, "cd": "INTRO", "hit_frames": [27]}, + {"section": "INTRO / OUTRO", "name": "Outro: Montage", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Snapshot 1", "tags": [], "hits": 1, "frames": 30, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Snapshot 2", "tags": [], "hits": 2, "frames": 32, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Snapshot 2 (Dodge Counter)", "tags": [], "hits": 2, "frames": 32, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [14, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Snapshot 3 - Unremarkable", "tags": [], "hits": 1, "frames": 86, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [30]}, + {"section": "BASIC ATTACK", "name": "Basic: Snapshot 3 - Commendable", "tags": [], "hits": 1, "frames": 106, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [50]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 1", "tags": [], "hits": 2, "frames": 27, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [8, 19]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 2", "tags": [], "hits": 2, "frames": 54, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 2 (Dodge Counter)", "tags": [], "hits": 2, "frames": 54, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [10, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 3 (1 Forte)", "tags": [], "hits": 2, "frames": 70, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 3 (2 Forte)", "tags": [], "hits": 5, "frames": 106, "cancel": 82, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34, 46, 58, 70, 82]}, + {"section": "BASIC ATTACK", "name": "Basic: Tracing Forms 3 (3 Forte)", "tags": [], "hits": 8, "frames": 142, "cancel": 118, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34, 46, 58, 70, 82, 94, 106, 118]}, + {"section": "BASIC ATTACK", "name": "Basic: Letting It Go", "tags": [], "hits": 4, "frames": 77, "cancel": 54, "noswap": 90, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [0, 12, 24, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Letting It Go (Echo)", "tags": [], "hits": 4, "frames": 77, "cancel": 54, "noswap": 90, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [0, 12, 24, 54]}, + {"section": "RESONANCE SKILL", "name": "Skill Compensate", "tags": [], "hits": 4, "frames": 60, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [16, 22, 28, 53]}, + {"section": "RESONANCE SKILL", "name": "Skill: Spotlight", "tags": [], "hits": 7, "frames": 107, "cancel": 107, "noswap": 101, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [16, 22, 28, 57, 70, 101, 143]}, + {"section": "FORTE", "name": "Forte: Oblivion (Chafe)", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "FORTE", "name": "Forte: Oblivion (Echo)", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Clear As Day", "tags": ["TIME STOP 3–266F", "MOTION STOP 3–266F"], "hits": 1, "frames": 266, "cancel": 266, "noswap": 0, "tstop": 263, "mstop": 263, "cd": "LIBERATION", "hit_frames": [204]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Clear As Day (Echo)", "tags": ["TIME STOP 3–266F", "MOTION STOP 3–266F"], "hits": 1, "frames": 266, "cancel": 266, "noswap": 0, "tstop": 263, "mstop": 263, "cd": "LIBERATION", "hit_frames": [204]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": "TUNEBREAK", "hit_frames": [56]} + ] + }, + "1511": { + "name": "Lucy", + "wuwalab_name": "Lucy", + "url": "https://wuwalab.com/characters/lucy/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Outdated Hallucination", "tags": ["MOTION STOP 5–32F"], "hits": 2, "frames": 57, "cancel": 39, "noswap": 54, "tstop": 0, "mstop": 27, "cd": "INTRO", "hit_frames": [34, 39]}, + {"section": "INTRO / OUTRO", "name": "Outro: Countermeasure Program", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 1", "tags": [], "hits": 2, "frames": 31, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 19]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 1 (Hold)", "tags": [], "hits": 7, "frames": 80, "cancel": 66, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 20, 28, 36, 44, 52, 63]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 2", "tags": [], "hits": 3, "frames": 37, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 23, 26]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 3", "tags": [], "hits": 3, "frames": 69, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 31, 53]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 70, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [10, 31, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread 4", "tags": [], "hits": 6, "frames": 75, "cancel": 63, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 12, 18, 24, 40, 63]}, + {"section": "BASIC ATTACK", "name": "Basic: Locked Thread (Mid-Air)", "tags": [], "hits": 2, "frames": 97, "cancel": 79, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [74, 79]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Shredding 1", "tags": [], "hits": 4, "frames": 34, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 19, 21, 23]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Shredding 2", "tags": [], "hits": 5, "frames": 55, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [24, 28, 32, 37, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Shredding 2 (Dodge Counter)", "tags": [], "hits": 5, "frames": 55, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [24, 28, 33, 37, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Shredding 3", "tags": [], "hits": 5, "frames": 67, "cancel": 49, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [4, 6, 33, 45, 49]}, + {"section": "BASIC ATTACK", "name": "Basic: Thread Shredding 4", "tags": [], "hits": 5, "frames": 47, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [3, 6, 9, 13, 26]}, + {"section": "BASIC ATTACK", "name": "Basic: Algorithm Compaction (Mid-Air)", "tags": [], "hits": 2, "frames": 67, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34, 43]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Locked Thread 1", "tags": [], "hits": 3, "frames": 48, "cancel": 43, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [16, 30, 43]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Locked Thread 2", "tags": [], "hits": 7, "frames": 109, "cancel": 73, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [8, 17, 25, 31, 37, 56, 73]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Single Threading", "tags": [], "hits": 5, "frames": 67, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [8, 13, 19, 24, 38]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Dual Threading", "tags": [], "hits": 5, "frames": 67, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [10, 15, 21, 26, 48]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Multi-threading", "tags": [], "hits": 4, "frames": 61, "cancel": 55, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [38, 43, 49, 55]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Multi-threading (SQL)", "tags": [], "hits": 4, "frames": 61, "cancel": 55, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [38, 43, 49, 55]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Payload Charge", "tags": [], "hits": 5, "frames": 55, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [16, 20, 30, 42, 46]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Pulse Interference", "tags": [], "hits": 6, "frames": 156, "cancel": 128, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [2, 12, 114, 121, 128, 128]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Deadlock", "tags": ["TIME STOP 60F", "MOTION STOP 36F"], "hits": 2, "frames": 72, "cancel": 72, "noswap": 0, "tstop": 60, "mstop": 36, "cd": "SKILL", "hit_frames": [35, 64]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Netrunner Override", "tags": ["TIME STOP 202F", "MOTION STOP 202F"], "hits": 1, "frames": 262, "cancel": 262, "noswap": 0, "tstop": 202, "mstop": 202, "cd": "LIBERATION", "hit_frames": [251]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Old Net Deep Dive", "tags": ["TIME STOP 262F", "MOTION STOP 262F"], "hits": 1, "frames": 262, "cancel": 262, "noswap": 0, "tstop": 262, "mstop": 262, "cd": "LIBERATION", "hit_frames": [251]}, + {"section": "RESONANCE LIBERATION", "name": "Spoofing Program: Ping", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Spoofing Program: Synapse Burnout", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 96F", "MOTION STOP 70F"], "hits": 1, "frames": 96, "cancel": 96, "noswap": 96, "tstop": 96, "mstop": 70, "cd": "TUNEBREAK", "hit_frames": [72]}, + {"section": "TUNE BREAK SKILL", "name": "Hack Response - Data Crash", "tags": [], "hits": 5, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "TUNEBREAK", "hit_frames": [0, 0, 0, 0, 0]} + ] + }, + "1207": { + "name": "Lupa", + "wuwalab_name": "Lupa", + "url": "https://wuwalab.com/characters/lupa/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Try Focusing Eh?", "tags": ["MOTION STOP 6–60F"], "hits": 5, "frames": 70, "cancel": 34, "noswap": 60, "tstop": 0, "mstop": 54, "cd": "INTRO", "hit_frames": [24, 34, 38, 43, 47]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Nowhere to Run!", "tags": ["TIME STOP 6–90F", "MOTION STOP 6–150F"], "hits": 5, "frames": 150, "cancel": 150, "noswap": 0, "tstop": 84, "mstop": 144, "cd": "INTRO", "hit_frames": [114, 116, 120, 124, 129]}, + {"section": "INTRO / OUTRO", "name": "Outro: Stand by Me Warrior", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 1", "tags": [], "hits": 3, "frames": 42, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 23, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 2", "tags": [], "hits": 1, "frames": 32, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 3", "tags": [], "hits": 7, "frames": 67, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [20, 24, 30, 35, 41, 46, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 4", "tags": [], "hits": 4, "frames": 89, "cancel": 73, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 47, 66, 73]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star (Dodge Counter)", "tags": [], "hits": 5, "frames": 73, "cancel": 49, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [15, 23, 30, 37, 49]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 30, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 2 (Mid-Air)", "tags": [], "hits": 5, "frames": 56, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 23, 27, 32, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star 3 (Mid-Air)", "tags": [], "hits": 2, "frames": 71, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [19, 50]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star Plunge", "tags": [], "hits": 3, "frames": 69, "cancel": 55, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [26, 40, 55]}, + {"section": "BASIC ATTACK", "name": "Basic: Flaming Star Starfall", "tags": [], "hits": 5, "frames": 73, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 13, 20, 28, 42]}, + {"section": "HEAVY ATTACK", "name": "Basic: Flaming Star Firestrike (Mid-Air)", "tags": [], "hits": 2, "frames": 71, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [32, 50]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Flaming Star", "tags": [], "hits": 2, "frames": 51, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [18, 28]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Flaming Star Wolf's Gnawing", "tags": [], "hits": 2, "frames": 50, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [26, 40]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Flaming Star Wolf's Claw", "tags": [], "hits": 6, "frames": 96, "cancel": 75, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [24, 41, 46, 50, 54, 75]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Shewolf's Hunt", "tags": [], "hits": 1, "frames": 56, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [28]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Feral Fang", "tags": [], "hits": 1, "frames": 63, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [44]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Foebreaker", "tags": [], "hits": 1, "frames": 58, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [48]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Dance With the Wolf", "tags": [], "hits": 6, "frames": 151, "cancel": 102, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [54, 67, 73, 78, 84, 102]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Dance With the Wolf - Climax", "tags": [], "hits": 6, "frames": 151, "cancel": 102, "noswap": 12, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [54, 67, 73, 78, 84, 102]}, + {"section": "RESONANCE SKILL", "name": "Skill 5: Set the Arena Ablaze", "tags": [], "hits": 2, "frames": 96, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [57, 70]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Fire-Kissed Glory", "tags": ["TIME STOP 220F", "MOTION STOP 13–220F"], "hits": 1, "frames": 220, "cancel": 220, "noswap": 0, "tstop": 220, "mstop": 207, "cd": "LIBERATION", "hit_frames": [168]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": "TUNEBREAK", "hit_frames": [4, 26, 66]} + ] + }, + "1510": { + "name": "Luuk Herssen", + "wuwalab_name": "Luuk Herssen", + "url": "https://wuwalab.com/characters/luukherssen/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Before Injection of Dawn", "tags": ["MOTION STOP 5–25F"], "hits": 3, "frames": 75, "cancel": 39, "noswap": 57, "tstop": 0, "mstop": 20, "cd": 11, "hit_frames": [27, 33, 39]}, + {"section": "INTRO / OUTRO", "name": "Outro: Bow to the Last Light", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 1", "tags": [], "hits": 2, "frames": 31, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 21]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 2", "tags": [], "hits": 2, "frames": 56, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 2 (Dodge Counter)", "tags": [], "hits": 1, "frames": 56, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [50]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 3", "tags": [], "hits": 30, "frames": 56, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [33, 35, 40, 46, 52, 59, 64, 70, 76, 82, 89, 94, 100, 106, 112, 119, 124, 130, 136, 142, 149, 154, 160, 166, 172, 179, 184, 190, 196, 202]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 4", "tags": [], "hits": 1, "frames": 39, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [21]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 37, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 2 Scythe - Dissection (Mid-Air)", "tags": [], "hits": 3, "frames": 27, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [11, 17, 27]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 2 Scythe - Resection (Mid-Air)", "tags": [], "hits": 2, "frames": 30, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [13, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 3 Scythe - Dissection (Mid-Air)", "tags": [], "hits": 3, "frames": 72, "cancel": 64, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 18, 64]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 3 Scythe - Resection (Mid-Air)", "tags": [], "hits": 2, "frames": 66, "cancel": 47, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 47]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 3 (Mid-Air Dodge Counter)", "tags": [], "hits": 1, "frames": 69, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [37]}, + {"section": "BASIC ATTACK", "name": "Basic: Such is Light 4 (Mid-Air)", "tags": [], "hits": 1, "frames": 60, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [40]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Such is Light", "tags": [], "hits": 1, "frames": 60, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Golden Reflux", "tags": [], "hits": 1, "frames": 68, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [46]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Aureole of Execution - Ring", "tags": [], "hits": 6, "frames": 81, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [15, 21, 27, 33, 39, 46]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Aureole of Execution - Ring (Aureate Judge)", "tags": [], "hits": 6, "frames": 81, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [15, 21, 27, 33, 39, 46]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Aureole of Execution - Breach", "tags": [], "hits": 3, "frames": 81, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [33, 39, 45]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Aureole of Execution - Breach (Aureate Judge)", "tags": [], "hits": 3, "frames": 81, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [33, 39, 45]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Aureole of Execution - Glare", "tags": [], "hits": 1, "frames": 106, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [50]}, + {"section": "RESONANCE SKILL", "name": "Skill 4: Aureole of Execution - Glare (Aureate Judge)", "tags": [], "hits": 1, "frames": 106, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [50]}, + {"section": "RESONANCE SKILL", "name": "Basic: Golden Impale", "tags": [], "hits": 1, "frames": 68, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [46]}, + {"section": "FORTE", "name": "Basic: Gavel of Earthshaker", "tags": [], "hits": 1, "frames": 41, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [26]}, + {"section": "FORTE", "name": "Basic: Gavel of Earthshaker (Aureate Judge)", "tags": [], "hits": 1, "frames": 41, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [26]}, + {"section": "FORTE", "name": "Ichor Deposit", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "FORTE", "name": "Ichor Blade", "tags": [], "hits": 34, "frames": 357, "cancel": 357, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [60, 69, 78, 87, 96, 105, 114, 123, 132, 141, 150, 159, 168, 177, 186, 195, 204, 213, 222, 231, 240, 249, 258, 267, 276, 285, 294, 303, 312, 321, 330, 339, 348, 357]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Rewritten in Winter's Margins", "tags": ["TIME STOP 247F", "MOTION STOP 247F"], "hits": 6, "frames": 247, "cancel": 247, "noswap": 0, "tstop": 247, "mstop": 247, "cd": 10, "hit_frames": [230, 232, 234, 237, 239, 242]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 70F"], "hits": 1, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 70, "cd": 11, "hit_frames": [72]} + ] + }, + "1509": { + "name": "Lynae", + "wuwalab_name": "Lynae", + "url": "https://wuwalab.com/characters/lynae/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Time to Show Some Colors!", "tags": ["MOTION STOP 4–66F"], "hits": 10, "frames": 76, "cancel": 44, "noswap": 62, "tstop": 0, "mstop": 62, "cd": null, "hit_frames": [44, 50, 56, 62, 68, 74, 80, 86, 92, 98]}, + {"section": "INTRO / OUTRO", "name": "Outro: Let's Hit the Road!", "tags": [], "hits": 22, "frames": 159, "cancel": 118, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [52, 58, 64, 70, 76, 82, 88, 94, 100, 106, 110, 112, 116, 118, 122, 128, 134, 140, 146, 152, 158, 164]}, + {"section": "BASIC ATTACK", "name": "Basic: Chroma Drift 1", "tags": [], "hits": 1, "frames": 31, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Chroma Drift 2", "tags": [], "hits": 3, "frames": 66, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [15, 29, 39]}, + {"section": "BASIC ATTACK", "name": "Basic: Chroma Drift 3", "tags": [], "hits": 1, "frames": 44, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [28]}, + {"section": "BASIC ATTACK", "name": "Basic: Chroma Drift (Dodge Counter)", "tags": [], "hits": 1, "frames": 49, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [31]}, + {"section": "BASIC ATTACK", "name": "Basic: Chroma Drift (Mid-Air)", "tags": [], "hits": 2, "frames": 54, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [26, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade 1", "tags": [], "hits": 1, "frames": 35, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade 2", "tags": [], "hits": 2, "frames": 28, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 21]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade 3", "tags": [], "hits": 3, "frames": 40, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 16, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade 4", "tags": [], "hits": 4, "frames": 70, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 25, 38, 50]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade 5", "tags": [], "hits": 7, "frames": 99, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [8, 29, 35, 41, 47, 53, 59]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade (Dodge Counter)", "tags": [], "hits": 1, "frames": 34, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Kaleidoscopic Parade (Mid-Air)", "tags": [], "hits": 2, "frames": 54, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [26, 41]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Kaleidoscopic Parade (Ground Heavy)", "tags": [], "hits": 8, "frames": 82, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 14, 18, 22, 26, 30, 34, 56]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Kaleidoscopic Parade (Mid-air Heavy)", "tags": [], "hits": 7, "frames": 70, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 20, 30, 40, 50, 60, 70]}, + {"section": "FORTE", "name": "Basic: Spark Collision Lv.1", "tags": [], "hits": 2, "frames": 73, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16, 27]}, + {"section": "FORTE", "name": "Basic: Spark Collision Lv.2", "tags": [], "hits": 2, "frames": 109, "cancel": 63, "noswap": 36, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [52, 63]}, + {"section": "FORTE", "name": "Basic: Spark Collision Lv.3", "tags": [], "hits": 2, "frames": 157, "cancel": 111, "noswap": 84, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [100, 111]}, + {"section": "FORTE", "name": "Basic: Polychrome Leap 1", "tags": [], "hits": 3, "frames": 46, "cancel": 25, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 21, 25]}, + {"section": "FORTE", "name": "Basic: Polychrome Leap 2", "tags": [], "hits": 6, "frames": 42, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 18, 24, 30, 36, 42]}, + {"section": "FORTE", "name": "Basic: Polychrome Leap 3", "tags": [], "hits": 8, "frames": 37, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 17, 20, 23, 50, 53, 56, 59]}, + {"section": "FORTE", "name": "Basic: Iridescent Splash", "tags": [], "hits": 1, "frames": 64, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [38]}, + {"section": "FORTE", "name": "Basic: Visual Impact", "tags": [], "hits": 1, "frames": 105, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 1500, "hit_frames": [42]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Lynae-Style Palettes", "tags": [], "hits": 4, "frames": 76, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 360, "hit_frames": [30, 51, 58, 62]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Additive Color", "tags": [], "hits": 2, "frames": 75, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 360, "hit_frames": [16, 30]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Prismatic Overblast", "tags": ["TIME STOP 240F", "MOTION STOP 223F"], "hits": 10, "frames": 240, "cancel": 240, "noswap": 0, "tstop": 240, "mstop": 223, "cd": 1500, "hit_frames": [189, 195, 201, 207, 213, 219, 225, 231, 237, 243]}, + {"section": "RESONANCE LIBERATION", "name": "Basic: To a Vivid Tomorrow!", "tags": [], "hits": 22, "frames": 159, "cancel": 118, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [52, 56, 60, 65, 69, 73, 77, 81, 86, 90, 94, 98, 118, 124, 130, 136, 142, 148, 154, 160, 166, 172]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 96F", "MOTION STOP 70F"], "hits": 1, "frames": 96, "cancel": 96, "noswap": 96, "tstop": 96, "mstop": 70, "cd": null, "hit_frames": [72]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Rupture Response - Spectral Analysis", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0]} + ] + }, + "1209": { + "name": "Mornye", + "wuwalab_name": "Mornye", + "url": "https://wuwalab.com/characters/mornye/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Convergence", "tags": ["MOTION STOP 4–79F"], "hits": 6, "frames": 105, "cancel": 38, "noswap": 80, "tstop": 0, "mstop": 75, "cd": "INTRO", "hit_frames": [38, 70, 97, 124, 151, 178]}, + {"section": "INTRO / OUTRO", "name": "Outro: Recursion", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration 1", "tags": [], "hits": 3, "frames": 25, "cancel": 25, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 13, 25]}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration 2", "tags": [], "hits": 6, "frames": 49, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11, 26, 40, 49, 58, 67]}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration 3", "tags": [], "hits": 7, "frames": 49, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [24, 40, 49, 58, 67, 76, 85]}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration 4", "tags": [], "hits": 1, "frames": 116, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [51]}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration (Dodge Counter)", "tags": [], "hits": 1, "frames": 26, "cancel": 9, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [9]}, + {"section": "BASIC ATTACK", "name": "Basic: Ground State Calibration (Mid-air)", "tags": [], "hits": 1, "frames": 42, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [36]}, + {"section": "BASIC ATTACK", "name": "Basic: Wide Field Observation Mode 1", "tags": [], "hits": 4, "frames": 21, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [26, 34, 42, 49]}, + {"section": "BASIC ATTACK", "name": "Basic: Wide Field Observation Mode 2", "tags": [], "hits": 4, "frames": 39, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [17, 33, 49, 65]}, + {"section": "BASIC ATTACK", "name": "Basic: Wide Field Observation Mode 2 (Dodge Counter)", "tags": [], "hits": 4, "frames": 41, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [17, 33, 49, 65]}, + {"section": "BASIC ATTACK", "name": "Basic: Wide Field Observation Mode 3", "tags": [], "hits": 6, "frames": 41, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [31, 34, 41, 62, 67, 100]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Ground State Calibration", "tags": [], "hits": 3, "frames": 95, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [19, 40, 70]}, + {"section": "RESONANCE SKILL", "name": "Skill: Expectation Error", "tags": [], "hits": 0, "frames": 21, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Optimal Solution (Parry)", "tags": [], "hits": 1, "frames": 110, "cancel": 44, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [44]}, + {"section": "RESONANCE SKILL", "name": "Skill: Distributed Array", "tags": [], "hits": 4, "frames": 60, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [46, 46, 60, 60]}, + {"section": "FORTE", "name": "Forte: Geopotential Shift", "tags": [], "hits": 7, "frames": 92, "cancel": 80, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [22, 58, 80, 85, 112, 139, 166]}, + {"section": "FORTE", "name": "Forte: Inversion", "tags": ["MOTION STOP 76F"], "hits": 1, "frames": 76, "cancel": 76, "noswap": 76, "tstop": 0, "mstop": 76, "cd": "HEAVY", "hit_frames": [76]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Critical Protocol", "tags": ["TIME STOP 300F", "MOTION STOP 300F"], "hits": 1, "frames": 300, "cancel": 300, "noswap": 0, "tstop": 300, "mstop": 300, "cd": "LIBERATION", "hit_frames": [272]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": "TUNEBREAK", "hit_frames": [4, 26, 66]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Rupture Response - Particle Jet", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "TUNEBREAK", "hit_frames": [0]}, + {"section": "OTHER", "name": "Syntony Field (Heal)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "OTHER", "name": "High Syntony Field (Heal)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []} + ] + }, + "1204": { + "name": "Mortefi", + "wuwalab_name": "Mortefi", + "url": "https://wuwalab.com/characters/mortefi/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Dissonance", "tags": ["MOTION STOP 4–49F"], "hits": 1, "frames": 90, "cancel": 44, "noswap": 90, "tstop": 0, "mstop": 45, "cd": 11, "hit_frames": [44]}, + {"section": "INTRO / OUTRO", "name": "Outro: Rage Transposition", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 1", "tags": [], "hits": 1, "frames": 21, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 2", "tags": [], "hits": 2, "frames": 35, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 18]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 3", "tags": [], "hits": 1, "frames": 40, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 4", "tags": [], "hits": 5, "frames": 91, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 24, 30, 36, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show (Dodge Counter)", "tags": [], "hits": 1, "frames": 48, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [32]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 11, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Impromptu Show 2 (Mid-Air)", "tags": [], "hits": 1, "frames": 11, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [0]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Passionate Variation", "tags": [], "hits": 1, "frames": 46, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [16]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Fury Fugue", "tags": [], "hits": 1, "frames": 67, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [20]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Violent Finale", "tags": ["TIME STOP 120F", "MOTION STOP 64F"], "hits": 1, "frames": 120, "cancel": 120, "noswap": 0, "tstop": 120, "mstop": 64, "cd": 10, "hit_frames": [62]}, + {"section": "RESONANCE LIBERATION", "name": "Marcato", "tags": [], "hits": 1, "frames": 32, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [32]}, + {"section": "RESONANCE LIBERATION", "name": "Marcato - S1", "tags": [], "hits": 2, "frames": 21, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [21, 21]}, + {"section": "RESONANCE LIBERATION", "name": "Marcato - S5", "tags": [], "hits": 4, "frames": 45, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [39, 41, 45, 45]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 96F", "MOTION STOP 70F"], "hits": 1, "frames": 96, "cancel": 96, "noswap": 96, "tstop": 96, "mstop": 70, "cd": 11, "hit_frames": [72]} + ] + }, + "1506": { + "name": "Phoebe", + "wuwalab_name": "Phoebe", + "url": "https://wuwalab.com/characters/phoebe/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Golden Grace", "tags": ["MOTION STOP 4–46F"], "hits": 1, "frames": 98, "cancel": 45, "noswap": 69, "tstop": 0, "mstop": 42, "cd": 11, "hit_frames": [45]}, + {"section": "INTRO / OUTRO", "name": "Outro: Attentive Heart", "tags": [], "hits": 8, "frames": 180, "cancel": 135, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": [30, 45, 60, 75, 90, 105, 120, 135]}, + {"section": "BASIC ATTACK", "name": "Basic: Chamuel's Star 1", "tags": [], "hits": 1, "frames": 22, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Chamuel's Star 2", "tags": [], "hits": 2, "frames": 32, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12, 120]}, + {"section": "BASIC ATTACK", "name": "Basic: Chamuel's Star 3", "tags": [], "hits": 6, "frames": 61, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36, 42, 48, 54, 60, 66]}, + {"section": "BASIC ATTACK", "name": "Basic: Chamuel's Star 3 (Dodge Counter)", "tags": [], "hits": 6, "frames": 60, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36, 42, 48, 54, 60, 66]}, + {"section": "BASIC ATTACK", "name": "Basic: O Come Divine Light 1", "tags": [], "hits": 1, "frames": 26, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: O Come Divine Light 2", "tags": [], "hits": 2, "frames": 33, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [16, 26]}, + {"section": "BASIC ATTACK", "name": "Basic: O Come Divine Light 3", "tags": [], "hits": 8, "frames": 60, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36, 42, 48, 54, 60, 66, 72, 78]}, + {"section": "BASIC ATTACK", "name": "Basic: O Come Divine Light 3 (Dodge Counter)", "tags": [], "hits": 8, "frames": 60, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36, 42, 48, 54, 60, 66, 72, 78]}, + {"section": "BASIC ATTACK", "name": "Basic: O Come Divine Light (Mid-Air)", "tags": [], "hits": 2, "frames": 78, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [2, 27]}, + {"section": "RESONANCE SKILL", "name": "Skill: To Where Light Shines", "tags": [], "hits": 2, "frames": 70, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [37, 44]}, + {"section": "RESONANCE SKILL", "name": "Skill: To Where Light Shines Teleport", "tags": [], "hits": 2, "frames": 91, "cancel": 53, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [53, 59]}, + {"section": "RESONANCE SKILL", "name": "Ring of Mirrors: Refracted Holy Light", "tags": [], "hits": 2, "frames": 18, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [6, 18]}, + {"section": "RESONANCE SKILL", "name": "Skill: Utter Confession", "tags": [], "hits": 1, "frames": 66, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [48]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Absolution Litany", "tags": [], "hits": 1, "frames": 66, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [48]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Starflash", "tags": [], "hits": 3, "frames": 55, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [28, 34, 40]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Starflash (Confession) - S3", "tags": [], "hits": 3, "frames": 55, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [28, 34, 40]}, + {"section": "HEAVY ATTACK", "name": "Heavy: O Come Divine Light", "tags": [], "hits": 4, "frames": 61, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [40, 49, 58, 67]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Dawn of Enlightenment", "tags": ["TIME STOP 220F", "MOTION STOP 218F"], "hits": 1, "frames": 220, "cancel": 220, "noswap": 0, "tstop": 220, "mstop": 218, "cd": 10, "hit_frames": [186]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Dawn of Enlightenment (Absolution)", "tags": ["TIME STOP 220F", "MOTION STOP 218F"], "hits": 1, "frames": 220, "cancel": 220, "noswap": 0, "tstop": 220, "mstop": 218, "cd": 10, "hit_frames": [186]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Dawn of Enlightenment (Confession) - S1", "tags": ["TIME STOP 220F", "MOTION STOP 218F"], "hits": 1, "frames": 220, "cancel": 220, "noswap": 0, "tstop": 220, "mstop": 218, "cd": 10, "hit_frames": [186]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + }, + "1608": { + "name": "Phrolova", + "wuwalab_name": "Phrolova", + "url": "https://wuwalab.com/characters/phrolova/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Suite of Quietus", "tags": ["MOTION STOP 6–38F"], "hits": 2, "frames": 80, "cancel": 59, "noswap": 76, "tstop": 0, "mstop": 32, "cd": "0:11 80:1", "hit_frames": [43, 62]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Suite of Immortality", "tags": ["MOTION STOP 6–56F"], "hits": 1, "frames": 93, "cancel": 60, "noswap": 90, "tstop": 0, "mstop": 50, "cd": "0:11 93:1", "hit_frames": [60]}, + {"section": "INTRO / OUTRO", "name": "Outro: Unfinished Piece", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death 1", "tags": [], "hits": 2, "frames": 44, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [18, 35]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death 2", "tags": [], "hits": 1, "frames": 36, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death 2 (Backstep)", "tags": [], "hits": 1, "frames": 50, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [24]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death 2 (Dodge Counter)", "tags": [], "hits": 1, "frames": 50, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:8 2:2", "hit_frames": [24]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death 3", "tags": [], "hits": 6, "frames": 81, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 0:4 81:2", "hit_frames": [30, 36, 42, 48, 54, 60]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Life and Death (Mid-Air)", "tags": [], "hits": 1, "frames": 63, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:6 63:2", "hit_frames": [48]}, + {"section": "BASIC ATTACK", "name": "Basic: Movement of Fate and Finality", "tags": [], "hits": 7, "frames": 92, "cancel": 2, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [8, 14, 20, 26, 53, 60, 67]}, + {"section": "BASIC ATTACK", "name": "Basic: Hecate 1", "tags": [], "hits": 1, "frames": 40, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 35:0", "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Hecate 2", "tags": [], "hits": 2, "frames": 49, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 43:0", "hit_frames": [4, 22]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Movement of Life and Death", "tags": [], "hits": 2, "frames": 62, "cancel": 49, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [26, 49]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Scarlet Coda", "tags": [], "hits": 11, "frames": 172, "cancel": 139, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:9", "hit_frames": [14, 41, 59, 66, 73, 80, 87, 95, 102, 109, 139]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Whispers in a Fleeting Dream", "tags": [], "hits": 2, "frames": 34, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 32:2", "hit_frames": [10, 48]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Murmurs in a Haunting Dream", "tags": [], "hits": 6, "frames": 79, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 79:2", "hit_frames": [10, 16, 22, 28, 38, 81]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Waltz of Forsaken Depths", "tags": ["TIME STOP 240F", "MOTION STOP 240F"], "hits": 0, "frames": 240, "cancel": 240, "noswap": 0, "tstop": 240, "mstop": 240, "cd": "0:10", "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Curtain Call", "tags": [], "hits": 1, "frames": 83, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:10 47:5 83:2", "hit_frames": [42]}, + {"section": "FORTE", "name": "Basic: Enhanced Hecate", "tags": [], "hits": 0, "frames": 56, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "FORTE", "name": "Basic: Hecate - Strings", "tags": [], "hits": 2, "frames": 91, "cancel": 91, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 90:0", "hit_frames": [26, 56]}, + {"section": "FORTE", "name": "Basic: Hecate - Winds", "tags": [], "hits": 2, "frames": 70, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 70:0", "hit_frames": [26, 56]}, + {"section": "FORTE", "name": "Basic: Hecate - Cadenza", "tags": [], "hits": 2, "frames": 70, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 70:0", "hit_frames": [26, 56]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": "0:11", "hit_frames": [56]} + ] + }, + "1413": { + "name": "Qingxiao", + "wuwalab_name": "Qingxiao", + "url": "https://wuwalab.com/characters/qingxiao/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Tonality Shift", "tags": ["MOTION STOP 3–31F"], "hits": 3, "frames": 64, "cancel": 52, "noswap": 57, "tstop": 0, "mstop": 28, "cd": null, "hit_frames": [35, 43, 52]}, + {"section": "INTRO / OUTRO", "name": "Outro: Lingering Song", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 1", "tags": [], "hits": 2, "frames": 29, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [15, 22]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 1 (Heaven's Clarity)", "tags": [], "hits": 2, "frames": 29, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [15, 22]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 2", "tags": [], "hits": 2, "frames": 37, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 28]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 2 (Heaven's Clarity)", "tags": [], "hits": 2, "frames": 37, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 28]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3", "tags": [], "hits": 4, "frames": 48, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 12, 18, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3 (Heaven's Clarity)", "tags": [], "hits": 4, "frames": 48, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 12, 18, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3 (Dodge Counter)", "tags": [], "hits": 4, "frames": 48, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 12, 18, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3 (Dodge Counter) (Heaven's Clarity)", "tags": [], "hits": 4, "frames": 48, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [6, 12, 18, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 4", "tags": [], "hits": 5, "frames": 52, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [17, 32, 36, 39, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 4 (Heaven's Clarity)", "tags": [], "hits": 5, "frames": 52, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [17, 32, 36, 39, 42]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 1 (Mid-Air)", "tags": [], "hits": 6, "frames": 42, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0, 6, 12, 18, 24, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 1 (Mid-Air) (Heaven's Clarity)", "tags": [], "hits": 6, "frames": 42, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [0, 6, 12, 18, 24, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 2 (Mid-Air)", "tags": [], "hits": 3, "frames": 45, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 18, 23]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 2 (Mid-Air) (Heaven's Clarity)", "tags": [], "hits": 3, "frames": 45, "cancel": 23, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 18, 23]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3 (Mid-Air)", "tags": [], "hits": 6, "frames": 86, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [18, 24, 30, 36, 42, 70]}, + {"section": "BASIC ATTACK", "name": "Basic: Stringblade 3 (Mid-Air) (Heaven's Clarity)", "tags": [], "hits": 6, "frames": 86, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [18, 24, 30, 36, 42, 70]}, + {"section": "BASIC ATTACK", "name": "Basic: Plunging Attack", "tags": [], "hits": 1, "frames": 63, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [39]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Stringblade", "tags": [], "hits": 10, "frames": 137, "cancel": 109, "noswap": 126, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [26, 35, 43, 44, 52, 54, 61, 63, 72, 109]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 1", "tags": [], "hits": 3, "frames": 40, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 16, 19]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 1 (Enhanced)", "tags": [], "hits": 3, "frames": 40, "cancel": 19, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [12, 16, 19]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 2", "tags": [], "hits": 5, "frames": 58, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 17, 20, 26, 29]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 2 (Enhanced)", "tags": [], "hits": 5, "frames": 58, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [14, 17, 20, 26, 29]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 3", "tags": [], "hits": 5, "frames": 57, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 20, 30, 40, 50]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 3 (Enhanced)", "tags": [], "hits": 5, "frames": 57, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 20, 30, 40, 50]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 4", "tags": [], "hits": 5, "frames": 87, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 23, 32, 43, 61]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 4 (Enhanced)", "tags": [], "hits": 5, "frames": 87, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 23, 32, 43, 61]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 4 (Dodge Counter)", "tags": [], "hits": 5, "frames": 87, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 23, 32, 43, 61]}, + {"section": "FORTE", "name": "Basic: Ephemeral Transcendence 4 (Enhanced Dodge Counter)", "tags": [], "hits": 5, "frames": 87, "cancel": 61, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [10, 23, 32, 43, 61]}, + {"section": "FORTE", "name": "Forte: Heaven's Reckoning - Ephemeral Transcendence", "tags": ["TIME STOP 180F", "MOTION STOP 180F"], "hits": 10, "frames": 180, "cancel": 180, "noswap": 180, "tstop": 180, "mstop": 180, "cd": null, "hit_frames": [32, 44, 47, 58, 60, 72, 83, 90, 102, 119]}, + {"section": "FORTE", "name": "Forte: Heaven's Reckoning - Ephemeral Transcendence (Enhanced)", "tags": ["TIME STOP 180F", "MOTION STOP 180F"], "hits": 10, "frames": 180, "cancel": 180, "noswap": 180, "tstop": 180, "mstop": 180, "cd": null, "hit_frames": [32, 44, 47, 58, 60, 72, 83, 90, 102, 119]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Severing Note - Judgement", "tags": [], "hits": 3, "frames": 81, "cancel": 80, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 1200, "hit_frames": [4, 13, 72]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Severing Note - Ascendant", "tags": [], "hits": 3, "frames": 64, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16, 16, 25]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Severing Note - Ascendant (Heaven's Clarity)", "tags": [], "hits": 3, "frames": 64, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [16, 16, 25]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Billows Beneath Heaven", "tags": ["TIME STOP 300F", "MOTION STOP 300F"], "hits": 11, "frames": 300, "cancel": 300, "noswap": 0, "tstop": 300, "mstop": 300, "cd": 1500, "hit_frames": [140, 146, 152, 158, 164, 170, 176, 182, 188, 194, 238]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 120F", "MOTION STOP 100F"], "hits": 5, "frames": 120, "cancel": 120, "noswap": 120, "tstop": 120, "mstop": 100, "cd": null, "hit_frames": [64, 70, 76, 82, 101]} + ] + }, + "1411": { + "name": "Qiuyuan", + "wuwalab_name": "Qiuyuan", + "url": "https://wuwalab.com/characters/qiuyuan/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Attack the Must-Defend", "tags": ["MOTION STOP 6–54F"], "hits": 7, "frames": 74, "cancel": 68, "noswap": 70, "tstop": 0, "mstop": 48, "cd": 11, "hit_frames": [68, 73, 86, 98, 111, 124, 133]}, + {"section": "INTRO / OUTRO", "name": "Outro: Strike Before Ready", "tags": [], "hits": 1, "frames": 65, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": [82]}, + {"section": "INTRO / OUTRO", "name": "Outro: Sheath Fallen, New Shoots Revealed", "tags": [], "hits": 1, "frames": 65, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 10, "hit_frames": [82]}, + {"section": "BASIC ATTACK", "name": "Basic: Inkwash 1", "tags": [], "hits": 1, "frames": 19, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Inkwash 2", "tags": [], "hits": 2, "frames": 33, "cancel": 29, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Inkwash 3", "tags": [], "hits": 5, "frames": 64, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24, 34, 40, 49, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Inkwash (Dodge Counter)", "tags": [], "hits": 4, "frames": 90, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [30, 41, 53, 65]}, + {"section": "BASIC ATTACK", "name": "Basic: Inkwash (Mid-Air)", "tags": [], "hits": 1, "frames": 46, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [40]}, + {"section": "BASIC ATTACK", "name": "Basic: Thus Spoke the Blade - Inkwash 1", "tags": [], "hits": 2, "frames": 39, "cancel": 21, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10, 21]}, + {"section": "BASIC ATTACK", "name": "Basic: Thus Spoke the Blade - Inkwash 2", "tags": [], "hits": 3, "frames": 60, "cancel": 47, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 27, 47]}, + {"section": "BASIC ATTACK", "name": "Basic: Thus Spoke the Blade - Inkwash 3", "tags": [], "hits": 6, "frames": 45, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20, 56, 56, 74, 92, 110]}, + {"section": "BASIC ATTACK", "name": "Basic: Thus Spoke the Blade - Inkwash 4", "tags": [], "hits": 1, "frames": 53, "cancel": 6, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [6]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Inkwash", "tags": [], "hits": 1, "frames": 51, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [20]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Thus Spoke the Blade - To Teach", "tags": [], "hits": 5, "frames": 99, "cancel": 86, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [38, 46, 56, 68, 86]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Thus Spoke the Blade - To Save", "tags": [], "hits": 6, "frames": 57, "cancel": 57, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [40, 40, 46, 58, 64, 70]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Thus Spoke the Blade - To Sacrifice", "tags": [], "hits": 1, "frames": 47, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [32]}, + {"section": "HEAVY ATTACK", "name": "S6: Thus I Spoke", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [0]}, + {"section": "RESONANCE SKILL", "name": "Skill: Through the Groves", "tags": [], "hits": 3, "frames": 81, "cancel": 64, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [34, 49, 64]}, + {"section": "RESONANCE SKILL", "name": "Skill: Undaunted Wayfarer (Hold)", "tags": [], "hits": 5, "frames": 44, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [17, 25, 46, 67, 85]}, + {"section": "RESONANCE SKILL", "name": "Skill: Straw Cape in Drizzly Rain", "tags": [], "hits": 5, "frames": 44, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [16, 25, 46, 67, 85]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Sundering Strike", "tags": ["TIME STOP 230F", "MOTION STOP 230F"], "hits": 1, "frames": 230, "cancel": 230, "noswap": 0, "tstop": 230, "mstop": 230, "cd": 10, "hit_frames": [210]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 70F"], "hits": 5, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 70, "cd": 11, "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1308": { + "name": "Rebecca", + "wuwalab_name": "Rebecca", + "url": "https://wuwalab.com/characters/rebecca/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Yo, It's Big Boomin' Time!", "tags": ["MOTION STOP 4–93F"], "hits": 8, "frames": 96, "cancel": 72, "noswap": 96, "tstop": 0, "mstop": 89, "cd": "INTRO", "hit_frames": [44, 46, 48, 50, 52, 54, 56, 72]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Hey, Leadhead, Come 'n' Get Me!", "tags": ["MOTION STOP 4–61F"], "hits": 6, "frames": 89, "cancel": 59, "noswap": 63, "tstop": 0, "mstop": 57, "cd": "INTRO", "hit_frames": [29, 53, 54, 55, 57, 59]}, + {"section": "INTRO / OUTRO", "name": "Outro: Preem Choom", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Outro: Turret", "tags": [], "hits": 70, "frames": 840, "cancel": 840, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 192, 204, 216, 228, 240, 252, 264, 276, 288, 300, 312, 324, 336, 348, 360, 372, 384, 396, 408, 420, 432, 444, 456, 468, 480, 492, 504, 516, 528, 540, 552, 564, 576, 588, 600, 612, 624, 636, 648, 660, 672, 684, 696, 708, 720, 732, 744, 756, 768, 780, 792, 804, 816, 828, 840]}, + {"section": "INTRO / OUTRO", "name": "Outro: Turret (Lucy)", "tags": [], "hits": 20, "frames": 240, "cancel": 240, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 168, 180, 192, 204, 216, 228, 240]}, + {"section": "BASIC ATTACK", "name": "Basic: Huntress 1", "tags": [], "hits": 2, "frames": 26, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [8, 22]}, + {"section": "BASIC ATTACK", "name": "Basic: Huntress 2", "tags": [], "hits": 5, "frames": 40, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 13, 14, 16, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Huntress 3", "tags": [], "hits": 1, "frames": 42, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Huntress (Dodge Counter)", "tags": [], "hits": 1, "frames": 42, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Huntress (Mid-Air)", "tags": [], "hits": 1, "frames": 43, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34]}, + {"section": "BASIC ATTACK", "name": "Basic: Guts 1", "tags": [], "hits": 2, "frames": 56, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Guts 2", "tags": [], "hits": 1, "frames": 33, "cancel": 11, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11]}, + {"section": "BASIC ATTACK", "name": "Basic: Guts 3", "tags": [], "hits": 3, "frames": 85, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [13, 23, 58]}, + {"section": "BASIC ATTACK", "name": "Basic: Guts (Dodge Counter)", "tags": [], "hits": 1, "frames": 60, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [34]}, + {"section": "BASIC ATTACK", "name": "Basic: Guts (Mid-Air)", "tags": [], "hits": 1, "frames": 57, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Huntress", "tags": [], "hits": 2, "frames": 32, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [26, 32]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Huntress (Loop)", "tags": [], "hits": 1, "frames": 6, "cancel": 6, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [6]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Eat Lead!", "tags": [], "hits": 2, "frames": 36, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [0, 13]}, + {"section": "HEAVY ATTACK", "name": "Heavy 3: Guts", "tags": [], "hits": 1, "frames": 68, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [50]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: It's Big Boomin' Time!", "tags": [], "hits": 8, "frames": 87, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [30, 32, 34, 36, 38, 40, 42, 60]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Come 'n' Get Me!", "tags": [], "hits": 7, "frames": 110, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [12, 36, 62, 64, 66, 68, 70]}, + {"section": "FORTE", "name": "Forte: Rat-tat-tat!", "tags": [], "hits": 5, "frames": 110, "cancel": 84, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [12, 46, 50, 56, 84]}, + {"section": "FORTE", "name": "Forte: Bang-bang-bang!", "tags": [], "hits": 1, "frames": 90, "cancel": 64, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [64]}, + {"section": "DASH", "name": "Tactical Dodge: Huntress", "tags": [], "hits": 5, "frames": 36, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "DASH", "hit_frames": [6, 10, 16, 20, 30]}, + {"section": "DASH", "name": "Tactical Dodge: Guts", "tags": [], "hits": 1, "frames": 40, "cancel": 6, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "DASH", "hit_frames": [6]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Party 'til Dawn!", "tags": ["TIME STOP 180F", "MOTION STOP 180F"], "hits": 0, "frames": 180, "cancel": 180, "noswap": 0, "tstop": 180, "mstop": 180, "cd": "LIBERATION", "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Mk. 31 HMG", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Mk. 31 HMG 1st Enh.", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Mk. 31 HMG 2nd Enh.", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [0]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: BOOM! Fireworks!", "tags": [], "hits": 2, "frames": 133, "cancel": 133, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "LIBERATION", "hit_frames": [66, 79]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 96F", "MOTION STOP 70F"], "hits": 1, "frames": 96, "cancel": 96, "noswap": 96, "tstop": 96, "mstop": 70, "cd": "TUNEBREAK", "hit_frames": [72]}, + {"section": "TUNE BREAK SKILL", "name": "Hack Response - Meltdown", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "TUNEBREAK", "hit_frames": [0]} + ] + }, + "1501": { + "name": "Rover: Spectro", + "wuwalab_name": "Rover: Spectro", + "url": "https://wuwalab.com/characters/roverspectro/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Waveshock", "tags": ["MOTION STOP 4–51F"], "hits": 1, "frames": 72, "cancel": 56, "noswap": 71, "tstop": 0, "mstop": 47, "cd": 11, "hit_frames": [56]}, + {"section": "INTRO / OUTRO", "name": "Outro: Instant", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation 1", "tags": [], "hits": 1, "frames": 21, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation 2", "tags": [], "hits": 1, "frames": 25, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation 3", "tags": [], "hits": 5, "frames": 24, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14, 20, 26, 32, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation 4", "tags": [], "hits": 1, "frames": 49, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20]}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation (Dodge Counter)", "tags": [], "hits": 1, "frames": 27, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [17]}, + {"section": "BASIC ATTACK", "name": "Basic: Vibration Manifestation (Mid-Air)", "tags": [], "hits": 1, "frames": 54, "cancel": 39, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [39]}, + {"section": "BASIC ATTACK", "name": "Basic: Resonating Echoes", "tags": [], "hits": 2, "frames": 60, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [9, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy 1: Vibration Manifestation", "tags": [], "hits": 5, "frames": 33, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12, 18, 24, 30, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy 2: Resonance", "tags": [], "hits": 1, "frames": 27, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [17]}, + {"section": "HEAVY ATTACK", "name": "Heavy 3: Aftertune", "tags": [], "hits": 1, "frames": 41, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "RESONANCE SKILL", "name": "Skill: Resonating Slashes", "tags": [], "hits": 1, "frames": 41, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [16]}, + {"section": "RESONANCE SKILL", "name": "Skill: Resonating Spin", "tags": [], "hits": 2, "frames": 58, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [19, 31]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Echoing Orchestra", "tags": ["TIME STOP 129F", "MOTION STOP 79F"], "hits": 2, "frames": 129, "cancel": 129, "noswap": 0, "tstop": 129, "mstop": 79, "cd": 10, "hit_frames": [78, 123]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 91F", "MOTION STOP 70F"], "hits": 5, "frames": 91, "cancel": 91, "noswap": 91, "tstop": 91, "mstop": 70, "cd": 11, "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1102": { + "name": "Sanhua", + "wuwalab_name": "Sanhua", + "url": "https://wuwalab.com/characters/sanhua/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Freezing Thorns", "tags": ["MOTION STOP 52F"], "hits": 1, "frames": 60, "cancel": 54, "noswap": 70, "tstop": 0, "mstop": 52, "cd": "0:11 0:8", "hit_frames": [54]}, + {"section": "INTRO / OUTRO", "name": "Outro: Silversnow", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 1", "tags": [], "hits": 1, "frames": 23, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [13]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 2", "tags": [], "hits": 1, "frames": 33, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [24]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 2 (Dodge Counter)", "tags": [], "hits": 1, "frames": 33, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:8 25:2", "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 3", "tags": [], "hits": 4, "frames": 36, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [18, 24, 30, 36]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 4", "tags": [], "hits": 2, "frames": 36, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [12, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light 5", "tags": [], "hits": 1, "frames": 109, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 6:4 41:2", "hit_frames": [32]}, + {"section": "BASIC ATTACK", "name": "Basic: Frigid Light (Mid-Air)", "tags": [], "hits": 1, "frames": 60, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:6 44:2", "hit_frames": [34]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Cursor (Tap)", "tags": [], "hits": 0, "frames": 30, "cancel": 30, "noswap": 30, "tstop": 0, "mstop": 0, "cd": "0:7", "hit_frames": []}, + {"section": "HEAVY ATTACK", "name": "Heavy: Cursor (Forte)", "tags": [], "hits": 0, "frames": 50, "cancel": 50, "noswap": 50, "tstop": 0, "mstop": 0, "cd": "0:7", "hit_frames": []}, + {"section": "HEAVY ATTACK", "name": "Heavy: Cursor (Forte Buffer)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:7", "hit_frames": []}, + {"section": "HEAVY ATTACK", "name": "Heavy: Frigid Light", "tags": [], "hits": 5, "frames": 50, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 47:2", "hit_frames": [10, 14, 18, 22, 36]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Detonate", "tags": [], "hits": 2, "frames": 101, "cancel": 101, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3", "hit_frames": [51, 101]}, + {"section": "RESONANCE SKILL", "name": "Skill: Eternal Frost", "tags": [], "hits": 1, "frames": 60, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:4 59:2", "hit_frames": [18]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Glacial Gaze", "tags": ["TIME STOP 90F", "MOTION STOP 90F"], "hits": 1, "frames": 97, "cancel": 97, "noswap": 0, "tstop": 90, "mstop": 90, "cd": "0:10 93:0", "hit_frames": [72]}, + {"section": "FORTE", "name": "Glacier", "tags": [], "hits": 1, "frames": 75, "cancel": 75, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [75]}, + {"section": "FORTE", "name": "Ice Prism", "tags": [], "hits": 1, "frames": 62, "cancel": 62, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [62]}, + {"section": "FORTE", "name": "Ice Thorn", "tags": [], "hits": 1, "frames": 75, "cancel": 75, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [75]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 92F", "MOTION STOP 70F"], "hits": 5, "frames": 92, "cancel": 92, "noswap": 92, "tstop": 92, "mstop": 70, "cd": "0:11", "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1505": { + "name": "Shorekeeper", + "wuwalab_name": "Shorekeeper", + "url": "https://wuwalab.com/characters/shorekeeper/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Enlightenment", "tags": ["MOTION STOP 6–34F"], "hits": 5, "frames": 85, "cancel": 44, "noswap": 65, "tstop": 0, "mstop": 28, "cd": 10, "hit_frames": [83, 85, 87, 90, 92]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Discernment", "tags": ["TIME STOP 6–140F", "MOTION STOP 6–140F"], "hits": 3, "frames": 215, "cancel": 143, "noswap": 0, "tstop": 134, "mstop": 134, "cd": 10, "hit_frames": [143, 155, 167]}, + {"section": "INTRO / OUTRO", "name": "Outro: Binary Butterfly", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus 1", "tags": [], "hits": 1, "frames": 23, "cancel": 15, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus 2", "tags": [], "hits": 2, "frames": 33, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus 2 (Dodge Counter)", "tags": [], "hits": 2, "frames": 33, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [8, 20]}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus 3", "tags": [], "hits": 3, "frames": 47, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20, 29, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus 4", "tags": [], "hits": 1, "frames": 51, "cancel": 25, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [25]}, + {"section": "BASIC ATTACK", "name": "Basic: Origin Calculus (Mid-Air)", "tags": [], "hits": 1, "frames": 50, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [46]}, + {"section": "RESONANCE SKILL", "name": "Skill: Chaos Theory", "tags": [], "hits": 5, "frames": 39, "cancel": 17, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [55, 57, 60, 62, 65]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: End Loop", "tags": ["TIME STOP 207F", "MOTION STOP 207F"], "hits": 0, "frames": 207, "cancel": 207, "noswap": 0, "tstop": 207, "mstop": 207, "cd": 10, "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Stellarealm (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "FORTE", "name": "Forte: Illation", "tags": [], "hits": 5, "frames": 48, "cancel": 5, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [22, 34, 46, 58, 64]}, + {"section": "FORTE", "name": "Forte: Transmutation", "tags": [], "hits": 1, "frames": 50, "cancel": 46, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [46]}, + {"section": "FORTE", "name": "Flare Star Butterfly", "tags": [], "hits": 1, "frames": 36, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [36]}, + {"section": "FORTE", "name": "Flare Star Butterflies", "tags": [], "hits": 5, "frames": 56, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [42, 45, 48, 53, 56]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + }, + "1412": { + "name": "Sigrika", + "wuwalab_name": "Sigrika", + "url": "https://wuwalab.com/characters/sigrika/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Solsworn Etymology", "tags": ["MOTION STOP 5–42F"], "hits": 1, "frames": 58, "cancel": 46, "noswap": 48, "tstop": 0, "mstop": 37, "cd": "0:11 58:2", "hit_frames": [46]}, + {"section": "INTRO / OUTRO", "name": "Outro: In This Very Moment", "tags": [], "hits": 1, "frames": 48, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three 1", "tags": [], "hits": 1, "frames": 22, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three 2", "tags": [], "hits": 2, "frames": 41, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [18, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three 3", "tags": [], "hits": 3, "frames": 44, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [8, 16, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 42, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:8 0:2", "hit_frames": [8, 16, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three 4", "tags": [], "hits": 4, "frames": 78, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 72:1", "hit_frames": [22, 28, 46, 72]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three (Mid-Air)", "tags": [], "hits": 1, "frames": 44, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:6 36:2", "hit_frames": [38]}, + {"section": "BASIC ATTACK", "name": "Basic: One, Two, Three (Mid-Air Dodge Counter)", "tags": [], "hits": 1, "frames": 44, "cancel": 38, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:8 0:6 36:2", "hit_frames": [38]}, + {"section": "BASIC ATTACK", "name": "Basic: Elucidated", "tags": [], "hits": 4, "frames": 66, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:1 66:2", "hit_frames": [8, 16, 24, 66]}, + {"section": "BASIC ATTACK", "name": "Basic: Decipher (Dodge Counter)", "tags": [], "hits": 4, "frames": 66, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:8 66:2", "hit_frames": [8, 16, 24, 66]}, + {"section": "HEAVY ATTACK", "name": "Heavy: One, Two, Three", "tags": [], "hits": 2, "frames": 42, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2", "hit_frames": [32, 32]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: BOOMY BOOM!", "tags": [], "hits": 4, "frames": 56, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:3 56:2", "hit_frames": [10, 16, 36, 48]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: BIG BOOMY BOOM!", "tags": [], "hits": 5, "frames": 56, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 56:2", "hit_frames": [6, 18, 30, 42, 54]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Soliskin to the Aid", "tags": [], "hits": 4, "frames": 54, "cancel": 50, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:2 54:2", "hit_frames": [6, 16, 24, 50]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Where Trust Leads Me!", "tags": ["TIME STOP 228F", "MOTION STOP 228F"], "hits": 1, "frames": 228, "cancel": 228, "noswap": 0, "tstop": 228, "mstop": 228, "cd": "0:10 206:2", "hit_frames": [176]}, + {"section": "FORTE", "name": "Forte: Schemata of Runes", "tags": [], "hits": 1, "frames": 76, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:9 0:5 40:4 58:2", "hit_frames": [12]}, + {"section": "FORTE", "name": "Runic Outburst", "tags": [], "hits": 3, "frames": 68, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [20, 36, 68]}, + {"section": "FORTE", "name": "Runic Chain Whip", "tags": [], "hits": 7, "frames": 66, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [6, 12, 18, 24, 54, 60, 66]}, + {"section": "FORTE", "name": "Runic Soliskin", "tags": [], "hits": 6, "frames": 78, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "0:0", "hit_frames": [18, 36, 45, 54, 63, 78]}, + {"section": "FORTE", "name": "Forte: Learn My True Name", "tags": [], "hits": 2, "frames": 138, "cancel": 86, "noswap": 132, "tstop": 0, "mstop": 0, "cd": "0:10 132:9 138:2", "hit_frames": [86, 130]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 92F", "MOTION STOP 70F"], "hits": 1, "frames": 92, "cancel": 92, "noswap": 92, "tstop": 92, "mstop": 70, "cd": "0:11", "hit_frames": [72]} + ] + }, + "1110": { + "name": "Suisui", + "wuwalab_name": "SuiSui", + "url": "https://wuwalab.com/characters/suisui/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Tinkling Jade", "tags": ["MOTION STOP 4–58F"], "hits": 1, "frames": 78, "cancel": 60, "noswap": 60, "tstop": 0, "mstop": 54, "cd": "INTRO", "hit_frames": [60]}, + {"section": "INTRO / OUTRO", "name": "Intro: Tinkling Jade (Enhanced)", "tags": ["MOTION STOP 4–58F"], "hits": 1, "frames": 78, "cancel": 60, "noswap": 60, "tstop": 0, "mstop": 54, "cd": "INTRO", "hit_frames": [60]}, + {"section": "INTRO / OUTRO", "name": "Outro: Rippling Waters", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Enrichment (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Enrichment - S4 (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Spring's Birth (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Spring's Birth - S4 (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "Plume Step (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr 1", "tags": [], "hits": 1, "frames": 24, "cancel": 2, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [8]}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr 2", "tags": [], "hits": 2, "frames": 46, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 30]}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr 3", "tags": [], "hits": 3, "frames": 51, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [22, 29, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 35, "cancel": 26, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [13, 17, 26]}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr 4", "tags": [], "hits": 6, "frames": 60, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [2, 8, 14, 20, 26, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Zephyr (Mid-Air)", "tags": [], "hits": 1, "frames": 45, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [37]}, + {"section": "BASIC ATTACK", "name": "Basic: Drizzle 1", "tags": [], "hits": 4, "frames": 31, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [20, 24, 31, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: Drizzle 2", "tags": [], "hits": 7, "frames": 70, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [23, 32, 36, 40, 43, 47, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Drizzle 3", "tags": [], "hits": 12, "frames": 66, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [11, 16, 20, 25, 29, 34, 38, 43, 47, 52, 56, 61]}, + {"section": "BASIC ATTACK", "name": "Basic: Drizzle 4", "tags": [], "hits": 1, "frames": 64, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [48]}, + {"section": "BASIC ATTACK", "name": "Basic: Swallow's Cut", "tags": [], "hits": 1, "frames": 60, "cancel": 33, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [33]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Drizzle", "tags": [], "hits": 11, "frames": 97, "cancel": 82, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 82]}, + {"section": "HEAVY ATTACK", "name": "Basic: Illuminating Dew", "tags": [], "hits": 1, "frames": 64, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [30]}, + {"section": "RESONANCE SKILL", "name": "Skill: Zephyr", "tags": [], "hits": 6, "frames": 55, "cancel": 55, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [25, 31, 37, 43, 49, 55]}, + {"section": "RESONANCE SKILL", "name": "Skill: Awakening Spring", "tags": [], "hits": 1, "frames": 78, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [60]}, + {"section": "RESONANCE SKILL", "name": "Skill: Awakening Spring (Enhanced)", "tags": [], "hits": 1, "frames": 78, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [60]}, + {"section": "RESONANCE SKILL", "name": "Skill: Drizzle", "tags": [], "hits": 7, "frames": 54, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [26, 30, 35, 40, 45, 50, 57]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Song of Thoroughfare", "tags": ["TIME STOP 264F", "MOTION STOP 264F"], "hits": 0, "frames": 264, "cancel": 264, "noswap": 0, "tstop": 264, "mstop": 264, "cd": "LIBERATION", "hit_frames": []}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": "TUNEBREAK", "hit_frames": [56]} + ] + }, + "1601": { + "name": "Taoqi", + "wuwalab_name": "Taoqi", + "url": "https://wuwalab.com/characters/taoqi/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Defense Formation", "tags": ["MOTION STOP 4–61F"], "hits": 1, "frames": 104, "cancel": 64, "noswap": 90, "tstop": 0, "mstop": 57, "cd": 11, "hit_frames": [64]}, + {"section": "INTRO / OUTRO", "name": "Outro: Iron Will", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge 1", "tags": [], "hits": 1, "frames": 29, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge 2", "tags": [], "hits": 1, "frames": 35, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge 3", "tags": [], "hits": 2, "frames": 74, "cancel": 62, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36, 62]}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge 4", "tags": [], "hits": 1, "frames": 72, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [36]}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge (Dodge Counter)", "tags": [], "hits": 1, "frames": 48, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Concealed Edge (Mid-Air)", "tags": [], "hits": 1, "frames": 72, "cancel": 42, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [42]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Concealed Edge", "tags": [], "hits": 1, "frames": 77, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [30]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Strategic Parry", "tags": [], "hits": 1, "frames": 61, "cancel": 4, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [4]}, + {"section": "RESONANCE SKILL", "name": "Skill: Fortified Defense", "tags": [], "hits": 1, "frames": 55, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [32]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Unmovable", "tags": ["TIME STOP 145F", "MOTION STOP 103F"], "hits": 1, "frames": 145, "cancel": 140, "noswap": 0, "tstop": 145, "mstop": 103, "cd": 10, "hit_frames": [100]}, + {"section": "FORTE", "name": "Forte: Timed Counters 1", "tags": [], "hits": 1, "frames": 27, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [16]}, + {"section": "FORTE", "name": "Forte: Timed Counters 2", "tags": [], "hits": 1, "frames": 33, "cancel": 22, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [22]}, + {"section": "FORTE", "name": "Forte: Timed Counters 3", "tags": [], "hits": 1, "frames": 79, "cancel": 56, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [56]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 64F"], "hits": 3, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 64, "cd": 11, "hit_frames": [4, 26, 66]} + ] + }, + "1503": { + "name": "Verina", + "wuwalab_name": "Verina", + "url": "https://wuwalab.com/characters/verina/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Verdant Growth", "tags": ["MOTION STOP 4–54F"], "hits": 1, "frames": 98, "cancel": 76, "noswap": 83, "tstop": 0, "mstop": 50, "cd": 11, "hit_frames": [62]}, + {"section": "INTRO / OUTRO", "name": "Outro: Blossom", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "INTRO / OUTRO", "name": "S1: Blossom (Healing)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 1", "tags": [], "hits": 1, "frames": 29, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 2", "tags": [], "hits": 1, "frames": 35, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 3", "tags": [], "hits": 2, "frames": 43, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [20, 24]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 3 (Dodge Counter)", "tags": [], "hits": 1, "frames": 20, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 8, "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 4", "tags": [], "hits": 1, "frames": 43, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 5", "tags": [], "hits": 1, "frames": 58, "cancel": 10, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [10]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 21, "cancel": 15, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Starflower Blooms 1 (Mid-Air)", "tags": [], "hits": 1, "frames": 21, "cancel": 15, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [15]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 2 (Mid-Air)", "tags": [], "hits": 1, "frames": 18, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Starflower Blooms 2 (Mid-Air)", "tags": [], "hits": 1, "frames": 18, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [12]}, + {"section": "BASIC ATTACK", "name": "Basic: Cultivation 3 (Mid-Air)", "tags": [], "hits": 3, "frames": 33, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24, 28, 32]}, + {"section": "BASIC ATTACK", "name": "Basic: Starflower Blooms 3 (Mid-Air)", "tags": [], "hits": 3, "frames": 33, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [24, 28, 32]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Cultivation", "tags": [], "hits": 1, "frames": 48, "cancel": 9, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [9]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Cultivation (Mid-Air)", "tags": [], "hits": 1, "frames": 36, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 6, "hit_frames": [28]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Starflower Blooms", "tags": [], "hits": 2, "frames": 48, "cancel": 20, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [9, 20]}, + {"section": "RESONANCE SKILL", "name": "Skill: Botany Experiment", "tags": [], "hits": 4, "frames": 65, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [24, 27, 30, 45]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Arboreal Flourish", "tags": ["TIME STOP 106F", "MOTION STOP 59F"], "hits": 1, "frames": 150, "cancel": 150, "noswap": 0, "tstop": 106, "mstop": 59, "cd": 10, "hit_frames": [58]}, + {"section": "RESONANCE LIBERATION", "name": "Photosynthesis Mark", "tags": [], "hits": 1, "frames": 22, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [22]}, + {"section": "RESONANCE LIBERATION", "name": "Photosynthesis Mark - S3", "tags": [], "hits": 1, "frames": 22, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": null, "hit_frames": [22]}, + {"section": "RESONANCE LIBERATION", "name": "Joyous Harvest - S6", "tags": [], "hits": 1, "frames": 32, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [32]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + }, + "1610": { + "name": "Yangyang: Xuanling", + "wuwalab_name": "XuanLing", + "url": "https://wuwalab.com/characters/xuanling/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Skytouch", "tags": ["MOTION STOP 5–35F"], "hits": 1, "frames": 47, "cancel": 40, "noswap": 44, "tstop": 0, "mstop": 30, "cd": "INTRO", "hit_frames": [40]}, + {"section": "INTRO / OUTRO", "name": "Intro 2: Aria of the Feather", "tags": ["MOTION STOP 5–35F"], "hits": 1, "frames": 47, "cancel": 40, "noswap": 44, "tstop": 0, "mstop": 30, "cd": "INTRO", "hit_frames": [40]}, + {"section": "INTRO / OUTRO", "name": "Outro: As the Wind Wills", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword 1", "tags": [], "hits": 1, "frames": 19, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword 2", "tags": [], "hits": 3, "frames": 44, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 15, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 44, "cancel": 37, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [6, 15, 37]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword 3", "tags": [], "hits": 2, "frames": 43, "cancel": 35, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 35]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword 4", "tags": [], "hits": 3, "frames": 76, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 21, 41]}, + {"section": "BASIC ATTACK", "name": "Basic: Azure Sword (Mid-Air)", "tags": [], "hits": 1, "frames": 53, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword 1", "tags": [], "hits": 2, "frames": 33, "cancel": 27, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 27]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword 2", "tags": [], "hits": 3, "frames": 42, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 20, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword 2 (Dodge Counter)", "tags": [], "hits": 3, "frames": 42, "cancel": 12, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [12, 20, 29]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword 3", "tags": [], "hits": 5, "frames": 33, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16, 16, 25, 34, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword 4", "tags": [], "hits": 3, "frames": 93, "cancel": 54, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [50, 52, 54]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Sword (Mid-Air)", "tags": [], "hits": 1, "frames": 53, "cancel": 34, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [34]}, + {"section": "BASIC ATTACK", "name": "Basic: Feather Fall (Mid-Air)", "tags": [], "hits": 4, "frames": 76, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [10, 19, 28, 58]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Azure Sword", "tags": [], "hits": 3, "frames": 105, "cancel": 70, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [52, 60, 70]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Feather Sword", "tags": [], "hits": 2, "frames": 45, "cancel": 45, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [36, 45]}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Switch - Azure", "tags": [], "hits": 4, "frames": 59, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [22, 41, 50, 59]}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Switch - Azure (Directional)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Switch - Feather", "tags": [], "hits": 3, "frames": 44, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [28, 36, 44]}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Switch - Feather (Directional)", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Flow - Azure", "tags": [], "hits": 4, "frames": 59, "cancel": 41, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [22, 41, 50, 59]}, + {"section": "RESONANCE SKILL", "name": "Skill: Sword Stance Flow - Feather", "tags": [], "hits": 3, "frames": 44, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [28, 36, 44]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Hush of a Thousand Voices", "tags": ["TIME STOP 300F", "MOTION STOP 300F"], "hits": 1, "frames": 300, "cancel": 300, "noswap": 0, "tstop": 300, "mstop": 300, "cd": "LIBERATION", "hit_frames": [252]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Shadow of Xuanling", "tags": [], "hits": 1, "frames": 12, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "NONE", "hit_frames": [12]}, + {"section": "FORTE", "name": "Basic: Havoc in Bloom 1", "tags": [], "hits": 3, "frames": 38, "cancel": 14, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [14, 20, 26]}, + {"section": "FORTE", "name": "Basic: Havoc in Bloom 2", "tags": [], "hits": 3, "frames": 69, "cancel": 60, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [36, 48, 60]}, + {"section": "FORTE", "name": "Basic: Havoc in Bloom 3", "tags": [], "hits": 6, "frames": 108, "cancel": 72, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 15, 24, 33, 42, 72]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 70F"], "hits": 5, "frames": 90, "cancel": 90, "noswap": 89, "tstop": 90, "mstop": 70, "cd": "TUNEBREAK", "hit_frames": [30, 36, 42, 48, 72]} + ] + }, + "1507": { + "name": "Zani", + "wuwalab_name": "Zani", + "url": "https://wuwalab.com/characters/zani/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Immediate Execution", "tags": ["MOTION STOP 4–80F"], "hits": 6, "frames": 90, "cancel": 78, "noswap": 80, "tstop": 0, "mstop": 76, "cd": "INTRO", "hit_frames": [20, 26, 32, 38, 44, 78]}, + {"section": "INTRO / OUTRO", "name": "Outro: Beacon for the Future", "tags": [], "hits": 1, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "OUTRO", "hit_frames": [0]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation 1", "tags": [], "hits": 1, "frames": 24, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [16]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation 2", "tags": [], "hits": 1, "frames": 32, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [18]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation 3", "tags": [], "hits": 3, "frames": 57, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [12, 33, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation 3 (Dodge Counter)", "tags": [], "hits": 3, "frames": 57, "cancel": 51, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [12, 33, 51]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation 4", "tags": [], "hits": 4, "frames": 103, "cancel": 77, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [26, 42, 69, 77]}, + {"section": "BASIC ATTACK", "name": "Basic: Routine Negotiation (Mid-Air)", "tags": [], "hits": 1, "frames": 60, "cancel": 48, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [48]}, + {"section": "BASIC ATTACK", "name": "Basic: Breakthrough", "tags": [], "hits": 8, "frames": 110, "cancel": 110, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [26, 50, 60, 70, 80, 90, 100, 110]}, + {"section": "BASIC ATTACK", "name": "Basic: Heavy Slash Daybreak", "tags": [], "hits": 3, "frames": 31, "cancel": 31, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [20, 29, 31]}, + {"section": "BASIC ATTACK", "name": "Basic: Heavy Slash Dawning", "tags": [], "hits": 5, "frames": 79, "cancel": 71, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [18, 28, 56, 67, 71]}, + {"section": "BASIC ATTACK", "name": "Basic: Heavy Slash Dawning (Dodge Counter)", "tags": [], "hits": 5, "frames": 77, "cancel": 69, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "COUNTER", "hit_frames": [12, 22, 50, 63, 69]}, + {"section": "BASIC ATTACK", "name": "Basic: Heavy Slash Nightfall", "tags": [], "hits": 9, "frames": 151, "cancel": 133, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [22, 32, 51, 61, 80, 90, 94, 118, 133]}, + {"section": "BASIC ATTACK", "name": "Basic: Heavy Slash Nightfall (Half)", "tags": [], "hits": 5, "frames": 76, "cancel": 58, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "BASIC", "hit_frames": [6, 15, 19, 43, 58]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Routine Negotiation", "tags": [], "hits": 4, "frames": 63, "cancel": 47, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "HEAVY", "hit_frames": [12, 35, 41, 47]}, + {"section": "RESONANCE SKILL", "name": "Skill: Standard Defense Protocol", "tags": [], "hits": 1, "frames": 18, "cancel": 8, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [8]}, + {"section": "RESONANCE SKILL", "name": "Skill: Scorching Light (Tap)", "tags": [], "hits": 0, "frames": 30, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": []}, + {"section": "RESONANCE SKILL", "name": "Skill: Scorching Light (Hold)", "tags": [], "hits": 0, "frames": 78, "cancel": 78, "noswap": 0, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": []}, + {"section": "FORTE", "name": "Forte: Targeted Action", "tags": [], "hits": 3, "frames": 134, "cancel": 128, "noswap": 38, "tstop": 0, "mstop": 0, "cd": "SKILL", "hit_frames": [66, 117, 128]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Rekindle", "tags": ["TIME STOP 200F", "MOTION STOP 200F"], "hits": 1, "frames": 200, "cancel": 200, "noswap": 0, "tstop": 200, "mstop": 200, "cd": "LIBERATION", "hit_frames": [120]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: The Last Stand", "tags": ["TIME STOP 134F", "MOTION STOP 134F"], "hits": 2, "frames": 134, "cancel": 134, "noswap": 0, "tstop": 134, "mstop": 134, "cd": "LIBERATION", "hit_frames": [44, 128]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 94F", "MOTION STOP 70F"], "hits": 1, "frames": 94, "cancel": 94, "noswap": 94, "tstop": 94, "mstop": 70, "cd": "TUNEBREAK", "hit_frames": [72]} + ] + }, + "1105": { + "name": "Zhezhi", + "wuwalab_name": "Zhezhi", + "url": "https://wuwalab.com/characters/zhezhi/abilities", + "abilities": [ + {"section": "INTRO / OUTRO", "name": "Intro: Radiant Ruin", "tags": ["MOTION STOP 5–59F"], "hits": 3, "frames": 80, "cancel": 36, "noswap": 80, "tstop": 0, "mstop": 54, "cd": 11, "hit_frames": [66, 72, 78]}, + {"section": "INTRO / OUTRO", "name": "Outro: Carve and Draw", "tags": [], "hits": 0, "frames": 0, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": []}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 1", "tags": [], "hits": 2, "frames": 36, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [18, 34]}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 2", "tags": [], "hits": 5, "frames": 44, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [30, 34, 38, 42, 46]}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 2 (Dodge Counter)", "tags": [], "hits": 5, "frames": 34, "cancel": 13, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [18, 23, 26, 30, 35]}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 3", "tags": [], "hits": 1, "frames": 60, "cancel": 40, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [44]}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 1 (Mid-Air)", "tags": [], "hits": 5, "frames": 34, "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [22, 26, 30, 34, 38]}, + {"section": "BASIC ATTACK", "name": "Basic: Dimming Brush 2 (Mid-Air)", "tags": [], "hits": 1, "frames": 66, "cancel": 36, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [39]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Dimming Brush", "tags": [], "hits": 1, "frames": 40, "cancel": 32, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 2, "hit_frames": [34]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Conjuration", "tags": [], "hits": 3, "frames": 75, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 3, "hit_frames": [28, 34, 40]}, + {"section": "HEAVY ATTACK", "name": "Heavy: Conjuration (Mid-Air)", "tags": [], "hits": 3, "frames": 38, "cancel": 30, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [30, 36, 42]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Manifestation", "tags": [], "hits": 3, "frames": 40, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 4, "hit_frames": [26, 32, 38]}, + {"section": "RESONANCE SKILL", "name": "Skill 1: Manifestation (Hold)", "tags": [], "hits": 3, "frames": 42, "cancel": 24, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 5, "hit_frames": [26, 32, 38]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Stroke of Genius", "tags": ["MOTION STOP 12F"], "hits": 1, "frames": 52, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 12, "cd": 5, "hit_frames": [46]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Stroke of Genius - S6", "tags": ["MOTION STOP 12F"], "hits": 2, "frames": 52, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 12, "cd": 5, "hit_frames": [46, 52]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Stroke of Genius (Mid-Air)", "tags": ["MOTION STOP 12F"], "hits": 1, "frames": 52, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 12, "cd": 6, "hit_frames": [46]}, + {"section": "RESONANCE SKILL", "name": "Skill 2: Stroke of Genius (Mid-Air) - S6", "tags": ["MOTION STOP 12F"], "hits": 2, "frames": 52, "cancel": 18, "noswap": 0, "tstop": 0, "mstop": 12, "cd": 6, "hit_frames": [46, 52]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Creation's Zenith", "tags": ["MOTION STOP 52F"], "hits": 3, "frames": 72, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 52, "cd": 5, "hit_frames": [56, 68, 79]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Creation's Zenith - S6", "tags": ["MOTION STOP 52F"], "hits": 4, "frames": 72, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 52, "cd": 5, "hit_frames": [56, 62, 68, 79]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Creation's Zenith (Mid-Air)", "tags": ["MOTION STOP 52F"], "hits": 3, "frames": 72, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 52, "cd": 6, "hit_frames": [56, 68, 79]}, + {"section": "RESONANCE SKILL", "name": "Skill 3: Creation's Zenith (Mid-Air) - S6", "tags": ["MOTION STOP 52F"], "hits": 4, "frames": 72, "cancel": 28, "noswap": 0, "tstop": 0, "mstop": 52, "cd": 6, "hit_frames": [56, 62, 68, 79]}, + {"section": "RESONANCE LIBERATION", "name": "Liberation: Living Canvas", "tags": ["TIME STOP 166F", "MOTION STOP 166F"], "hits": 0, "frames": 166, "cancel": 166, "noswap": 0, "tstop": 166, "mstop": 166, "cd": 10, "hit_frames": []}, + {"section": "RESONANCE LIBERATION", "name": "Inklit Spirit", "tags": [], "hits": 1, "frames": 37, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [37]}, + {"section": "RESONANCE LIBERATION", "name": "Inklit Spirit - S5", "tags": [], "hits": 2, "frames": 37, "cancel": 0, "noswap": 0, "tstop": 0, "mstop": 0, "cd": 0, "hit_frames": [37, 37]}, + {"section": "TUNE BREAK SKILL", "name": "Tune Break Skill", "tags": ["TIME STOP 90F", "MOTION STOP 54F"], "hits": 1, "frames": 90, "cancel": 90, "noswap": 90, "tstop": 90, "mstop": 54, "cd": 11, "hit_frames": [56]} + ] + } + } +} diff --git a/tests/test_ww_timings.py b/tests/test_ww_timings.py new file mode 100644 index 0000000..7751a40 --- /dev/null +++ b/tests/test_ww_timings.py @@ -0,0 +1,48 @@ +import json +import sys +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(ROOT / "tools")) + +import ww_import_timings as imp # noqa: E402 + +CHARACTERS = json.loads((ROOT / "static" / "data" / "ww_characters.json").read_text(encoding="utf-8"))["characters"] +SHIPPED = json.loads((ROOT / "static" / "data" / "ww_timings.json").read_text(encoding="utf-8")) + + +class ImportTimingsTests(unittest.TestCase): + def test_matches_by_name_and_drops_damage_columns(self): + scrape = { + "fetched_at": "2026-10-01 08:51", + "characters": { + "roverspectro": {"name": "Rover: Spectro", "abilities": [ + {"section": "BASIC ATTACK", "name": "Basic 1", "tags": [], "hits": 1, "frames": 23, + "cancel": 16, "noswap": 0, "tstop": 0, "mstop": 0, "cd": None, "genre": "BASIC", + "mv": 120, "hit_frames": [16]}, + ]}, + "xuanling": {"name": "XuanLing", "abilities": []}, + "nobody": {"name": "Nobody", "abilities": []}, + }, + } + data, unmatched = imp.build(scrape, CHARACTERS) + self.assertEqual(unmatched, ["Nobody"]) + rover = data["characters"]["1501"] + self.assertEqual(rover["name"], "Rover: Spectro") + self.assertNotIn("mv", rover["abilities"][0]) + self.assertEqual(rover["abilities"][0]["cancel"], 16) + self.assertIn("1610", data["characters"]) # XuanLing -> Yangyang: Xuanling + self.assertEqual(json.loads(imp.dump(data)), data) + + def test_shipped_file_is_keyed_by_character_ids_and_timing_only(self): + ids = {str(c["id"]) for c in CHARACTERS.values()} + self.assertTrue(SHIPPED["characters"]) + for cid, c in SHIPPED["characters"].items(): + self.assertIn(cid, ids) + for a in c["abilities"]: + self.assertLessEqual(set(a), set(imp.KEEP), (c["name"], a["name"])) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/ww_import_timings.py b/tools/ww_import_timings.py new file mode 100644 index 0000000..c50bc90 --- /dev/null +++ b/tools/ww_import_timings.py @@ -0,0 +1,114 @@ +""" +Build static/data/ww_timings.json (the Characters page's Timings tab) from a WuwaLAB scrape. + +WuwaLAB (https://wuwalab.com) lists every ability's frame data on its character pages +(/characters//abilities). The scrape is read from those rendered pages; this tool only +reshapes it. ComboTracker is about which buttons to press and when, so only timing columns are +kept: hits, total frames, cancel frame, no-swap window, time stop, motion stop, cooldown, hit +frames and the chips WuwaLAB shows next to a name. Damage columns are dropped. + +Each WuwaLAB character is matched to its entry in static/data/ww_characters.json by name, and the +output is keyed by that entry's id so the page can look it up for the selected character. + +Usage: + python tools/ww_import_timings.py path/to/wuwalab_timings.json +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path +from typing import Any + +ROOT = Path(__file__).resolve().parent.parent +CHARACTERS = ROOT / "static" / "data" / "ww_characters.json" +OUT = ROOT / "static" / "data" / "ww_timings.json" + +KEEP = ("section", "name", "tags", "hits", "frames", "cancel", "noswap", "tstop", "mstop", "cd", "hit_frames") + +# WuwaLAB names that don't share a word set with the encore.moe name. +ALIASES = {"xuanling": "Yangyang: Xuanling"} + + +def name_tokens(name: str) -> str: + """'Rover: Spectro' -> 'rover spectro'; word order and punctuation ignored.""" + return " ".join(sorted(t for t in re.split(r"[^a-z]+", str(name).lower()) if t)) + + +def ability(raw: dict[str, Any]) -> dict[str, Any]: + out = {k: raw[k] for k in KEEP if k in raw} + out["tags"] = [str(t) for t in out.get("tags") or []] + out.setdefault("hit_frames", []) + return out + + +def build(scrape: dict[str, Any], characters: dict[str, Any]) -> tuple[dict[str, Any], list[str]]: + by_tokens = {name_tokens(c["name"]): c for c in characters.values()} + out: dict[str, Any] = {} + unmatched: list[str] = [] + for slug, ch in sorted(scrape.get("characters", {}).items()): + key = name_tokens(ALIASES.get(slug) or ch.get("name", slug)) + target = by_tokens.get(key) + if not target: + unmatched.append(ch.get("name", slug)) + continue + out[str(target["id"])] = { + "name": target["name"], + "wuwalab_name": ch.get("name", slug), + "url": ch.get("url") or f"https://wuwalab.com/characters/{slug}/abilities", + "abilities": [ability(a) for a in ch.get("abilities", [])], + } + data = { + "about": "Ability frame data from WuwaLAB (https://wuwalab.com), timing columns only. " + "Built by tools/ww_import_timings.py; keyed by the ids in ww_characters.json.", + "source": "https://wuwalab.com", + "fetched_at": scrape.get("fetched_at", ""), + "fps": 60, + "characters": out, + } + return data, unmatched + + +def dump(data: dict[str, Any]) -> str: + """Pretty at the character level, one ability per line, so updates diff cleanly.""" + lines = ["{"] + for k in ("about", "source", "fetched_at", "fps"): + lines.append(f" {json.dumps(k)}: {json.dumps(data[k], ensure_ascii=False)},") + lines.append(' "characters": {') + chars = list(data["characters"].items()) + for i, (cid, c) in enumerate(chars): + lines.append(f" {json.dumps(cid)}: {{") + for k in ("name", "wuwalab_name", "url"): + lines.append(f" {json.dumps(k)}: {json.dumps(c[k], ensure_ascii=False)},") + lines.append(' "abilities": [') + abl = c["abilities"] + for j, a in enumerate(abl): + lines.append(f" {json.dumps(a, ensure_ascii=False)}{',' if j < len(abl) - 1 else ''}") + lines.append(" ]") + lines.append(f" }}{',' if i < len(chars) - 1 else ''}") + lines.append(" }") + lines.append("}") + return "\n".join(lines) + "\n" + + +def main(argv: list[str] | None = None) -> int: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("scrape", type=Path, help="WuwaLAB scrape JSON (characters -> slug -> abilities)") + args = ap.parse_args(argv) + + scrape = json.loads(args.scrape.read_text(encoding="utf-8")) + characters = json.loads(CHARACTERS.read_text(encoding="utf-8"))["characters"] + data, unmatched = build(scrape, characters) + OUT.write_text(dump(data), encoding="utf-8") + total = sum(len(c["abilities"]) for c in data["characters"].values()) + print(f"Wrote {OUT.relative_to(ROOT)}: {len(data['characters'])} characters, {total} abilities.") + if unmatched: + print(f"No match in ww_characters.json (skipped): {', '.join(unmatched)}", file=sys.stderr) + return 1 if unmatched else 0 + + +if __name__ == "__main__": + sys.exit(main()) From d1933d307b6f4e4ddda15514bcc98fc5f00787a0 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 12:57:38 +0000 Subject: [PATCH 02/22] Fix the CI build job after requirements-build.txt was merged away PyInstaller now lives in requirements.txt, so the build job's "-r requirements-build.txt" failed with "No such file". Install from requirements.txt only, and update the README's build step to match. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01XnctbwSWKszAPHhVFMYjj4 --- .github/workflows/ci.yml | 2 +- README.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38ffb91..70cd7a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: with: python-version: "3.11" - name: Install dependencies - run: python -m pip install -r requirements.txt -r requirements-build.txt + run: python -m pip install -r requirements.txt - name: Build run: python -m PyInstaller --noconfirm --clean ComboTracker.spec - uses: actions/upload-artifact@v4 diff --git a/README.md b/README.md index 32aa4d1..4b19302 100644 --- a/README.md +++ b/README.md @@ -75,9 +75,9 @@ Notes: ### Building the Windows release You can package ComboTracker so others can run it without installing Python. -1. Install build tooling (once): +1. Install the requirements, which include PyInstaller (once): ```bash - python -m pip install -r requirements-build.txt + python -m pip install -r requirements.txt ``` 2. From the project root, build: ```bash From 5f8675a4dfa051cad3e957d460dc38c74ba8d69b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 13:15:19 +0000 Subject: [PATCH 03/22] Left-align the Characters page layout The layout was capped at 1400px and centered, so on a wide window the roster sat far right of the search box with an empty gap on its left. It now fills the width, lined up with the top bar. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01XnctbwSWKszAPHhVFMYjj4 --- static/characters.css | 2 -- 1 file changed, 2 deletions(-) diff --git a/static/characters.css b/static/characters.css index c813116..721322d 100644 --- a/static/characters.css +++ b/static/characters.css @@ -118,8 +118,6 @@ input[type="search"], select, textarea { grid-template-columns: minmax(260px, 360px) 1fr; gap: 20px; padding: 20px; - max-width: 1400px; - margin: 0 auto; align-items: start; } From 4b6f7a4e7a654134d86557854c254c3d722d5d6b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Oct 2026 13:17:12 +0000 Subject: [PATCH 04/22] Drag to resize the sidebar and the Characters list - Main app: a handle on the rail's right edge resizes it (200-480px). Double-click resets to 256px. Hidden when the rail is collapsed or on phones. While dragging, iframes ignore the pointer so the Characters page can't swallow the drag. - Characters page: a bar between the character list and the detail panel resizes the list (200-900px); the grid adds columns as it widens. Double-click resets. Hidden on narrow windows. Both widths are remembered per browser. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01XnctbwSWKszAPHhVFMYjj4 --- static/app/shell.js | 33 +++++++++++++++++++++++++++++++++ static/characters.css | 26 ++++++++++++++++++++++---- static/characters.html | 2 ++ static/characters.js | 39 +++++++++++++++++++++++++++++++++++++++ static/index.html | 3 +++ static/shell.css | 23 +++++++++++++++++++++-- 6 files changed, 120 insertions(+), 6 deletions(-) diff --git a/static/app/shell.js b/static/app/shell.js index 1a2bf29..d2f4e00 100644 --- a/static/app/shell.js +++ b/static/app/shell.js @@ -57,6 +57,39 @@ getEl('railToggle')?.addEventListener('click', () => { writeStoredFlag('ctRailCompact', compact); }); +// Drag the rail's right edge to resize it (remembered per browser); double-click resets. +const RAIL_WIDTH_KEY = 'ctRailWidth'; +const RAIL_MIN = 200, RAIL_MAX = 480, RAIL_DEFAULT = 256; +function setRailWidth(px) { + const w = Math.round(Math.min(RAIL_MAX, Math.max(RAIL_MIN, px))); + appEl.style.setProperty('--rail-w', `${w}px`); + return w; +} +try { + const saved = Number(localStorage.getItem(RAIL_WIDTH_KEY)); + if (saved) setRailWidth(saved); +} catch (_) { /* ignore */ } +const railResizer = getEl('railResizer'); +railResizer?.addEventListener('pointerdown', (e) => { + e.preventDefault(); + railResizer.setPointerCapture(e.pointerId); + document.body.classList.add('resizing'); + let width = Math.round(document.querySelector('.rail').getBoundingClientRect().width); + const move = (ev) => { width = setRailWidth(ev.clientX); }; + const up = () => { + railResizer.removeEventListener('pointermove', move); + document.body.classList.remove('resizing'); + try { localStorage.setItem(RAIL_WIDTH_KEY, String(width)); } catch (_) { /* ignore */ } + }; + railResizer.addEventListener('pointermove', move); + railResizer.addEventListener('pointerup', up, { once: true }); + railResizer.addEventListener('pointercancel', up, { once: true }); +}); +railResizer?.addEventListener('dblclick', () => { + setRailWidth(RAIL_DEFAULT); + try { localStorage.removeItem(RAIL_WIDTH_KEY); } catch (_) { /* ignore */ } +}); + // The combo list lives in the rail; without a rail (phones) it moves to the top of the Practice page. const comboListCard = getEl('comboListCard'); const railSpacer = document.querySelector('.rail-spacer'); diff --git a/static/characters.css b/static/characters.css index 721322d..217b2c4 100644 --- a/static/characters.css +++ b/static/characters.css @@ -13,6 +13,7 @@ --line: #232933; --line-strong: #343C48; --radius: 10px; + --roster-w: 360px; --el-aero: #55d6a8; --el-electro: #b67cff; @@ -115,8 +116,8 @@ input[type="search"], select, textarea { /* --- Layout --- */ .layout { display: grid; - grid-template-columns: minmax(260px, 360px) 1fr; - gap: 20px; + grid-template-columns: var(--roster-w) 12px minmax(0, 1fr); + gap: 4px; padding: 20px; align-items: start; } @@ -305,9 +306,25 @@ input[type="search"], select, textarea { .as-inputs .row { display: flex; flex-wrap: wrap; gap: 6px; } .src-line { margin-top: 14px; font-size: 12px; color: var(--text-secondary); } +/* Drag handle between the roster and the detail panel (characters.js) */ +.splitter { + position: sticky; + top: 76px; + align-self: stretch; + max-height: calc(100vh - 96px); + cursor: col-resize; + display: flex; + justify-content: center; +} +.splitter::before { content: ''; width: 2px; border-radius: 1px; background: var(--line); } +.splitter:hover::before, +.resizing .splitter::before { background: var(--accent-blue); } +.resizing { cursor: col-resize; user-select: none; } + /* --- Phones / narrow windows --- */ @media (max-width: 900px) { - .layout { grid-template-columns: 1fr; padding: 12px; } + .layout { grid-template-columns: 1fr; padding: 12px; gap: 20px; } + .splitter { display: none; } .roster { position: static; max-height: 260px; } .skill-body { grid-template-columns: 1fr; } .team { grid-template-columns: 1fr auto; } @@ -324,5 +341,6 @@ input[type="search"], select, textarea { .embed .topbar { position: static; background: transparent; padding: 14px 16px 0; border-bottom: 0; } .embed .topbar .back, .embed .topbar h1 { display: none; } -.embed .roster { top: 12px; max-height: calc(100vh - 24px); } +.embed .roster, +.embed .splitter { top: 12px; max-height: calc(100vh - 24px); } .embed .layout { padding: 16px; } diff --git a/static/characters.html b/static/characters.html index 149f645..40f86e6 100644 --- a/static/characters.html +++ b/static/characters.html @@ -23,6 +23,8 @@

Characters

+ +
Pick a character to see their moves and team rotations.
diff --git a/static/characters.js b/static/characters.js index 34ac4e1..a3af20f 100644 --- a/static/characters.js +++ b/static/characters.js @@ -481,6 +481,44 @@ function saveAsCombo(teamEl) { // Events + boot // --------------------------------------------------------------------------- +// Drag the bar between the roster and the detail panel to resize the roster (remembered per +// browser); double-click resets it. +const ROSTER_WIDTH_KEY = 'ww-roster-width'; +const ROSTER_MIN = 200, ROSTER_MAX = 900; + +function setRosterWidth(px) { + const w = Math.round(Math.min(ROSTER_MAX, Math.max(ROSTER_MIN, px))); + document.documentElement.style.setProperty('--roster-w', `${w}px`); + return w; +} + +function bindResizer() { + const saved = Number(readPref(ROSTER_WIDTH_KEY, 0)); + if (saved) setRosterWidth(saved); + const bar = $('rosterResizer'); + bar.addEventListener('pointerdown', (e) => { + e.preventDefault(); + bar.setPointerCapture(e.pointerId); + document.body.classList.add('resizing'); + const startX = e.clientX; + const startW = $('roster').getBoundingClientRect().width; + let width = startW; + const move = (ev) => { width = setRosterWidth(startW + ev.clientX - startX); }; + const up = () => { + bar.removeEventListener('pointermove', move); + document.body.classList.remove('resizing'); + writePref(ROSTER_WIDTH_KEY, String(width)); + }; + bar.addEventListener('pointermove', move); + bar.addEventListener('pointerup', up, { once: true }); + bar.addEventListener('pointercancel', up, { once: true }); + }); + bar.addEventListener('dblclick', () => { + document.documentElement.style.removeProperty('--roster-w'); + try { localStorage.removeItem(ROSTER_WIDTH_KEY); } catch { /* ignore */ } + }); +} + function bindEvents() { $('search').addEventListener('input', (e) => { state.query = e.target.value.trim(); @@ -599,5 +637,6 @@ async function downloadRaw() { renderFilters(); bindEvents(); +bindResizer(); watchTracker(); load(); diff --git a/static/index.html b/static/index.html index 31b0505..f5f81d0 100644 --- a/static/index.html +++ b/static/index.html @@ -15,6 +15,9 @@
+ + +