diff --git a/training.css b/training.css index 384167b..fb2c87a 100644 --- a/training.css +++ b/training.css @@ -8,10 +8,10 @@ .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} -/* ---- panel: sisi kanan (atau kiri) di bawah header HUD; letaknya mengikuti tiga ukuran header seperti panel tutorial ---- */ -#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} +/* ---- 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;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[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 b{font-size:13px;letter-spacing:2.2px;color:#f3d796} .dm-head span{display:flex;gap:4px} diff --git a/training.js b/training.js index 3bcb484..2345063 100644 --- a/training.js +++ b/training.js @@ -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 - 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: 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 @@ -30,9 +30,9 @@ 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' } }; - 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 }; - 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 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; } };