Panel dummy: letak bawaan di kiri dan z-index di bawah timer mode

Panel Dummy kini muncul di sisi kiri (bisa dipindah ke kanan dengan tombol di kepala panel) supaya penghitung kombo besar di kanan tidak tertutup, dan z-index panel dibuat di bawah timer mode (.form-timers) yang tembus klik sehingga timer tetap terlihat.
This commit is contained in:
rizkyaz0 2026-10-05 14:57:15 +07:00
parent 7f336df6e5
commit a5a75176e6
2 changed files with 6 additions and 6 deletions

View File

@ -8,10 +8,10 @@
.match-actions #dm-btn.on{background:#e6c78f;color:#102734;border-color:#fff0c8} .match-actions #dm-btn.on{background:#e6c78f;color:#102734;border-color:#fff0c8}
body.tut-on #dm-btn,body.tut-on #dm-panel{display:none!important} body.tut-on #dm-btn,body.tut-on #dm-panel{display:none!important}
/* ---- panel: sisi kanan (atau kiri) di bawah header HUD; letaknya mengikuti tiga ukuran header seperti panel tutorial ---- */ /* ---- panel: sisi kiri (bisa dipindah ke kanan) di bawah header HUD, jauh dari penghitung kombo besar di kanan; letaknya mengikuti tiga ukuran header seperti panel tutorial. z-index 2: timer mode (.form-timers, z-index 3, tembus klik) tetap terlihat di atasnya ---- */
#dm-panel{--dm-fs:12px;position:absolute;right:14px;top:156px;z-index:4;width:236px;max-height:calc(100% - 156px - 128px);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;box-sizing:border-box;padding:7px 10px 10px;color:#fff8e8;background:linear-gradient(180deg,#0d2432f2,#0a1b27ee);border:1px solid #e6c78f55;border-top:3px solid #e6c78f;font:600 var(--dm-fs)/1.25 Rajdhani,Arial,sans-serif;pointer-events:auto;box-shadow:0 6px 22px #0008} #dm-panel{--dm-fs:12px;position:absolute;left:14px;top:156px;z-index:2;width:236px;max-height:calc(100% - 156px - 128px);overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;box-sizing:border-box;padding:7px 10px 10px;color:#fff8e8;background:linear-gradient(180deg,#0d2432f2,#0a1b27ee);border:1px solid #e6c78f55;border-top:3px solid #e6c78f;font:600 var(--dm-fs)/1.25 Rajdhani,Arial,sans-serif;pointer-events:auto;box-shadow:0 6px 22px #0008}
#dm-panel[hidden]{display:none} #dm-panel[hidden]{display:none}
#dm-panel[data-side="left"]{right:auto;left:14px} #dm-panel[data-side="right"]{left:auto;right:14px}
.dm-head{display:flex;align-items:center;justify-content:space-between;gap:8px} .dm-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.dm-head b{font-size:13px;letter-spacing:2.2px;color:#f3d796} .dm-head b{font-size:13px;letter-spacing:2.2px;color:#f3d796}
.dm-head span{display:flex;gap:4px} .dm-head span{display:flex;gap:4px}

View File

@ -1,5 +1,5 @@
/* Latihan lanjutan (RENCANA 6.5, training.js + training.css): panel "DUMMY" di arena latihan (bukan di tutorial). Tombol DUMMY di bilah kecil bawah jam (di samping Pengaturan /* Latihan lanjutan (RENCANA 6.5, training.js + training.css): panel "DUMMY" di arena latihan (bukan di tutorial). Tombol DUMMY di bilah kecil bawah jam (di samping Pengaturan
dan Jeda) membuka panel kecil yang bisa ditutup, dipindah ke sisi lain, dan ingatannya (buka/tutup, sisi) tersimpan di localStorage['konoha.training.v1']. dan Jeda) membuka panel kecil yang bisa ditutup, dipindah ke sisi lain, dan ingatannya (buka/tutup, sisi; bawaan kiri supaya penghitung kombo besar di kanan tidak tertutup) tersimpan di localStorage['konoha.training.v1'].
Isi panel: Isi panel:
Perilaku dummy: Diam (bawaan), Blok terus, Lompat terus, Serang acak, Ikuti pemain, CPU penuh (= saklar "Lawan aktif" di Pengaturan, tetap sinkron), dan Reset posisi. Perilaku dummy: Diam (bawaan), Blok terus, Lompat terus, Serang acak, Ikuti pemain, CPU penuh (= saklar "Lawan aktif" di Pengaturan, tetap sinkron), dan Reset posisi.
Alat bantu: Tampilkan hitbox (setHitboxes yang sudah ada), Tampilkan frame data (startup, aktif, recovery, total dalam ms, jangkauan dalam px, damage dasar, dari data Alat bantu: Tampilkan hitbox (setHitboxes yang sudah ada), Tampilkan frame data (startup, aktif, recovery, total dalam ms, jangkauan dalam px, damage dasar, dari data
@ -30,9 +30,9 @@
seruduk: { name: 'SERUDUK KILAT', sub: 'jurus toko (K)', range: '190 px di depan, sambil meluncur' }, seruduk: { name: 'SERUDUK KILAT', sub: 'jurus toko (K)', range: '190 px di depan, sambil meluncur' },
hentak: { name: 'HENTAKAN BUMI', sub: 'jurus toko (K)', range: '230 px di sekitar' } hentak: { name: 'HENTAKAN BUMI', sub: 'jurus toko (K)', range: '230 px di sekitar' }
}; };
const S = { on: false, fail: false, beh: 'diam', inf: false, fd: false, open: false, side: 'right', next: 0, dj: false, time: 0, last: null, fdv: null, fdn: 0, cmb: { live: false, hits: 0, dmg: 0, last: null }, busy: false, ui: null, key: '' }; const S = { on: false, fail: false, beh: 'diam', inf: false, fd: false, open: false, side: 'left', next: 0, dj: false, time: 0, last: null, fdv: null, fdn: 0, cmb: { live: false, hits: 0, dmg: 0, last: null }, busy: false, ui: null, key: '' };
const R = { state: 'idle', ev: [], down: new Set(), t0: 0, p0: null, i: 0, dur: 0, beh: 'diam', inf: false, ref: null, res: null, msg: '', tone: '', keep: null }; const R = { state: 'idle', ev: [], down: new Set(), t0: 0, p0: null, i: 0, dur: 0, beh: 'diam', inf: false, ref: null, res: null, msg: '', tone: '', keep: null };
try { const v = JSON.parse(localStorage.getItem(KEY) || 'null'); if (v) { S.open = !!v.open; S.side = v.side === 'left' ? 'left' : 'right'; } } catch (_) { /* tanpa simpanan */ } try { const v = JSON.parse(localStorage.getItem(KEY) || 'null'); if (v) { S.open = !!v.open; S.side = v.side === 'right' ? 'right' : 'left'; } } catch (_) { /* tanpa simpanan */ }
const save = () => { try { localStorage.setItem(KEY, JSON.stringify({ open: S.open, side: S.side })); } catch (_) { /* abaikan */ } }; const save = () => { try { localStorage.setItem(KEY, JSON.stringify({ open: S.open, side: S.side })); } catch (_) { /* abaikan */ } };
const usable = () => S.on && !S.fail && !window.Tutorial?.active && $('#arena')?.dataset.mode === 'training' && !document.body.classList.contains('in-menu'); const usable = () => S.on && !S.fail && !window.Tutorial?.active && $('#arena')?.dataset.mode === 'training' && !document.body.classList.contains('in-menu');
const guard = fn => (...a) => { try { return fn(...a); } catch (e) { console.error(e); S.fail = true; return false; } }; const guard = fn => (...a) => { try { return fn(...a); } catch (e) { console.error(e); S.fail = true; return false; } };