From 2d262773f13a7daebc7ddc2d0a669022cdbd1d9b Mon Sep 17 00:00:00 2001 From: rizkyaz0 Date: Thu, 1 Oct 2026 19:58:20 +0700 Subject: [PATCH] Rasa bermain, gerakan perintah, toko, skin, menu karakter, easter egg --- ROADMAP.md | 5 ++ browo.js | 6 +- files.json | 8 +-- game.js | 93 +++++++++++++++++++++---- index.html | 4 +- menu.js | 4 +- meta.css | 32 +++++++++ meta.js | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++ precache.js | 2 +- 9 files changed, 319 insertions(+), 25 deletions(-) create mode 100644 meta.css create mode 100644 meta.js diff --git a/ROADMAP.md b/ROADMAP.md index b92f9d3..cb77c16 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -6,6 +6,11 @@ Status per 2026-10-02. Dokumen ini adalah usulan; urutan dan isi sepenuhnya bisa --- +## Status pengerjaan (2026-10-02, branch `feat/gamefeel-shop`) + +**Sudah dikerjakan dan diuji:** jarak berdiri 54→80 px dan jangkauan pukulan +28% (1.1, 1.5); skala sprite lompat ×1.14 dan jongkok ×1.10 (1.2); gerakan perintah ↓↓+Spasi (uppercut, menjatuhkan) dan ↓→+Spasi (tinju maju); salto dua-ketuk-S dipindah (lompat ganda tetap W W) (1.4, keputusan 1); counter hit dan pengurangan damage kombo panjang plus peringkat kombo C/B/A/S (1.3 sebagian); koin, toko (5 jurus, 6 skin warna), menu Karakter (skin, jurus toko tombol K, daftar gerakan), Koleksi (15 pencapaian, statistik, ekspor/impor simpanan) (2, 3, 5 sebagian); easter egg: kode Konami, ketik `syududu` / `mbg` / `esemka`, klik judul 7x, ketuk slot tanda tanya (6 sebagian). +**Belum:** launcher/juggle penuh, blok/parry/lempar, skill tambahan per karakter (butuh gambar), skin kostum, mode Arcade/Survival/2P, suara, gamepad, rebind tombol, hit-stop per serangan, kalibrasi ukuran kepala sejati (sekarang pakai faktor tetap). + ## 0. Kondisi sekarang **Sudah ada** diff --git a/browo.js b/browo.js index 355ad6f..7004a06 100644 --- a/browo.js +++ b/browo.js @@ -6,9 +6,9 @@ // Safari chain: a quick jab, a wide hook, then a heavy shoulder smash with big knockback. Reach sits inside the measured // fist tip (82/82/97 px in BROWO_METRICS.emitters). const combo = [ - {damage:6,knockback:80,reach:105,duration:.34,hitAt:.5}, - {damage:8,knockback:110,reach:105,duration:.38,hitAt:.5}, - {damage:12,knockback:220,reach:120,duration:.5,hitAt:.58} + {damage:6,knockback:80,reach:135,duration:.34,hitAt:.5}, + {damage:8,knockback:110,reach:135,duration:.38,hitAt:.5}, + {damage:12,knockback:220,reach:155,duration:.5,hitAt:.58} ]; // Pohon Sawit: BRO WO slams a palm on the floor and an oil-palm erupts `ahead` px in front; everything inside `radius` // px of that spot on the floor is hit. He does not need to touch the rival; a jump above 150 px clears it. diff --git a/files.json b/files.json index 4306a81..9b2ef1d 100644 --- a/files.json +++ b/files.json @@ -1,10 +1,10 @@ { "files": 216, - "bytes": 30348602, + "bytes": 30355188, "list": [ { "file": "index.html", - "bytes": 11996 + "bytes": 12066 }, { "file": "mobile.html", @@ -24,11 +24,11 @@ }, { "file": "game.js", - "bytes": 217269 + "bytes": 223237 }, { "file": "menu.js", - "bytes": 21009 + "bytes": 21557 }, { "file": "match.js", diff --git a/game.js b/game.js index 5cf8b2e..4701a73 100644 --- a/game.js +++ b/game.js @@ -2,7 +2,7 @@ (() => { 'use strict'; const W = 1280, H = 720; - const CONFIG = { groundY: 584, walkSpeed: 320, runSpeed: 520, jumpSpeed: 830, doubleJumpSpeed: 790, gravity: 2900, fastFall: 1180, doubleTapWindow: .26, rollDuration: .28, ...window.STAGE_CONFIG }; + const CONFIG = { bodyGap: 80, reachScale: 1.28, groundY: 584, walkSpeed: 320, runSpeed: 520, jumpSpeed: 830, doubleJumpSpeed: 790, gravity: 2900, fastFall: 1180, doubleTapWindow: .26, rollDuration: .28, ...window.STAGE_CONFIG }; const canvas = document.querySelector('#arena'), ctx = canvas.getContext('2d', { alpha: false }); const $ = s => document.querySelector(s); const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v)); @@ -209,6 +209,7 @@ systemAnnouncer?.play([call,outcome]); } if(event.type==='next-round'){resetCombat();announceTimer=0;emitRoundCue('round',event.round);} + if(event.type==='complete'){window.Meta?.award?.({winner:match.winner,playerWins:match.playerWins,enemyWins:match.enemyWins,player:selectedCharacter,enemy:opponentCharacter,level:difficulty,bestCombo,perfect:match.winner==='player'&&match.enemyWins===0});} if(event.type==='complete')window.FrontEnd?.showResult({winner:match.winner,playerWins:match.playerWins,enemyWins:match.enemyWins,player:selectedCharacter,enemy:opponentCharacter,stage:stageId,level:difficulty,mode:'versus'}); } } @@ -293,21 +294,82 @@ if (key === 'escape') { if (settingsOpen) closeSettings(); else setPaused(!paused); return; } if (key === 'r') { reset(); return; } if (!canAct() || keys.has(key)) return; - keys.add(key); + keys.add(key); logInput(key); if (key === 'a' || key === 'd') { const direction = key === 'a' ? -1 : 1; if (time - taps[key] <= CONFIG.doubleTapWindow) hero.runDirection = direction; else if (hero.runDirection !== direction) hero.runDirection = 0; taps[key] = time; taps[key === 'a' ? 'd' : 'a'] = -10; } // A new left/right press cuts a basic attack short: right away after its hit, or as soon as the hit lands. if ((key === 'a' || key === 'd') && hero.action?.type === 'attack') { if (hero.action.fired) { hero.action = null; state(hero.grounded ? 'idle' : 'jump'); } else { hero.action.cancelInto = 'move'; hero.action.queued = 0; } } if (key === 'w') jump(); - if (key === 's') { if (time - taps.s <= CONFIG.doubleTapWindow) jump(true); taps.s = time; } - if (key === ' ') startAttack(); - if (key === 'i') cast('skill1'); if (key === 'o') cast('skill2'); if (key === 'p') cast('ultimate'); + if (key === 's') taps.s = time; + if (key === ' ') { if (!startCommand()) startAttack(); } + if (key === 'k') useShopMove(); if (key === 'i') cast('skill1'); if (key === 'o') cast('skill2'); if (key === 'p') cast('ultimate'); } + + // ---- Command moves, shop moves and game-feel helpers (see ROADMAP.md) ---- + // Down-down+Space is an uppercut launcher, down-forward+Space a lunging punch. They reuse the fighter's own attack poses. + const inputLog = []; + const STATE_SCALE = { jump: 1.14, crouch: 1.1 }; + function logInput(key) { if (!'sad'.includes(key)) return; inputLog.push({ k: key, t: time }); if (inputLog.length > 6) inputLog.shift(); } + function commandFor() { + const fwd = hero.facing > 0 ? 'd' : 'a', n = inputLog.length, last = inputLog[n - 1], prev = inputLog[n - 2]; + if (!last || time - last.t > .55) return null; + if (last.k === 's' && prev?.k === 's' && last.t - prev.t <= .4) return 'uppercut'; + if (last.k === fwd && prev?.k === 's' && last.t - prev.t <= .4) return 'lunge'; + return null; + } + const COMMANDS = { + uppercut: { label: 'UPPERCUT!', state: 'attack3', cd: 2.6, duration: .5, hitAt: .36, damage: 15, knockback: 260 }, + lunge: { label: 'TINJU MAJU!', state: 'attack2', cd: 1.8, duration: .44, hitAt: .3, damage: 11, knockback: 300 } + }; + function startCommand() { + const id = commandFor(); if (!id || !canAct() || hero.action || hero.doublePose > 0 || (hero.spCd || 0) > 0 || !hero.grounded) return false; + const c = COMMANDS[id]; inputLog.length = 0; hero.spCd = c.cd; + hero.action = { type: 'attack', name: c.state, index: 3, t: 0, duration: c.duration, hit: false, queued: 0, fired: false, hitAt: c.hitAt, special: id, color: '#ffe9a0' }; + hero.runDirection = 0; state(c.state); announce(c.label, .6); sound('cast'); return true; + } + const SHOP_MOVES = { + seruduk: { name: 'SERUDUK KILAT', cd: 7, state: 'attack2', duration: .45, hitAt: .3, damage: 14, knockback: 340 }, + hentak: { name: 'HENTAKAN BUMI', cd: 10, state: 'attack3', duration: .55, hitAt: .42, damage: 16, knockback: 200 }, + perisai: { name: 'PERISAI', cd: 16, instant: true }, + pulih: { name: 'AURA PEMULIH', cd: 30, instant: true }, + isiulang: { name: 'ISI ULANG', cd: 35, instant: true } + }; + function useShopMove() { + const id = window.Meta?.equippedMove?.(), m = SHOP_MOVES[id]; + if (!m || !canAct() || hero.action || hero.doublePose > 0 || (hero.shopCd || 0) > 0) return false; + hero.shopCd = m.cd; announce(m.name, .7); sound('cast'); + if (m.instant) { + if (id === 'perisai') { hero.invuln = Math.max(hero.invuln, 1.6); hero.shield = 1.6; } + if (id === 'pulih') { hero.hp = Math.min(BALANCE.heroMax, hero.hp + 25); damageNumbers.push({ x: hero.x, y: hero.y - 150, amount: '+25', life: .9, maxLife: .9, color: '#8dffa8' }); } + if (id === 'isiulang') { hero.cooldowns.skill1 = hero.cooldowns.skill2 = 0; rechargePulse.skill1 = rechargePulse.skill2 = .3; } + spawnParticles(hero.x, hero.y - 90, id === 'pulih' ? '#8dffa8' : '#9fe8ff', 26, 240); return true; + } + hero.action = { type: 'attack', name: m.state, index: 3, t: 0, duration: m.duration, hit: false, queued: 0, fired: false, hitAt: m.hitAt, special: id, color: '#9fe8ff' }; + hero.runDirection = 0; state(m.state); return true; + } + function specialHit(a) { + const dx = (dummy.x - hero.x) * hero.facing, y = hero.y - 100, near = Math.abs(dummy.y - hero.y) < 150, col = a.color || '#ffe9a0'; + effects.push({ type: 'slash', x: hero.x + hero.facing * 60, y, life: .28, maxLife: .28, facing: hero.facing, index: 3, color: col }); + if (a.special === 'hentak') { + effects.push({ type: 'slam', x: hero.x, y: CONFIG.groundY - 2, life: .8, maxLife: .8 }); spawnParticles(hero.x, CONFIG.groundY - 8, col, 36, 360); trauma = Math.min(1, trauma + .4); sound('heavy'); + if (Math.abs(dx) < 230 && dummy.y > CONFIG.groundY - 125) hitDummy(SHOP_MOVES.hentak.damage, 200, col, hero.x, y, true); + return; + } + const reach = a.special === 'uppercut' ? 150 : a.special === 'seruduk' ? 190 : 175, dmg = (COMMANDS[a.special] || SHOP_MOVES[a.special]).damage, kb = (COMMANDS[a.special] || SHOP_MOVES[a.special]).knockback; + dust(hero.x + hero.facing * 40, 12); + if (dx > -30 && dx < reach && near) { + const up = a.special === 'uppercut'; + if (hitDummy(dmg, kb, col, hero.x, y, up) && up) { dummy.vy = -640; dummy.y -= 2; } + sound('heavy'); + } else sound('step'); + } + function comboRank(n) { return n >= 12 ? 'S' : n >= 8 ? 'A' : n >= 5 ? 'B' : n >= 3 ? 'C' : ''; } function release(key) { key = key.toLowerCase(); keys.delete(key); if ((key === 'a' && hero.runDirection === -1) || (key === 'd' && hero.runDirection === 1)) hero.runDirection = 0; } function clearInput() { keys.clear(); hero.runDirection = 0; taps.a = taps.d = taps.s = -10; } function resetCombat() { systemAnnouncer?.clear(); stopUltimateVoice(); Object.assign(hero, { x: 350, y: CONFIG.groundY, vx: 0, vy: 0, facing: 1, grounded: true, jumps: 0, state: 'idle', animTime: 0, walkPhase: 0, smokeDistance:0, action: null, runDirection: 0, hp: BALANCE.heroMax, koTime:0, invuln: 0, hurtTime: 0, doublePose: 0, rollDuration: CONFIG.rollDuration, rollBuffer: null, airTime: 0, cooldowns: { skill1: 0, skill2: 0, ultimate: 0 } }); + hero.spCd = hero.shopCd = hero.shield = 0; inputLog.length = 0; Object.assign(dummy, { x: 915, y: CONFIG.groundY, vx: 0, vy: 0, state: 'idle', stateTime: 0, damage: 0, ko:false, flash: 0, invuln: 0, angle: 0 }); if(F) {F.reset(hero);F.reset(dummy);Object.assign(dummy,{facing:-1,action:null,cooldowns:{skill1:0,skill2:0,ultimate:0},aiThink:.4,aiTime:0,aiChain:0,walkPhase:0,jumps:0});cpu={seen:new WeakMap(),decided:new WeakSet(),read:null,heroActionAt:0,heroAction:null,airborne:false,airAt:0,antiAirRead:false,plan:null,doubleAt:0};syncPlayerForm();} fenrCutin=null;hudIdentity=''; @@ -323,6 +385,9 @@ if (menuOpen || (match && match.phase!=='fight') || dummy.invuln > 0 || dummy.state === 'down' || dummy.state === 'recover') return false; if (dummy.action?.guard && shellGuard(dummy)) return false; const dir = sourceX <= dummy.x ? 1 : -1; + // Counter hit: striking a rival in their wind-up deals extra; long chains scale down so none loops forever. + if (dummy.action && !dummy.action.fired && dummy.action.type === 'attack') { damage = Math.round(damage * 1.25); if (damage > 1) announce('COUNTER!', .5); } + if (comboHits >= 5) damage = Math.max(1, Math.round(damage * Math.max(.55, 1 - .07 * (comboHits - 4)))); dummy.damage += damage; totalDamage += damage; comboHits++; bestCombo = Math.max(bestCombo, comboHits); comboDamage += damage; comboTimer = 2.3; // Versus combo limit: after comboCap hits in one continuous stun the CPU gets its immunity (like the player's), // so a re-started chain cannot loop it to K.O. Easy has no limit. @@ -706,7 +771,7 @@ const cfx = { ents: [], hazards: [], marks: [] }; function cfKit(d) { const move = (name, index = 1, mode = false) => { - if (name === 'attack') return { name: `attack${index}`, type: 'attack', index, ...d.combo[index - 1] }; + if (name === 'attack') { const c = d.combo[index - 1]; return { name: `attack${index}`, type: 'attack', index, ...c, reach: Math.round((c.reach || 105) * (CONFIG.reachScale || 1)) }; } if (name === 'ultimate') return { name: 'ultimate', type: 'ultimate', duration: d.balance.castTime, damage: 0, hitAt: 1 }; const k = (mode && d.mode?.skills?.[name]) || d.skills[name], m = { name, type: name, knockback: 160, duration: .6, ...k, hitAt: k.hitAt ?? .5 }; if (k.kind === 'projectile' || k.kind === 'wave' || k.kind === 'homing' || k.kind === 'lob') { m.projectile = true; m.range = k.range || 560; m.reach = m.range; } @@ -1181,7 +1246,7 @@ time += dt; hero.animTime += dt; hero.invuln = Math.max(0, hero.invuln - dt); hero.doublePose = Math.max(0, (hero.doublePose || 0) - dt); if(fenrCutin) {fenrCutin.t+=dt;if(fenrCutin.t>.78)fenrCutin=null;} if(F&&selectedCharacter==='fenr'){const changes=hero.formChanges;F.advance(hero,dt,hero.hp>0);if(changes!==hero.formChanges){syncPlayerForm();hero.doublePose=0;state(hero.grounded?'idle':'jump');}} - hero.airTime = hero.grounded ? 0 : hero.airTime + dt; + hero.airTime = hero.grounded ? 0 : hero.airTime + dt; hero.spCd = Math.max(0, (hero.spCd || 0) - dt); hero.shopCd = Math.max(0, (hero.shopCd || 0) - dt); hero.shield = Math.max(0, (hero.shield || 0) - dt); for (const name of Object.keys(hero.cooldowns)) hero.cooldowns[name] = Math.max(0, hero.cooldowns[name] - dt); if (hero.doublePose <= 0 && hero.rollBuffer && hero.hurtTime <= 0) { const buffered = hero.rollBuffer; hero.rollBuffer = null; if (buffered === 'attack') startAttack(); else cast(buffered); } comboTimer = Math.max(0, comboTimer - dt); if (!comboTimer) comboHits = comboDamage = 0; @@ -1199,7 +1264,8 @@ if (hero.action) { const a = hero.action; a.t += dt; state(a.name); if((selectedCharacter==='fenr'||selectedCharacter==='mira'||selectedCharacter==='haldor'||selectedCharacter==='isolde'||selectedCharacter==='solan'||selectedCharacter==='nib'||CF[selectedCharacter])&&a.dash&&a.t>a.duration*.2&&a.t= a.duration * (a.hitAt || (a.type === 'skill2' ? .53 : .5))) { a.fired = true; if (a.type === 'attack') meleeHit(a.index); else fireSkill(a); } + if (a.special && a.t < a.duration * .55 && ['lunge', 'seruduk'].includes(a.special)) hero.vx = hero.facing * (a.special === 'seruduk' ? 1000 : 760); + if (a.type !== 'ultimate' && !a.fired && a.t >= a.duration * (a.hitAt || (a.type === 'skill2' ? .53 : .5))) { a.fired = true; if (a.special) specialHit(a); else if (a.type === 'attack') meleeHit(a.index); else fireSkill(a); } if (a.fired && a.cancelInto && hero.action === a) { const into = a.cancelInto; hero.action = null; state(hero.grounded ? 'idle' : 'jump'); if (into === 'jump') jump(); } if (a.t >= a.duration || (a.type === 'skill1' && a.fired)) { const queued = a.queued && a.index < 3, remaining = Math.max(0, a.queued - 1); const next = (a.index || 0) + 1; hero.action = null; if (queued) { startAttack(next); hero.action.queued = remaining; } else state(hero.grounded ? 'idle' : 'jump'); } } @@ -1221,7 +1287,7 @@ advanceMatch(dt); } // MIRA's robot and HALDOR's exoframe are much wider than the other fighters; keep bodies from sinking into them. - function bodyGap() { return selectedCharacter === 'mira' || opponentCharacter === 'mira' ? 66 : selectedCharacter === 'haldor' || opponentCharacter === 'haldor' ? 62 : 54; } + function bodyGap() { return CONFIG.bodyGap || 80; } function currentDummyHP() {return Math.max(0,BALANCE.dummyMax-dummy.damage);} function hpLayers(value) {return {front:clamp(value-BALANCE.hpPerBar,0,BALANCE.hpPerBar),reserve:clamp(value,0,BALANCE.hpPerBar)};} function updateDummy(dt) { @@ -1896,8 +1962,9 @@ const pose = heroPose(), index = pose.frame; const r = list[index], cw = manifest.cell?.width || manifest.cell?.w || r.w, ch = manifest.cell?.height || manifest.cell?.h || r.h; const anchorX = manifest.cell?.anchor_x ?? cw / 2, anchorY = manifest.cell?.anchor_y ?? ch - (manifest.cell?.safe_margin_y || 0); - const spriteScale = pose.scale; - ctx.save(); ctx.translate(Math.round(hero.x), Math.round(hero.y)); ctx.scale(hero.facing * spriteScale, spriteScale); ctx.imageSmoothingEnabled = false; + const spriteScale = pose.scale * (STATE_SCALE[hero.state] || 1), skin = window.Meta?.skinFilter?.(selectedCharacter); + if (hero.shield > 0) { ctx.save(); ctx.strokeStyle = '#9fe8ff'; ctx.globalAlpha = Math.min(1, hero.shield) * .8; ctx.lineWidth = 4; ctx.beginPath(); ctx.ellipse(hero.x, hero.y - 90, 70, 105, 0, 0, Math.PI * 2); ctx.stroke(); ctx.restore(); } + ctx.save(); if (skin) ctx.filter = skin; ctx.translate(Math.round(hero.x), Math.round(hero.y)); ctx.scale(hero.facing * spriteScale, spriteScale); ctx.imageSmoothingEnabled = false; if (pose.pivot) { ctx.translate(pose.worldPivot.x, pose.worldPivot.y); ctx.rotate(pose.rotation); ctx.translate(-pose.pivot.x, -pose.pivot.y); } ctx.drawImage(images.hero, r.x, r.y, r.w, r.h, -anchorX, -anchorY, r.w, r.h); ctx.restore(); } @@ -1906,7 +1973,7 @@ shadow(dummy.x,CONFIG.groundY,dummy.state==='down'?65:opponentCharacter==='mira'?61:opponentCharacter==='haldor'?55:43,.20); if(!m||!img)return; const r=m.frame_layout.rows[pose.state][pose.frame]; - ctx.save();ctx.translate(Math.round(dummy.x),Math.round(dummy.y));ctx.scale(dummy.facing||-1,1);ctx.imageSmoothingEnabled=false; + ctx.save();ctx.translate(Math.round(dummy.x),Math.round(dummy.y));{const k=STATE_SCALE[pose.state]||1;ctx.scale((dummy.facing||-1)*k,k);}ctx.imageSmoothingEnabled=false; ctx.drawImage(img,r.x,r.y,r.w,r.h,-m.cell.width/2,-(m.cell.height-m.cell.safe_margin_y),r.w,r.h);ctx.restore(); if(dummy.action && !dummy.action.fired && dummy.action.type!=='ultimate') { ctx.save();ctx.strokeStyle='#f0b15e';ctx.lineWidth=2;ctx.globalAlpha=.7; @@ -2172,7 +2239,7 @@ $('#health-fill').style.width = `${h.front}%`; $('#health-reserve').style.width = `${h.reserve}%`; $('#health-label').textContent = `${hero.hp} / ${BALANCE.heroMax}`; $('#guard-fill').style.width = `${dh.front}%`; $('#guard-reserve').style.width = `${dh.reserve}%`; $('#guard-label').textContent = `HP ${currentDummyHP()} / ${BALANCE.dummyMax}`; $('#dummy-state').textContent = dummy.ko?'K.O.':({ idle: aiEnabled?'WATCHING':'PRACTICE', hurt: 'HIT CONFIRMED', down: 'DOWN', recover: 'RECOVERING' })[dummy.state] || (dummy.action?'ATTACKING':'APPROACHING'); - $('#combo').classList.toggle('visible', comboHits > 0); $('#combo-count').textContent = comboHits; $('#combo-damage').textContent = `${comboDamage} DAMAGE`; $('#total-damage').innerHTML = `${totalDamage} DMG`; + $('#combo').classList.toggle('visible', comboHits > 0); $('#combo-count').textContent = comboHits; $('#combo-damage').textContent = `${comboDamage} DAMAGE${comboRank(comboHits) ? ' · RANK ' + comboRank(comboHits) : ''}`; window.Meta?.hud?.({ move: SHOP_MOVES[window.Meta?.equippedMove?.()], cd: hero.shopCd || 0, sp: hero.spCd || 0 }); $('#total-damage').innerHTML = `${totalDamage} DMG`; $('#best-combo').innerHTML = `${bestCombo} HITS`; $('#announcement').classList.toggle('visible', announceTimer > 0); for (const card of document.querySelectorAll('.skill-card')) { diff --git a/index.html b/index.html index b7bd18b..92d2f4e 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,6 @@ -AETHER CLASH — Mecha vs Demi-Human +AETHER CLASH — Mecha vs Demi-Human
Menyiapkan…
@@ -23,6 +23,6 @@
✦AETHER CLASHMenyiapkan arena…
AETHER CLASH / SETTINGS

Pengaturan arena

Atur audio, tampilan, dan kontrol permainan.

Kontrol keyboard

A / D · Gerak   2× A / D · Lari
W · Lompat   S · Menunduk / turun cepat
2× S · Salto   SPACE · Kombo 3 pukulan
I / O · Skill   P · Ultimate

AETHER CLASH / PAUSE

PAUSED

Pertarungan dijeda. Siap melanjutkan?

-
+
diff --git a/menu.js b/menu.js index c556f38..88ee590 100644 --- a/menu.js +++ b/menu.js @@ -65,7 +65,7 @@ if(backgroundVideo){videoPlayToken++;backgroundVideo.pause();backgroundVideo.remove();} root.dataset.screen=screen;root.dataset.step=String(step);root.dataset.mode=mode; if(screen==='home'){ - root.innerHTML=`
FIGHTING DEMO / VOL. 02${canFullscreen?``:''}

AETHER
CLASH✦

Two factions. One arena.

MECHAVSDEMI-HUMANTECHNOLOGY MEETS INSTINCT
${game.snapshot().ready?'READY TO FIGHT':'PREPARING ARENA…'}
`; + root.innerHTML=`
FIGHTING DEMO / VOL. 02${canFullscreen?``:''}

AETHER
CLASH✦

Two factions. One arena.

MECHAVSDEMI-HUMANTECHNOLOGY MEETS INSTINCT
${game.snapshot().ready?'READY TO FIGHT':'PREPARING ARENA…'}
`; } else if(screen==='select'){ root.innerHTML=`
${navHeader(step===0?'SELECT YOUR FIGHTER':'SELECT YOUR RIVAL',mode==='versus'?'VERSUS COMPUTER':'TRAINING ROOM')}
01 PLAYER02 RIVAL03 ARENA
${fighterPanel(step===0?hover:player,'player')}
${step===0?'PLAYER 1':'COMPUTER'}CHOOSE A FIGHTER
${roster.map((id,i)=>{const f=info(id);return ``;}).join('')}

${roster.length>opened.length?(roster.length-opened.length)+' challenger slots reserved.':''}

${fighterPanel(step===1?hover:null,'enemy')}
${footer()}`; updatePreview(false); @@ -99,7 +99,7 @@ if(cmd==='fullscreen'){sfx('move',true);dismissFullscreenHint();game.toggleFullscreen?.();return;} if(cmd==='confirm'){confirm();return;}if(cmd==='back'){back();return;}sfx('confirm',true); if(cmd==='versus'||cmd==='training'){mode=cmd;screen='select';step=0;hover=player;render();} - if(cmd==='settings')game.openSettings();if(cmd==='about'){screen='about';render();} + if(cmd==='shop'||cmd==='locker'||cmd==='book')window.Meta?.open(cmd);if(cmd==='settings')game.openSettings();if(cmd==='about'){screen='about';render();} if(cmd==='home'){game.stopAnnouncer();screen='home';render();}if(cmd==='start')start(); if(cmd==='rematch'){({player,enemy,stage,level,mode}=result);start();} if(cmd==='reselect'){screen='select';step=0;hover=player;render();} diff --git a/meta.css b/meta.css new file mode 100644 index 0000000..48a9ad9 --- /dev/null +++ b/meta.css @@ -0,0 +1,32 @@ +/* Meta layer: shop, locker, achievements, toasts, easter eggs. */ +#meta-overlay{position:fixed;inset:0;z-index:60;background:rgba(6,14,20,.94);color:#f6eedb;font-family:Rajdhani,Arial,sans-serif;overflow:auto} +#meta-overlay[hidden]{display:none} +.meta-panel{max-width:1100px;margin:0 auto;padding:18px 20px 40px} +.meta-panel header{display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-bottom:1px solid #ffffff22;padding-bottom:12px} +.meta-panel nav{display:flex;gap:8px;flex:1} +.mt,.meta-x,.pill,.chip,.item button{font:inherit;color:inherit;background:#13222d;border:1px solid #ffffff33;border-radius:6px;padding:8px 14px;cursor:pointer;letter-spacing:.06em} +.mt.on,.pill.on,.chip.on{background:#e8b84a;color:#101923;border-color:#e8b84a;font-weight:700} +.meta-coin{font-size:22px;color:#e8b84a;font-weight:700} +.meta-note{margin:12px 0 0;padding:8px 12px;background:#e8b84a22;border-left:3px solid #e8b84a} +.meta-body h3{margin:22px 0 10px;letter-spacing:.12em;color:#e8b84a;font-size:18px} +.meta-body h5{margin:14px 0 6px;color:#9fb3c4;letter-spacing:.1em} +.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px} +.item{background:#101c26;border:1px solid #ffffff1c;border-radius:8px;padding:12px;display:flex;flex-direction:column;gap:6px} +.item h4{margin:0;letter-spacing:.08em}.item p{margin:0;color:#c7d3dc;font-size:15px;flex:1}.item small{color:#8fa3b3} +.item button:not([disabled]){background:#e8b84a;color:#101923;font-weight:700}.item button[disabled]{opacity:.5;cursor:default} +.swatch{height:120px;background:#0b1520;border-radius:6px;display:grid;place-items:center;overflow:hidden}.swatch img{height:110px} +.roster{display:flex;gap:8px;flex-wrap:wrap;margin:14px 0}.chip{display:flex;align-items:center;gap:8px;padding:4px 12px 4px 4px}.chip img{width:38px;height:38px;border-radius:4px;object-fit:cover} +.locker{display:grid;grid-template-columns:minmax(200px,320px) 1fr;gap:24px}.preview{background:#0b1520;border-radius:10px;display:grid;place-items:center;padding:12px}.preview img{width:100%;max-width:300px} +.pills{display:flex;gap:8px;flex-wrap:wrap}.moves{list-style:none;padding:0;margin:0;display:grid;gap:4px}.moves li{color:#c7d3dc}.moves b{color:#e8b84a;display:inline-block;min-width:100px} +.meta-hint{color:#8fa3b3;font-size:14px}.ach{list-style:none;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px}.ach li{background:#101c26;border:1px solid #ffffff1c;border-radius:8px;padding:10px;display:flex;flex-direction:column;opacity:.6}.ach li.ok{opacity:1;border-color:#e8b84a}.ach span{font-size:14px;color:#9fb3c4} +.pill.danger{border-color:#ff6a6a;color:#ff9a9a} +#meta-toasts{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:90;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none} +.meta-toast{background:#101923ee;border:1px solid #e8b84a;color:#f6eedb;padding:8px 16px;border-radius:6px;font:700 17px Rajdhani,Arial,sans-serif;letter-spacing:.05em;transition:opacity .5s,transform .5s}.meta-toast.coin{border-color:#8dffa8}.meta-toast.out{opacity:0;transform:translateY(-8px)} +#shop-chip{position:fixed;right:14px;bottom:128px;z-index:15;display:flex;gap:8px;align-items:center;background:#101923dd;border:1px solid #9fe8ff;color:#f6eedb;padding:6px 12px;border-radius:6px;font:700 15px Rajdhani,Arial,sans-serif;letter-spacing:.06em}#shop-chip[hidden]{display:none}#shop-chip.cool{border-color:#667788;opacity:.7}#shop-chip kbd{background:#9fe8ff;color:#101923;border-radius:3px;padding:0 6px} +.in-menu #shop-chip{display:none} +.egg-layer{position:fixed;inset:0;z-index:95;pointer-events:none;overflow:hidden} +.egg-layer span{position:absolute;left:-60px;top:var(--y);font-size:var(--s);animation:eggrun var(--t) linear var(--d) forwards} +.egg-layer.truck span{font-size:70px} +@keyframes eggrun{to{transform:translateX(calc(100vw + 120px)) rotate(8deg)}} +.home-nav .meta-nav b{color:#e8b84a} +@media(max-width:700px){.locker{grid-template-columns:1fr}} diff --git a/meta.js b/meta.js new file mode 100644 index 0000000..f54a0de --- /dev/null +++ b/meta.js @@ -0,0 +1,190 @@ +/* Meta layer: coins, shop, character locker (skin + shop move), achievements and easter eggs. + Everything is stored in this browser only (localStorage). The game engine reads it through window.Meta. */ +(() => { + 'use strict'; + const KEY = 'konoha.save.v1'; + const SKINS = { + standar: { name: 'STANDAR', price: 0, filter: '' }, + senja: { name: 'SENJA', price: 150, filter: 'hue-rotate(-35deg) saturate(1.25)' }, + rimba: { name: 'HIJAU RIMBA', price: 150, filter: 'hue-rotate(75deg) saturate(1.2)' }, + laut: { name: 'BIRU LAUT', price: 150, filter: 'hue-rotate(160deg) saturate(1.2)' }, + neon: { name: 'NEON', price: 300, filter: 'hue-rotate(270deg) saturate(1.9) brightness(1.08)' }, + emas: { name: 'EMAS', price: 450, filter: 'sepia(1) saturate(3.2) hue-rotate(-12deg) brightness(1.1)' }, + mono: { name: 'MONOKROM', price: 250, filter: 'grayscale(1) contrast(1.25)' } + }; + const MOVES = { + seruduk: { name: 'SERUDUK KILAT', price: 350, cd: 7, desc: 'Menerjang maju dan menghantam lawan di depan. Kuat untuk membuka jarak.' }, + hentak: { name: 'HENTAKAN BUMI', price: 500, cd: 10, desc: 'Menghentak tanah ke dua sisi; lawan di dekatmu terjatuh.' }, + perisai: { name: 'PERISAI', price: 450, cd: 16, desc: 'Kebal serangan selama 1,6 detik. Pakai untuk lolos dari ultimate.' }, + pulih: { name: 'AURA PEMULIH', price: 600, cd: 30, desc: 'Memulihkan 25 HP seketika.' }, + isiulang: { name: 'ISI ULANG', price: 700, cd: 35, desc: 'Menyegarkan cooldown skill 1 dan 2 seketika.' } + }; + const COMMANDS = [ + ['↓ ↓ + SPASI', 'UPPERCUT', 'Meluncurkan lawan ke atas dan menjatuhkannya.'], + ['↓ → + SPASI', 'TINJU MAJU', 'Maju sambil memukul, jangkauan panjang.'], + ['SPASI x3', 'KOMBO', 'Rantai tiga pukulan; pukulan ketiga paling kuat.'], + ['W W', 'LOMPAT GANDA', 'Lompat kedua di udara (berputar).'], + ['K', 'JURUS TOKO', 'Memakai jurus toko yang dipasang di menu Karakter.'] + ]; + const ACH = { + first_win: ['PERTAMA KALI', 'Menangkan satu pertandingan.'], + perfect: ['BERSIH', 'Menang tanpa kehilangan satu ronde pun.'], + combo5: ['KOMBO 5', 'Capai kombo 5 pukulan.'], + combo10: ['KOMBO 10', 'Capai kombo 10 pukulan.'], + hard_win: ['SANG PEMBURU', 'Menang di tingkat selain Easy.'], + wins10: ['SEPULUH KALI', 'Menangkan 10 pertandingan.'], + shopper: ['PEMBELI', 'Beli barang pertamamu di toko.'], + fashion: ['MODIS', 'Miliki 3 skin.'], + rich: ['KAYA', 'Kumpulkan total 2000 koin.'], + konami: ['KODE LAMA', 'Temukan kode rahasia lama.'], + syududu: ['SYUDUDU', 'Panggil semut.'], + mbg: ['TRUK LEWAT', 'Panggil truk katering.'], + esemka: ['KONVOI', 'Panggil konvoi.'], + penasaran: ['PENASARAN', 'Ketuk slot tanda tanya berulang kali.'], + logo: ['TELITI', 'Temukan rahasia di judul.'] + }; + const blank = () => ({ v: 1, coins: 0, earned: 0, owned: { skin: ['standar'], move: [] }, skin: {}, move: null, stats: { wins: 0, losses: 0, bestCombo: 0, perfects: 0 }, ach: {}, eggs: {} }); + let save = blank(); + try { const raw = JSON.parse(localStorage.getItem(KEY) || 'null'); if (raw && raw.v === 1) save = { ...blank(), ...raw, owned: { ...blank().owned, ...raw.owned }, stats: { ...blank().stats, ...raw.stats } }; } catch (_) {} + const persist = () => { try { localStorage.setItem(KEY, JSON.stringify(save)); } catch (_) {} }; + const $ = s => document.querySelector(s); + const esc = t => String(t).replace(/[&<>"]/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c])); + + // ---- toasts ---- + let toastBox; + function toast(msg, kind = '') { + if (!toastBox) { toastBox = document.createElement('div'); toastBox.id = 'meta-toasts'; document.body.append(toastBox); } + const el = document.createElement('div'); el.className = 'meta-toast ' + kind; el.textContent = msg; toastBox.append(el); + setTimeout(() => el.classList.add('out'), 3200); setTimeout(() => el.remove(), 3800); + } + function addCoins(n) { save.coins += n; if (n > 0) save.earned += n; persist(); checkRich(); refreshCoins(); } + function checkRich() { if (save.earned >= 2000) unlock('rich'); } + function unlock(id) { + if (save.ach[id] || !ACH[id]) return false; + save.ach[id] = Date.now(); save.coins += 50; save.earned += 50; persist(); toast('PENCAPAIAN: ' + ACH[id][0] + ' +50 koin', 'ach'); refreshCoins(); return true; + } + + // ---- engine API ---- + function skinFilter(id) { const s = SKINS[save.skin[id] || 'standar']; return s && save.owned.skin.includes(save.skin[id] || 'standar') ? s.filter : ''; } + function equippedMove() { return save.move && save.owned.move.includes(save.move) ? save.move : null; } + let chip; + function hud(info) { + if (!chip) { chip = document.createElement('div'); chip.id = 'shop-chip'; document.body.append(chip); } + const m = equippedMove() ? info.move : null; + const key = m ? m.name + '|' + Math.ceil(info.cd) : ''; + if (chip.dataset.k === key) return; chip.dataset.k = key; + chip.hidden = !m; chip.innerHTML = m ? `K${esc(m.name)}${info.cd > 0 ? Math.ceil(info.cd) + 's' : 'SIAP'}` : ''; + chip.classList.toggle('cool', info.cd > 0); + } + function award(r) { + const won = r.winner === 'player', parts = []; + let gain = won ? 120 : 30; parts.push(won ? 'Menang +120' : 'Hadiah main +30'); + if (won) { + if (r.level && r.level !== 'easy') { const b = { medium: 40, hard: 80, excellent: 120 }[r.level] || 40; gain += b; parts.push('Tingkat +' + b); } + if (r.perfect) { gain += 60; parts.push('Bersih +60'); } + } + const cb = Math.min(60, (r.bestCombo || 0) * 4); if (cb) { gain += cb; parts.push('Kombo +' + cb); } + if (won) { save.stats.wins++; unlock('first_win'); if (save.stats.wins >= 10) unlock('wins10'); if (r.perfect) { save.stats.perfects++; unlock('perfect'); } if (r.level && r.level !== 'easy') unlock('hard_win'); } else save.stats.losses++; + save.stats.bestCombo = Math.max(save.stats.bestCombo, r.bestCombo || 0); + if ((r.bestCombo || 0) >= 5) unlock('combo5'); if ((r.bestCombo || 0) >= 10) unlock('combo10'); + addCoins(gain); toast('KOIN +' + gain + ' (' + parts.join(', ') + ')', 'coin'); + } + + // ---- UI ---- + let root, tab = 'shop', who = null, notice = ''; + const roster = () => Object.keys(window.FIGHTERS || {}).concat(window.Browo && window.BROWO_MANIFEST ? ['browo'] : []); + const fname = id => window.FIGHTERS?.[id]?.name || (id === 'browo' ? 'BRO WO' : id.toUpperCase()); + const fnames = id => window.FIGHTERS?.[id]?.names || window.Browo?.names || []; + function refreshCoins() { const c = $('#meta-coins'); if (c) c.textContent = save.coins; } + function build() { + root = document.createElement('div'); root.id = 'meta-overlay'; root.hidden = true; document.body.append(root); + root.addEventListener('click', onClick); + } + function open(t = 'shop') { + if (!root) build(); tab = t; if (!who) who = roster()[0]; root.hidden = false; render(); + document.addEventListener('keydown', escClose, true); + } + function close() { root.hidden = true; document.removeEventListener('keydown', escClose, true); } + function escClose(e) { if (e.key === 'Escape') { e.stopPropagation(); close(); } } + function tabs() { return ['shop:TOKO', 'locker:KARAKTER', 'book:KOLEKSI'].map(x => { const [k, l] = x.split(':'); return ``; }).join(''); } + function render() { + let body = ''; + if (tab === 'shop') body = renderShop(); else if (tab === 'locker') body = renderLocker(); else body = renderBook(); + root.innerHTML = `
◆ ${save.coins}
${notice ? `

${esc(notice)}

` : ''}
${body}
`; + } + function renderShop() { + const skins = Object.entries(SKINS).filter(([k]) => k !== 'standar').map(([k, s]) => { + const own = save.owned.skin.includes(k); + return `

${s.name}

Warna baru untuk semua karakter.

`; + }).join(''); + const moves = Object.entries(MOVES).map(([k, m]) => { + const own = save.owned.move.includes(k); + return `

${m.name}

${m.desc}

Cooldown ${m.cd} detik · tombol K
`; + }).join(''); + return `

Jurus toko

${moves}

Skin warna

${skins}

Koin didapat dari menang pertandingan, kombo, dan pencapaian. Pasang barang di menu KARAKTER.

`; + } + const portrait = id => `assets/${id}/ui/portrait.webp`; + function renderLocker() { + const ids = roster(), sk = save.skin[who] || 'standar'; + const pick = ids.map(id => ``).join(''); + const skins = save.owned.skin.map(k => ``).join(''); + const moves = [``].concat(save.owned.move.map(k => ``)).join(''); + const n = fnames(who); + return `
${pick}

${fname(who)}

Skin
${skins}
Jurus toko (tombol K)
${moves}

${save.owned.move.length ? '' : 'Belum punya jurus toko. Beli di tab TOKO.'}

Daftar gerakan
    ${n.length ? `
  • SPASI ${esc(n[0] || '')}
  • I ${esc(n[1] || '')}
  • O ${esc(n[2] || '')}
  • P ${esc(n[3] || '')}
  • ` : ''}${COMMANDS.map(c => `
  • ${c[0]} ${c[1]} — ${c[2]}
  • `).join('')}
`; + } + function renderBook() { + const got = Object.keys(ACH).filter(k => save.ach[k]).length, st = save.stats; + const list = Object.entries(ACH).map(([k, [n, d]]) => { const ok = !!save.ach[k], hidden = !ok && ['konami', 'syududu', 'mbg', 'esemka', 'penasaran', 'logo'].includes(k); return `
  • ${ok ? '★' : '☆'} ${hidden ? '???' : n}${hidden ? 'Pencapaian rahasia.' : d}
  • `; }).join(''); + return `

    Statistik

    Menang ${st.wins} · Kalah ${st.losses} · Bersih ${st.perfects} · Kombo terbaik ${st.bestCombo} · Total koin ${save.earned}

    Pencapaian ${got}/${Object.keys(ACH).length}

    Simpanan

    `; + } + function onClick(e) { + const b = e.target.closest('button'); if (!b) return; + if (b.hasAttribute('data-close')) return close(); + if (b.dataset.tab) { tab = b.dataset.tab; notice = ''; return render(); } + if (b.dataset.who) { who = b.dataset.who; return render(); } + if (b.dataset.skin) { save.skin[who] = b.dataset.skin; persist(); return render(); } + if (b.dataset.move !== undefined && b.hasAttribute('data-move')) { save.move = b.dataset.move || null; persist(); return render(); } + if (b.dataset.buy) { + const [kind, id] = b.dataset.buy.split(':'), item = (kind === 'skin' ? SKINS : MOVES)[id]; + if (save.owned[kind].includes(id)) return; + if (save.coins < item.price) { notice = 'Koin belum cukup untuk ' + item.name + '.'; return render(); } + save.coins -= item.price; save.owned[kind].push(id); if (kind === 'move' && !save.move) save.move = id; + notice = item.name + ' dibeli.'; persist(); unlock('shopper'); if (save.owned.skin.length >= 4) unlock('fashion'); return render(); + } + if (b.hasAttribute('data-export')) { const code = btoa(unescape(encodeURIComponent(JSON.stringify(save)))); navigator.clipboard?.writeText(code).then(() => { notice = 'Kode disalin ke papan klip.'; render(); }, () => { notice = 'Tidak bisa menyalin.'; render(); }); return; } + if (b.hasAttribute('data-import')) { const code = prompt('Tempel kode simpanan:'); if (!code) return; try { const d = JSON.parse(decodeURIComponent(escape(atob(code.trim())))); if (d.v !== 1) throw 0; save = { ...blank(), ...d }; persist(); notice = 'Simpanan dimuat.'; } catch (_) { notice = 'Kode tidak valid.'; } return render(); } + if (b.hasAttribute('data-reset')) { if (confirm('Hapus semua koin, skin, jurus, dan pencapaian?')) { save = blank(); persist(); notice = 'Simpanan dihapus.'; render(); } } + } + + // ---- easter eggs ---- + const KONAMI = ['arrowup', 'arrowup', 'arrowdown', 'arrowdown', 'arrowleft', 'arrowright', 'arrowleft', 'arrowright', 'b', 'a']; + let kbuf = [], tbuf = ''; + function swarm(emoji, n, cls) { + const box = document.createElement('div'); box.className = 'egg-layer ' + cls; document.body.append(box); + for (let i = 0; i < n; i++) { const s = document.createElement('span'); s.textContent = emoji; s.style.setProperty('--y', (8 + Math.random() * 84) + 'vh'); s.style.setProperty('--d', (Math.random() * 1.6) + 's'); s.style.setProperty('--t', (3 + Math.random() * 2) + 's'); s.style.setProperty('--s', (22 + Math.random() * 30) + 'px'); box.append(s); } + setTimeout(() => box.remove(), 6500); + } + function egg(id, label, fn) { + fn(); if (!save.eggs[id]) { save.eggs[id] = 1; addCoins(100); toast(label + ' +100 koin', 'ach'); } if (ACH[id]) unlock(id); + } + const CODES = { + syududu: () => egg('syududu', 'SYUDUDU!', () => swarm('🐜', 40, 'ants')), + mbg: () => egg('mbg', 'TRUK KATERING LEWAT', () => swarm('🚚', 1, 'truck')), + esemka: () => egg('esemka', 'KONVOI ESEMKA', () => swarm('🚗', 6, 'truck')) + }; + document.addEventListener('keydown', e => { + if (e.target?.matches?.('input,textarea')) return; + const k = e.key.length === 1 ? e.key.toLowerCase() : e.key.toLowerCase(); + kbuf.push(k); if (kbuf.length > KONAMI.length) kbuf.shift(); + if (kbuf.join() === KONAMI.join()) { kbuf = []; egg('konami', 'KODE RAHASIA TERBUKA', () => swarm('✦', 24, 'ants')); } + if (k.length === 1) { tbuf = (tbuf + k).slice(-10); for (const c in CODES) if (tbuf.endsWith(c)) { tbuf = ''; CODES[c](); } } + }); + let logoClicks = 0, lockClicks = 0, lt = 0; + document.addEventListener('click', e => { + if (e.target.closest?.('.home-title h1')) { if (++logoClicks >= 7) { logoClicks = 0; egg('logo', 'KAMU TELITI', () => swarm('✦', 20, 'ants')); } } + const lock = e.target.closest?.('[data-fighter^="locked"]'); + if (lock) { const now = Date.now(); if (now - lt > 4000) lockClicks = 0; lt = now; lockClicks++; if (lockClicks === 3) toast('Siapa yang akan datang berikutnya…?'); if (lockClicks >= 6) { lockClicks = 0; egg('penasaran', 'RASA INGIN TAHUMU DIHARGAI', () => {}); } } + }, true); + + window.Meta = { skinFilter, equippedMove, hud, award, open, close, toast, addCoins, unlock, get coins() { return save.coins; }, get save() { return save; } }; +})(); diff --git a/precache.js b/precache.js index 7ae6fce..0421244 100644 --- a/precache.js +++ b/precache.js @@ -1,2 +1,2 @@ /* Generated by tools/build_dist.mjs (regenerated by hand for Konoha Fighting): runtime files [path, bytes, sha1] for preload.js and sw.js. Do not edit. */ -self.AETHER_PRECACHE = {"version":"30fafa08dc89","total":30348602,"files":[["index.html",11996,"ec19aa2228c0"],["mobile.html",3638,"920bc9372dca"],["style.css",25814,"413539b8eaca"],["menu.css",28655,"006133147876"],["preload.js",4100,"b042759fb485"],["game.js",217269,"f47763c6e4be"],["menu.js",21009,"1aea1071b966"],["match.js",4217,"99ac57c18f9d"],["announcer.js",3087,"43ec8295c5f4"],["touch.js",4816,"124342a02504"],["fenr.js",2903,"30635da02da7"],["browo.js",5523,"1e4295ff3d92"],["assets/anice/form/run/sprite-sheet-alpha.webp",1363320,"3762ce677116"],["assets/anice/manifest.js",25215,"20eae2a0a515"],["assets/anice/run/sprite-sheet-alpha.webp",933198,"4fb2cd5820fd"],["assets/anice/ui/cutin-mode.webp",381008,"fed063c899f7"],["assets/anice/ui/cutin.webp",200842,"1fa39d1c9ca4"],["assets/anice/ui/fx-burst.webp",142064,"14ee91dba90e"],["assets/anice/ui/fx-impact.webp",16644,"c24b27799758"],["assets/anice/ui/fx-nano.webp",80992,"5740f5a80f75"],["assets/anice/ui/fx-nanoblast.webp",46472,"a1afa4bece15"],["assets/anice/ui/fx-podium.webp",84750,"19836aa8e6d5"],["assets/anice/ui/fx-tackle.webp",78640,"bfb7736dad93"],["assets/anice/ui/fx-words.webp",67296,"52a66cefabce"],["assets/anice/ui/icon-basic.webp",27784,"bf77858fa893"],["assets/anice/ui/icon-mode-skill1.webp",36626,"b48253629667"],["assets/anice/ui/icon-mode-skill2.webp",42382,"a3e42aa81355"],["assets/anice/ui/icon-mode-ultimate.webp",40962,"e07e3fcefe02"],["assets/anice/ui/icon-skill1.webp",27550,"8100a94969e9"],["assets/anice/ui/icon-skill2.webp",27416,"63f3eb5cfa99"],["assets/anice/ui/icon-ultimate.webp",29408,"fe832c87be0e"],["assets/anice/ui/portrait.webp",31204,"04876d7cf2d7"],["assets/audio/announcer/arco_wins.mp3",23031,"4e3734fb863a"],["assets/audio/announcer/double_ko.mp3",24285,"5b0ba10cfa89"],["assets/audio/announcer/draw.mp3",17598,"eb92b764316c"],["assets/audio/announcer/fenr_wins.mp3",24285,"9fe9cb3a833b"],["assets/audio/announcer/fight.mp3",17598,"8a64a7e3d192"],["assets/audio/announcer/ko.mp3",11328,"f3106c569e34"],["assets/audio/announcer/manifest.js",1478,"df99fff86510"],["assets/audio/announcer/round_1.mp3",17598,"fdcce639d88d"],["assets/audio/announcer/round_2.mp3",35570,"2598ef54b8c4"],["assets/audio/announcer/round_3.mp3",21359,"83ec7e4ec306"],["assets/audio/announcer/select_arco.mp3",15090,"b0856ea865dc"],["assets/audio/announcer/select_fenr.mp3",17598,"a7770529a39c"],["assets/audio/announcer/time_up.mp3",20106,"e59e9a60345e"],["assets/audio/arco-ultimate-dylan.mp3",36824,"0d6136cbf82a"],["assets/audio/music/midday-showdown.mp3",1571832,"65d22abb18d9"],["assets/browo/manifest.js",11367,"0059f584090e"],["assets/browo/run/sprite-sheet-alpha.webp",1034754,"b9298446ad0c"],["assets/browo/ui/cutin-fire.webp",400460,"4f0ee94bcc60"],["assets/browo/ui/cutin.webp",410306,"d11a6fa4e1c3"],["assets/browo/ui/fx-burntree.webp",108312,"fbbbe24e8ac5"],["assets/browo/ui/fx-impact.webp",15564,"3aeb4063798e"],["assets/browo/ui/fx-sawit.webp",111080,"9ee0c3ac2f35"],["assets/browo/ui/fx-sunburst.webp",47934,"59684833a729"],["assets/browo/ui/fx-tornado.webp",138990,"224d165f7c5e"],["assets/browo/ui/fx-truck.webp",53508,"674f1bf52fb8"],["assets/browo/ui/icon-basic.webp",31632,"dff834ddda1d"],["assets/browo/ui/icon-rage-skill1.webp",38234,"c098d1a0cb5a"],["assets/browo/ui/icon-rage-skill2.webp",41992,"efc7b8a053d3"],["assets/browo/ui/icon-rage-ultimate.webp",39076,"6720839976cc"],["assets/browo/ui/icon-skill1.webp",39968,"a7c877917434"],["assets/browo/ui/icon-skill2.webp",31528,"f5bbc58a5ecc"],["assets/browo/ui/icon-ultimate.webp",38878,"5128489c945a"],["assets/browo/ui/portrait.webp",44684,"4bb5c0c5ecee"],["assets/ethanolman/manifest.js",13894,"e40c1faebddc"],["assets/ethanolman/run/sprite-sheet-alpha.webp",885038,"1c058021275b"],["assets/ethanolman/ui/cutin-mode.webp",466514,"1e17fb1eca55"],["assets/ethanolman/ui/cutin.webp",468960,"7de0ef8ca909"],["assets/ethanolman/ui/fx-blast.webp",165684,"15e65b1dadca"],["assets/ethanolman/ui/fx-burst.webp",125934,"0fac6678b182"],["assets/ethanolman/ui/fx-fireflow.webp",55662,"7026e8fa0442"],["assets/ethanolman/ui/fx-firepillar.webp",92556,"97aabac66799"],["assets/ethanolman/ui/fx-flood.webp",103472,"c437d832d1ad"],["assets/ethanolman/ui/fx-impact.webp",16930,"c15448d4f325"],["assets/ethanolman/ui/fx-splash.webp",157048,"32aff8cf663e"],["assets/ethanolman/ui/fx-wave.webp",54982,"473d5a746675"],["assets/ethanolman/ui/icon-basic.webp",34308,"6c4939cd2b42"],["assets/ethanolman/ui/icon-mode-skill1.webp",41852,"8ed215cd9fce"],["assets/ethanolman/ui/icon-mode-skill2.webp",44852,"68d69cf3e7dc"],["assets/ethanolman/ui/icon-mode-ultimate.webp",41016,"ac84b45e6512"],["assets/ethanolman/ui/icon-skill1.webp",38200,"4d8ea6fadb3e"],["assets/ethanolman/ui/icon-skill2.webp",34536,"cdf037f2d3f8"],["assets/ethanolman/ui/icon-ultimate.webp",40840,"380c19c26c36"],["assets/ethanolman/ui/portrait.webp",64936,"5eb8a1ac6b78"],["assets/fenr/audio/fenr-ultimate-holden.mp3",23031,"4d15d464b495"],["assets/fenr/human/manifest.js",11409,"fb5294ec1ce2"],["assets/fenr/human/run/sprite-sheet-alpha.webp",1486412,"0d6f47bb4cb5"],["assets/fenr/ui/cutin.webp",119558,"538658b309df"],["assets/fenr/ui/fx-bite.webp",8948,"b257d8dad484"],["assets/fenr/ui/fx-claw.webp",7178,"780d656a1837"],["assets/fenr/ui/fx-gale.webp",4970,"54bbac66f730"],["assets/fenr/ui/fx-howl.webp",10784,"3837b651a7a6"],["assets/fenr/ui/fx-rush.webp",10026,"ee5f015089dd"],["assets/fenr/ui/fx-transform.webp",15202,"aa9e6402f320"],["assets/fenr/ui/icon-human-basic.webp",11026,"a51720ccc2a1"],["assets/fenr/ui/icon-human-skill1.webp",6122,"028f0e547941"],["assets/fenr/ui/icon-human-skill2.webp",9938,"a04cc8d9767b"],["assets/fenr/ui/icon-ultimate.webp",14998,"bc755f2f7468"],["assets/fenr/ui/icon-wolf-basic.webp",15864,"54aeb1d66b05"],["assets/fenr/ui/icon-wolf-skill1.webp",10442,"0d5ada7ae5d2"],["assets/fenr/ui/icon-wolf-skill2.webp",8652,"a83241200084"],["assets/fenr/ui/portrait-human.webp",24324,"db4f7dbaea08"],["assets/fenr/ui/portrait-wolf.webp",27618,"3593d886c6e6"],["assets/fenr/wolf/manifest.js",11434,"cac1df6e1fe5"],["assets/fenr/wolf/run/sprite-sheet-alpha.webp",2360632,"c884ad55b290"],["assets/fonts/OFL.txt",4373,"061a0eb53e23"],["assets/fonts/Rajdhani-Bold.ttf",400680,"fb82c1992ff1"],["assets/fonts/Rajdhani-Medium.ttf",384348,"7837ff8a9aea"],["assets/gufron/manifest.js",13997,"bbb036cb8c22"],["assets/gufron/run/sprite-sheet-alpha.webp",952108,"f42f605027dd"],["assets/gufron/ui/cutin-mode.webp",385766,"547b288052c0"],["assets/gufron/ui/cutin.webp",376720,"bf17c8ef5576"],["assets/gufron/ui/fx-ant.webp",38064,"be9b39d4c04f"],["assets/gufron/ui/fx-antswarm.webp",44740,"cb4114217442"],["assets/gufron/ui/fx-burst.webp",132316,"c782bd4d854e"],["assets/gufron/ui/fx-giantant.webp",64786,"a2f603bfcbb6"],["assets/gufron/ui/fx-impact.webp",20724,"17c67b4d4699"],["assets/gufron/ui/fx-soundchain.webp",85598,"d4bdf799227e"],["assets/gufron/ui/fx-soundwave.webp",50296,"d578e131dae7"],["assets/gufron/ui/icon-basic.webp",33562,"6571eaa205c7"],["assets/gufron/ui/icon-mode-skill1.webp",39900,"c6f18a761bb1"],["assets/gufron/ui/icon-mode-skill2.webp",37666,"a9322f5d86aa"],["assets/gufron/ui/icon-mode-ultimate.webp",40038,"3d77d1409749"],["assets/gufron/ui/icon-skill1.webp",36430,"a5314f21e323"],["assets/gufron/ui/icon-skill2.webp",32212,"79fad79ff3ff"],["assets/gufron/ui/icon-ultimate.webp",39842,"9f145a38783e"],["assets/gufron/ui/portrait.webp",54520,"a1fab006ecd2"],["assets/mecha/manifest.js",13264,"6a57bf63b6e7"],["assets/mecha/run/sprite-sheet-alpha.webp",1140340,"02dfd7fc3f38"],["assets/megachan/manifest.js",13941,"a5d65eb7c9fb"],["assets/megachan/run/sprite-sheet-alpha.webp",1259292,"4ee735a8c199"],["assets/megachan/ui/cutin-mode.webp",361828,"162c7f48ee7e"],["assets/megachan/ui/cutin.webp",402302,"4d3f7c762127"],["assets/megachan/ui/fx-blackbull.webp",101600,"9473ab48136e"],["assets/megachan/ui/fx-bull.webp",71072,"e5cf32972bda"],["assets/megachan/ui/fx-bullflame.webp",62998,"4490c7e2930d"],["assets/megachan/ui/fx-burst.webp",140028,"49affed34a69"],["assets/megachan/ui/fx-firewave.webp",92234,"85ecc5b7c2d6"],["assets/megachan/ui/fx-hellbull.webp",88778,"f4bc116724f0"],["assets/megachan/ui/fx-impact.webp",18462,"6aecf90dfbe2"],["assets/megachan/ui/fx-soundwave.webp",52582,"95ef89ffc01f"],["assets/megachan/ui/icon-basic.webp",34370,"eb2234f905c9"],["assets/megachan/ui/icon-mode-skill1.webp",42356,"52f383e9f608"],["assets/megachan/ui/icon-mode-skill2.webp",35454,"f9e93e263bba"],["assets/megachan/ui/icon-mode-ultimate.webp",42464,"e9ff7e94a1a6"],["assets/megachan/ui/icon-skill1.webp",38852,"7ffd61cc9fab"],["assets/megachan/ui/icon-skill2.webp",35164,"836d4a372a92"],["assets/megachan/ui/icon-ultimate.webp",36534,"c600915ad2ac"],["assets/megachan/ui/portrait.webp",50208,"480c53efe5cf"],["assets/menu/anice-select.webp",84138,"2df5ad3aedec"],["assets/menu/azure-harbor.webp",116560,"e9b00d01e676"],["assets/menu/browo-select.webp",152000,"5b47b5c28cb2"],["assets/menu/elderwood.webp",130386,"ec28da7499fb"],["assets/menu/ethanolman-select.webp",110500,"338a537affa4"],["assets/menu/gufron-select.webp",141964,"556cea81f8bf"],["assets/menu/home-art.webp",188424,"3cccd1c9793b"],["assets/menu/home-factions-loop.mp4",1417101,"d48036ae3888"],["assets/menu/home-factions.webp",148524,"2068721bc197"],["assets/menu/locked.svg",768,"f3a3b427476c"],["assets/menu/megachan-select.webp",132458,"3183d7f39d7f"],["assets/menu/moonrise.webp",68134,"750461b81b3b"],["assets/menu/soloman-select.webp",110436,"d3f3ca73f203"],["assets/menu/sonofsolo-select.webp",89842,"f53866cb83d1"],["assets/menu/sunspire.webp",49268,"54b11853a23a"],["assets/soloman/manifest.js",13766,"35683e03761f"],["assets/soloman/run/sprite-sheet-alpha.webp",270610,"bcd4fd6cd6cb"],["assets/soloman/ui/cutin-mode.webp",365344,"c4c9c5dade73"],["assets/soloman/ui/cutin.webp",342288,"f74857a51a2a"],["assets/soloman/ui/fx-bigcar.webp",52920,"e338f3395245"],["assets/soloman/ui/fx-burst.webp",145262,"c7a4932ccbba"],["assets/soloman/ui/fx-car.webp",39348,"4b22dec17ae2"],["assets/soloman/ui/fx-impact.webp",18322,"37c84bd2ac07"],["assets/soloman/ui/fx-sarong.webp",80564,"d0efd9e6a754"],["assets/soloman/ui/fx-sarongstorm.webp",99630,"42feb9ba487e"],["assets/soloman/ui/icon-basic.webp",32998,"6c714fe220d3"],["assets/soloman/ui/icon-mode-skill1.webp",36614,"928acd22ab7d"],["assets/soloman/ui/icon-mode-skill2.webp",38390,"c3c8d5585157"],["assets/soloman/ui/icon-mode-ultimate.webp",38516,"82acaa3f5fd7"],["assets/soloman/ui/icon-skill1.webp",37222,"71e07a8fbde7"],["assets/soloman/ui/icon-skill2.webp",32592,"1684118d154c"],["assets/soloman/ui/icon-ultimate.webp",35204,"19eb66421733"],["assets/soloman/ui/portrait.webp",41504,"54af30bea16e"],["assets/sonofsolo/manifest.js",13987,"38b5634551cb"],["assets/sonofsolo/run/sprite-sheet-alpha.webp",794606,"d58e1110f2a1"],["assets/sonofsolo/ui/cutin-mode.webp",391760,"2c85475e78c0"],["assets/sonofsolo/ui/cutin.webp",372392,"18daa717980c"],["assets/sonofsolo/ui/fx-acidspray.webp",68430,"b368c4e8e418"],["assets/sonofsolo/ui/fx-bigpuddle.webp",34698,"550d00a48dfc"],["assets/sonofsolo/ui/fx-burst.webp",130608,"a59d08d91234"],["assets/sonofsolo/ui/fx-drop.webp",29396,"8808a822b5a0"],["assets/sonofsolo/ui/fx-flask.webp",36436,"e6df5128a9f5"],["assets/sonofsolo/ui/fx-impact.webp",21714,"f47cc13724fa"],["assets/sonofsolo/ui/fx-puddle.webp",25912,"1e2f93f15c65"],["assets/sonofsolo/ui/fx-soundwave.webp",70540,"dd1b34d135e5"],["assets/sonofsolo/ui/icon-basic.webp",32010,"a8939a2ff541"],["assets/sonofsolo/ui/icon-mode-skill1.webp",38246,"6adc58839078"],["assets/sonofsolo/ui/icon-mode-skill2.webp",36994,"5365bb50e06d"],["assets/sonofsolo/ui/icon-mode-ultimate.webp",37964,"a81dde34bbe7"],["assets/sonofsolo/ui/icon-skill1.webp",32678,"39f613bfb04d"],["assets/sonofsolo/ui/icon-skill2.webp",28192,"b847849c77a3"],["assets/sonofsolo/ui/icon-ultimate.webp",36286,"8e9c83500b0b"],["assets/sonofsolo/ui/portrait.webp",42766,"53f5f4b7532e"],["assets/stage-config.js",329,"a1a1d7579894"],["assets/stage.webp",84514,"35061ed6fae8"],["assets/ui/arco-avatar.webp",28238,"4c06b6cad40a"],["assets/ui/attack.webp",6744,"bd2b590d635e"],["assets/ui/drone-config.js",195,"f7e8e6490fc4"],["assets/ui/drone.png",18724,"474894562b64"],["assets/ui/dummy-avatar.webp",22410,"d3fbe1234b69"],["assets/ui/icons-check.webp",32114,"e27fecadcda7"],["assets/ui/skill1.webp",8908,"3228c3690fb8"],["assets/ui/skill2.webp",9788,"dceb3d2b71cd"],["assets/ui/squadron-icon.webp",6466,"ddedba88f295"],["assets/ui/ultimate-cutin.webp",126218,"599145541b00"],["assets/ui/ultimate.webp",7504,"770631fda059"]]}; +self.AETHER_PRECACHE = {"version":"da197240f947","total":30355188,"files":[["index.html",12066,"7bf79cb3daf8"],["mobile.html",3638,"920bc9372dca"],["style.css",25814,"413539b8eaca"],["menu.css",28655,"006133147876"],["preload.js",4100,"b042759fb485"],["game.js",223237,"67fa65e845da"],["menu.js",21557,"b9c78fa98282"],["match.js",4217,"99ac57c18f9d"],["announcer.js",3087,"43ec8295c5f4"],["touch.js",4816,"124342a02504"],["fenr.js",2903,"30635da02da7"],["browo.js",5523,"31bd14753a39"],["assets/anice/form/run/sprite-sheet-alpha.webp",1363320,"3762ce677116"],["assets/anice/manifest.js",25215,"20eae2a0a515"],["assets/anice/run/sprite-sheet-alpha.webp",933198,"4fb2cd5820fd"],["assets/anice/ui/cutin-mode.webp",381008,"fed063c899f7"],["assets/anice/ui/cutin.webp",200842,"1fa39d1c9ca4"],["assets/anice/ui/fx-burst.webp",142064,"14ee91dba90e"],["assets/anice/ui/fx-impact.webp",16644,"c24b27799758"],["assets/anice/ui/fx-nano.webp",80992,"5740f5a80f75"],["assets/anice/ui/fx-nanoblast.webp",46472,"a1afa4bece15"],["assets/anice/ui/fx-podium.webp",84750,"19836aa8e6d5"],["assets/anice/ui/fx-tackle.webp",78640,"bfb7736dad93"],["assets/anice/ui/fx-words.webp",67296,"52a66cefabce"],["assets/anice/ui/icon-basic.webp",27784,"bf77858fa893"],["assets/anice/ui/icon-mode-skill1.webp",36626,"b48253629667"],["assets/anice/ui/icon-mode-skill2.webp",42382,"a3e42aa81355"],["assets/anice/ui/icon-mode-ultimate.webp",40962,"e07e3fcefe02"],["assets/anice/ui/icon-skill1.webp",27550,"8100a94969e9"],["assets/anice/ui/icon-skill2.webp",27416,"63f3eb5cfa99"],["assets/anice/ui/icon-ultimate.webp",29408,"fe832c87be0e"],["assets/anice/ui/portrait.webp",31204,"04876d7cf2d7"],["assets/audio/announcer/arco_wins.mp3",23031,"4e3734fb863a"],["assets/audio/announcer/double_ko.mp3",24285,"5b0ba10cfa89"],["assets/audio/announcer/draw.mp3",17598,"eb92b764316c"],["assets/audio/announcer/fenr_wins.mp3",24285,"9fe9cb3a833b"],["assets/audio/announcer/fight.mp3",17598,"8a64a7e3d192"],["assets/audio/announcer/ko.mp3",11328,"f3106c569e34"],["assets/audio/announcer/manifest.js",1478,"df99fff86510"],["assets/audio/announcer/round_1.mp3",17598,"fdcce639d88d"],["assets/audio/announcer/round_2.mp3",35570,"2598ef54b8c4"],["assets/audio/announcer/round_3.mp3",21359,"83ec7e4ec306"],["assets/audio/announcer/select_arco.mp3",15090,"b0856ea865dc"],["assets/audio/announcer/select_fenr.mp3",17598,"a7770529a39c"],["assets/audio/announcer/time_up.mp3",20106,"e59e9a60345e"],["assets/audio/arco-ultimate-dylan.mp3",36824,"0d6136cbf82a"],["assets/audio/music/midday-showdown.mp3",1571832,"65d22abb18d9"],["assets/browo/manifest.js",11367,"0059f584090e"],["assets/browo/run/sprite-sheet-alpha.webp",1034754,"b9298446ad0c"],["assets/browo/ui/cutin-fire.webp",400460,"4f0ee94bcc60"],["assets/browo/ui/cutin.webp",410306,"d11a6fa4e1c3"],["assets/browo/ui/fx-burntree.webp",108312,"fbbbe24e8ac5"],["assets/browo/ui/fx-impact.webp",15564,"3aeb4063798e"],["assets/browo/ui/fx-sawit.webp",111080,"9ee0c3ac2f35"],["assets/browo/ui/fx-sunburst.webp",47934,"59684833a729"],["assets/browo/ui/fx-tornado.webp",138990,"224d165f7c5e"],["assets/browo/ui/fx-truck.webp",53508,"674f1bf52fb8"],["assets/browo/ui/icon-basic.webp",31632,"dff834ddda1d"],["assets/browo/ui/icon-rage-skill1.webp",38234,"c098d1a0cb5a"],["assets/browo/ui/icon-rage-skill2.webp",41992,"efc7b8a053d3"],["assets/browo/ui/icon-rage-ultimate.webp",39076,"6720839976cc"],["assets/browo/ui/icon-skill1.webp",39968,"a7c877917434"],["assets/browo/ui/icon-skill2.webp",31528,"f5bbc58a5ecc"],["assets/browo/ui/icon-ultimate.webp",38878,"5128489c945a"],["assets/browo/ui/portrait.webp",44684,"4bb5c0c5ecee"],["assets/ethanolman/manifest.js",13894,"e40c1faebddc"],["assets/ethanolman/run/sprite-sheet-alpha.webp",885038,"1c058021275b"],["assets/ethanolman/ui/cutin-mode.webp",466514,"1e17fb1eca55"],["assets/ethanolman/ui/cutin.webp",468960,"7de0ef8ca909"],["assets/ethanolman/ui/fx-blast.webp",165684,"15e65b1dadca"],["assets/ethanolman/ui/fx-burst.webp",125934,"0fac6678b182"],["assets/ethanolman/ui/fx-fireflow.webp",55662,"7026e8fa0442"],["assets/ethanolman/ui/fx-firepillar.webp",92556,"97aabac66799"],["assets/ethanolman/ui/fx-flood.webp",103472,"c437d832d1ad"],["assets/ethanolman/ui/fx-impact.webp",16930,"c15448d4f325"],["assets/ethanolman/ui/fx-splash.webp",157048,"32aff8cf663e"],["assets/ethanolman/ui/fx-wave.webp",54982,"473d5a746675"],["assets/ethanolman/ui/icon-basic.webp",34308,"6c4939cd2b42"],["assets/ethanolman/ui/icon-mode-skill1.webp",41852,"8ed215cd9fce"],["assets/ethanolman/ui/icon-mode-skill2.webp",44852,"68d69cf3e7dc"],["assets/ethanolman/ui/icon-mode-ultimate.webp",41016,"ac84b45e6512"],["assets/ethanolman/ui/icon-skill1.webp",38200,"4d8ea6fadb3e"],["assets/ethanolman/ui/icon-skill2.webp",34536,"cdf037f2d3f8"],["assets/ethanolman/ui/icon-ultimate.webp",40840,"380c19c26c36"],["assets/ethanolman/ui/portrait.webp",64936,"5eb8a1ac6b78"],["assets/fenr/audio/fenr-ultimate-holden.mp3",23031,"4d15d464b495"],["assets/fenr/human/manifest.js",11409,"fb5294ec1ce2"],["assets/fenr/human/run/sprite-sheet-alpha.webp",1486412,"0d6f47bb4cb5"],["assets/fenr/ui/cutin.webp",119558,"538658b309df"],["assets/fenr/ui/fx-bite.webp",8948,"b257d8dad484"],["assets/fenr/ui/fx-claw.webp",7178,"780d656a1837"],["assets/fenr/ui/fx-gale.webp",4970,"54bbac66f730"],["assets/fenr/ui/fx-howl.webp",10784,"3837b651a7a6"],["assets/fenr/ui/fx-rush.webp",10026,"ee5f015089dd"],["assets/fenr/ui/fx-transform.webp",15202,"aa9e6402f320"],["assets/fenr/ui/icon-human-basic.webp",11026,"a51720ccc2a1"],["assets/fenr/ui/icon-human-skill1.webp",6122,"028f0e547941"],["assets/fenr/ui/icon-human-skill2.webp",9938,"a04cc8d9767b"],["assets/fenr/ui/icon-ultimate.webp",14998,"bc755f2f7468"],["assets/fenr/ui/icon-wolf-basic.webp",15864,"54aeb1d66b05"],["assets/fenr/ui/icon-wolf-skill1.webp",10442,"0d5ada7ae5d2"],["assets/fenr/ui/icon-wolf-skill2.webp",8652,"a83241200084"],["assets/fenr/ui/portrait-human.webp",24324,"db4f7dbaea08"],["assets/fenr/ui/portrait-wolf.webp",27618,"3593d886c6e6"],["assets/fenr/wolf/manifest.js",11434,"cac1df6e1fe5"],["assets/fenr/wolf/run/sprite-sheet-alpha.webp",2360632,"c884ad55b290"],["assets/fonts/OFL.txt",4373,"061a0eb53e23"],["assets/fonts/Rajdhani-Bold.ttf",400680,"fb82c1992ff1"],["assets/fonts/Rajdhani-Medium.ttf",384348,"7837ff8a9aea"],["assets/gufron/manifest.js",13997,"bbb036cb8c22"],["assets/gufron/run/sprite-sheet-alpha.webp",952108,"f42f605027dd"],["assets/gufron/ui/cutin-mode.webp",385766,"547b288052c0"],["assets/gufron/ui/cutin.webp",376720,"bf17c8ef5576"],["assets/gufron/ui/fx-ant.webp",38064,"be9b39d4c04f"],["assets/gufron/ui/fx-antswarm.webp",44740,"cb4114217442"],["assets/gufron/ui/fx-burst.webp",132316,"c782bd4d854e"],["assets/gufron/ui/fx-giantant.webp",64786,"a2f603bfcbb6"],["assets/gufron/ui/fx-impact.webp",20724,"17c67b4d4699"],["assets/gufron/ui/fx-soundchain.webp",85598,"d4bdf799227e"],["assets/gufron/ui/fx-soundwave.webp",50296,"d578e131dae7"],["assets/gufron/ui/icon-basic.webp",33562,"6571eaa205c7"],["assets/gufron/ui/icon-mode-skill1.webp",39900,"c6f18a761bb1"],["assets/gufron/ui/icon-mode-skill2.webp",37666,"a9322f5d86aa"],["assets/gufron/ui/icon-mode-ultimate.webp",40038,"3d77d1409749"],["assets/gufron/ui/icon-skill1.webp",36430,"a5314f21e323"],["assets/gufron/ui/icon-skill2.webp",32212,"79fad79ff3ff"],["assets/gufron/ui/icon-ultimate.webp",39842,"9f145a38783e"],["assets/gufron/ui/portrait.webp",54520,"a1fab006ecd2"],["assets/mecha/manifest.js",13264,"6a57bf63b6e7"],["assets/mecha/run/sprite-sheet-alpha.webp",1140340,"02dfd7fc3f38"],["assets/megachan/manifest.js",13941,"a5d65eb7c9fb"],["assets/megachan/run/sprite-sheet-alpha.webp",1259292,"4ee735a8c199"],["assets/megachan/ui/cutin-mode.webp",361828,"162c7f48ee7e"],["assets/megachan/ui/cutin.webp",402302,"4d3f7c762127"],["assets/megachan/ui/fx-blackbull.webp",101600,"9473ab48136e"],["assets/megachan/ui/fx-bull.webp",71072,"e5cf32972bda"],["assets/megachan/ui/fx-bullflame.webp",62998,"4490c7e2930d"],["assets/megachan/ui/fx-burst.webp",140028,"49affed34a69"],["assets/megachan/ui/fx-firewave.webp",92234,"85ecc5b7c2d6"],["assets/megachan/ui/fx-hellbull.webp",88778,"f4bc116724f0"],["assets/megachan/ui/fx-impact.webp",18462,"6aecf90dfbe2"],["assets/megachan/ui/fx-soundwave.webp",52582,"95ef89ffc01f"],["assets/megachan/ui/icon-basic.webp",34370,"eb2234f905c9"],["assets/megachan/ui/icon-mode-skill1.webp",42356,"52f383e9f608"],["assets/megachan/ui/icon-mode-skill2.webp",35454,"f9e93e263bba"],["assets/megachan/ui/icon-mode-ultimate.webp",42464,"e9ff7e94a1a6"],["assets/megachan/ui/icon-skill1.webp",38852,"7ffd61cc9fab"],["assets/megachan/ui/icon-skill2.webp",35164,"836d4a372a92"],["assets/megachan/ui/icon-ultimate.webp",36534,"c600915ad2ac"],["assets/megachan/ui/portrait.webp",50208,"480c53efe5cf"],["assets/menu/anice-select.webp",84138,"2df5ad3aedec"],["assets/menu/azure-harbor.webp",116560,"e9b00d01e676"],["assets/menu/browo-select.webp",152000,"5b47b5c28cb2"],["assets/menu/elderwood.webp",130386,"ec28da7499fb"],["assets/menu/ethanolman-select.webp",110500,"338a537affa4"],["assets/menu/gufron-select.webp",141964,"556cea81f8bf"],["assets/menu/home-art.webp",188424,"3cccd1c9793b"],["assets/menu/home-factions-loop.mp4",1417101,"d48036ae3888"],["assets/menu/home-factions.webp",148524,"2068721bc197"],["assets/menu/locked.svg",768,"f3a3b427476c"],["assets/menu/megachan-select.webp",132458,"3183d7f39d7f"],["assets/menu/moonrise.webp",68134,"750461b81b3b"],["assets/menu/soloman-select.webp",110436,"d3f3ca73f203"],["assets/menu/sonofsolo-select.webp",89842,"f53866cb83d1"],["assets/menu/sunspire.webp",49268,"54b11853a23a"],["assets/soloman/manifest.js",13766,"35683e03761f"],["assets/soloman/run/sprite-sheet-alpha.webp",270610,"bcd4fd6cd6cb"],["assets/soloman/ui/cutin-mode.webp",365344,"c4c9c5dade73"],["assets/soloman/ui/cutin.webp",342288,"f74857a51a2a"],["assets/soloman/ui/fx-bigcar.webp",52920,"e338f3395245"],["assets/soloman/ui/fx-burst.webp",145262,"c7a4932ccbba"],["assets/soloman/ui/fx-car.webp",39348,"4b22dec17ae2"],["assets/soloman/ui/fx-impact.webp",18322,"37c84bd2ac07"],["assets/soloman/ui/fx-sarong.webp",80564,"d0efd9e6a754"],["assets/soloman/ui/fx-sarongstorm.webp",99630,"42feb9ba487e"],["assets/soloman/ui/icon-basic.webp",32998,"6c714fe220d3"],["assets/soloman/ui/icon-mode-skill1.webp",36614,"928acd22ab7d"],["assets/soloman/ui/icon-mode-skill2.webp",38390,"c3c8d5585157"],["assets/soloman/ui/icon-mode-ultimate.webp",38516,"82acaa3f5fd7"],["assets/soloman/ui/icon-skill1.webp",37222,"71e07a8fbde7"],["assets/soloman/ui/icon-skill2.webp",32592,"1684118d154c"],["assets/soloman/ui/icon-ultimate.webp",35204,"19eb66421733"],["assets/soloman/ui/portrait.webp",41504,"54af30bea16e"],["assets/sonofsolo/manifest.js",13987,"38b5634551cb"],["assets/sonofsolo/run/sprite-sheet-alpha.webp",794606,"d58e1110f2a1"],["assets/sonofsolo/ui/cutin-mode.webp",391760,"2c85475e78c0"],["assets/sonofsolo/ui/cutin.webp",372392,"18daa717980c"],["assets/sonofsolo/ui/fx-acidspray.webp",68430,"b368c4e8e418"],["assets/sonofsolo/ui/fx-bigpuddle.webp",34698,"550d00a48dfc"],["assets/sonofsolo/ui/fx-burst.webp",130608,"a59d08d91234"],["assets/sonofsolo/ui/fx-drop.webp",29396,"8808a822b5a0"],["assets/sonofsolo/ui/fx-flask.webp",36436,"e6df5128a9f5"],["assets/sonofsolo/ui/fx-impact.webp",21714,"f47cc13724fa"],["assets/sonofsolo/ui/fx-puddle.webp",25912,"1e2f93f15c65"],["assets/sonofsolo/ui/fx-soundwave.webp",70540,"dd1b34d135e5"],["assets/sonofsolo/ui/icon-basic.webp",32010,"a8939a2ff541"],["assets/sonofsolo/ui/icon-mode-skill1.webp",38246,"6adc58839078"],["assets/sonofsolo/ui/icon-mode-skill2.webp",36994,"5365bb50e06d"],["assets/sonofsolo/ui/icon-mode-ultimate.webp",37964,"a81dde34bbe7"],["assets/sonofsolo/ui/icon-skill1.webp",32678,"39f613bfb04d"],["assets/sonofsolo/ui/icon-skill2.webp",28192,"b847849c77a3"],["assets/sonofsolo/ui/icon-ultimate.webp",36286,"8e9c83500b0b"],["assets/sonofsolo/ui/portrait.webp",42766,"53f5f4b7532e"],["assets/stage-config.js",329,"a1a1d7579894"],["assets/stage.webp",84514,"35061ed6fae8"],["assets/ui/arco-avatar.webp",28238,"4c06b6cad40a"],["assets/ui/attack.webp",6744,"bd2b590d635e"],["assets/ui/drone-config.js",195,"f7e8e6490fc4"],["assets/ui/drone.png",18724,"474894562b64"],["assets/ui/dummy-avatar.webp",22410,"d3fbe1234b69"],["assets/ui/icons-check.webp",32114,"e27fecadcda7"],["assets/ui/skill1.webp",8908,"3228c3690fb8"],["assets/ui/skill2.webp",9788,"dceb3d2b71cd"],["assets/ui/squadron-icon.webp",6466,"ddedba88f295"],["assets/ui/ultimate-cutin.webp",126218,"599145541b00"],["assets/ui/ultimate.webp",7504,"770631fda059"]]};