diff --git a/gui/main.py b/gui/main.py index 7569bcf..345eb35 100644 --- a/gui/main.py +++ b/gui/main.py @@ -114,7 +114,7 @@ class AuxToolsUpdateThread(QThread): if self.update_forge: from util.forge.update_tools import ensure_forge_plugins self.progress.emit("Updating Forge plugins…") - if not ensure_forge_plugins(log_fn=lambda m: self.progress.emit(m)): + if not ensure_forge_plugins(force=True, log_fn=lambda m: self.progress.emit(m)): self.finished.emit(False, "Forge plugin update failed.") return self.finished.emit(True, "components_updated") diff --git a/util/forge/Forge_MV.js b/util/forge/Forge_MV.js index 675f210..7023672 100644 --- a/util/forge/Forge_MV.js +++ b/util/forge/Forge_MV.js @@ -1,1104 +1,28 @@ //============================================================================= -// Forge_MV.js — In-game cheat & editor overlay for RPG Maker MV +// forge.js - In-game cheat & editor overlay for RPG Maker MV/MZ //============================================================================= /*: - * @plugindesc Forge — modern in-game editor: variables, switches, items, actors, gold, teleport, common events, freeze/lock & battle cheats. (MV) - * @author len (Forge - clean-room, MTool-inspired) - * - * @param Hotkey - * @desc Key to toggle the panel. - * @default F10 - * - * @param SpeedKey - * @desc Key to toggle the speedhack (fast-forward). Use a key name like Control, Shift, Alt, or a letter. - * @default Control - * - * @param StartOpen - * @desc Open the panel automatically on new game / load (true/false). - * @default false - * - * @param ItemMaxOverride - * @desc Value used by the "Max" button for item stacks (0 = use engine maxItems). - * @default 0 - * - * @help - * Forge — drop-in cheat & editor for RPG Maker MV. - * Place in js/plugins/ and enable. Press F10 in-game to open the overlay. - * - * Sections: Variables · Switches · Items/Weapons/Armors · Actors · Party/Gold · - * Map/Teleport · Common Events · Data Lock (freeze) · Battle cheats. - * - * All edits are RAM-only and never written to save files. No external requests. - * Plugin command: MTC open (toggles the panel) + * @target MZ MV + * @plugindesc Forge - modern in-game editor + * @author len, shellawa + * @url https://gitgud.io/zero64801/forge-mvmz/ */ - -/* =================================================================================== - * Forge — in-game cheat & editor overlay for RPG Maker MV / MZ (shared core) - * Clean-room reimplementation of MTool's variable/value editor. Vanilla JS, zero deps. - * This file is the engine-agnostic core; the MV/MZ ship files prepend the plugin header. - * Layers: ops (DOM-free, testable) · locks (prototype monkeypatches) · cheats · ui (Shadow DOM) - * =================================================================================== */ -(function (root) { - 'use strict'; - if (root && root.__FORGE_CORE__) return; - - // ---------- environment ---------- - var IS_MZ = (typeof Utils !== 'undefined' && Utils.RPGMAKER_NAME === 'MZ'); - var nodeFs = null, nodePath = null; - try { if (typeof require === 'function') { nodeFs = require('fs'); nodePath = require('path'); } } catch (e) {} - function gameCwd() { try { return process.cwd(); } catch (e) { return '.'; } } - - var PARAM_NAMES = ['Max HP', 'Max MP', 'Attack', 'Defense', 'M.Attack', 'M.Defense', 'Agility', 'Luck']; - - // ---------- small utils ---------- - function clampInt(v, lo, hi) { v = Math.floor(Number(v) || 0); if (v < lo) v = lo; if (hi != null && v > hi) v = hi; return v; } - function defined(x) { return typeof x !== 'undefined' && x !== null; } - function dataName(d) { return d && d.name ? d.name : ''; } - // actor.level may be a getter (number), a method, or only the _level field across engines/plugins. - function actorLevel(a) { if (!a) return 0; if (typeof a.level === 'number') return a.level; if (typeof a.level === 'function') return a.level(); return a._level || 1; } - - // =================================================================================== - // OPS — pure logic, only touches $game*/$data* globals. Unit-testable. - // =================================================================================== - var ops = {}; - - ops.vars = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.variables.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.variables[id]) || ('Variable ' + id); }, - get: function (id) { return defined(window.$gameVariables) ? $gameVariables.value(id) : 0; }, - set: function (id, v) { if (!defined(window.$gameVariables)) return; $gameVariables.setValue(id, typeof v === 'string' && v.trim() !== '' && !isNaN(v) ? Number(v) : v); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - ops.switches = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.switches.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.switches[id]) || ('Switch ' + id); }, - get: function (id) { return defined(window.$gameSwitches) ? $gameSwitches.value(id) : false; }, - set: function (id, v) { if (!defined(window.$gameSwitches)) return; $gameSwitches.setValue(id, !!v); }, - toggle: function (id) { this.set(id, !this.get(id)); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - var INV_TABLES = { item: '$dataItems', weapon: '$dataWeapons', armor: '$dataArmors' }; - ops.inv = { - table: function (kind) { return window[INV_TABLES[kind]] || []; }, - data: function (kind, id) { return this.table(kind)[id] || null; }, - count: function (kind, id) { var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.numItems(d) : 0; }, - maxStack: function (kind, id) { if (MTC._itemMaxOverride > 0) return MTC._itemMaxOverride; var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.maxItems(d) : 99; }, - grant: function (kind, id, n) { var d = this.data(kind, id); if (d && defined(window.$gameParty)) $gameParty.gainItem(d, n, false); if (locks.isItemFrozen(kind, id)) LOCK.items.set(itemKey(kind, id), { kind: kind, id: id, value: this.count(kind, id) }); }, - setCount: function (kind, id, target) { this.grant(kind, id, clampInt(target, 0, null) - this.count(kind, id)); }, - max: function (kind, id) { this.setCount(kind, id, this.maxStack(kind, id)); }, - list: function (kind) { - var t = this.table(kind), out = []; - for (var id = 1; id < t.length; id++) { - var d = t[id]; if (!d || !d.name) continue; - out.push({ id: id, name: d.name, description: d.description || '', iconIndex: d.iconIndex || 0, count: $gameParty.numItems(d) }); - } - return out; - } - }; - - ops.gold = { - get: function () { return defined(window.$gameParty) ? $gameParty.gold() : 0; }, - max: function () { return defined(window.$gameParty) && $gameParty.maxGold ? $gameParty.maxGold() : 99999999; }, - add: function (n) { - if (!defined(window.$gameParty)) return; - if (LOCK.gold != null) { LOCK.gold = clampInt(LOCK.gold + n, 0, this.max()); (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); return; } - if (n >= 0) $gameParty.gainGold(n); else $gameParty.loseGold(-n); - }, - set: function (target) { this.add(clampInt(target, 0, this.max()) - this.get()); } - }; - - ops.actors = { - list: function () { - var out = []; - if (!defined(window.$dataActors)) return out; - for (var id = 1; id < $dataActors.length; id++) { - var d = $dataActors[id]; if (!d) continue; - var a = $gameActors.actor(id); - out.push({ id: id, name: a ? a.name() : d.name, level: a ? actorLevel(a) : (d.initialLevel || 1), inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false }); - } - return out; - }, - get: function (id) { - var a = $gameActors.actor(id); if (!a) return null; - var params = []; - for (var p = 0; p < 8; p++) params.push({ id: p, name: PARAM_NAMES[p], value: a.param(p) }); - var skills = []; - if (defined(window.$dataSkills)) for (var s = 1; s < $dataSkills.length; s++) { var sk = $dataSkills[s]; if (sk && sk.name) skills.push({ id: s, name: sk.name, learned: a.isLearnedSkill ? a.isLearnedSkill(s) : (a.skills().indexOf(sk) >= 0) }); } - var equips = [], slots = a.equipSlots ? a.equipSlots() : [], cur = a.equips(); - for (var e = 0; e < slots.length; e++) equips.push({ slot: e, etypeId: slots[e], current: cur[e] ? cur[e].name : '(none)' }); - return { - id: id, name: a.name(), level: actorLevel(a), exp: a.currentExp ? a.currentExp() : 0, - nextExp: a.nextLevelExp ? a.nextLevelExp() : 0, - hp: a.hp, mp: a.mp, tp: a.tp, mhp: a.mhp, mmp: a.mmp, - params: params, skills: skills, equips: equips, - inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false - }; - }, - setLevel: function (id, lv) { var a = $gameActors.actor(id); if (a) { var cap = a.maxLevel ? a.maxLevel() : 99; a.changeLevel(clampInt(lv, 1, cap), false); a.refresh(); } }, - setExp: function (id, exp) { var a = $gameActors.actor(id); if (a) { a.changeExp(clampInt(exp, 0, null), false); a.refresh(); } }, - setHp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setHp(clampInt(v, 0, a.mhp)); a.refresh(); } }, - setMp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setMp(clampInt(v, 0, a.mmp)); a.refresh(); } }, - setTp: function (id, v) { var a = $gameActors.actor(id); if (a && a.setTp) { a.setTp(clampInt(v, 0, 100)); a.refresh(); } }, - addParam: function (id, pid, delta) { var a = $gameActors.actor(id); if (a) { a.addParam(pid, Math.floor(delta)); a.refresh(); } }, - // param(pid) = round((paramBase+paramPlus) * paramRate * paramBuffRate) clamped to [paramMin,paramMax]. - // addParam only mutates paramPlus, so invert the rate to land the *visible* param on target. - setParam: function (id, pid, target) { - var a = $gameActors.actor(id); if (!a) return; - var rate = (a.paramRate ? a.paramRate(pid) : 1) * (a.paramBuffRate ? a.paramBuffRate(pid) : 1) || 1; - var cap = a.paramMax ? a.paramMax(pid) : null; - var want = clampInt(target, a.paramMin ? a.paramMin(pid) : 0, cap); - var base = a.paramBase ? a.paramBase(pid) : 0, plus = (a.paramPlus ? a.paramPlus(pid) : (a._paramPlus ? a._paramPlus[pid] : 0)) || 0; - a.addParam(pid, Math.round(want / rate) - base - plus); - a.refresh(); - }, - learn: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.learnSkill(skillId); }, - forget: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.forgetSkill(skillId); }, - equip: function (id, slotId, kind, itemId) { var a = $gameActors.actor(id); if (!a) return; var item = itemId ? ops.inv.data(kind, itemId) : null; if (a.forceChangeEquip) a.forceChangeEquip(slotId, item); else a.changeEquip(slotId, item); a.refresh(); }, - recover: function (id) { var a = $gameActors.actor(id); if (a) { a.recoverAll(); a.refresh(); } }, - setName: function (id, name) { var a = $gameActors.actor(id); if (a) a.setName(String(name)); }, - addToParty: function (id) { $gameParty.addActor(id); }, - removeFromParty: function (id) { $gameParty.removeActor(id); } - }; - - ops.party = { - members: function () { return defined(window.$gameParty) ? $gameParty.members().map(function (a) { return { id: a.actorId(), name: a.name(), level: actorLevel(a) }; }) : []; }, - add: function (id) { if (defined(window.$gameParty)) $gameParty.addActor(id); }, - remove: function (id) { if (defined(window.$gameParty)) $gameParty.removeActor(id); }, - steps: function () { return defined(window.$gameParty) ? $gameParty.steps() : 0; }, - // RPG Maker derives playtime from frame count (Game_System has no playtime()). - playtime: function () { return (typeof Graphics !== 'undefined' && Graphics.frameCount) ? Math.floor(Graphics.frameCount / 60) : 0; } - }; - - ops.map = { - list: function () { - var out = []; - if (!defined(window.$dataMapInfos)) return out; - for (var id = 1; id < $dataMapInfos.length; id++) { var m = $dataMapInfos[id]; if (m) out.push({ id: id, name: m.name || ('Map ' + id) }); } - return out; - }, - current: function () { if (!defined(window.$gameMap) || !defined(window.$gamePlayer)) return { mapId: 0, x: 0, y: 0, dir: 2 }; return { mapId: $gameMap.mapId(), x: $gamePlayer.x, y: $gamePlayer.y, dir: $gamePlayer.direction ? $gamePlayer.direction() : 2 }; }, - teleport: function (mapId, x, y, dir, fade) { $gamePlayer.reserveTransfer(mapId, clampInt(x, 0, null), clampInt(y, 0, null), dir || 0, fade == null ? 0 : fade); }, - loadMapFile: function (mapId) { - if (!nodeFs) return null; - try { var f = 'Map' + String(mapId).padStart(3, '0') + '.json'; return JSON.parse(nodeFs.readFileSync(nodePath.join(gameCwd(), 'data', f), 'utf8')); } - catch (e) { return null; } - }, - noclip: function (b) { locks.state.noclip = !!b; if (defined(window.$gamePlayer)) $gamePlayer.setThrough(!!b); }, - isNoclip: function () { return !!locks.state.noclip; }, - speed: function (n) { if (defined(window.$gamePlayer)) $gamePlayer.setMoveSpeed(clampInt(n, 1, 8)); } - }; - - ops.commonev = { - list: function () { - var out = []; - if (!defined(window.$dataCommonEvents)) return out; - for (var id = 1; id < $dataCommonEvents.length; id++) { var c = $dataCommonEvents[id]; if (c) out.push({ id: id, name: c.name || ('Common Event ' + id) }); } - return out; - }, - run: function (id) { if (defined(window.$gameTemp)) $gameTemp.reserveCommonEvent(id); } - }; - - ops.battle = { - inBattle: function () { - if (typeof SceneManager === 'undefined' || !SceneManager._scene) return false; - if (typeof Scene_Battle !== 'undefined' && SceneManager._scene instanceof Scene_Battle) return true; - var c = SceneManager._scene.constructor; // fallback if class binding unavailable - return !!(c && c.name === 'Scene_Battle'); - }, - instantWin: function () { - if (typeof $gameTroop === 'undefined' || !$gameTroop) return; - $gameTroop.members().forEach(function (e) { - e.setHp(0); - if (e.deathStateId && e.addState) e.addState(e.deathStateId()); // mark actually dead - else if (e.die) e.die(); - if (e.performCollapse) e.performCollapse(); // visual collapse - e.refresh(); - }); - if (typeof BattleManager !== 'undefined' && BattleManager.checkBattleEnd) BattleManager.checkBattleEnd(); - }, - flee: function () { if (typeof BattleManager !== 'undefined' && BattleManager.processAbort) BattleManager.processAbort(); } - }; - - // =================================================================================== - // LOCKS — prototype-level monkeypatches + per-frame re-assertion. Installed once. - // =================================================================================== - var LOCK = { vars: new Map(), switches: new Map(), items: new Map(), gold: null, stats: new Map(), noclip: false }; - function itemKey(kind, id) { return kind + ':' + id; } - - var locks = { - state: LOCK, - _installed: false, - install: function () { - if (this._installed) return; this._installed = true; - // Variables - if (typeof Game_Variables !== 'undefined') { - var _sv = Game_Variables.prototype.setValue; - Game_Variables.prototype.setValue = function (id, value) { if (LOCK.vars.has(id)) value = LOCK.vars.get(id); _sv.call(this, id, value); }; - } - // Switches - if (typeof Game_Switches !== 'undefined') { - var _ss = Game_Switches.prototype.setValue; - Game_Switches.prototype.setValue = function (id, value) { if (LOCK.switches.has(id)) value = LOCK.switches.get(id); _ss.call(this, id, value); }; - } - // Gold: substitute (not block) so freezeGold can re-snapshot on edit; item freeze is tick-based - // (NOT a gainItem block) so equip bookkeeping / give-take still runs, corrected next frame. - if (typeof Game_Party !== 'undefined') { - var _gg = Game_Party.prototype.gainGold; - locks._origGainGold = _gg; - Game_Party.prototype.gainGold = function (n) { if (LOCK.gold != null) return; _gg.call(this, n); }; - } - // Battle: god mode + OHKO via one executeHpDamage override - if (typeof Game_Action !== 'undefined') { - var _ehd = Game_Action.prototype.executeHpDamage; - Game_Action.prototype.executeHpDamage = function (target, value) { - if (CHEAT.god && target.isActor && target.isActor() && value > 0) value = 0; - if (CHEAT.ohko && this.subject().isActor && this.subject().isActor() && target.isEnemy && target.isEnemy()) value = target.hp; - _ehd.call(this, target, value); - }; - } - // God mode also blocks non-action HP loss for actors (slip/regen, event Change-HP) + floor damage. - if (typeof Game_Battler !== 'undefined' && Game_Battler.prototype.gainHp) { - var _gh = Game_Battler.prototype.gainHp; - Game_Battler.prototype.gainHp = function (value) { if (CHEAT.god && this.isActor && this.isActor() && value < 0) value = 0; _gh.call(this, value); }; - } - if (typeof Game_Actor !== 'undefined' && Game_Actor.prototype.executeFloorDamage) { - var _efd = Game_Actor.prototype.executeFloorDamage; - Game_Actor.prototype.executeFloorDamage = function () { if (CHEAT.god) return; _efd.call(this); }; - } - // No encounters - if (typeof Game_Player !== 'undefined') { - var _epv = Game_Player.prototype.encounterProgressValue; - Game_Player.prototype.encounterProgressValue = function () { return CHEAT.noEncounter ? 0 : _epv.call(this); }; - } - // Speedhack: drive the scene update extra times per frame (speed>1) or skip frames (speed<1). - // Input is still read once per real frame, so the whole game (movement, anim, battle, messages, - // events, timers) runs faster/slower. Works for MV and MZ (both expose SceneManager.updateScene). - if (typeof SceneManager !== 'undefined' && SceneManager.updateScene) { - var _updateScene = SceneManager.updateScene, _spdAcc = 0; - // Extra updates are only safe in a steady scene: the scene must be started, not changing, and - // (on a map) not mid-transfer — otherwise $dataMap is briefly null and the scroll code throws. - function speedSafe(mgr) { - if (mgr.isCurrentSceneStarted) { if (!mgr.isCurrentSceneStarted()) return false; } // MV - else if (mgr._scene && mgr._scene.isStarted) { if (!mgr._scene.isStarted()) return false; } // MZ - if (mgr.isSceneChanging && mgr.isSceneChanging()) return false; // mid scene transition - if (typeof $gamePlayer !== 'undefined' && $gamePlayer && $gamePlayer.isTransferring && $gamePlayer.isTransferring()) return false; - if (typeof DataManager !== 'undefined' && DataManager.isMapLoaded && !DataManager.isMapLoaded()) return false; // map (re)loading - return true; - } - SceneManager.updateScene = function () { - var sp = CHEAT.speed || 1; - if (sp >= 1) { - _updateScene.call(this); - if (sp > 1 && this._scene && typeof this._scene.update === 'function' && speedSafe(this)) { - _spdAcc += (sp - 1); - var guard = 0; - while (_spdAcc >= 1 && guard++ < 64) { _spdAcc -= 1; try { this._scene.update(); } catch (e) { _spdAcc = 0; break; } } - } else { _spdAcc = 0; } // not safe / not boosting -> don't bank up a burst of catch-up updates - } else { - _spdAcc += sp; - if (_spdAcc >= 1) { _spdAcc -= 1; _updateScene.call(this); } - else if (this._scene) { // skip the game advance this frame, keep start/ready bookkeeping - var u = this._scene.update; this._scene.update = function () {}; - try { _updateScene.call(this); } finally { this._scene.update = u; } - } - } - }; - } - // Clear stale freeze snapshots when the engine swaps in fresh game objects (new game / load). - if (typeof DataManager !== 'undefined') { - if (DataManager.setupNewGame) { var _sng = DataManager.setupNewGame; DataManager.setupNewGame = function () { locks.clearAll(); _sng.call(this); }; } - if (DataManager.extractSaveContents) { var _esc = DataManager.extractSaveContents; DataManager.extractSaveContents = function (c) { locks.clearAll(); return _esc.call(this, c); }; } - } - }, - // Freeze setters update both the lock map and the live value once. Maps store parsed objects so - // the per-frame tick never re-parses string keys. - freezeVar: function (id, on) { if (on) { LOCK.vars.set(id, ops.vars.get(id)); ops.vars.set(id, ops.vars.get(id)); } else LOCK.vars.delete(id); }, - freezeSwitch: function (id, on) { if (on) LOCK.switches.set(id, ops.switches.get(id)); else LOCK.switches.delete(id); }, - freezeItem: function (kind, id, on) { var k = itemKey(kind, id); if (on) LOCK.items.set(k, { kind: kind, id: id, value: ops.inv.count(kind, id) }); else LOCK.items.delete(k); }, - freezeGold: function (on) { LOCK.gold = on ? ops.gold.get() : null; }, - freezeStat: function (actorId, stat, on) { var k = actorId + ':' + stat; if (on) { var a = defined(window.$gameActors) ? $gameActors.actor(actorId) : null; LOCK.stats.set(k, { actorId: actorId, stat: stat, value: a ? a[stat] : 0 }); } else LOCK.stats.delete(k); }, - isVarFrozen: function (id) { return LOCK.vars.has(id); }, - isSwitchFrozen: function (id) { return LOCK.switches.has(id); }, - isItemFrozen: function (kind, id) { return LOCK.items.has(itemKey(kind, id)); }, - isStatFrozen: function (actorId, stat) { return LOCK.stats.has(actorId + ':' + stat); }, - // Per-frame: re-assert values the overrides can't catch (hp/mp/tp, gold target, item counts, noclip). - tick: function () { - if (!LOCK.noclip && LOCK.gold == null && !LOCK.stats.size && !LOCK.items.size) return; // early-out - if (LOCK.noclip && defined(window.$gamePlayer) && !$gamePlayer.isThrough()) $gamePlayer.setThrough(true); - if (LOCK.gold != null && defined(window.$gameParty) && $gameParty.gold() !== LOCK.gold) (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); - if (LOCK.stats.size && defined(window.$gameActors)) { - LOCK.stats.forEach(function (e) { - var a = $gameActors.actor(e.actorId); if (!a) return; - if (e.stat === 'hp' && a.hp !== e.value) a.setHp(Math.min(e.value, a.mhp)); - else if (e.stat === 'mp' && a.mp !== e.value) a.setMp(Math.min(e.value, a.mmp)); - else if (e.stat === 'tp' && a.tp !== e.value && a.setTp) a.setTp(e.value); - }); - } - if (LOCK.items.size && defined(window.$gameParty)) { - LOCK.items.forEach(function (e) { if (ops.inv.count(e.kind, e.id) !== e.value) { var d = ops.inv.data(e.kind, e.id); if (d) $gameParty.gainItem(d, e.value - ops.inv.count(e.kind, e.id), false); } }); - } - }, - summary: function () { - var out = []; - LOCK.vars.forEach(function (v, id) { out.push({ type: 'var', id: id, label: 'Var ' + id + ' · ' + ops.vars.name(id), value: v }); }); - LOCK.switches.forEach(function (v, id) { out.push({ type: 'switch', id: id, label: 'Switch ' + id + ' · ' + ops.switches.name(id), value: v ? 'ON' : 'OFF' }); }); - LOCK.items.forEach(function (e, key) { out.push({ type: 'item', key: key, label: e.kind + ' ' + e.id + ' · ' + (ops.inv.data(e.kind, e.id) ? ops.inv.data(e.kind, e.id).name : ''), value: e.value }); }); - LOCK.stats.forEach(function (e, key) { out.push({ type: 'stat', key: key, label: 'Actor ' + e.actorId + ' · ' + e.stat.toUpperCase(), value: e.value }); }); - if (LOCK.gold != null) out.push({ type: 'gold', label: 'Gold (frozen)', value: LOCK.gold }); - if (LOCK.noclip) out.push({ type: 'noclip', label: 'Noclip (active)', value: 'ON' }); - return out; - }, - clearAll: function () { LOCK.vars.clear(); LOCK.switches.clear(); LOCK.items.clear(); LOCK.stats.clear(); LOCK.gold = null; if (LOCK.noclip) ops.map.noclip(false); } - }; - - // =================================================================================== - // CHEATS — global toggles consumed by the lock overrides + battle actions. - // =================================================================================== - var CHEAT = { god: false, ohko: false, noEncounter: false, speed: 1, uiFocused: false }; - var cheats = { - state: CHEAT, - setGod: function (b) { CHEAT.god = !!b; }, - setOhko: function (b) { CHEAT.ohko = !!b; }, - setNoEncounter: function (b) { CHEAT.noEncounter = !!b; }, - setSpeed: function (n) { CHEAT.speed = Math.max(0.1, Math.min(Number(n) || 1, 16)); }, - toggleSpeed: function () { this.setSpeed(CHEAT.speed !== 1 ? 1 : (MTC._speedBoost || 2)); return CHEAT.speed; }, - instantWin: function () { ops.battle.instantWin(); }, - flee: function () { ops.battle.flee(); } - }; - - // expose the assembled API (UI is attached below if a real DOM is present) - var MTC = { env: { IS_MZ: IS_MZ }, ops: ops, locks: locks, cheats: cheats, LOCK: LOCK, CHEAT: CHEAT, PARAM_NAMES: PARAM_NAMES, _itemMaxOverride: 0, _hotkey: 'F10', _speedKey: 'Control', _speedBoost: 2 }; - if (root) { root.Forge = MTC; root.__FORGE_CORE__ = true; } - if (typeof module !== 'undefined' && module.exports) module.exports = MTC; - - // ---- engine boot hooks (guarded; only when classes exist) ---- - if (typeof Scene_Base !== 'undefined') { - var _su = Scene_Base.prototype.update; - Scene_Base.prototype.update = function () { _su.call(this); try { locks.tick(); } catch (e) {} }; - } - // install lock overrides as soon as the game classes are available - try { locks.install(); } catch (e) {} - - // ---- UI: attach only when a real browser DOM is available (skipped in Node tests) ---- - if (typeof document !== 'undefined' && document.body && typeof document.body.attachShadow === 'function' && typeof window !== 'undefined') { - try { MTC.ui = buildUI(MTC); } catch (e) { try { console.error('[Forge] UI init failed', e); } catch (_) {} } - } - - // =================================================================================== - // UI — Shadow-DOM overlay. Inlined so the single ship file works with zero deps. - // =================================================================================== - function buildUI(API) { - var LS = 'forge:'; - function store(k, v) { try { localStorage.setItem(LS + k, JSON.stringify(v)); } catch (e) {} } - function load(k, d) { try { var s = localStorage.getItem(LS + k); return s == null ? d : JSON.parse(s); } catch (e) { return d; } } - // persisted speed settings (UI-controlled; override core/param defaults if the user changed them) - API._speedKey = load('speedKey', API._speedKey || 'Control'); - API._speedUseKey = load('speedUseKey', true); - API._speedBoost = load('speedBoost', API._speedBoost || 2); - if (!API._speedUseKey) API.cheats.setSpeed(API._speedBoost); // "always on" mode applies immediately - - function el(tag, props, kids) { - var n = document.createElement(tag); - if (props) for (var k in props) { - if (k === 'class') n.className = props[k]; - else if (k === 'text') n.textContent = props[k]; - else if (k === 'html') n.innerHTML = props[k]; - else if (k === 'style') n.setAttribute('style', props[k]); - else if (k.slice(0, 2) === 'on' && typeof props[k] === 'function') n.addEventListener(k.slice(2).toLowerCase(), props[k]); - else if (props[k] != null) n.setAttribute(k, props[k]); - } - if (kids) (Array.isArray(kids) ? kids : [kids]).forEach(function (c) { if (c != null) n.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); }); - return n; - } - - // Inline SVG icons (no font/emoji dependency -> render identically on Windows/macOS/Linux). - function svg(inner) { return ''; } - var ICONS = { - vars: svg(''), - switches: svg(''), - inv: svg(''), - actors: svg(''), - party: svg(''), - map: svg(''), - commonev: svg(''), - locks: svg(''), - battle: svg(''), - tool: svg(''), - refresh: svg(''), - theme: svg(''), - close: svg(''), - lock: svg(''), - unlock: svg('') - }; - - var CSS = "\ -:host{position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important;contain:none}\ -*{box-sizing:border-box;font-family:var(--font-ui);-webkit-user-select:none;user-select:none}\ -#forge-root{--font-ui:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-mono:ui-monospace,'Cascadia Code',Consolas,monospace;\ ---fg-bg:#15171c;--fg-bg-elev:#1c1f27;--fg-bg-input:#21242d;--fg-bg-row-alt:#181b22;--fg-border:#2b2f3a;--fg-border-strong:#3a3f4d;\ ---fg-text:#e6e9ef;--fg-text-dim:#9aa1b1;--fg-text-faint:#646b7d;--fg-accent:#5b8cff;--fg-accent-weak:#2a3a63;--fg-success:#3ecf8e;--fg-warn:#f0b132;--fg-danger:#f0556a;--fg-frozen:#8b5cf6;\ ---sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--rad-sm:4px;--rad-md:7px;--rad-lg:11px;--rad-pill:999px;\ ---sh-panel:0 18px 50px rgba(0,0,0,.5),0 0 0 1px var(--fg-border);--row-h:30px;--rail-w:64px;--ease:cubic-bezier(.2,.7,.3,1);--dur:120ms;\ ---fs-xs:11px;--fs-sm:12px;--fs-md:13px;--fs-lg:15px;color:var(--fg-text);font-size:var(--fs-md)}\ -#forge-root[data-theme=light]{--fg-bg:#f6f7f9;--fg-bg-elev:#fff;--fg-bg-input:#eef0f4;--fg-bg-row-alt:#f0f2f5;--fg-border:#dde0e7;--fg-border-strong:#c7ccd8;--fg-text:#1a1d24;--fg-text-dim:#5a6172;--fg-text-faint:#9097a6;--fg-accent-weak:#dce6ff}\ -.fg-panel{position:fixed;display:flex;flex-direction:column;background:var(--fg-bg);border-radius:var(--rad-lg);box-shadow:var(--sh-panel);overflow:hidden;z-index:2147483000;min-width:480px;min-height:360px;pointer-events:auto}\ -.fg-titlebar{display:flex;align-items:center;gap:6px;height:33px;padding:0 6px 0 10px;background:var(--fg-bg-elev);border-bottom:1px solid var(--fg-border);cursor:move;flex:0 0 auto}\ -.fg-brand{font-weight:700;font-size:var(--fs-md);letter-spacing:.3px;color:var(--fg-text);margin-right:8px;white-space:nowrap}\ -.fg-brand b{color:var(--fg-accent)}\ -.fg-search{flex:1;height:23px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:var(--rad-md);color:var(--fg-text);padding:0 9px;font-size:var(--fs-sm);outline:none;min-width:80px}\ -.fg-search:focus{border-color:var(--fg-accent)}\ -.fg-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:23px;height:23px;border-radius:var(--rad-md);background:transparent;color:var(--fg-text-dim);border:0;cursor:pointer;font-size:13px;transition:background var(--dur)}\ -.fg-iconbtn:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-body{flex:1;display:flex;min-height:0}\ -.fg-rail{flex:0 0 var(--rail-w);display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) var(--sp-1);background:var(--fg-bg-elev);border-right:1px solid var(--fg-border);overflow-y:auto}\ -.fg-rail__item{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--sp-2) 0;border-radius:var(--rad-md);cursor:pointer;color:var(--fg-text-dim);font-size:10px;transition:all var(--dur);border:0;background:transparent}\ -.fg-rail__item .ic{display:flex;align-items:center;justify-content:center}\n.fg-rail__item .ic svg{width:19px;height:19px}\n.fg-iconbtn svg{width:15px;height:15px}\n.fg-lock svg{width:15px;height:15px}\n.fg-launcher svg{width:21px;height:21px}\ -.fg-rail__item:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-rail__item.is-active{background:var(--fg-accent-weak);color:var(--fg-accent)}\ -.fg-content{flex:1;display:flex;flex-direction:column;min-width:0}\ -.fg-section-head{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4) var(--sp-2);flex:0 0 auto}\ -.fg-section-head h2{margin:0;font-size:var(--fs-lg);font-weight:600}\ -.fg-count{font-size:var(--fs-xs);color:var(--fg-text-faint);background:var(--fg-bg-input);padding:2px 7px;border-radius:var(--rad-pill)}\ -.fg-spacer{flex:1}\ -.fg-subtoolbar{display:flex;align-items:center;gap:var(--sp-2);padding:0 var(--sp-4) var(--sp-2);flex-wrap:wrap}\ -.fg-segmented{display:inline-flex;background:var(--fg-bg-input);border-radius:var(--rad-md);padding:2px}\ -.fg-segmented button{border:0;background:transparent;color:var(--fg-text-dim);padding:3px 12px;border-radius:5px;cursor:pointer;font-size:var(--fs-sm)}\ -.fg-segmented button.is-active{background:var(--fg-accent);color:#fff}\ -.fg-btn{border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text);padding:4px 11px;border-radius:var(--rad-md);cursor:pointer;font-size:var(--fs-sm);transition:all var(--dur)}\ -.fg-btn:hover{border-color:var(--fg-accent);color:var(--fg-accent)}\ -.fg-btn--ghost{background:transparent;border-color:transparent;color:var(--fg-text-dim)}\ -.fg-btn--danger:hover{border-color:var(--fg-danger);color:var(--fg-danger)}\ -.fg-list{flex:1;overflow-y:auto;overflow-x:hidden;position:relative;border-top:1px solid var(--fg-border)}\ -.fg-list__sizer{position:relative;width:100%}\ -.fg-list__window{position:absolute;top:0;left:0;right:0}\ -.fg-row{display:flex;align-items:center;gap:var(--sp-2);height:var(--row-h);padding:0 var(--sp-4);border-bottom:1px solid var(--fg-border);font-size:var(--fs-sm)}\ -.fg-row:nth-child(even){background:var(--fg-bg-row-alt)}\ -.fg-row.is-frozen{box-shadow:inset 3px 0 0 var(--fg-frozen)}\ -.fg-row.is-selected{background:var(--fg-accent-weak)!important;box-shadow:inset 2px 0 0 var(--fg-accent)}\ -.fg-cell--id{flex:0 0 52px;color:var(--fg-text-faint);font-family:var(--font-mono);font-size:var(--fs-xs)}\ -.fg-cell--name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\ -.fg-cell--name .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--fg-accent);margin-right:6px;vertical-align:middle}\ -.fg-cell--val{flex:0 0 auto;display:flex;align-items:center;gap:4px}\ -.fg-stepper{display:inline-flex;align-items:center;gap:3px}\ -.fg-step{min-width:30px;width:auto;padding:0 5px;height:22px;white-space:nowrap;border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text-dim);border-radius:5px;cursor:pointer;font-size:var(--fs-xs);font-family:var(--font-mono)}\ -.fg-step:hover{color:var(--fg-accent);border-color:var(--fg-accent)}\ -.fg-num{width:68px;height:22px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:5px;color:var(--fg-text);text-align:right;padding:0 6px;font-family:var(--font-mono);font-size:var(--fs-sm);outline:none}\ -.fg-num:focus{border-color:var(--fg-accent)}\ -.fg-toggle{width:38px;height:21px;border-radius:var(--rad-pill);background:var(--fg-border-strong);position:relative;cursor:pointer;transition:background var(--dur);border:0;flex:0 0 auto}\ -.fg-toggle::after{content:'';position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;transition:transform var(--dur)}\ -.fg-toggle.is-on{background:var(--fg-success)}\ -.fg-toggle.is-on::after{transform:translateX(17px)}\ -.fg-lock{width:24px;height:24px;border:0;background:transparent;color:var(--fg-text-faint);cursor:pointer;border-radius:5px;font-size:13px;flex:0 0 auto}\ -.fg-lock:hover{color:var(--fg-frozen);background:var(--fg-bg-input)}\ -.fg-lock.is-frozen{color:var(--fg-frozen)}\ -.fg-statusbar{display:flex;align-items:center;gap:var(--sp-2);height:24px;padding:0 var(--sp-3);background:var(--fg-bg-elev);border-top:1px solid var(--fg-border);font-size:var(--fs-xs);color:var(--fg-text-faint);flex:0 0 auto}\ -.fg-detail{padding:var(--sp-3) var(--sp-4);overflow-y:auto;flex:1}\ -.fg-field{display:flex;align-items:center;gap:var(--sp-2);padding:5px 0;border-bottom:1px solid var(--fg-border);min-width:0}\n.fg-field .fg-stepper{margin-left:auto;flex:0 0 auto}\ -.fg-field label{flex:0 0 96px;color:var(--fg-text-dim);font-size:var(--fs-sm)}\ -.fg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:var(--sp-2) var(--sp-4)}\ -.fg-toasts{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;gap:6px;z-index:2147483100;pointer-events:none}\ -.fg-toast{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-left:3px solid var(--fg-accent);color:var(--fg-text);padding:8px 14px;border-radius:var(--rad-md);font-size:var(--fs-sm);box-shadow:var(--sh-panel);animation:fgin var(--dur) var(--ease)}\ -.fg-toast.warn{border-left-color:var(--fg-warn)}.fg-toast.danger{border-left-color:var(--fg-danger)}.fg-toast.ok{border-left-color:var(--fg-success)}\ -@keyframes fgin{from{opacity:0;transform:translateY(6px)}to{opacity:1}}\ -.fg-launcher{position:fixed;pointer-events:auto;width:42px;height:42px;border-radius:50%;background:var(--fg-accent);color:#fff;border:0;cursor:pointer;font-size:18px;z-index:2147482999;box-shadow:var(--sh-panel);display:flex;align-items:center;justify-content:center}\ -.fg-launcher:hover{filter:brightness(1.1)}\ -.fg-resize{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}\ -.fg-resize::after{content:'';position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--fg-text-faint);border-bottom:2px solid var(--fg-text-faint)}\ -.fg-empty{padding:var(--sp-5);text-align:center;color:var(--fg-text-faint);font-size:var(--fs-sm)}\ -.fg-confirm{position:fixed;pointer-events:auto;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);z-index:2147483200}\ -.fg-confirm__box{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-radius:var(--rad-lg);padding:var(--sp-4);max-width:340px;box-shadow:var(--sh-panel)}\ -.fg-confirm__box p{margin:0 0 var(--sp-4)}.fg-confirm__row{display:flex;justify-content:flex-end;gap:var(--sp-2)}\ -input::placeholder{color:var(--fg-text-faint)}\ -::-webkit-scrollbar{width:9px;height:9px}\ -::-webkit-scrollbar-track{background:transparent}\ -::-webkit-scrollbar-thumb{background:var(--fg-border-strong);border-radius:5px}\ -::-webkit-scrollbar-thumb:hover{background:var(--fg-text-faint)}"; - - // ---------- shadow host ---------- - var host = el('div', { id: 'forge-host' }); - host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important'; - document.body.appendChild(host); - var shadow = host.attachShadow({ mode: 'open' }); - var rootEl = el('div', { id: 'forge-root' }); - rootEl.setAttribute('data-theme', load('theme', 'dark')); - shadow.appendChild(el('style', { text: CSS })); - shadow.appendChild(rootEl); - - // Swallow events so panel interaction never leaks to the game. BUBBLE phase: the panel's own - // inputs receive the event first (target phase), then we stop it before it reaches document - // (where RPG Maker's Input/TouchInput listen). Capture phase would block the inputs themselves. - ['keydown', 'keyup', 'keypress', 'wheel', 'mousedown', 'mouseup', 'mousemove', 'click', 'dblclick', - 'pointerdown', 'pointerup', 'pointermove', 'pointercancel', 'touchstart', 'touchend', 'touchmove', 'touchcancel', 'contextmenu'].forEach(function (t) { - rootEl.addEventListener(t, function (e) { e.stopPropagation(); }, false); - }); - function isEditable(el) { return el && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA'); } - rootEl.addEventListener('focusin', function (e) { if (isEditable(e.target)) API.CHEAT.uiFocused = true; }, true); - rootEl.addEventListener('focusout', function () { setTimeout(function () { API.CHEAT.uiFocused = !!(shadow.activeElement && isEditable(shadow.activeElement)); }, 0); }, true); - window.addEventListener('blur', function () { API.CHEAT.uiFocused = false; }); // never latch the game-input gate - // Backup engine-level gate: while a panel input is focused, drop the game's keyboard handler. - if (typeof Input !== 'undefined' && Input._onKeyDown) { var _okd = Input._onKeyDown; Input._onKeyDown = function (e) { if (API.CHEAT.uiFocused) return; _okd.call(this, e); }; } - if (typeof Input !== 'undefined' && Input._onKeyUp) { var _oku = Input._onKeyUp; Input._onKeyUp = function (e) { if (API.CHEAT.uiFocused) return; _oku.call(this, e); }; } - - // ---------- toasts ---------- - var toasts = el('div', { class: 'fg-toasts' }); rootEl.appendChild(toasts); - function toast(msg, kind) { var t = el('div', { class: 'fg-toast ' + (kind || ''), text: msg }); toasts.appendChild(t); setTimeout(function () { t.remove(); }, 2200); } - function confirmBox(msg, onYes) { - var box = el('div', { class: 'fg-confirm' }, el('div', { class: 'fg-confirm__box' }, [ - el('p', { text: msg }), - el('div', { class: 'fg-confirm__row' }, [ - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Cancel', onclick: function () { box.remove(); } }), - el('button', { class: 'fg-btn fg-btn--danger', text: 'Confirm', onclick: function () { box.remove(); onYes(); } }) - ]) - ])); - rootEl.appendChild(box); - } - - // ---------- panel skeleton ---------- - var vw = window.innerWidth || 816, vh = window.innerHeight || 624; - // Default size fits the window (many MV games are ~816x624); leave a margin. - var st = load('panel', { x: 16, y: 16, w: Math.min(880, vw - 32), h: Math.min(560, vh - 32) }); - st.w = Math.max(420, Math.min(st.w, vw - 8)); st.h = Math.max(320, Math.min(st.h, vh - 8)); - st.x = Math.max(0, Math.min(st.x, vw - st.w)); st.y = Math.max(0, Math.min(st.y, vh - st.h)); // keep fully on-screen - var panel = el('div', { class: 'fg-panel' }); - panel.style.left = st.x + 'px'; panel.style.top = st.y + 'px'; panel.style.width = st.w + 'px'; panel.style.height = st.h + 'px'; - var search = el('input', { class: 'fg-search', type: 'text', placeholder: 'Search… (Ctrl+K)' }); - var titlebar = el('div', { class: 'fg-titlebar' }, [ - el('span', { class: 'fg-brand', html: 'Forge' }), - search, - el('button', { class: 'fg-iconbtn', title: 'Rescan', html: ICONS.refresh, onclick: function () { render(); toast('Rescanned'); } }), - el('button', { class: 'fg-iconbtn', title: 'Theme', html: ICONS.theme, onclick: function () { var t = rootEl.getAttribute('data-theme') === 'light' ? 'dark' : 'light'; rootEl.setAttribute('data-theme', t); store('theme', t); } }), - el('button', { class: 'fg-iconbtn', title: 'Close (F10)', html: ICONS.close, onclick: function () { hide(); } }) - ]); - var rail = el('div', { class: 'fg-rail' }); - var content = el('div', { class: 'fg-content' }); - var statusbar = el('div', { class: 'fg-statusbar' }); - panel.appendChild(titlebar); - panel.appendChild(el('div', { class: 'fg-body' }, [rail, content])); - panel.appendChild(statusbar); - var resize = el('div', { class: 'fg-resize' }); panel.appendChild(resize); - rootEl.appendChild(panel); - - // ---------- launcher (docks to bottom-right corner by default; 'launcherPos' is a fresh key so - // any stale mid-screen position from older builds is ignored) ---------- - var lp = load('launcherPos', { x: vw - 56, y: vh - 56 }); - lp.x = Math.max(4, Math.min(lp.x, vw - 46)); lp.y = Math.max(4, Math.min(lp.y, vh - 46)); - var launcher = el('button', { class: 'fg-launcher', html: ICONS.tool, title: 'Forge (F10)' }); - launcher.style.left = lp.x + 'px'; launcher.style.top = lp.y + 'px'; - launcher.addEventListener('click', function (e) { if (!launcher._dragged) toggle(); }); - rootEl.appendChild(launcher); - makeDraggable(launcher, launcher, function (x, y) { store('launcherPos', { x: x, y: y }); }, true); - - // ---------- drag / resize ---------- - function makeDraggable(handle, target, onEnd, isLauncher) { - handle.addEventListener('mousedown', function (e) { - if (e.target.closest && e.target.closest('input,button.fg-iconbtn')) return; - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ox = parseInt(target.style.left) || 0, oy = parseInt(target.style.top) || 0, moved = false; - if (isLauncher) target._dragged = false; - function mv(ev) { ev.stopPropagation(); var dx = ev.clientX - sx, dy = ev.clientY - sy; if (Math.abs(dx) + Math.abs(dy) > 3) moved = true; var nx = Math.max(0, Math.min(window.innerWidth - target.offsetWidth, ox + dx)), ny = Math.max(0, Math.min(window.innerHeight - 30, oy + dy)); target.style.left = nx + 'px'; target.style.top = ny + 'px'; if (isLauncher) target._dragged = moved; } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); if (onEnd) onEnd(parseInt(target.style.left), parseInt(target.style.top)); setTimeout(function () { if (isLauncher) target._dragged = false; }, 0); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - } - makeDraggable(titlebar, panel, function (x, y) { st.x = x; st.y = y; store('panel', st); }); - resize.addEventListener('mousedown', function (e) { - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ow = panel.offsetWidth, oh = panel.offsetHeight; - function mv(ev) { ev.stopPropagation(); var w = Math.max(480, ow + ev.clientX - sx), h = Math.max(360, oh + ev.clientY - sy); panel.style.width = w + 'px'; panel.style.height = h + 'px'; if (activeRenderer && activeRenderer.onResize) activeRenderer.onResize(); } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); st.w = panel.offsetWidth; st.h = panel.offsetHeight; store('panel', st); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - - // ---------- reusable virtualized list ---------- - function VirtualList(opts) { - // opts: rowH, getModel()->[], renderRow(rowEl, item), matches(item, query) - var listEl = el('div', { class: 'fg-list' }); - var sizer = el('div', { class: 'fg-list__sizer' }); - var win = el('div', { class: 'fg-list__window' }); - sizer.appendChild(win); listEl.appendChild(sizer); - var rowH = opts.rowH || 30, pool = [], model = [], view = [], query = ''; - // ONE delegated row click (recycled rows must not accumulate per-draw listeners). - if (opts.onRowClick) listEl.addEventListener('click', function (e) { var r = e.target && e.target.closest ? e.target.closest('.fg-row') : null; if (r && r._item) opts.onRowClick(r._item); }); - function rebuild() { model = opts.getModel() || []; applyFilter(); } - function applyFilter() { - view = query ? model.filter(function (it) { return opts.matches(it, query); }) : model; - sizer.style.height = (view.length * rowH) + 'px'; - var em = listEl.querySelector('.fg-empty'); - if (!view.length) { pool.forEach(function (r) { r.style.display = 'none'; }); if (!em) listEl.appendChild(el('div', { class: 'fg-empty', text: 'Nothing here' })); } - else if (em) em.remove(); - lastFirst = -1; draw(true); // content changed -> force re-render - } - var lastFirst = -1; - function draw(force) { - var scroll = listEl.scrollTop, h = listEl.clientHeight || 400; - var first = Math.max(0, Math.floor(scroll / rowH) - 4); - if (!force && first === lastFirst) return; // window unchanged during scroll -> skip re-render - lastFirst = first; - var count = Math.ceil(h / rowH) + 8; - var last = Math.min(view.length, first + count); - win.style.transform = 'translateY(' + (first * rowH) + 'px)'; - var need = last - first; - while (pool.length < need) { var r = el('div', { class: 'fg-row' }); win.appendChild(r); pool.push(r); } - for (var i = 0; i < pool.length; i++) { - var r = pool[i]; - if (i < need) { r.style.display = 'flex'; r._item = view[first + i]; opts.renderRow(r, view[first + i]); } else { r.style.display = 'none'; r._item = null; } - } - } - var raf = null; - listEl.addEventListener('scroll', function () { if (raf) return; raf = requestAnimationFrame(function () { raf = null; draw(false); }); }); - return { el: listEl, rebuild: rebuild, applyFilter: applyFilter, draw: function () { draw(true); }, setQuery: function (q) { query = q; applyFilter(); }, onResize: function () { draw(true); }, - refresh: function () { draw(true); } }; - } - - // numeric stepper control - function stepper(getVal, setVal, opts) { - opts = opts || {}; - var wrap = el('div', { class: 'fg-stepper' }); - var input = el('input', { class: 'fg-num', type: 'text' }); - function sync() { input.value = getVal(); } - function commit(v) { setVal(v); sync(); if (opts.after) opts.after(); } - [['−100', -100], ['−1', -1]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - wrap.appendChild(input); - [['+1', 1], ['+100', 100]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - input.addEventListener('keydown', function (e) { if (e.key === 'Enter') { commit(parse(input.value)); input.blur(); } else if (e.key === 'Escape') { sync(); input.blur(); } }); - input.addEventListener('blur', function () { commit(parse(input.value)); }); - function parse(s) { var n = Number(String(s).replace(/[^0-9.\-]/g, '')); return isNaN(n) ? getVal() : n; } - sync(); - return { el: wrap, sync: sync }; - } - - // ---------- sections ---------- - var activeRenderer = null, currentSection = null; - var SECTIONS = []; - function section(id, icon, title, builder) { SECTIONS.push({ id: id, icon: icon, title: title, builder: builder }); } - - function listSection(getModel, renderRow, matches, headExtra) { - return function (body, head) { - if (headExtra) headExtra(head); - var vl = VirtualList({ getModel: getModel, renderRow: renderRow, matches: matches || defaultMatch }); - body.appendChild(vl.el); - vl.rebuild(); - return { vl: vl, onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return (getModel() || []).length; } }; - }; - } - function defaultMatch(it, q) { q = q.toLowerCase(); return String(it.id) === q || (it.name && it.name.toLowerCase().indexOf(q) >= 0); } - - // Variables - section('vars', ICONS.vars, 'Variables', listSection( - function () { return API.ops.vars.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isVarFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.vars.get(it.id); }, function (v) { API.ops.vars.set(it.id, v); if (API.locks.isVarFrozen(it.id)) API.locks.freezeVar(it.id, true); }, {}); - val.appendChild(sp.el); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isVarFrozen(it.id), function (on) { API.locks.freezeVar(it.id, on); refreshActive(); })); - } - )); - - // Switches - section('switches', ICONS.switches, 'Switches', listSection( - function () { return API.ops.switches.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isSwitchFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var tg = el('button', { class: 'fg-toggle' + (API.ops.switches.get(it.id) ? ' is-on' : '') }); - tg.addEventListener('click', function () { API.ops.switches.set(it.id, !API.ops.switches.get(it.id)); if (API.locks.isSwitchFrozen(it.id)) API.locks.freezeSwitch(it.id, true); tg.classList.toggle('is-on', API.ops.switches.get(it.id)); }); - val.appendChild(tg); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isSwitchFrozen(it.id), function (on) { API.locks.freezeSwitch(it.id, on); refreshActive(); })); - } - )); - - // Items / Weapons / Armors (segmented) - section('inv', ICONS.inv, 'Items', function (body, head) { - var kind = 'item'; - var seg = el('div', { class: 'fg-segmented' }); - ['item', 'weapon', 'armor'].forEach(function (k) { - var b = el('button', { class: k === kind ? 'is-active' : '', text: k.charAt(0).toUpperCase() + k.slice(1) + 's' }); - b.addEventListener('click', function () { kind = k; seg.querySelectorAll('button').forEach(function (x) { x.classList.remove('is-active'); }); b.classList.add('is-active'); vl.rebuild(); }); - seg.appendChild(b); - }); - head.appendChild(seg); - var vl = VirtualList({ - getModel: function () { return API.ops.inv.list(kind); }, - matches: defaultMatch, - renderRow: function (row, it) { - row.className = 'fg-row' + (API.locks.isItemFrozen(kind, it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.description || it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.inv.count(kind, it.id); }, function (v) { API.ops.inv.setCount(kind, it.id, v); }, {}); - val.appendChild(sp.el); - val.appendChild(el('button', { class: 'fg-step', text: 'Max', style: 'width:auto;padding:0 6px', onclick: function () { API.ops.inv.max(kind, it.id); sp.sync(); } })); - row.appendChild(val); - row.appendChild(lockBtn(API.locks.isItemFrozen(kind, it.id), function (on) { API.locks.freezeItem(kind, it.id, on); refreshActive(); })); - } - }); - body.appendChild(vl.el); vl.rebuild(); - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.inv.list(kind).length; } }; - }); - - // Actors (master-detail) - section('actors', ICONS.actors, 'Actors', function (body) { - var detail = el('div', { class: 'fg-detail' }); - var selectedId = null; - var vl = VirtualList({ - rowH: 30, matches: defaultMatch, - getModel: function () { return API.ops.actors.list(); }, - onRowClick: function (it) { showActor(it.id); }, - renderRow: function (row, it) { - row.className = 'fg-row' + (it.id === selectedId ? ' is-selected' : ''); - row.style.cursor = 'pointer'; - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', html: (it.inParty ? '' : '') + escapeHtml(it.name) })); - row.appendChild(el('span', { class: 'fg-cell--val', text: 'Lv ' + it.level })); - } - }); - var split = el('div', { style: 'flex:1;display:flex;min-height:0' }); - var left = el('div', { style: 'flex:0 0 240px;display:flex;flex-direction:column;border-right:1px solid var(--fg-border)' }); - left.appendChild(vl.el); - split.appendChild(left); split.appendChild(detail); - body.appendChild(split); vl.rebuild(); - var firstA = API.ops.actors.list()[0]; // auto-select first actor so detail isn't empty - if (firstA) showActor(firstA.id); - function showActor(id) { - selectedId = id; vl.draw(); // re-highlight the selected row in the (virtualized) list - var a = API.ops.actors.get(id); detail.innerHTML = ''; - if (!a) { detail.appendChild(el('div', { class: 'fg-empty', text: 'Actor not initialized (start a game first)' })); return; } - detail.appendChild(el('h2', { text: a.name + ' · Lv ' + a.level, style: 'margin:0 0 12px;font-size:15px' })); - var grid = el('div', { class: 'fg-grid' }); - grid.appendChild(numField('Level', function () { return API.ops.actors.get(id).level; }, function (v) { API.ops.actors.setLevel(id, v); showActor(id); })); - grid.appendChild(numField('EXP', function () { return API.ops.actors.get(id).exp; }, function (v) { API.ops.actors.setExp(id, v); showActor(id); })); - grid.appendChild(statField('HP', id, 'hp', function () { return API.ops.actors.get(id).hp; }, function () { return API.ops.actors.get(id).mhp; }, API.ops.actors.setHp)); - grid.appendChild(statField('MP', id, 'mp', function () { return API.ops.actors.get(id).mp; }, function () { return API.ops.actors.get(id).mmp; }, API.ops.actors.setMp)); - grid.appendChild(statField('TP', id, 'tp', function () { return API.ops.actors.get(id).tp; }, function () { return 100; }, API.ops.actors.setTp)); - a.params.forEach(function (p) { grid.appendChild(numField(p.name, function () { return API.ops.actors.get(id).params[p.id].value; }, function (v) { API.ops.actors.setParam(id, p.id, v); })); }); - detail.appendChild(grid); - var actbar = el('div', { style: 'display:flex;gap:8px;margin:14px 0' }, [ - el('button', { class: 'fg-btn', text: 'Recover All', onclick: function () { API.ops.actors.recover(id); showActor(id); } }), - el('button', { class: 'fg-btn', text: a.inParty ? 'Remove from Party' : 'Add to Party', onclick: function () { if (a.inParty) API.ops.actors.removeFromParty(id); else API.ops.actors.addToParty(id); vl.rebuild(); showActor(id); } }) - ]); - detail.appendChild(actbar); - // skills - detail.appendChild(el('h2', { text: 'Skills', style: 'font-size:13px;margin:10px 0 4px;color:var(--fg-text-dim)' })); - var skbox = el('div', { style: 'max-height:140px;overflow:auto;border:1px solid var(--fg-border);border-radius:7px' }); - a.skills.forEach(function (s) { - var r = el('div', { class: 'fg-field', style: 'padding:3px 10px' }, [ - el('span', { style: 'flex:1;font-size:12px', text: s.id + ': ' + s.name }), - el('button', { class: 'fg-btn fg-btn--ghost', text: s.learned ? 'Forget' : 'Learn', onclick: function () { if (s.learned) API.ops.actors.forget(id, s.id); else API.ops.actors.learn(id, s.id); showActor(id); } }) - ]); - skbox.appendChild(r); - }); - detail.appendChild(skbox); - } - function numField(label, get, set) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, set, {}).el); - f.appendChild(el('span', { style: 'flex:0 0 24px;width:24px' })); // empty lock slot -> steppers align with HP/MP/TP rows - return f; - } - function statField(label, id, stat, get, getMax, setFn) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, function (v) { setFn(id, v); if (API.locks.isStatFrozen(id, stat)) API.locks.freezeStat(id, stat, true); }, {}).el); - f.appendChild(lockBtn(API.locks.isStatFrozen(id, stat), function (on) { API.locks.freezeStat(id, stat, on); })); - return f; - } - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.actors.list().length; } }; - }); - - // Party / Main - section('party', ICONS.party, 'Party', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - d.appendChild(el('div', { class: 'fg-field' }, [ - el('label', { text: 'Gold' }), - stepper(function () { return API.ops.gold.get(); }, function (v) { API.ops.gold.set(v); }, {}).el, - lockBtn(API.LOCK.gold != null, function (on) { API.locks.freezeGold(on); rebuild(); }) - ])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Steps' }), el('span', { text: API.ops.party.steps() })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Members' }), el('span', { text: API.ops.party.members().map(function (m) { return m.name; }).join(', ') || '(none)' })])); - d.appendChild(el('h2', { text: 'Quick actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Gold = Max', onclick: function () { API.ops.gold.set(API.ops.gold.max()); rebuild(); toast('Gold maxed', 'ok'); } }), - el('button', { class: 'fg-btn', text: 'Heal Party', onclick: function () { API.ops.party.members().forEach(function (m) { API.ops.actors.recover(m.id); }); toast('Party healed', 'ok'); } }) - ])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.party.members().length; } }; - }); - - // Map / Teleport - section('map', ICONS.map, 'Map', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var cur = API.ops.map.current(); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Current' }), el('span', { text: 'Map ' + cur.mapId + ' @ (' + cur.x + ',' + cur.y + ')' })])); - var sel = el('select', { class: 'fg-search', style: 'flex:1' }); - API.ops.map.list().forEach(function (m) { sel.appendChild(el('option', { value: m.id, text: m.id + ': ' + m.name })); }); - sel.value = cur.mapId; - var xIn = el('input', { class: 'fg-num', value: cur.x }), yIn = el('input', { class: 'fg-num', value: cur.y }); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Teleport to' }), sel])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'X / Y' }), xIn, yIn, - el('button', { class: 'fg-btn', text: 'Go', onclick: function () { API.ops.map.teleport(Number(sel.value), Number(xIn.value), Number(yIn.value), 0, 2); toast('Teleporting…', 'ok'); } })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Noclip' }), - (function () { var t = el('button', { class: 'fg-toggle' + (API.ops.map.isNoclip() ? ' is-on' : '') }); t.addEventListener('click', function () { var on = !API.ops.map.isNoclip(); API.ops.map.noclip(on); t.classList.toggle('is-on', on); }); return t; })()])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Move speed' }), - stepper(function () { return (window.$gamePlayer && $gamePlayer._moveSpeed) || 4; }, function (v) { API.ops.map.speed(v); }, {}).el])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.map.list().length; } }; - }); - - // Common Events - section('commonev', ICONS.commonev, 'Common Ev.', listSection( - function () { return API.ops.commonev.list(); }, - function (row, it) { - row.className = 'fg-row'; row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - row.appendChild(el('span', { class: 'fg-cell--val' }, el('button', { class: 'fg-btn', text: 'Run', onclick: function () { confirmBox('Run common event ' + it.id + ' (' + it.name + ')?', function () { API.ops.commonev.run(it.id); toast('Reserved CE ' + it.id, 'ok'); }); } }))); - } - )); - - // Data Lock (aggregated frozen targets) - section('locks', ICONS.locks, 'Data Lock', function (body, head) { - head.appendChild(el('button', { class: 'fg-btn fg-btn--danger', text: 'Unfreeze all', onclick: function () { API.locks.clearAll(); rebuild(); toast('All unfrozen'); } })); - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var s = API.locks.summary(); - if (!s.length) { d.appendChild(el('div', { class: 'fg-empty', text: 'No frozen values. Use the lock icon on any row to freeze it.' })); return; } - s.forEach(function (row) { - d.appendChild(el('div', { class: 'fg-field' }, [ - el('span', { style: 'flex:1;font-size:12px', text: row.label }), - el('span', { style: 'color:var(--fg-frozen);font-family:var(--font-mono);margin-right:8px', text: String(row.value) }), - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Unfreeze', onclick: function () { unfreeze(row); rebuild(); } }) - ])); - }); - } - function unfreeze(row) { - if (row.type === 'var') API.locks.freezeVar(row.id, false); - else if (row.type === 'switch') API.locks.freezeSwitch(row.id, false); - else if (row.type === 'item') { var p = row.key.split(':'); API.LOCK.items.delete(row.key); } - else if (row.type === 'stat') { API.LOCK.stats.delete(row.key); } - else if (row.type === 'gold') API.locks.freezeGold(false); - else if (row.type === 'noclip') API.ops.map.noclip(false); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.locks.summary().length; } }; - }); - - // Battle cheats - section('battle', ICONS.battle, 'Cheats', function (body) { - var d = el('div', { class: 'fg-detail' }); - function tog(label, get, set) { - var t = el('button', { class: 'fg-toggle' + (get() ? ' is-on' : '') }); - t.addEventListener('click', function () { var v = !get(); set(v); t.classList.toggle('is-on', v); }); - return el('div', { class: 'fg-field' }, [el('label', { text: label }), t]); - } - d.appendChild(tog('God mode (blocks HP loss)', function () { return API.CHEAT.god; }, API.cheats.setGod)); - d.appendChild(tog('One-hit kill', function () { return API.CHEAT.ohko; }, API.cheats.setOhko)); - d.appendChild(tog('No random encounters', function () { return API.CHEAT.noEncounter; }, API.cheats.setNoEncounter)); - // ---- game speed (speedhack) ---- - d.appendChild(el('h2', { text: 'Game speed', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - var speedRow = el('div', { class: 'fg-field' }); - speedRow.appendChild(el('label', { text: 'Speed' })); - var seg = el('div', { class: 'fg-segmented', style: 'flex-wrap:wrap' }); - var presets = [['0.5×', 0.5], ['1×', 1], ['2×', 2], ['3×', 3], ['5×', 5], ['8×', 8]]; - function keyLabel(k) { return k === 'Control' ? 'Ctrl' : (k === ' ' ? 'Space' : k); } - // In KEY mode the highlight = the ARMED target (_speedBoost); in ALWAYS-ON mode = the live speed. - function targetSpeed() { return API._speedUseKey ? (API._speedBoost || 2) : (API.CHEAT.speed || 1); } - function syncSeg() { var t = targetSpeed(); Array.prototype.forEach.call(seg.children, function (b) { b.classList.toggle('is-active', Number(b.dataset.v) === t); }); if (typeof custom !== 'undefined' && custom) custom.value = t; } - // Picking a speed ARMS the target. It only changes the live game speed if key-mode is OFF, or if - // the speedhack is already active (then it live-updates). So buttons respect the key toggle. - function pick(v) { - API._speedBoost = v; store('speedBoost', v); - if (!API._speedUseKey || API.CHEAT.speed !== 1) { API.cheats.setSpeed(v); toast('Speed ' + v + '×', 'ok'); } - else { toast('Armed ' + v + '× — hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - syncSeg(); - } - presets.forEach(function (p) { - var b = el('button', { text: p[0] }); b.dataset.v = p[1]; - b.addEventListener('click', function () { pick(p[1]); }); - seg.appendChild(b); - }); - speedRow.appendChild(seg); - d.appendChild(speedRow); - var customRow = el('div', { class: 'fg-field' }); - customRow.appendChild(el('label', { text: 'Custom ×' })); - var custom = el('input', { class: 'fg-num', type: 'text', value: targetSpeed() }); - custom.addEventListener('keydown', function (e) { if (e.key === 'Enter') { pick(Number(custom.value) || 1); custom.blur(); } }); - custom.addEventListener('blur', function () { pick(Number(custom.value) || 1); }); - customRow.appendChild(custom); - d.appendChild(customRow); - - // ---- use-key toggle (off => speed is always on) ---- - var useKeyRow = el('div', { class: 'fg-field' }); - useKeyRow.appendChild(el('label', { text: 'Use hold key' })); - var ukTog = el('button', { class: 'fg-toggle' + (API._speedUseKey ? ' is-on' : '') }); - ukTog.addEventListener('click', function () { - speedHeld = false; // changing mode ends any active hold so a later key-release won't reset speed - var on = !API._speedUseKey; API._speedUseKey = on; store('speedUseKey', on); ukTog.classList.toggle('is-on', on); - keyRow.style.display = on ? '' : 'none'; - if (on) { API.cheats.setSpeed(1); toast('Speed: hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - else { API.cheats.setSpeed(API._speedBoost || 2); toast('Speed: always on at ' + (API._speedBoost || 2) + '×', 'ok'); } - syncSeg(); - }); - useKeyRow.appendChild(ukTog); - d.appendChild(useKeyRow); - - // ---- rebindable key ---- - var keyRow = el('div', { class: 'fg-field' }); - keyRow.appendChild(el('label', { text: 'Hold key' })); - var keyBtn = el('button', { class: 'fg-btn', text: keyLabel(API._speedKey) }); - keyBtn.addEventListener('click', function () { - keyBtn.textContent = 'Press a key…'; API._capturingSpeedKey = true; - function cap(ev) { - ev.preventDefault(); ev.stopPropagation(); - window.removeEventListener('keydown', cap, true); API._capturingSpeedKey = false; - if (ev.key !== 'Escape') { API._speedKey = ev.key; store('speedKey', ev.key); } - keyBtn.textContent = keyLabel(API._speedKey); - } - window.addEventListener('keydown', cap, true); - }); - keyRow.appendChild(keyBtn); - keyRow.style.display = API._speedUseKey ? '' : 'none'; - d.appendChild(keyRow); - syncSeg(); - d.appendChild(el('h2', { text: 'In-battle actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Instant Win', onclick: function () { API.cheats.instantWin(); toast(API.ops.battle.inBattle() ? 'Enemies downed' : 'Not in battle', API.ops.battle.inBattle() ? 'ok' : 'warn'); } }), - el('button', { class: 'fg-btn', text: 'Flee / Abort', onclick: function () { API.cheats.flee(); } }) - ])); - body.appendChild(d); - return { refresh: function () {}, count: function () { return 0; } }; - }); - - // ---------- render / navigation ---------- - function escapeHtml(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } - function lockBtn(frozen, onToggle) { - var b = el('button', { class: 'fg-lock' + (frozen ? ' is-frozen' : ''), html: frozen ? ICONS.lock : ICONS.unlock, title: 'Freeze value' }); - b.addEventListener('click', function () { frozen = !frozen; b.className = 'fg-lock' + (frozen ? ' is-frozen' : ''); b.innerHTML = frozen ? ICONS.lock : ICONS.unlock; onToggle(frozen); }); - return b; - } - function refreshActive() { if (activeRenderer && activeRenderer.refresh) activeRenderer.refresh(); updateStatus(); } - - SECTIONS.forEach(function (s) { - var item = el('button', { class: 'fg-rail__item', title: s.title }, [el('span', { class: 'ic', html: s.icon }), el('span', { text: s.title.split(' ')[0] })]); - item.addEventListener('click', function () { selectSection(s.id); }); - s._rail = item; rail.appendChild(item); - }); - - function selectSection(id) { - currentSection = id; - SECTIONS.forEach(function (s) { s._rail.classList.toggle('is-active', s.id === id); }); - render(); - store('lastSection', id); - } - function render() { - var s = SECTIONS.filter(function (x) { return x.id === currentSection; })[0]; if (!s) return; - content.innerHTML = ''; - var head = el('div', { class: 'fg-subtoolbar' }); - var sectionHead = el('div', { class: 'fg-section-head' }, [el('h2', { text: s.title }), el('span', { class: 'fg-count', text: '' }), el('span', { class: 'fg-spacer' })]); - content.appendChild(sectionHead); - content.appendChild(head); - var body = el('div', { style: 'flex:1;display:flex;flex-direction:column;min-height:0' }); - content.appendChild(body); - activeRenderer = s.builder(body, head) || {}; - if (head.children.length === 0) head.remove(); - var cnt = activeRenderer.count ? activeRenderer.count() : 0; - sectionHead.querySelector('.fg-count').textContent = cnt + (cnt === 1 ? ' entry' : ' entries'); - // Search only applies to list sections (those expose setQuery); hide it on form sections. - var searchable = !!activeRenderer.setQuery; - // keep the search box's flex space (invisible, not removed) so the titlebar buttons stay anchored right - search.style.visibility = searchable ? 'visible' : 'hidden'; - if (searchable && search.value) activeRenderer.setQuery(search.value.trim()); - updateStatus(); - } - function updateStatus() { - var frozen = API.locks.summary().length; - statusbar.innerHTML = ''; - statusbar.appendChild(el('span', { text: API.env.IS_MZ ? 'RPG Maker MZ' : 'RPG Maker MV' })); - statusbar.appendChild(el('span', { class: 'fg-spacer', style: 'flex:1' })); - statusbar.appendChild(el('span', { text: (frozen ? frozen + ' frozen · ' : '') + 'F10 to toggle' })); - } - - search.addEventListener('input', debounce(function () { if (activeRenderer && activeRenderer.setQuery) activeRenderer.setQuery(search.value.trim()); }, 120)); - function debounce(fn, ms) { var t; return function () { clearTimeout(t); t = setTimeout(fn, ms); }; } - - // ---------- show / hide / hotkeys ---------- - var visible = false; - function show() { visible = true; try { document.body.appendChild(host); } catch (e) {} panel.style.display = 'flex'; launcher.style.display = 'none'; if (!currentSection) selectSection(load('lastSection', 'vars')); else render(); } - function hide() { visible = false; panel.style.display = 'none'; launcher.style.display = 'flex'; API.CHEAT.uiFocused = false; if (typeof Input !== 'undefined' && Input.clear) Input.clear(); } - function toggle() { if (visible) hide(); else show(); } - panel.style.display = 'none'; - - // Speed key = HOLD to fast-forward: while the key is held the game runs at the armed boost speed; - // on release it returns to 1x. Only active when the "use key" option is on. Gated to !uiFocused so - // holding a key while typing in the panel never fast-forwards. - var speedHeld = false; - function isSpeedKey(k) { var sk = API._speedKey || 'Control'; return k === sk || (sk === 'Control' && k === 'Ctrl'); } - function holdStart() { if (!speedHeld) { speedHeld = true; API.cheats.setSpeed(API._speedBoost || 2); toast('Fast-forward ' + API.CHEAT.speed + '×', 'ok'); } } - function holdEnd() { if (speedHeld) { speedHeld = false; API.cheats.setSpeed(1); } } - window.addEventListener('keydown', function (e) { - if (API._capturingSpeedKey) return; // a key-rebind is in progress - var key = e.key || ''; - if (key === (API._hotkey || 'F10')) { e.preventDefault(); toggle(); return; } - if (visible && (e.ctrlKey || e.metaKey) && key.toLowerCase() === 'k') { e.preventDefault(); search.focus(); search.select(); } - else if (visible && key === 'Escape') { if (shadow.activeElement && shadow.activeElement.tagName === 'INPUT') shadow.activeElement.blur(); else hide(); } - if (API._speedUseKey && isSpeedKey(key) && !API.CHEAT.uiFocused) holdStart(); // hold to fast-forward - }, true); - window.addEventListener('keyup', function (e) { - if (API._capturingSpeedKey) return; - if (isSpeedKey(e.key || '')) holdEnd(); - }, true); - window.addEventListener('blur', holdEnd); // alt-tab / focus loss -> stop fast-forward (no stuck key) - - // expose - return { - show: show, hide: hide, toggle: toggle, toast: toast, render: render, - isVisible: function () { return visible; }, root: rootEl, host: host, - select: selectSection, sections: SECTIONS.map(function (s) { return s.id; }) - }; - } - -})(typeof window !== 'undefined' ? window : (typeof globalThis !== 'undefined' ? globalThis : this)); - -/* ---- MV scaffolding (plugin command + start-open) ---- */ -(function () { - if (typeof Game_Interpreter === 'undefined') return; - var P = (typeof PluginManager !== 'undefined' && PluginManager.parameters) ? PluginManager.parameters('Forge_MV') : {}; - if (window.Forge) { - window.Forge._hotkey = (P.Hotkey || 'F10').trim(); - window.Forge._itemMaxOverride = Number(P.ItemMaxOverride) || 0; - // speed key: plugin-param is the first-run default; a key rebound in the panel (persisted) wins - try { if (!localStorage.getItem('forge:speedKey')) window.Forge._speedKey = (P.SpeedKey || 'Control').trim(); } catch (e) { window.Forge._speedKey = (P.SpeedKey || 'Control').trim(); } - } - var _pc = Game_Interpreter.prototype.pluginCommand; - Game_Interpreter.prototype.pluginCommand = function (cmd, args) { - _pc.call(this, cmd, args); - if (cmd === 'MTC' && window.Forge && window.Forge.ui) window.Forge.ui.toggle(); - }; - if (String(P.StartOpen) === 'true' && typeof Scene_Map !== 'undefined') { - var _s = Scene_Map.prototype.start; - Scene_Map.prototype.start = function () { _s.call(this); if (window.Forge && window.Forge.ui && !window.Forge.ui.isVisible()) window.Forge.ui.show(); }; - } -})(); - +(function(){var e=document.createElement(`style`);e.textContent=`@import "https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap";:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:#ff6568;--color-orange-400:#ff8b1a;--color-yellow-300:#ffe02a;--color-yellow-400:#fac800;--color-yellow-500:#edb200;--color-fuchsia-500:#e12afb;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c10;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}@supports (color:lab(0% 0 0)){:root,:host{--color-red-400:lab(63.7053% 60.745 31.3109);--color-orange-400:lab(70.0429% 42.5156 75.8207);--color-yellow-300:lab(89.7033% -.480294 84.4917);--color-yellow-400:lab(83.2664% 8.65132 106.895);--color-yellow-500:lab(76.3898% 14.5258 98.4589);--color-fuchsia-500:lab(56.4256% 83.132 -64.639);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425)}}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-left:20px}:where(select:is([multiple],[size])) optgroup option{padding-left:20px}::-webkit-file-upload-button{margin-right:4px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{top:0;bottom:0;left:0;right:0}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\\[-0\\.5px\\]{top:-.5px}.top-\\[4px\\]{top:4px}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.left-4{left:calc(var(--spacing) * 4)}.left-\\[4px\\]{left:4px}.left-\\[24px\\]{left:24px}.z-2147482999{z-index:2147482999}.z-2147483000{z-index:2147483000}.z-2147483647{z-index:2147483647}.m-0{margin:0}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-0{min-height:0}.w-1\\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(140px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(160px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(260px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(300px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{grid-gap:calc(var(--spacing) * 2);gap:calc(var(--spacing) * 2)}.gap-3{grid-gap:calc(var(--spacing) * 3);gap:calc(var(--spacing) * 3)}.gap-4{grid-gap:calc(var(--spacing) * 4);gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(var(--spacing) * var(--tw-space-y-reverse));margin-bottom:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(var(--spacing) * var(--tw-space-x-reverse));margin-right:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.divide-border\\/50>:not(:last-child)){border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\\[\\#2a2d3a\\]{border-color:#2a2d3a}.border-accent{border-color:var(--color-accent)}.border-accent\\/30{border-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/30{border-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.border-accent\\/50{border-color:rgba(99,102,241,.5)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/50{border-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.border-border{border-color:var(--color-border)}.border-border\\/50{border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-danger\\/30{border-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.border-danger\\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-fuchsia-500\\/30{border-color:rgba(225,42,251,.3)}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\\/30{border-color:color-mix(in oklab, var(--color-fuchsia-500) 30%, transparent)}}.border-gray-500\\/30{border-color:rgba(106,114,130,.3)}@supports (color:color-mix(in lab, red, red)){.border-gray-500\\/30{border-color:color-mix(in oklab, var(--color-gray-500) 30%, transparent)}}.border-ok\\/30{border-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.border-ok\\/30{border-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.border-warn\\/30{border-color:rgba(251,146,60,.3)}@supports (color:color-mix(in lab, red, red)){.border-warn\\/30{border-color:color-mix(in oklab, var(--color-warn) 30%, transparent)}}.border-yellow-500\\/30{border-color:rgba(237,178,0,.3)}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\\/30{border-color:color-mix(in oklab, var(--color-yellow-500) 30%, transparent)}}.border-l-frozen{border-left-color:var(--color-frozen)}.bg-\\[\\#1a1d24\\]{background-color:#1a1d24}.bg-\\[\\#3a3f4d\\]{background-color:#3a3f4d}.bg-\\[\\#7ba4ff\\]\\/10{background-color:rgba(123,164,255,.1);background-color:lab(67.3388% 4.90472 -50.2993/.1)}.bg-\\[\\#13151a\\]{background-color:#13151a}.bg-accent{background-color:var(--color-accent)}.bg-accent-weak{background-color:var(--color-accent-weak)}.bg-accent\\/5{background-color:rgba(99,102,241,.05)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/5{background-color:color-mix(in oklab, var(--color-accent) 5%, transparent)}}.bg-accent\\/10{background-color:rgba(99,102,241,.1)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/10{background-color:color-mix(in oklab, var(--color-accent) 10%, transparent)}}.bg-accent\\/20{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/20{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg2{background-color:var(--color-bg2)}.bg-border{background-color:var(--color-border)}.bg-border\\/50{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.bg-border\\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-danger{background-color:var(--color-danger)}.bg-danger\\/10{background-color:rgba(239,68,68,.1)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-danger\\/20{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/20{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.bg-frozen\\/20{background-color:rgba(139,92,246,.2)}@supports (color:color-mix(in lab, red, red)){.bg-frozen\\/20{background-color:color-mix(in oklab, var(--color-frozen) 20%, transparent)}}.bg-fuchsia-500\\/10{background-color:rgba(225,42,251,.1)}@supports (color:color-mix(in lab, red, red)){.bg-fuchsia-500\\/10{background-color:color-mix(in oklab, var(--color-fuchsia-500) 10%, transparent)}}.bg-gray-500\\/10{background-color:rgba(106,114,130,.1)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-ok{background-color:var(--color-ok)}.bg-ok\\/10{background-color:rgba(16,185,129,.1)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/10{background-color:color-mix(in oklab, var(--color-ok) 10%, transparent)}}.bg-ok\\/20{background-color:rgba(16,185,129,.2)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/20{background-color:color-mix(in oklab, var(--color-ok) 20%, transparent)}}.bg-transparent{background-color:transparent}.bg-warn\\/10{background-color:rgba(251,146,60,.1)}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500\\/10{background-color:rgba(237,178,0,.1)}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\\/10{background-color:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-left:var(--spacing);padding-right:var(--spacing)}.px-1\\.5{padding-left:calc(var(--spacing) * 1.5);padding-right:calc(var(--spacing) * 1.5)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-2\\.5{padding-left:calc(var(--spacing) * 2.5);padding-right:calc(var(--spacing) * 2.5)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-3\\.5{padding-left:calc(var(--spacing) * 3.5);padding-right:calc(var(--spacing) * 3.5)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.py-0\\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:var(--spacing);padding-bottom:var(--spacing)}.py-1\\.5{padding-top:calc(var(--spacing) * 1.5);padding-bottom:calc(var(--spacing) * 1.5)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[\\#7ba4ff\\]{color:#7ba4ff}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-frozen{color:var(--color-frozen)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-ok{color:var(--color-ok)}.text-orange-400{color:var(--color-orange-400)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,rgba(0,0,0,.1)), 0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{user-select:none}.select-text{user-select:text}@media (hover:hover){.group-hover\\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.first-letter\\:text-\\[\\#7ba4ff\\]:first-letter{color:#7ba4ff}@media (hover:hover){.hover\\:bg-\\[\\#2a2d3a\\]:hover{background-color:#2a2d3a}.hover\\:bg-accent\\/20:hover{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/20:hover{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.hover\\:bg-accent\\/30:hover{background-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\\:bg-accent\\/80:hover{background-color:rgba(99,102,241,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--color-accent) 80%, transparent)}}.hover\\:bg-accent\\/85:hover{background-color:rgba(99,102,241,.85)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/85:hover{background-color:color-mix(in oklab, var(--color-accent) 85%, transparent)}}.hover\\:bg-border:hover{background-color:var(--color-border)}.hover\\:bg-border\\/30:hover{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/30:hover{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.hover\\:bg-border\\/50:hover{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/50:hover{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.hover\\:bg-border\\/80:hover{background-color:rgba(34,37,51,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/80:hover{background-color:color-mix(in oklab, var(--color-border) 80%, transparent)}}.hover\\:bg-danger\\/20:hover{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/20:hover{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-danger\\/80:hover{background-color:rgba(239,68,68,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/80:hover{background-color:color-mix(in oklab, var(--color-danger) 80%, transparent)}}.hover\\:bg-frozen\\/30:hover{background-color:rgba(139,92,246,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-frozen\\/30:hover{background-color:color-mix(in oklab, var(--color-frozen) 30%, transparent)}}.hover\\:bg-ok\\/30:hover{background-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-ok\\/30:hover{background-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-gray-200:hover{color:var(--color-gray-200)}.hover\\:text-gray-300:hover{color:var(--color-gray-300)}.hover\\:text-gray-400:hover{color:var(--color-gray-400)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\\:opacity-100:hover{opacity:1}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.focus\\:bg-border\\/30:focus{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.focus\\:bg-border\\/30:focus{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:opacity-50:disabled{opacity:.5}:host{--color-bg:#0b0c10;--color-bg-elev:#13151f;--color-bg-input:#1a1c29;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-text-faint:#646b7d;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#222533;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#6366f1}body,:host{color:#f1f5f9;font-family:Outfit,system-ui,-apple-system,sans-serif}*,:after,:before{--tw-border-style:solid}.cursor-grab{cursor:-webkit-grab;cursor:grab}.active\\:cursor-grabbing:active{cursor:-webkit-grabbing;cursor:grabbing}.space-x-1>:not([hidden])~:not([hidden]){margin-left:4px}.space-x-1\\.5>:not([hidden])~:not([hidden]){margin-left:6px}.space-x-2>:not([hidden])~:not([hidden]){margin-left:8px}.space-x-2\\.5>:not([hidden])~:not([hidden]){margin-left:10px}.space-x-3>:not([hidden])~:not([hidden]){margin-left:12px}.space-x-4>:not([hidden])~:not([hidden]){margin-left:16px}.space-y-0\\.5>:not([hidden])~:not([hidden]){margin-top:2px}.space-y-1>:not([hidden])~:not([hidden]){margin-top:4px}.space-y-2>:not([hidden])~:not([hidden]){margin-top:8px}.space-y-2\\.5>:not([hidden])~:not([hidden]){margin-top:10px}.space-y-3>:not([hidden])~:not([hidden]){margin-top:12px}.space-y-4>:not([hidden])~:not([hidden]){margin-top:16px}.space-y-6>:not([hidden])~:not([hidden]){margin-top:24px}.divide-y>:not([hidden])~:not([hidden]){border-top-width:1px;border-color:var(--color-border)}input,textarea,[contenteditable=true]{user-select:text!important}button,button:focus{outline:none!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-duration{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-duration:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}} +/*$vite$:1*/`,document.head.appendChild(e);var t=!1,n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}function y(e){"@babel/helpers - typeof";return y=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},y(e)}function b(e,t){if(y(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(y(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function x(e){var t=b(e,`string`);return y(t)==`symbol`?t:t+``}function S(e,t,n){return(t=x(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ee,C=1<<24,w=1024,te=2048,ne=4096,re=8192,ie=16384,ae=32768,oe=1<<25,se=65536,ce=1<<19,le=1<<20,ue=1<<25,de=65536,fe=1<<21,pe=1<<22,me=1<<23,he=Symbol(`$state`),ge=Symbol(`legacy props`),_e=Symbol(``),ve=Symbol(`proxy path`),ye=Symbol(`attributes`),be=Symbol(`class`),xe=Symbol(`style`),Se=Symbol(`text`),Ce=Symbol(`form reset`),we=Symbol(`hmr anchor`),Te=new class extends Error{constructor(...e){super(...e),S(this,`name`,`StaleReactionError`),S(this,`message`,"The reaction that called `getAbortSignal()` was re-run or destroyed")}},Ee=!!((ee=globalThis.document)!=null&&ee.contentType)&&globalThis.document.contentType.includes(`xml`);function De(e){if(t){let t=Error(`invariant_violation\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: "${e}"\nhttps://svelte.dev/e/invariant_violation`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/invariant_violation`)}function Oe(e){if(t){let t=Error(`lifecycle_outside_component\n\`${e}(...)\` can only be used during component initialisation\nhttps://svelte.dev/e/lifecycle_outside_component`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){if(t){let e=Error("async_derived_orphan\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\nhttps://svelte.dev/e/async_derived_orphan");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(){if(t){let e=Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/bind_invalid_checkbox_value`)}function je(){if(t){let e=Error(`derived_references_self +A derived value cannot reference itself recursively +https://svelte.dev/e/derived_references_self`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/derived_references_self`)}function Me(e,n,r){if(t){let t=Error(`each_key_duplicate\n${r?`Keyed each block has duplicate key \`${r}\` at indexes ${e} and ${n}`:`Keyed each block has duplicate key at indexes ${e} and ${n}`}\nhttps://svelte.dev/e/each_key_duplicate`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ne(e,n,r){if(t){let t=Error(`each_key_volatile\nKeyed each block has key that is not idempotent — the key for item at index ${e} was \`${n}\` but is now \`${r}\`. Keys must be the same each time for a given item\nhttps://svelte.dev/e/each_key_volatile`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_volatile`)}function Pe(e){if(t){let t=Error(`effect_in_teardown\n\`${e}\` cannot be used inside an effect cleanup function\nhttps://svelte.dev/e/effect_in_teardown`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Fe(){if(t){let e=Error(`effect_in_unowned_derived +Effect cannot be created inside a \`$derived\` value that was not itself created inside an effect +https://svelte.dev/e/effect_in_unowned_derived`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ie(e){if(t){let t=Error(`effect_orphan\n\`${e}\` can only be used inside an effect (e.g. during component initialisation)\nhttps://svelte.dev/e/effect_orphan`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_orphan`)}function Le(){if(t){let e=Error(`effect_update_depth_exceeded +Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state +https://svelte.dev/e/effect_update_depth_exceeded`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Re(){if(t){let e=Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/invalid_snippet`)}function ze(e){if(t){let t=Error(`props_invalid_value\nCannot do \`bind:${e}={undefined}\` when \`${e}\` has a fallback value\nhttps://svelte.dev/e/props_invalid_value`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_invalid_value`)}function Be(e){if(t){let t=Error(`props_rest_readonly\nRest element properties of \`$props()\` such as \`${e}\` are readonly\nhttps://svelte.dev/e/props_rest_readonly`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_rest_readonly`)}function Ve(e){if(t){let t=Error(`rune_outside_svelte\nThe \`${e}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files\nhttps://svelte.dev/e/rune_outside_svelte`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/rune_outside_svelte`)}function He(){if(t){let e=Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){if(t){let e=Error(`state_prototype_fixed +Cannot set prototype of \`$state\` object +https://svelte.dev/e/state_prototype_fixed`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){if(t){let e=Error("state_unsafe_mutation\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){if(t){let e=Error("svelte_boundary_reset_onerror\nA `` `reset` function cannot be called while an error is still being handled\nhttps://svelte.dev/e/svelte_boundary_reset_onerror");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke={},qe=Symbol(`uninitialized`),Je=Symbol(`filename`),Ye=`http://www.w3.org/1999/xhtml`,Xe=`http://www.w3.org/2000/svg`,Ze=`font-weight: bold`,Qe=`font-weight: normal`;function $e(e){t?console.warn(`%c[svelte] await_reactivity_loss\n%cDetected reactivity loss when reading \`${e}\`. This happens when state is read in an async function after an earlier \`await\`\nhttps://svelte.dev/e/await_reactivity_loss`,Ze,Qe):console.warn(`https://svelte.dev/e/await_reactivity_loss`)}function et(e,n){t?console.warn(`%c[svelte] await_waterfall\n%cAn async derived, \`${e}\` (${n}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\nhttps://svelte.dev/e/await_waterfall`,Ze,Qe):console.warn(`https://svelte.dev/e/await_waterfall`)}function tt(){t?console.warn(`%c[svelte] derived_inert +%cReading a derived belonging to a now-destroyed effect may result in stale values +https://svelte.dev/e/derived_inert`,Ze,Qe):console.warn(`https://svelte.dev/e/derived_inert`)}function nt(e,n,r){t?console.warn(`%c[svelte] hydration_attribute_changed\n%cThe \`${e}\` attribute on \`${n}\` changed its value between server and client renders. The client value, \`${r}\`, will be ignored in favour of the server value\nhttps://svelte.dev/e/hydration_attribute_changed`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_attribute_changed`)}function rt(e){t?console.warn(`%c[svelte] hydration_mismatch\n%c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:`Hydration failed because the initial UI does not match what was rendered on the server`}\nhttps://svelte.dev/e/hydration_mismatch`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_mismatch`)}function it(){t?console.warn("%c[svelte] select_multiple_invalid_value\n%cThe `value` property of a ` `);function fl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,0),r=Hs(t,`min`,19,()=>-1/0),i=Hs(t,`max`,3,1/0),a=P(I(String(n())));Mi(()=>{F(a,String(n()),!0)});let o=()=>{var e;let o=parseFloat(H(a));isNaN(o)&&(o=n()),o=Math.max(r(),Math.min(i(),o)),n(o),F(a,String(o),!0),(e=t.onchange)==null||e.call(t,n())},s=(e,o)=>{var s;o.shiftKey&&(e*=10);let c=n()+e;c=Math.max(r(),Math.min(i(),c)),n(c),F(a,String(c),!0),(s=t.onchange)==null||s.call(t,n())},c=e=>{e.stopPropagation(),e.key===`Enter`?(o(),e.target.blur()):e.key===`Escape`&&(F(a,String(n()),!0),e.target.blur())};var l=dl(),u=L(l),d=R(u,2);us(d);var f=R(d,2);D(l),U(`click`,u,e=>s(-1,e)),Ua(`blur`,d,o),U(`keydown`,d,c),Cs(d,()=>H(a),e=>F(a,e)),U(`click`,f,e=>s(1,e)),G(e,l),Nt()}Wa([`click`,`keydown`]);var pl=W(``);function ml(e,t){Mt(t,!0);let n=Hs(t,`locked`,3,!1);var r=pl(),i=L(r),a=e=>{uc(e,{size:14})},o=e=>{cc(e,{size:14})};mo(i,e=>{n()?e(a):e(o,-1)}),D(r),z(()=>{Jo(r,1,`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors focus:outline-none ${n()?`bg-frozen/20 text-frozen hover:bg-frozen/30`:`hover:bg-border text-gray-500 hover:text-gray-300`}`),ps(r,`title`,n()?`Unfreeze`:`Freeze`),ps(r,`aria-label`,n()?`Unfreeze state`:`Freeze state`)}),U(`click`,r,()=>{var e;return(e=t.ontoggle)==null?void 0:e.call(t,!n())}),G(e,r),Nt()}Wa([`click`]);var hl=W(``),gl=W(``),_l=W(`
`),vl=W(`
`);function yl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetVarId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetVarId);e!==-1&&H(a).scrollToIndex(e),Q.targetVarId=null}});let o,s=P(!1),c=new Set,l=I({}),u=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||t.value!==void 0&&t.value!==null&&String(t.value).toLowerCase().includes(e));c=new Set(t.map(e=>e.id))}},d=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`variables`,e.id),r=Zc.isFavorite(`variables`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},f=()=>{F(n,q.vars.list(),!0),u(),d()},p=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(s)||(F(n,q.vars.list(),!0),d())},1e3);return()=>clearInterval(e)});let h=(e,t)=>{q.vars.set(e,t),Y.vars.has(e)&&X.freezeVar(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)};var g=vl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y);D(y),D(_);var x=R(_,2);Ps(ul(L(x),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{let r=Wn(()=>l[t().id]||typeof t().value);var i=_l(),a=L(i),o=L(a,!0);D(a);var c=R(a,2),u=L(c),f=L(u,!0);D(u),D(c);var p=R(c,2),g=L(p),_=L(g);{let e=Wn(()=>Zc.isFavorite(`variables`,t().id)?`fill-current`:``);bc(_,{size:16,get class(){return H(e)}})}D(g);var v=R(g,2),y=L(v,!0);D(v);var b=R(v,2),x=e=>{{let n=Wn(()=>Number(t().value)||0);fl(e,{get value(){return H(n)},onchange:e=>h(t().id,e)})}},S=e=>{var n=hl(),r=L(n);r.value=r.__value=`true`;var i=R(r);i.value=i.__value=`false`,D(n);var a;Qo(n),z(()=>{a!==(a=t().value?`true`:`false`)&&(n.value=n.__value=t().value?`true`:`false`,Zo(n,t().value?`true`:`false`))}),U(`change`,n,e=>h(t().id,e.currentTarget.value===`true`)),G(e,n)},ee=e=>{var n=gl();us(n),z(e=>ds(n,e),[()=>String(t().value===void 0||t().value===null?``:t().value)]),Ua(`blur`,n,e=>h(t().id,e.currentTarget.value)),U(`keydown`,n,e=>{e.stopPropagation(),e.key===`Enter`&&e.currentTarget.blur()}),G(e,n)};mo(b,e=>{H(r)===`number`?e(x):H(r)===`boolean`?e(S,1):e(ee,-1)});var C=R(b,2),w=L(C);{let e=Wn(()=>Y.vars.has(t().id));ml(w,{get locked(){return H(e)},ontoggle:e=>{X.freezeVar(t().id,e),F(n,[...H(n)],!0),d()}})}D(C),D(p),D(i),z((e,n,a)=>{Jo(i,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(o,n),ps(u,`title`,t().name),K(f,t().name),Jo(g,1,`mr-2 flex items-center justify-center transition-colors ${a==null?``:a}`),K(y,H(r)===`number`?`NUM`:H(r)===`string`?`STR`:`BOOL`)},[()=>Y.vars.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`variables`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,p,()=>F(s,!0)),U(`focusout`,p,()=>F(s,!1)),U(`click`,g,()=>{Zc.toggleFavorite(`variables`,t().id),d()}),U(`click`,v,()=>{(l[t().id]||typeof t().value)===`number`?l[t().id]=`string`:l[t().id]=`number`}),G(e,i)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(x),D(g),z(()=>{var e;ds(v,H(i)),K(b,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,p),G(e,g),Nt()}Wa([`input`,`focusin`,`focusout`,`click`,`change`,`keydown`]);var bl=W(``);function xl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,!1),r=()=>{var e;n(!n()),(e=t.onchange)==null||e.call(t,n())};var i=bl(),a=L(i);D(i),z(()=>{Jo(i,1,`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${n()?`bg-ok`:`bg-[#3a3f4d]`}`),Jo(a,1,`absolute top-[4px] h-4 w-4 rounded-full bg-white shadow transition-all ${n()?`left-[24px]`:`left-[4px]`}`)}),U(`click`,i,r),G(e,i),Nt()}Wa([`click`]);var Sl=W(`
`),Cl=W(`
`);function wl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetSwitchId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetSwitchId);e!==-1&&H(a).scrollToIndex(e),Q.targetSwitchId=null}});let o,s=P(!1),c=new Set,l=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||(t.value?`true`:`false`).includes(e));c=new Set(t.map(e=>e.id))}},u=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`switches`,e.id),r=Zc.isFavorite(`switches`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},d=()=>{F(n,q.switches.list(),!0),l(),u()},f=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{l(),u()},300)};Ws(()=>{d();let e=setInterval(()=>{H(s)||(F(n,q.switches.list(),!0),u())},1e3);return()=>clearInterval(e)});let p=(e,t)=>{q.switches.set(e,t),Y.switches.has(e)&&X.freezeSwitch(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)},h=e=>{H(r).forEach(t=>p(t.id,e)),d(),zc.show(`All filtered switches turned ${e?`ON`:`OFF`}`,`success`)};var g=Cl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y),x=R(b,2),S=R(x,2),ee=L(S);D(S),D(y),D(_);var C=R(_,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{var r=Sl(),i=L(r),a=L(i,!0);D(i);var o=R(i,2),c=L(o),l=L(c,!0);D(c),D(o);var d=R(o,2),f=L(d),h=L(f);{let e=Wn(()=>Zc.isFavorite(`switches`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(f);var g=R(f,2);xl(g,{get value(){return t().value},onchange:e=>p(t().id,e)});var _=R(g,2),v=L(_);{let e=Wn(()=>Y.switches.has(t().id));ml(v,{get locked(){return H(e)},ontoggle:e=>{X.freezeSwitch(t().id,e),F(n,[...H(n)],!0),u()}})}D(_),D(d),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),Jo(c,1,`truncate text-sm select-text cursor-text ${t().value?`text-white font-bold`:`text-gray-400`}`),K(l,t().name),Jo(f,1,`flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.switches.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`switches`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),Ua(`mouseenter`,d,()=>F(s,!0)),Ua(`mouseleave`,d,()=>F(s,!1)),U(`click`,f,()=>{Zc.toggleFavorite(`switches`,t().id),u()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(g),z(()=>{var e;ds(v,H(i)),K(ee,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,f),U(`click`,b,()=>h(!0)),U(`click`,x,()=>h(!1)),G(e,g),Nt()}Wa([`input`,`click`]);var Tl=W(`
`),El=W(`
`),Dl=W(`
`);function Ol(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetItemKey!==null&&H(a)){let[e,t]=Q.targetItemKey.split(`:`);if(e===H(o)){if(H(r).length>0){let e=H(r).findIndex(e=>e.id===parseInt(t,10));e!==-1&&H(a).scrollToIndex(e),Q.targetItemKey=null}}else p(e)}});let o=P(I(Fc.Item)),s,c=P(!1),l=new Set,u=()=>{if(!H(i).trim())l=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||String(t.count).includes(e)||t.description&&t.description.toLowerCase().includes(e));l=new Set(t.map(e=>e.id))}},d=()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;F(r,H(n).filter(e=>l.has(e.id)).sort((t,n)=>{let r=Zc.isFavorite(e,t.id),i=Zc.isFavorite(e,n.id);return r&&!i?-1:!r&&i?1:t.id-n.id}),!0)},f=()=>{F(n,q.inv.list(H(o)),!0),u(),d()},p=e=>{F(o,e,!0),f(),H(a)&&H(a).resetScroll()},h=e=>{F(i,e.target.value,!0),clearTimeout(s),s=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(c)||(F(n,q.inv.list(H(o)),!0),d())},1e3);return()=>clearInterval(e)});let g=(e,t)=>{q.inv.setCount(H(o),e,t),Y.items.has(`${H(o)}:${e}`)&&X.freezeItem(H(o),e,!0)};var _=Dl(),v=L(_),y=L(v),b=L(y),x=R(b,2),S=R(x,2);D(y);var ee=R(y,2);us(ee),D(v);var C=R(v,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:48,itemTemplate:(e,t=m)=>{var r=El(),i=L(r),a=L(i,!0);D(i);var s=R(i,2),l=L(s),u=L(l,!0);D(l);var f=R(l,2),p=e=>{var n=Tl(),r=L(n,!0);D(n),z((e,t)=>{ps(n,`title`,e),K(r,t)},[()=>t().description.replace(/\n/g,` `),()=>t().description.replace(/\n/g,` `)]),G(e,n)};mo(f,e=>{t().description&&e(p)}),D(s);var h=R(s,2),_=L(h),v=L(_);{let e=Wn(()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`fill-current`:``);bc(v,{size:16,get class(){return H(e)}})}D(_);var y=R(_,2);{let e=Wn(()=>q.inv.maxStack(H(o),t().id));fl(y,{get value(){return t().count},min:0,get max(){return H(e)},onchange:e=>g(t().id,e)})}var b=R(y,2),x=L(b);{let e=Wn(()=>Y.items.has(`${H(o)}:${t().id}`));ml(x,{get locked(){return H(e)},ontoggle:e=>{X.freezeItem(H(o),t().id,e),F(n,[...H(n)],!0),d()}})}D(b),D(h),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),ps(l,`title`,t().name),K(u,t().name),Jo(_,1,`mr-1 flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.items.has(`${H(o)}:${t().id}`)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,h,()=>F(c,!0)),U(`focusout`,h,()=>F(c,!1)),U(`click`,_,()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;Zc.toggleFavorite(e,t().id),d()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(_),z(()=>{Jo(b,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Item?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(x,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Weapon?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(S,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Armor?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),ds(ee,H(i))}),U(`click`,b,()=>p(Fc.Item)),U(`click`,x,()=>p(Fc.Weapon)),U(`click`,S,()=>p(Fc.Armor)),U(`input`,ee,h),G(e,_),Nt()}Wa([`click`,`input`,`focusin`,`focusout`]);var kl=W(``),Al=W(``),jl=W(`
`),Ml=W(`
`),Nl=W(`
No skills in database.
`),Pl=W(``),Fl=W(`
`),Il=W(`No active states.`),Ll=W(``),Rl=W(`

Core Status

Level
EXP
HP
MP
TP

Parameters

Skills

States

`,1),zl=W(`
Start a game or select an actor to edit stats.
`),Bl=W(`
Actors
`);function Vl(e,t){Mt(t,!0);let n=P(I([])),r=P(null),i=P(null),a=P(null),o=P(``),s=P(``);Mi(()=>{Q.targetActorId!==null&&H(n).length>0&&(F(r,Q.targetActorId,!0),Q.targetActorId=null,Q.targetActorStat=null,c())});let c=()=>{F(n,J.list(),!0),H(r)===null&&H(n).length>0&&F(r,H(n)[0].id,!0),H(r)!==null&&F(i,J.get(H(r)),!0)};Ws(()=>{c();let e=setInterval(()=>{c()},1e3);return()=>clearInterval(e)});let l=e=>{F(r,e,!0),F(i,J.get(e),!0)},u=(e,t)=>{H(r)!==null&&(e===`hp`?J.setHp(H(r),t):e===`mp`?J.setMp(H(r),t):e===`tp`&&J.setTp(H(r),t),Y.stats.has(`${H(r)}:${e}`)&&X.freezeStat(H(r),e,!0),F(i,J.get(H(r)),!0))},d=(e,t)=>{H(r)!==null&&(J.setParam(H(r),e,t),F(i,J.get(H(r)),!0))},f=()=>{H(r)===null||!H(i)||(H(i).inParty?J.removeFromParty(H(r)):J.addToParty(H(r)),c())},p=(e,t)=>{H(r)!==null&&(t?J.forgetSkill(H(r),e):J.learnSkill(H(r),e),F(i,J.get(H(r)),!0))},m={[Lc.MHP]:`Max HP`,[Lc.MMP]:`Max MP`,[Lc.ATK]:`Attack`,[Lc.DEF]:`Defense`,[Lc.MAT]:`M. Attack`,[Lc.MDF]:`M. Defense`,[Lc.AGI]:`Agility`,[Lc.LUK]:`Luck`};var h=Bl(),g=L(h),_=R(L(g),2);yo(_,21,()=>H(n),ho,(e,t)=>{var n=Al(),i=L(n),a=L(i),o=e=>{G(e,kl())};mo(a,e=>{H(t).inParty&&e(o)});var s=R(a,2),c=L(s,!0);D(s),D(i);var u=R(i,2),d=L(u);D(u),D(n),z(()=>{var e;ps(n,`id`,`actor-btn-${H(t).id}`),Jo(n,1,`flex w-full items-center justify-between rounded px-2.5 py-2 text-left text-sm transition-colors ${H(r)===H(t).id?`bg-accent text-white font-semibold`:`hover:bg-border/50 text-gray-300`}`),K(c,H(t).name),K(d,`Lv.${(e=H(t).level)==null?``:e}`)}),U(`click`,n,()=>l(H(t).id)),G(e,n)}),D(_),D(g);var v=R(g,2),y=L(v),b=e=>{var t,n=Rl(),l=_i(n),h=L(l),g=L(h),_=L(g,!0);D(g);var v=R(g,2),y=L(v);D(v),D(h);var b=R(h,2),x=L(b),S=R(x,2),ee=L(S,!0);D(S),D(b),D(l);var C=R(l,2),w=L(C),te=R(L(w),2),ne=R(L(te),2),re=L(ne);fl(re,{get value(){return H(i).level},min:1,max:99,onchange:e=>{H(r)!==null&&(J.setLevel(H(r),e),Y.stats.has(`${H(r)}:level`)&&X.freezeStat(H(r),`level`,!0),F(i,J.get(H(r)),!0),c())}});var ie=R(re,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:level`));ml(ie,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`level`,e),F(i,J.get(H(r)),!0))}})}D(ne),D(te);var ae=R(te,2),oe=R(L(ae),2),se=L(oe);fl(se,{get value(){return H(i).exp},min:0,onchange:e=>{H(r)!==null&&(J.setExp(H(r),e),Y.stats.has(`${H(r)}:exp`)&&X.freezeStat(H(r),`exp`,!0),F(i,J.get(H(r)),!0),c())}});var ce=R(se,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:exp`));ml(ce,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`exp`,e),F(i,J.get(H(r)),!0))}})}D(oe),D(ae);var le=R(ae,2),ue=R(L(le),2),de=L(ue);fl(de,{get value(){return H(i).hp},min:0,get max(){return H(i).mhp},onchange:e=>u(`hp`,e)});var fe=R(de,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:hp`));ml(fe,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`hp`,e),F(i,J.get(H(r)),!0))}})}D(ue),D(le);var pe=R(le,2),me=R(L(pe),2),he=L(me);fl(he,{get value(){return H(i).mp},min:0,get max(){return H(i).mmp},onchange:e=>u(`mp`,e)});var ge=R(he,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:mp`));ml(ge,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`mp`,e),F(i,J.get(H(r)),!0))}})}D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve);fl(ye,{get value(){return H(i).tp},min:0,get max(){return H(i).mtp},onchange:e=>u(`tp`,e)});var be=R(ye,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:tp`));ml(be,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`tp`,e),F(i,J.get(H(r)),!0))}})}D(ve),D(_e),D(w);var xe=R(w,2);yo(R(L(xe),2),17,()=>H(i).params,e=>e.id,(e,t)=>{var n=jl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2),c=L(s);fl(c,{get value(){return H(t).value},min:1,onchange:e=>{d(H(t).id,e),Y.stats.has(`${H(r)}:param_${H(t).id}`)&&X.freezeStat(H(r),`param_${H(t).id}`,!0)}});var l=R(c,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:param_${H(t).id}`));ml(l,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`param_${H(t).id}`,e),F(i,J.get(H(r)),!0))}})}D(s),D(n),z(()=>{ps(n,`id`,`stat-param_${H(t).id}`),K(o,m[H(t).id]||`Stat`)}),G(e,n)}),D(xe),D(C);var Se=R(C,2),Ce=L(Se),we=R(L(Ce),2);us(we),D(Ce);var Te=R(Ce,2);yo(Te,21,()=>H(i).skills.filter(e=>!H(o).trim()||e.name.toLowerCase().includes(H(o).trim().toLowerCase())||e.id.toString().includes(H(o).trim())),e=>e.id,(e,t)=>{var n=Ml(),r=L(n),i=L(r);D(r);var a=R(r,2),o=L(a,!0);D(a),D(n),z(e=>{var n;K(i,`${e==null?``:e}: ${(n=H(t).name)==null?``:n}`),Jo(a,1,`rounded border px-3 py-1 text-xs font-semibold transition-colors ${H(t).learned?`border-danger/30 text-danger bg-danger/10 hover:bg-danger/20`:`border-accent/30 text-accent bg-accent/10 hover:bg-accent/20`}`),K(o,H(t).learned?`Forget`:`Learn`)},[()=>H(t).id.toString().padStart(3,`0`)]),U(`click`,a,()=>p(H(t).id,H(t).learned)),G(e,n)},e=>{G(e,Nl())}),D(Te),D(Se);var Ee=R(Se,2),De=L(Ee),Oe=R(L(De),2),ke=L(Oe);us(ke);var Ae=R(ke,2),je=e=>{var t=Pl();U(`click`,t,()=>{H(r)!==null&&(J.clearStates(H(r)),F(i,J.get(H(r)),!0))}),G(e,t)};mo(Ae,e=>{H(i).states.length>0&&e(je)}),D(Oe),D(De);var Me=R(De,2);yo(Me,21,()=>H(i).states,ho,(e,t)=>{var n=Fl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2);D(n),z(()=>K(o,H(t).name)),U(`click`,s,()=>{H(r)!==null&&(J.removeState(H(r),H(t).id),F(i,J.get(H(r)),!0))}),G(e,n)},e=>{G(e,Il())}),D(Me);var Ne=R(Me,2),Pe=L(Ne),Fe=L(Pe);Fe.value=(t=Fe.__value=null)!=null&&t!==void 0?t:``,yo(R(Fe),17,()=>J.listStates().filter(e=>!H(s).trim()||e.name.toLowerCase().includes(H(s).trim().toLowerCase())||e.id.toString().includes(H(s).trim())),ho,(e,t)=>{var n=Ll(),r=L(n);D(n);var i={};z(e=>{var a;if(K(r,`${e==null?``:e}: ${(a=H(t).name)==null?``:a}`),i!==(i=H(t).id)){var o;n.value=(o=n.__value=H(t).id)==null?``:o}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,n)}),D(Pe);var Ie=R(Pe,2);D(Ne),D(Ee),z(()=>{var e;K(_,H(i).name),K(y,`Actor ID: ${(e=H(i).id)==null?``:e}`),Jo(S,1,`rounded border px-3 py-1.5 text-xs font-semibold transition-colors ${H(i).inParty?`border-danger/30 bg-danger/20 text-danger hover:bg-danger/30`:`border-ok/30 bg-ok/20 text-ok hover:bg-ok/30`}`),K(ee,H(i).inParty?`Remove Party`:`Add Party`),Ie.disabled=H(a)===null}),U(`click`,x,()=>{H(r)!==null&&(J.recover(H(r)),F(i,J.get(H(r)),!0))}),U(`click`,S,f),Cs(we,()=>H(o),e=>F(o,e)),Cs(ke,()=>H(s),e=>F(s,e)),$o(Pe,()=>H(a),e=>F(a,e)),U(`click`,Ie,()=>{H(r)!==null&&H(a)!==null&&(J.addState(H(r),H(a)),F(i,J.get(H(r)),!0),F(a,null))}),G(e,n)},x=e=>{G(e,zl())};mo(y,e=>{H(i)?e(b):e(x,-1)}),D(v),D(h),G(e,h),Nt()}Wa([`click`]);function Hl(e){let t=e-1;return t*t*t+1}function Ul(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Hl}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=Wl(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function Wl(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var Gl=W(` `),Kl=W(``),ql=W(`

`),Jl=W(`
Configure the hold key in the Keys panel.
`),Yl=W(`
Warning: Game is permanently sped up. Turn this back on to require holding a key.
`),Xl=W(``),Zl=W(`
`),Ql=W(`

Active Enemies

`),$l=W(`LEAD`),eu=W(`
`),tu=W(`
No active party members found (start/load a game).
`),nu=W(`

Quick Actions

Party Resources

Gold
Steps
Playtime

Battle Settings

God Mode
One-Hit Kill
Disable Encounters

Movement

Noclip (Walk Through Walls)
Move Speed

Game Speed

Hold Key to Fast Forward
Speed Multiplier
`);function ru(e,t){Mt(t,!0);let n=P(0),r=P(0),i=P(0),a=P(4),o=P(!1),s=P(I([])),c=P(I([])),l=[{title:`System & Menus`,actions:[`quick_save`,`quick_load`,`open_save_scene`,`open_load_scene`,`goto_title`]},{title:`Battle Actions`,actions:[`force_victory`,`force_defeat`,`force_escape`,`trigger_encounter`]},{title:`Health Controls`,actions:[`party_recovery`,`party_wound`,`enemy_recovery`,`enemy_wound`]}],u=()=>{F(n,q.gold.get(),!0),F(r,q.party.steps(),!0),F(i,q.party.playtime(),!0),window.$gamePlayer&&F(a,window.$gamePlayer._moveSpeed||4,!0),F(o,!!(window.SceneManager&&window.SceneManager._scene&&window.SceneManager._scene.constructor.name===`Scene_Battle`)),H(o)&&window.$gameTroop?F(s,window.$gameTroop.members().map(e=>({ref:e,name:e.name(),hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(s,[],!0),window.$gameParty?F(c,window.$gameParty.members().map(e=>({ref:e,id:e.actorId(),name:e.name(),level:typeof e.level==`function`?e.level():e._level||1,hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(c,[],!0)};Ws(()=>{u();let e=setInterval(u,1e3);return()=>clearInterval(e)});let d=e=>{q.gold.set(e),Y.gold!==null&&X.freezeGold(!0),F(n,q.gold.get(),!0)},f=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`},p=(e,t)=>{e.ref.setHp(t),u()},m=(e,t)=>{e.ref.setMp(t),u()},h=(e,t)=>{e.ref.setTp?e.ref.setTp(t):e.ref.tp=t,u()},g=P(null),_=(e,t)=>{e!==t&&window.$gameParty&&typeof window.$gameParty.swapOrder==`function`&&(window.$gameParty.swapOrder(e,t),u())};var v=nu(),y=L(v),b=R(L(y),2);yo(b,21,()=>l,ho,(e,t)=>{var n=ql(),r=L(n),i=L(r,!0);D(r);var a=R(r,2);yo(a,21,()=>H(t).actions,ho,(e,t)=>{let n=Wn(()=>nl.find(e=>e.id===H(t)));var r=eo(),i=_i(r),a=e=>{var t=Kl(),r=L(t),i=L(r,!0);D(r);var a=R(r,2),o=e=>{var t=Gl(),r=L(t,!0);D(t),z(e=>K(r,e),[()=>{var e;return Yc.fromString(((e=$.get(H(n).id))==null?void 0:e.keyStr)||``).asDisplayString()}]),G(e,t)},s=Wn(()=>{var e;return(e=$.get(H(n).id))==null?void 0:e.keyStr});mo(a,e=>{H(s)&&e(o)}),D(t),z(()=>K(i,H(n).name)),U(`click`,t,()=>{var e,t;(e=(t=H(n)).onEnter)==null||e.call(t),u()}),G(e,t)};mo(i,e=>{H(n)&&e(a)}),G(e,r)}),D(a),D(n),z(()=>K(i,H(t).title)),G(e,n)}),D(b),D(y);var x=R(y,2),S=L(x),ee=R(L(S),2),C=R(L(ee),2),w=L(C);fl(w,{get value(){return H(n)},min:0,max:99999999,onchange:d});var te=R(w,2);{let e=Wn(()=>Y.gold!==null);ml(te,{get locked(){return H(e)},ontoggle:e=>{X.freezeGold(e),u()}})}D(C),D(ee);var ne=R(ee,2),re=R(L(ne),2),ie=L(re,!0);D(re),D(ne);var ae=R(ne,2),oe=R(L(ae),2),se=L(oe,!0);D(oe),D(ae),D(S);var ce=R(S,2),le=R(L(ce),2),ue=L(le);xl(R(L(ue),2),{get value(){return Z.god},onchange:e=>Wc.setGod(e)}),D(ue);var de=R(ue,2);xl(R(L(de),2),{get value(){return Z.ohko},onchange:e=>Wc.setOhko(e)}),D(de);var fe=R(de,2);xl(R(L(fe),2),{get value(){return Z.noEncounter},onchange:e=>Wc.setNoEncounter(e)}),D(fe),D(le),D(ce),D(x);var pe=R(x,2),me=R(L(pe),2),he=L(me);xl(R(L(he),2),{get value(){return Y.noclip},onchange:e=>X.setNoclip(e)}),D(he);var ge=R(he,2);fl(R(L(ge),2),{get value(){return H(a)},min:1,max:8,onchange:e=>q.map.speed(e)}),D(ge),D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve),be=L(ye);xl(R(L(be),2),{get value(){return Z.speedUseKey},onchange:e=>{Wc.setSpeedUseKey(e),e?Wc.setSpeed(1):Wc.setSpeed(Z.speedBoost)}}),D(be);var xe=R(be,2),Se=e=>{G(e,Jl())},Ce=e=>{G(e,Yl())};mo(xe,e=>{Z.speedUseKey?e(Se):e(Ce,-1)}),D(ye);var we=R(ye,2),Te=R(L(we),2);yo(Te,20,()=>[.5,1,2,3,5,8],ho,(e,t)=>{var n=Xl(),r=L(n);D(n),z(()=>{Jo(n,1,`border-border h-7 w-9 rounded border text-xs transition-colors ${Z.speedBoost===t?`border-accent bg-accent text-white font-semibold`:`bg-bg hover:bg-border/50 text-gray-300`}`),K(r,`${t==null?``:t}x`)}),U(`click`,n,()=>{Wc.setSpeedBoost(t),Z.speedUseKey||Wc.setSpeed(t)}),G(e,n)}),D(Te),D(we),D(ve),D(_e);var Ee=R(_e,2),De=e=>{var t=Ql(),n=R(L(t),2);yo(n,21,()=>H(s),ho,(e,t)=>{var n=Zl(),r=L(n),i=L(r),a=L(i,!0);D(i),D(r);var o=R(r,2),s=L(o),c=L(s),l=L(c);D(c),fl(R(c,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(s);var u=R(s,2),d=L(u),f=L(d);D(d),fl(R(d,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(u);var g=R(u,2),_=L(g),v=L(_);D(_),fl(R(_,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(g),D(o),D(n),z(()=>{var e,n,r,i,o;K(a,H(t).name),K(l,`HP (${(e=H(t).hp)==null?``:e}/${(n=H(t).mhp)==null?``:n})`),K(f,`MP (${(r=H(t).mp)==null?``:r}/${(i=H(t).mmp)==null?``:i})`),K(v,`TP (${(o=H(t).tp)==null?``:o})`)}),G(e,n)}),D(n),D(t),G(e,t)};mo(Ee,e=>{H(o)&&H(s).length>0&&e(De)});var Oe=R(Ee,2),ke=R(L(Oe),2);yo(ke,31,()=>H(c),e=>e.id,(e,t,n)=>{var r=eu(),i=L(r),a=L(i),o=L(a),s=R(L(o),2),c=L(s),l=R(c),u=e=>{G(e,$l())};mo(l,e=>{H(n)===0&&e(u)}),D(s),D(o);var d=R(o,2),f=L(d);D(d),D(a);var v=R(a,2),y=L(v),b=L(y),x=L(b);D(b),fl(R(b,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(y);var S=R(y,2),ee=L(S),C=L(ee);D(ee),fl(R(ee,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(S);var w=R(S,2),te=L(w),ne=L(te);D(te),fl(R(te,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(w),D(v),D(i),D(r),z(()=>{var e,o,s,l,u,d,p;Jo(r,1,`rounded p-2.5 transition-all duration-200 ${H(g)===H(n)?`border border-dashed border-accent/50 bg-accent/5`:`border border-border bg-bg`}`),Jo(i,1,`space-y-2 ${H(g)===H(n)?`invisible`:``}`),Jo(a,1,`flex w-full items-center justify-between pb-2 text-xs font-bold text-white ${H(g)===null?`cursor-grab active:cursor-grabbing`:``}`),K(c,`${(e=H(t).name)==null?``:e} `),K(f,`Lv.${(o=H(t).level)==null?``:o}`),K(x,`HP (${(s=H(t).hp)==null?``:s}/${(l=H(t).mhp)==null?``:l})`),K(C,`MP (${(u=H(t).mp)==null?``:u}/${(d=H(t).mmp)==null?``:d})`),K(ne,`TP (${(p=H(t).tp)==null?``:p})`)}),Ua(`dragenter`,r,e=>e.preventDefault()),Ua(`dragover`,r,e=>{if(e.preventDefault(),H(g)!==null&&H(g)!==H(n)){let t=e.currentTarget.getBoundingClientRect(),r=t.top+t.height/2;if(H(g)H(n)&&e.clientY>r)return;_(H(g),H(n)),F(g,H(n),!0)}}),Ua(`dragstart`,a,e=>{if(e.dataTransfer){e.dataTransfer.effectAllowed=`move`;let t=e.currentTarget.closest(`[role="listitem"]`);t&&e.dataTransfer.setDragImage(t,20,20)}setTimeout(()=>{F(g,H(n),!0)},0)}),Ua(`dragend`,a,()=>{F(g,null)}),Io(r,()=>Ul,()=>({duration:250})),G(e,r)},e=>{G(e,tu())}),D(ke),D(Oe),D(v),z(e=>{K(ie,H(r)),K(se,e)},[()=>f(H(i))]),Ua(`dragenter`,Oe,e=>e.preventDefault()),Ua(`dragover`,Oe,e=>e.preventDefault()),Ua(`dragenter`,ke,e=>e.preventDefault()),Ua(`dragover`,ke,e=>e.preventDefault()),G(e,v),Nt()}Wa([`click`]);var iu=W(``),au=W(`
No saved locations yet.
`),ou=W(`
`),su=W(`

Teleport

Saved Locations

`);function cu(e,t){Mt(t,!0);let n=P(I({mapId:0,x:0,y:0,dir:0})),r=P(I([])),i=P(0),a=P(0),o=P(0),s=P(I([])),c=P(``),l=P(``),u=P(``);Mi(()=>{H(o)>0&&q.map.loadMapEvents(H(o)).then(e=>{F(s,e,!0),e.find(e=>e.id.toString()===H(c))||F(c,``)})});let d=P(I([])),f=P(``),p=()=>{let e=q.map.current();e&&(F(n,e,!0),F(o,H(o)||e.mapId,!0),F(i,e.x,!0),F(a,e.y,!0)),F(r,q.map.list(),!0);try{let e=localStorage.getItem(`forge:locations`);e&&F(d,JSON.parse(e),!0)}catch(e){}};Ws(()=>{p();let e=setInterval(()=>{let e=q.map.current();e&&(e.mapId!==H(n).mapId||e.x!==H(n).x||e.y!==H(n).y)&&F(n,e,!0)},1e3);return()=>clearInterval(e)});let m=()=>{q.map.teleport(H(o),H(i),H(a),0,0)},h=()=>{let e=q.map.current();if(!e)return;let t=H(r).find(t=>t.id===e.mapId);F(d,[...H(d),{id:Date.now().toString(),name:H(f)||`Saved Location`,mapId:e.mapId,mapName:t?t.name:`Map ${e.mapId}`,x:e.x,y:e.y}],!0),F(f,``),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},g=e=>{F(d,H(d).filter(t=>t.id!==e),!0),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},_=e=>{q.map.teleport(e.mapId,e.x,e.y,0,0)};var v=su(),y=L(v),b=R(L(y),2),x=L(b);D(b);var S=R(b,2),ee=L(S),C=L(ee),w=R(L(C),2);us(w),D(C);var te=R(C,2);yo(te,21,()=>H(r).filter(e=>!H(l).trim()||e.name.toLowerCase().includes(H(l).trim().toLowerCase())||e.id.toString().includes(H(l).trim())),ho,(e,t)=>{var r=iu(),i=L(r);D(r);var a={};z(e=>{var o;if(K(i,`${H(t).id===H(n).mapId?`[CURRENT] `:``}${e==null?``:e}: ${(o=H(t).name)==null?``:o}`),a!==(a=H(t).id)){var s;r.value=(s=r.__value=H(t).id)==null?``:s}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,r)}),D(te),D(ee);var ne=R(ee,2),re=L(ne),ie=R(L(re),2);us(ie),D(re);var ae=R(re,2),oe=L(ae);oe.value=oe.__value=``,yo(R(oe),17,()=>H(s).filter(e=>!H(u).trim()||e.name.toLowerCase().includes(H(u).trim().toLowerCase())||e.id.toString().includes(H(u).trim())),ho,(e,t)=>{var n=iu(),r=L(n);D(n);var i={};z(()=>{var e,a,o;if(K(r,`${(e=H(t).name)==null?``:e} (X:${(a=H(t).x)==null?``:a}, Y:${(o=H(t).y)==null?``:o})`),i!==(i=H(t).id)){var s;n.value=(s=n.__value=H(t).id)==null?``:s}}),G(e,n)}),D(ae),D(ne);var se=R(ne,2),ce=L(se),le=R(L(ce),2);us(le),D(ce);var ue=R(ce,2),de=R(L(ue),2);us(de),D(ue),D(se);var fe=R(se,2);D(S),D(y);var pe=R(y,2),me=R(L(pe),2),he=L(me);us(he);var ge=R(he,2);D(me);var _e=R(me,2),ve=L(_e),ye=e=>{G(e,au())},be=e=>{var t=eo();yo(_i(t),17,()=>H(d),e=>e.id,(e,t)=>{var n=ou(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o);D(o),D(r);var c=R(r,2),l=L(c),u=R(l,2);Ec(L(u),{size:14}),D(u),D(c),D(n),z(()=>{var e,n,r,i;K(a,H(t).name),K(s,`${(e=H(t).mapName)==null?``:e} (Map ${(n=H(t).mapId)==null?``:n}) • X:${(r=H(t).x)==null?``:r} Y:${(i=H(t).y)==null?``:i}`)}),U(`click`,l,()=>_(H(t))),U(`click`,u,()=>g(H(t).id)),G(e,n)}),G(e,t)};mo(ve,e=>{H(d).length===0?e(ye):e(be,-1)}),D(_e),D(pe),D(v),z(()=>{var e,t,r;return K(x,`Current: Map ${(e=H(n).mapId)==null?``:e} (${(t=H(n).x)==null?``:t}, ${(r=H(n).y)==null?``:r})`)}),Cs(w,()=>H(l),e=>F(l,e)),$o(te,()=>H(o),e=>F(o,e)),Cs(ie,()=>H(u),e=>F(u,e)),U(`change`,ae,e=>{let t=parseInt(e.target.value);if(isNaN(t))return;let n=H(s).find(e=>e.id===t);n&&(F(i,n.x,!0),F(a,n.y,!0))}),$o(ae,()=>H(c),e=>F(c,e)),Cs(le,()=>H(i),e=>F(i,e)),Cs(de,()=>H(a),e=>F(a,e)),U(`click`,fe,m),U(`keydown`,he,e=>{e.stopPropagation(),e.key===`Enter`&&h()}),Cs(he,()=>H(f),e=>F(f,e)),U(`click`,ge,h),G(e,v),Nt()}Wa([`change`,`click`,`keydown`]);var lu=W(` `,1),uu=W(``),du=W(`
`),fu=W(`
`);function pu(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(null),o,s=()=>{let e=H(n);if(H(i).trim()){let t=H(i).trim().toLowerCase();e=H(n).filter(e=>String(e.id)===t||e.name.toLowerCase().includes(t))}F(r,e.sort((e,t)=>{let n=Zc.isFavorite(`commonEvents`,e.id),r=Zc.isFavorite(`commonEvents`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},c=()=>{F(n,q.commonev.list(),!0),s()},l=e=>{F(i,e.target.value,!0),s()};Ws(()=>{c()});let u=e=>{H(a)===e?(q.commonev.run(e),F(a,null),clearTimeout(o)):(F(a,e,!0),clearTimeout(o),o=setTimeout(()=>{H(a)===e&&F(a,null)},3e3))},d=()=>{F(a,null),clearTimeout(o)};var f=fu(),p=L(f),h=L(p);us(h);var g=R(h,2),_=L(g);D(g),D(p);var v=R(p,2);ul(L(v),{get items(){return H(r)},itemHeight:38,itemTemplate:(e,t=m)=>{var n=du(),r=L(n),i=L(r),o=L(i,!0);D(i);var c=R(i,2),l=L(c,!0);D(c),D(r);var f=R(r,2),p=L(f),h=L(p);{let e=Wn(()=>Zc.isFavorite(`commonEvents`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(p);var g=R(p,2),_=L(g),v=e=>{var n=lu(),r=_i(n),i=R(r,2);U(`click`,r,()=>u(t().id)),U(`click`,i,d),G(e,n)},y=e=>{var n=uu();U(`click`,n,()=>u(t().id)),G(e,n)};mo(_,e=>{H(a)===t().id?e(v):e(y,-1)}),D(g),D(f),D(n),z((e,n)=>{K(o,e),ps(c,`title`,t().name),K(l,t().name),Jo(p,1,`mr-2 flex items-center justify-center transition-colors ${n==null?``:n}`)},[()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`commonEvents`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`click`,p,()=>{Zc.toggleFavorite(`commonEvents`,t().id),s()}),G(e,n)},$$slots:{itemTemplate:!0}}),D(v),D(f),z(()=>{var e;ds(h,H(i)),K(_,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,h,l),G(e,f),Nt()}Wa([`input`,`click`]);var mu=W(``),hu=W(`
`),gu=W(`
No active data locks. Use the lock icon on variables, switches, items, or stats to freeze their value.
`),_u=W(`
`);function vu(e,t){Mt(t,!0);let n=P(I([])),r=()=>{F(n,X.summary(),!0)};Ws(()=>{r();let e=setInterval(r,1e3);return()=>clearInterval(e)});let i=e=>{if(e.type===`var`)X.freezeVar(e.id,!1);else if(e.type===`switch`)X.freezeSwitch(e.id,!1);else if(e.type===`item`){let[t,n]=e.key.split(`:`);X.freezeItem(t,parseInt(n,10),!1)}else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);X.freezeStat(parseInt(t,10),n,!1)}else e.type===`gold`&&X.freezeGold(!1);r()},a=e=>{if(e.type===`var`)Q.targetVarId=e.id,Q.activeTab=Ic.Vars;else if(e.type===`switch`)Q.targetSwitchId=e.id,Q.activeTab=Ic.Switches;else if(e.type===`item`)Q.targetItemKey=e.key,Q.activeTab=Ic.Inv;else if(e.type===`gold`)Q.activeTab=Ic.General;else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);Q.targetActorId=parseInt(t,10),Q.targetActorStat=n,Q.activeTab=Ic.Actors}},o=()=>{X.clearAll(),r()},s=e=>e===`var`?`VAR`:e===`switch`?`SW`:e===`item`?`ITEM`:e===`stat`?`STAT`:e===`param`?`PARAM`:e===`gold`?`GOLD`:`LOCK`,c=e=>e===`var`?`border-accent/30 bg-accent/10 text-accent`:e===`switch`?`border-ok/30 bg-ok/10 text-ok`:e===`item`?`border-warn/30 bg-warn/10 text-warn`:e===`stat`?`border-danger/30 bg-danger/10 text-danger`:e===`param`?`border-fuchsia-500/30 bg-fuchsia-500/10 text-fuchsia-500`:e===`gold`?`border-yellow-500/30 bg-yellow-500/10 text-yellow-500`:`border-gray-500/30 bg-gray-500/10 text-gray-400`;var l=_u(),u=L(l),d=L(u),f=L(d);D(d);var p=R(d,2),m=e=>{var t=mu();U(`click`,t,o),G(e,t)};mo(p,e=>{H(n).length>0&&e(m)}),D(u);var h=R(u,2);yo(h,21,()=>H(n),ho,(e,t)=>{var n=hu(),r=L(n),o=L(r),l=L(o,!0);D(o);var u=R(o,2),d=L(u,!0);D(u),D(r);var f=R(r,2),p=L(f),m=L(p,!0);D(p);var h=R(p,2);D(f),D(n),z((e,n)=>{Jo(o,1,`rounded border px-1.5 py-0.5 text-[10px] font-bold font-mono tracking-wide ${e==null?``:e}`),K(l,n),ps(u,`title`,H(t).label),K(d,H(t).label),K(m,typeof H(t).value==`boolean`?H(t).value?`ON`:`OFF`:H(t).value)},[()=>c(H(t).type),()=>s(H(t).type)]),U(`keydown`,n,e=>e.key===`Enter`&&a(H(t))),U(`click`,n,()=>a(H(t))),U(`click`,h,e=>{e.stopPropagation(),i(H(t))}),G(e,n)},e=>{G(e,gu())}),D(h),D(l),z(()=>{var e;return K(f,`${(e=H(n).length)==null?``:e} active locks`)}),G(e,l),Nt()}Wa([`click`,`keydown`]);var yu=W(`
Press a key...
`),bu=W(``),xu=W(``),Su=W(`
`);function Cu(e,t){Mt(t,!0);let n=Hs(t,`value`,15,``),r=Hs(t,`required`,3,!1),i=Hs(t,`combiningKeyAlone`,3,!1),a=P(!1),o=()=>{F(a,!0);let e=e=>{var a;e.preventDefault(),e.stopPropagation();let o=Yc.fromEvent(e);o.isCombiningKey()&&!i()||(n(o.asString()),(a=t.onchange)==null||a.call(t,n()),r())},r=()=>{F(a,!1),window.removeEventListener(`keydown`,e,{capture:!0})};window.addEventListener(`keydown`,e,{capture:!0}),setTimeout(()=>{window.addEventListener(`click`,r,{capture:!0,once:!0})},100)},s=e=>{if(!e)return`None`;try{return Yc.fromString(e).asDisplayString()}catch(t){return e}};var c=Su(),l=L(c),u=e=>{G(e,yu())},d=e=>{var t=bu(),r=L(t,!0);D(t),z(e=>{Jo(t,1,`border-border bg-bg2 hover:bg-border/50 flex h-8 flex-1 items-center rounded border px-3 text-sm font-medium transition-colors ${n()?`text-white`:`text-gray-500`}`),K(r,e)},[()=>s(n())]),U(`click`,t,o),G(e,t)};mo(l,e=>{H(a)?e(u):e(d,-1)});var f=R(l,2),p=e=>{var r=xu();Mc(L(r),{size:14}),D(r),U(`click`,r,()=>{var e;n(``),(e=t.onchange)==null||e.call(t,n())}),G(e,r)};mo(f,e=>{!r()&&n()&&!H(a)&&e(p)}),D(c),G(e,c),Nt()}Wa([`click`]);var wu=W(`
`),Tu=W(`
`);function Eu(e,t){Mt(t,!0);let n=P(I([])),r=P(``),i=P(I([])),a=()=>{if(!H(r).trim())F(i,H(n),!0);else{let e=H(r).trim().toLowerCase();F(i,H(n).filter(t=>t.name.toLowerCase().includes(e)||t.desc.toLowerCase().includes(e)||t.keyStr.toLowerCase().includes(e)),!0)}},o=()=>{F(n,$.shortcuts.map(e=>({...e})),!0),a()};Ws(()=>{o()});let s=e=>{F(r,e.target.value,!0),a()},c=(e,t)=>{$.update(e,{keyStr:t}),o()},l=(e,t)=>{$.update(e,{enabled:t}),o()},u=()=>{localStorage.removeItem(`forge:shortcuts`),zc.show(`Defaults restored. Please reload the game.`,`success`)};var d=Tu(),f=L(d),p=L(f);us(p);var m=R(p,2);D(f);var h=R(f,2);yo(h,21,()=>H(i),e=>e.id,(e,t)=>{var n=wu(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o,!0);D(o),D(r);var u=R(r,2),d=L(u);{let e=Wn(()=>H(t).id===`speed_hold`||H(t).id===`skip_message`);Cu(d,{get value(){return H(t).keyStr},get required(){return H(t).required},get combiningKeyAlone(){return H(e)},onchange:e=>c(H(t).id,e)})}D(u);var f=R(u,2);xl(L(f),{get value(){return H(t).enabled},onchange:e=>l(H(t).id,e)}),D(f),D(n),z(()=>{Jo(i,1,`font-semibold text-sm ${H(t).enabled?`text-white`:`text-gray-500`}`),K(a,H(t).name),K(s,H(t).desc)}),G(e,n)}),D(h),D(d),z(()=>ds(p,H(r))),U(`input`,p,s),U(`click`,m,u),G(e,d),Nt()}Wa([`input`,`click`]),yt();var Du=Ls(()=>Xc),Ou=W(`

UI Preferences

Inactive Opacity
Controls how transparent the panel becomes when the mouse leaves.
Remember Window Position
Save the exact window dimensions and position between game boots.
Auto-Open on Boot
Automatically display the Forge panel when the game finishes loading.
Show Launcher Icon
Display a draggable icon to open the panel without a shortcut.

Gameplay

Quick Save / Load Slot
The save file slot used by the Quick Save and Quick Load shortcuts.

Data Management

Factory Reset
Wipes all Forge settings, locks, and saved layout data.
`);function ku(e,t){Mt(t,!1);let n=()=>Zc.save();Fs();var r=Ou(),i=L(r),a=R(L(i),2),o=R(L(a),2);fl(L(o),{get value(){return Du().inactiveOpacity},min:10,max:100,onchange:e=>{Du(Du().inactiveOpacity=e),n()}}),D(o),D(a);var s=R(a,2);xl(R(L(s),2),{onchange:()=>n(),get value(){return Du().rememberPosition},set value(e){Du(Du().rememberPosition=e)},$$legacy:!0}),D(s);var c=R(s,2);xl(R(L(c),2),{onchange:()=>n(),get value(){return Du().autoOpen},set value(e){Du(Du().autoOpen=e)},$$legacy:!0}),D(c);var l=R(c,2);xl(R(L(l),2),{onchange:()=>n(),get value(){return Du().showLauncher},set value(e){Du(Du().showLauncher=e)},$$legacy:!0}),D(l),D(i);var u=R(i,2),d=R(L(u),2),f=R(L(d),2);fl(L(f),{get value(){return Du().quickSaveSlot},min:1,max:20,onchange:e=>{Du(Du().quickSaveSlot=e),n()}}),D(f),D(d),D(u);var p=R(u,2),m=R(L(p),2),h=R(L(m),2);D(m),D(p),D(r),U(`click`,h,()=>Zc.resetAll()),G(e,r),Nt()}Wa([`click`]);var Au=W(`
No logs recorded yet.
`),ju=W(` `),Mu=W(`Narrator / Unknown`),Nu=W(`
`),Pu=W(`

Game Dialogue Logs

`);function Fu(e,t){Mt(t,!0);let n=P(void 0),r=e=>{let t=new Date(e);return`${t.getHours().toString().padStart(2,`0`)}:${t.getMinutes().toString().padStart(2,`0`)}:${t.getSeconds().toString().padStart(2,`0`)}`};Mi(()=>{Qc.entries.length&&setTimeout(()=>{var e,t;H(n)&&((e=(t=H(n)).scrollToBottom)==null||e.call(t))},10)});var i=Pu(),a=L(i),o=L(a),s=R(L(o),2);wc(L(s),{size:14}),ut(2),D(s),D(o);var c=R(o,2),l=L(c),u=e=>{var t=Au();mc(L(t),{size:32,class:`opacity-50`}),ut(2),D(t),G(e,t)},d=e=>{Ps(ul(e,{get items(){return Qc.entries},itemHeight:80,containerHeight:400,itemTemplate:(e,t=m)=>{var n=Nu(),i=L(n),a=L(i),o=e=>{var n=ju(),r=L(n,!0);D(n),z(()=>K(r,t().speaker)),G(e,n)},s=e=>{G(e,Mu())};mo(a,e=>{t().speaker?e(o):e(s,-1)});var c=R(a,2),l=L(c,!0);D(c),D(i);var u=R(i,2),d=L(u,!0);D(u),D(n),z(e=>{K(l,e),K(d,t().text)},[()=>r(t().timestamp)]),G(e,n)},$$slots:{itemTemplate:!0}}),e=>F(n,e,!0),()=>H(n))};mo(l,e=>{Qc.entries.length===0?e(u):e(d,-1)}),D(c),D(a),D(i),U(`click`,s,()=>tl.clear()),G(e,i),Nt()}Wa([`click`]);var Iu=W(``),Lu=W(``),Ru=W(`
`),zu=W(`
`,1);function Bu(e,t){Mt(t,!0),Mi(()=>{let e=document.getElementById(`forge-mvmz-host`);if(!e)return;let t=!1,n=()=>{t=!1},r=[`mousedown`,`mousemove`,`mouseup`,`click`,`dblclick`,`pointerdown`,`pointermove`,`pointerup`,`contextmenu`,`wheel`,`touchstart`,`touchmove`,`touchend`,`keydown`,`keyup`],i=e=>{(e.type===`mousedown`||e.type===`pointerdown`||e.type===`touchstart`)&&(t=!0);let n=e.type===`mousemove`||e.type===`pointermove`||e.type===`touchmove`,r=e.type===`mouseup`||e.type===`pointerup`||e.type===`touchend`;if(n){let n=!1;if(`buttons`in e?n=e.buttons>0:`touches`in e&&(n=e.touches.length>0),n&&!t)return}r&&!t||e.stopPropagation()};if(window.addEventListener(`mouseup`,n,{capture:!0}),window.addEventListener(`pointerup`,n,{capture:!0}),window.addEventListener(`touchend`,n,{capture:!0}),Q.visible)for(let t of r)e.addEventListener(t,i,!1);else for(let t of r)e.removeEventListener(t,i,!1);return()=>{window.removeEventListener(`mouseup`,n,{capture:!0}),window.removeEventListener(`pointerup`,n,{capture:!0}),window.removeEventListener(`touchend`,n,{capture:!0});for(let t of r)e.removeEventListener(t,i,!1)}});let n=[{id:Ic.General,label:`General`},{id:Ic.Vars,label:`Variables`},{id:Ic.Switches,label:`Switches`},{id:Ic.Inv,label:`Inventory`},{id:Ic.Actors,label:`Actors`},{id:Ic.Map,label:`Map`},{id:Ic.CommonEv,label:`Events`},{id:Ic.Locks,label:`Locks`},{id:Ic.Logs,label:`Logs`},{id:Ic.Shortcuts,label:`Keys`},{id:Ic.Settings,label:`Settings`}],r=P(0),i=P(0),a=P(840),o=P(520),s=P(!1);Ws(()=>{Zc.load(),X.install(),Wc.install(),tl.install(),$.init(nl);try{let e=JSON.parse(localStorage.getItem(`forge:panel`)||`null`);e&&Xc.rememberPosition?(F(r,e.x,!0),F(i,e.y,!0),F(a,e.w,!0),F(o,e.h,!0)):typeof window<`u`&&(F(r,0),F(i,0),F(a,Math.min(840,window.innerWidth||840),!0),F(o,Math.min(520,window.innerHeight||520),!0));let t=localStorage.getItem(`forge:lastTab`);t&&Object.values(Ic).includes(t)&&(Q.activeTab=t)}catch(e){}Xc.autoOpen&&!Q.visible&&(Q.visible=!0)});let c=()=>{Xc.rememberPosition&&localStorage.setItem(`forge:panel`,JSON.stringify({x:H(r),y:H(i),w:H(a),h:H(o)})),localStorage.setItem(`forge:lastTab`,Q.activeTab)},l=P(!1),u=P(0),d=P(0),f=P(0),p=P(0),m=e=>{H(l)&&(F(r,Math.max(0,Math.min(window.innerWidth-H(a),H(f)+e.clientX-H(u))),!0),F(i,Math.max(0,Math.min(window.innerHeight-H(o),H(p)+e.clientY-H(d))),!0))},h=()=>{F(l,!1),window.removeEventListener(`mousemove`,m,!0),window.removeEventListener(`mouseup`,h,!0),c()},g=e=>{e.target.closest(`button, input, select`)||(F(l,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(f,H(r),!0),F(p,H(i),!0),window.addEventListener(`mousemove`,m,!0),window.addEventListener(`mouseup`,h,!0))},_=P(!1),v=P(0),y=P(0),b=e=>{H(_)&&(F(a,Math.max(560,Math.min(window.innerWidth-H(r),H(v)+e.clientX-H(u))),!0),F(o,Math.max(360,Math.min(window.innerHeight-H(i),H(y)+e.clientY-H(d))),!0))},x=()=>{F(_,!1),window.removeEventListener(`mousemove`,b,!0),window.removeEventListener(`mouseup`,x,!0),c()},S=e=>{F(_,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(v,H(a),!0),F(y,H(o),!0),window.addEventListener(`mousemove`,b,!0),window.addEventListener(`mouseup`,x,!0),e.stopPropagation()};var ee=zu(),C=_i(ee),w=e=>{var t=Lu(),u=L(t),d=L(u),f=R(d,2);yo(f,21,()=>n,ho,(e,t)=>{var n=Iu(),r=L(n),i=e=>{Ac(e,{size:14})},a=e=>{ic(e,{size:14})},o=e=>{Sc(e,{size:14})},s=e=>{gc(e,{size:14})},l=e=>{Oc(e,{size:14})},u=e=>{fc(e,{size:14})},d=e=>{Pc(e,{size:14})},f=e=>{uc(e,{size:14})},p=e=>{mc(e,{size:14})},m=e=>{oc(e,{size:14})},h=e=>{vc(e,{size:14})};mo(r,e=>{H(t).id===`general`?e(i):H(t).id===`vars`?e(a,1):H(t).id===`switches`?e(o,2):H(t).id===`inv`?e(s,3):H(t).id===`actors`?e(l,4):H(t).id===`map`?e(u,5):H(t).id===`commonev`?e(d,6):H(t).id===`locks`?e(f,7):H(t).id===`logs`?e(p,8):H(t).id===`shortcuts`?e(m,9):H(t).id===`settings`&&e(h,10)});var g=R(r,2),_=L(g,!0);D(g),D(n),z(()=>{Jo(n,1,`w-full text-left rounded px-3 py-2 text-xs font-semibold transition-all flex items-center space-x-2.5 focus:outline-none ${Q.activeTab===H(t).id?`bg-[#7ba4ff]/10 text-[#7ba4ff] shadow-sm`:`text-gray-400 hover:bg-[#2a2d3a] hover:text-gray-200`}`),K(_,H(t).label)}),U(`click`,n,()=>{var e;Q.activeTab=H(t).id,(e=window.getSelection())==null||e.removeAllRanges(),c()}),G(e,n)}),D(f);var p=R(f,2),m=L(p);ps(m,`title`,`1.0.0`),m.textContent=`1.0.0`,D(p),D(u);var h=R(u,2),v=L(h),y=L(v),b=L(y,!0);D(y);var x=R(y,2);Mc(L(x),{size:14}),D(x),D(v);var ee=R(v,2),C=L(ee),w=e=>{yl(e,{})},te=e=>{wl(e,{})},ne=e=>{Ol(e,{})},re=e=>{Vl(e,{})},ie=e=>{ru(e,{})},ae=e=>{cu(e,{})},oe=e=>{pu(e,{})},se=e=>{vu(e,{})},ce=e=>{Fu(e,{})},le=e=>{Eu(e,{})},ue=e=>{ku(e,{})};mo(C,e=>{Q.activeTab===Ic.Vars?e(w):Q.activeTab===Ic.Switches?e(te,1):Q.activeTab===Ic.Inv?e(ne,2):Q.activeTab===Ic.Actors?e(re,3):Q.activeTab===Ic.General?e(ie,4):Q.activeTab===Ic.Map?e(ae,5):Q.activeTab===Ic.CommonEv?e(oe,6):Q.activeTab===Ic.Locks?e(se,7):Q.activeTab===Ic.Logs?e(ce,8):Q.activeTab===Ic.Shortcuts?e(le,9):Q.activeTab===Ic.Settings&&e(ue,10)}),D(ee),D(h),il(R(h,2),{onmousedown:S}),D(t),z(e=>{var n,c,u,d;Xo(t,`opacity: ${H(l)||H(_)||H(s)?1:Xc.inactiveOpacity/100}; left: ${(n=H(r))==null?``:n}px; top: ${(c=H(i))==null?``:c}px; width: ${(u=H(a))==null?``:u}px; height: ${(d=H(o))==null?``:d}px; background: #13151a; color: #d4d8e3;`),K(b,e)},[()=>{var e;return((e=n.find(e=>e.id===Q.activeTab))==null?void 0:e.label)||``}]),Ua(`mouseenter`,t,()=>F(s,!0)),Ua(`mouseleave`,t,()=>F(s,!1)),U(`mousedown`,d,g),U(`mousedown`,v,g),U(`click`,x,()=>Q.visible=!1),G(e,t)};mo(C,e=>{Q.visible&&e(w)});var te=R(C,2);yo(te,21,()=>zc.toasts,e=>e.id,(e,t)=>{var n=Ru(),r=L(n),i=R(r,2),a=L(i,!0);D(i),D(n),z(()=>{Xo(n,`background: #1a1d24; border-color: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`}; opacity: 0.95; min-width: 160px; max-width: 320px;`),Xo(r,`background: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`};`),K(a,H(t).message)}),G(e,n)}),D(te),ol(R(te,2),{}),G(e,ee),Nt()}Wa([`mousedown`,`click`]);var Vu=`forge-mvmz-host`,Hu=document.getElementById(Vu);Hu||(Hu=document.createElement(`div`),Hu.id=Vu,Hu.style.position=`fixed`,Hu.style.top=`0`,Hu.style.left=`0`,Hu.style.width=`100vw`,Hu.style.height=`100vh`,Hu.style.pointerEvents=`none`,Hu.style.zIndex=`2147483647`,document.body.appendChild(Hu));var Uu=document.createElement(`style`);Uu.textContent=`#${Vu} { z-index: 2147483647 !important; }`,document.head.appendChild(Uu);var Wu=null,Gu;typeof Hu.attachShadow==`function`?(Wu=Hu.attachShadow({mode:`open`}),Gu=Wu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,Wu.appendChild(e)}}},0)):(Gu=Hu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,document.head.appendChild(e)}}},0));var Ku=document.createElement(`div`);Ku.style.pointerEvents=`none`,Ku.style.width=`100%`,Ku.style.height=`100%`,Gu.appendChild(Ku);try{to(Bu,{target:Ku})}catch(e){console.error(`[FORGE] Error mounting Svelte App:`,e)}if(window.Input!==void 0&&window.Input._onKeyDown){let e=window.Input._onKeyDown;window.Input._onKeyDown=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}if(window.Input!==void 0&&window.Input._onKeyUp){let e=window.Input._onKeyUp;window.Input._onKeyUp=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}})(); \ No newline at end of file diff --git a/util/forge/Forge_MZ.js b/util/forge/Forge_MZ.js index 98111b9..7023672 100644 --- a/util/forge/Forge_MZ.js +++ b/util/forge/Forge_MZ.js @@ -1,1115 +1,28 @@ //============================================================================= -// Forge_MZ.js — In-game cheat & editor overlay for RPG Maker MZ +// forge.js - In-game cheat & editor overlay for RPG Maker MV/MZ //============================================================================= /*: - * @target MZ - * @plugindesc Forge — modern in-game editor: variables, switches, items, actors, gold, teleport, common events, freeze/lock & battle cheats. (MZ) - * @author len (Forge - clean-room, MTool-inspired) - * @url - * - * @param hotkey - * @text Toggle Hotkey - * @desc Key to toggle the panel. - * @type string - * @default F10 - * - * @param speedKey - * @text Speedhack Key - * @desc Key to toggle fast-forward (e.g. Control, Shift, Alt, or a letter). - * @type string - * @default Control - * - * @param startOpen - * @text Open on start - * @desc Open the panel automatically on new game / load. - * @type boolean - * @default false - * - * @param itemMaxOverride - * @text Item "Max" value - * @desc Value used by the "Max" button for item stacks (0 = use engine maxItems). - * @type number - * @min 0 - * @default 0 - * - * @command open - * @text Open / Toggle Panel - * @desc Toggle the Forge overlay. - * - * @help - * Forge — drop-in cheat & editor for RPG Maker MZ. - * Place in js/plugins/ and enable in the Plugin Manager. Press F10 to open. - * - * Sections: Variables · Switches · Items/Weapons/Armors · Actors · Party/Gold · - * Map/Teleport · Common Events · Data Lock (freeze) · Battle cheats. - * - * All edits are RAM-only and never written to save files. No external requests. - * Plugin command "Open / Toggle Panel" toggles the overlay from events. + * @target MZ MV + * @plugindesc Forge - modern in-game editor + * @author len, shellawa + * @url https://gitgud.io/zero64801/forge-mvmz/ */ - -/* =================================================================================== - * Forge — in-game cheat & editor overlay for RPG Maker MV / MZ (shared core) - * Clean-room reimplementation of MTool's variable/value editor. Vanilla JS, zero deps. - * This file is the engine-agnostic core; the MV/MZ ship files prepend the plugin header. - * Layers: ops (DOM-free, testable) · locks (prototype monkeypatches) · cheats · ui (Shadow DOM) - * =================================================================================== */ -(function (root) { - 'use strict'; - if (root && root.__FORGE_CORE__) return; - - // ---------- environment ---------- - var IS_MZ = (typeof Utils !== 'undefined' && Utils.RPGMAKER_NAME === 'MZ'); - var nodeFs = null, nodePath = null; - try { if (typeof require === 'function') { nodeFs = require('fs'); nodePath = require('path'); } } catch (e) {} - function gameCwd() { try { return process.cwd(); } catch (e) { return '.'; } } - - var PARAM_NAMES = ['Max HP', 'Max MP', 'Attack', 'Defense', 'M.Attack', 'M.Defense', 'Agility', 'Luck']; - - // ---------- small utils ---------- - function clampInt(v, lo, hi) { v = Math.floor(Number(v) || 0); if (v < lo) v = lo; if (hi != null && v > hi) v = hi; return v; } - function defined(x) { return typeof x !== 'undefined' && x !== null; } - function dataName(d) { return d && d.name ? d.name : ''; } - // actor.level may be a getter (number), a method, or only the _level field across engines/plugins. - function actorLevel(a) { if (!a) return 0; if (typeof a.level === 'number') return a.level; if (typeof a.level === 'function') return a.level(); return a._level || 1; } - - // =================================================================================== - // OPS — pure logic, only touches $game*/$data* globals. Unit-testable. - // =================================================================================== - var ops = {}; - - ops.vars = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.variables.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.variables[id]) || ('Variable ' + id); }, - get: function (id) { return defined(window.$gameVariables) ? $gameVariables.value(id) : 0; }, - set: function (id, v) { if (!defined(window.$gameVariables)) return; $gameVariables.setValue(id, typeof v === 'string' && v.trim() !== '' && !isNaN(v) ? Number(v) : v); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - ops.switches = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.switches.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.switches[id]) || ('Switch ' + id); }, - get: function (id) { return defined(window.$gameSwitches) ? $gameSwitches.value(id) : false; }, - set: function (id, v) { if (!defined(window.$gameSwitches)) return; $gameSwitches.setValue(id, !!v); }, - toggle: function (id) { this.set(id, !this.get(id)); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - var INV_TABLES = { item: '$dataItems', weapon: '$dataWeapons', armor: '$dataArmors' }; - ops.inv = { - table: function (kind) { return window[INV_TABLES[kind]] || []; }, - data: function (kind, id) { return this.table(kind)[id] || null; }, - count: function (kind, id) { var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.numItems(d) : 0; }, - maxStack: function (kind, id) { if (MTC._itemMaxOverride > 0) return MTC._itemMaxOverride; var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.maxItems(d) : 99; }, - grant: function (kind, id, n) { var d = this.data(kind, id); if (d && defined(window.$gameParty)) $gameParty.gainItem(d, n, false); if (locks.isItemFrozen(kind, id)) LOCK.items.set(itemKey(kind, id), { kind: kind, id: id, value: this.count(kind, id) }); }, - setCount: function (kind, id, target) { this.grant(kind, id, clampInt(target, 0, null) - this.count(kind, id)); }, - max: function (kind, id) { this.setCount(kind, id, this.maxStack(kind, id)); }, - list: function (kind) { - var t = this.table(kind), out = []; - for (var id = 1; id < t.length; id++) { - var d = t[id]; if (!d || !d.name) continue; - out.push({ id: id, name: d.name, description: d.description || '', iconIndex: d.iconIndex || 0, count: $gameParty.numItems(d) }); - } - return out; - } - }; - - ops.gold = { - get: function () { return defined(window.$gameParty) ? $gameParty.gold() : 0; }, - max: function () { return defined(window.$gameParty) && $gameParty.maxGold ? $gameParty.maxGold() : 99999999; }, - add: function (n) { - if (!defined(window.$gameParty)) return; - if (LOCK.gold != null) { LOCK.gold = clampInt(LOCK.gold + n, 0, this.max()); (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); return; } - if (n >= 0) $gameParty.gainGold(n); else $gameParty.loseGold(-n); - }, - set: function (target) { this.add(clampInt(target, 0, this.max()) - this.get()); } - }; - - ops.actors = { - list: function () { - var out = []; - if (!defined(window.$dataActors)) return out; - for (var id = 1; id < $dataActors.length; id++) { - var d = $dataActors[id]; if (!d) continue; - var a = $gameActors.actor(id); - out.push({ id: id, name: a ? a.name() : d.name, level: a ? actorLevel(a) : (d.initialLevel || 1), inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false }); - } - return out; - }, - get: function (id) { - var a = $gameActors.actor(id); if (!a) return null; - var params = []; - for (var p = 0; p < 8; p++) params.push({ id: p, name: PARAM_NAMES[p], value: a.param(p) }); - var skills = []; - if (defined(window.$dataSkills)) for (var s = 1; s < $dataSkills.length; s++) { var sk = $dataSkills[s]; if (sk && sk.name) skills.push({ id: s, name: sk.name, learned: a.isLearnedSkill ? a.isLearnedSkill(s) : (a.skills().indexOf(sk) >= 0) }); } - var equips = [], slots = a.equipSlots ? a.equipSlots() : [], cur = a.equips(); - for (var e = 0; e < slots.length; e++) equips.push({ slot: e, etypeId: slots[e], current: cur[e] ? cur[e].name : '(none)' }); - return { - id: id, name: a.name(), level: actorLevel(a), exp: a.currentExp ? a.currentExp() : 0, - nextExp: a.nextLevelExp ? a.nextLevelExp() : 0, - hp: a.hp, mp: a.mp, tp: a.tp, mhp: a.mhp, mmp: a.mmp, - params: params, skills: skills, equips: equips, - inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false - }; - }, - setLevel: function (id, lv) { var a = $gameActors.actor(id); if (a) { var cap = a.maxLevel ? a.maxLevel() : 99; a.changeLevel(clampInt(lv, 1, cap), false); a.refresh(); } }, - setExp: function (id, exp) { var a = $gameActors.actor(id); if (a) { a.changeExp(clampInt(exp, 0, null), false); a.refresh(); } }, - setHp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setHp(clampInt(v, 0, a.mhp)); a.refresh(); } }, - setMp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setMp(clampInt(v, 0, a.mmp)); a.refresh(); } }, - setTp: function (id, v) { var a = $gameActors.actor(id); if (a && a.setTp) { a.setTp(clampInt(v, 0, 100)); a.refresh(); } }, - addParam: function (id, pid, delta) { var a = $gameActors.actor(id); if (a) { a.addParam(pid, Math.floor(delta)); a.refresh(); } }, - // param(pid) = round((paramBase+paramPlus) * paramRate * paramBuffRate) clamped to [paramMin,paramMax]. - // addParam only mutates paramPlus, so invert the rate to land the *visible* param on target. - setParam: function (id, pid, target) { - var a = $gameActors.actor(id); if (!a) return; - var rate = (a.paramRate ? a.paramRate(pid) : 1) * (a.paramBuffRate ? a.paramBuffRate(pid) : 1) || 1; - var cap = a.paramMax ? a.paramMax(pid) : null; - var want = clampInt(target, a.paramMin ? a.paramMin(pid) : 0, cap); - var base = a.paramBase ? a.paramBase(pid) : 0, plus = (a.paramPlus ? a.paramPlus(pid) : (a._paramPlus ? a._paramPlus[pid] : 0)) || 0; - a.addParam(pid, Math.round(want / rate) - base - plus); - a.refresh(); - }, - learn: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.learnSkill(skillId); }, - forget: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.forgetSkill(skillId); }, - equip: function (id, slotId, kind, itemId) { var a = $gameActors.actor(id); if (!a) return; var item = itemId ? ops.inv.data(kind, itemId) : null; if (a.forceChangeEquip) a.forceChangeEquip(slotId, item); else a.changeEquip(slotId, item); a.refresh(); }, - recover: function (id) { var a = $gameActors.actor(id); if (a) { a.recoverAll(); a.refresh(); } }, - setName: function (id, name) { var a = $gameActors.actor(id); if (a) a.setName(String(name)); }, - addToParty: function (id) { $gameParty.addActor(id); }, - removeFromParty: function (id) { $gameParty.removeActor(id); } - }; - - ops.party = { - members: function () { return defined(window.$gameParty) ? $gameParty.members().map(function (a) { return { id: a.actorId(), name: a.name(), level: actorLevel(a) }; }) : []; }, - add: function (id) { if (defined(window.$gameParty)) $gameParty.addActor(id); }, - remove: function (id) { if (defined(window.$gameParty)) $gameParty.removeActor(id); }, - steps: function () { return defined(window.$gameParty) ? $gameParty.steps() : 0; }, - // RPG Maker derives playtime from frame count (Game_System has no playtime()). - playtime: function () { return (typeof Graphics !== 'undefined' && Graphics.frameCount) ? Math.floor(Graphics.frameCount / 60) : 0; } - }; - - ops.map = { - list: function () { - var out = []; - if (!defined(window.$dataMapInfos)) return out; - for (var id = 1; id < $dataMapInfos.length; id++) { var m = $dataMapInfos[id]; if (m) out.push({ id: id, name: m.name || ('Map ' + id) }); } - return out; - }, - current: function () { if (!defined(window.$gameMap) || !defined(window.$gamePlayer)) return { mapId: 0, x: 0, y: 0, dir: 2 }; return { mapId: $gameMap.mapId(), x: $gamePlayer.x, y: $gamePlayer.y, dir: $gamePlayer.direction ? $gamePlayer.direction() : 2 }; }, - teleport: function (mapId, x, y, dir, fade) { $gamePlayer.reserveTransfer(mapId, clampInt(x, 0, null), clampInt(y, 0, null), dir || 0, fade == null ? 0 : fade); }, - loadMapFile: function (mapId) { - if (!nodeFs) return null; - try { var f = 'Map' + String(mapId).padStart(3, '0') + '.json'; return JSON.parse(nodeFs.readFileSync(nodePath.join(gameCwd(), 'data', f), 'utf8')); } - catch (e) { return null; } - }, - noclip: function (b) { locks.state.noclip = !!b; if (defined(window.$gamePlayer)) $gamePlayer.setThrough(!!b); }, - isNoclip: function () { return !!locks.state.noclip; }, - speed: function (n) { if (defined(window.$gamePlayer)) $gamePlayer.setMoveSpeed(clampInt(n, 1, 8)); } - }; - - ops.commonev = { - list: function () { - var out = []; - if (!defined(window.$dataCommonEvents)) return out; - for (var id = 1; id < $dataCommonEvents.length; id++) { var c = $dataCommonEvents[id]; if (c) out.push({ id: id, name: c.name || ('Common Event ' + id) }); } - return out; - }, - run: function (id) { if (defined(window.$gameTemp)) $gameTemp.reserveCommonEvent(id); } - }; - - ops.battle = { - inBattle: function () { - if (typeof SceneManager === 'undefined' || !SceneManager._scene) return false; - if (typeof Scene_Battle !== 'undefined' && SceneManager._scene instanceof Scene_Battle) return true; - var c = SceneManager._scene.constructor; // fallback if class binding unavailable - return !!(c && c.name === 'Scene_Battle'); - }, - instantWin: function () { - if (typeof $gameTroop === 'undefined' || !$gameTroop) return; - $gameTroop.members().forEach(function (e) { - e.setHp(0); - if (e.deathStateId && e.addState) e.addState(e.deathStateId()); // mark actually dead - else if (e.die) e.die(); - if (e.performCollapse) e.performCollapse(); // visual collapse - e.refresh(); - }); - if (typeof BattleManager !== 'undefined' && BattleManager.checkBattleEnd) BattleManager.checkBattleEnd(); - }, - flee: function () { if (typeof BattleManager !== 'undefined' && BattleManager.processAbort) BattleManager.processAbort(); } - }; - - // =================================================================================== - // LOCKS — prototype-level monkeypatches + per-frame re-assertion. Installed once. - // =================================================================================== - var LOCK = { vars: new Map(), switches: new Map(), items: new Map(), gold: null, stats: new Map(), noclip: false }; - function itemKey(kind, id) { return kind + ':' + id; } - - var locks = { - state: LOCK, - _installed: false, - install: function () { - if (this._installed) return; this._installed = true; - // Variables - if (typeof Game_Variables !== 'undefined') { - var _sv = Game_Variables.prototype.setValue; - Game_Variables.prototype.setValue = function (id, value) { if (LOCK.vars.has(id)) value = LOCK.vars.get(id); _sv.call(this, id, value); }; - } - // Switches - if (typeof Game_Switches !== 'undefined') { - var _ss = Game_Switches.prototype.setValue; - Game_Switches.prototype.setValue = function (id, value) { if (LOCK.switches.has(id)) value = LOCK.switches.get(id); _ss.call(this, id, value); }; - } - // Gold: substitute (not block) so freezeGold can re-snapshot on edit; item freeze is tick-based - // (NOT a gainItem block) so equip bookkeeping / give-take still runs, corrected next frame. - if (typeof Game_Party !== 'undefined') { - var _gg = Game_Party.prototype.gainGold; - locks._origGainGold = _gg; - Game_Party.prototype.gainGold = function (n) { if (LOCK.gold != null) return; _gg.call(this, n); }; - } - // Battle: god mode + OHKO via one executeHpDamage override - if (typeof Game_Action !== 'undefined') { - var _ehd = Game_Action.prototype.executeHpDamage; - Game_Action.prototype.executeHpDamage = function (target, value) { - if (CHEAT.god && target.isActor && target.isActor() && value > 0) value = 0; - if (CHEAT.ohko && this.subject().isActor && this.subject().isActor() && target.isEnemy && target.isEnemy()) value = target.hp; - _ehd.call(this, target, value); - }; - } - // God mode also blocks non-action HP loss for actors (slip/regen, event Change-HP) + floor damage. - if (typeof Game_Battler !== 'undefined' && Game_Battler.prototype.gainHp) { - var _gh = Game_Battler.prototype.gainHp; - Game_Battler.prototype.gainHp = function (value) { if (CHEAT.god && this.isActor && this.isActor() && value < 0) value = 0; _gh.call(this, value); }; - } - if (typeof Game_Actor !== 'undefined' && Game_Actor.prototype.executeFloorDamage) { - var _efd = Game_Actor.prototype.executeFloorDamage; - Game_Actor.prototype.executeFloorDamage = function () { if (CHEAT.god) return; _efd.call(this); }; - } - // No encounters - if (typeof Game_Player !== 'undefined') { - var _epv = Game_Player.prototype.encounterProgressValue; - Game_Player.prototype.encounterProgressValue = function () { return CHEAT.noEncounter ? 0 : _epv.call(this); }; - } - // Speedhack: drive the scene update extra times per frame (speed>1) or skip frames (speed<1). - // Input is still read once per real frame, so the whole game (movement, anim, battle, messages, - // events, timers) runs faster/slower. Works for MV and MZ (both expose SceneManager.updateScene). - if (typeof SceneManager !== 'undefined' && SceneManager.updateScene) { - var _updateScene = SceneManager.updateScene, _spdAcc = 0; - // Extra updates are only safe in a steady scene: the scene must be started, not changing, and - // (on a map) not mid-transfer — otherwise $dataMap is briefly null and the scroll code throws. - function speedSafe(mgr) { - if (mgr.isCurrentSceneStarted) { if (!mgr.isCurrentSceneStarted()) return false; } // MV - else if (mgr._scene && mgr._scene.isStarted) { if (!mgr._scene.isStarted()) return false; } // MZ - if (mgr.isSceneChanging && mgr.isSceneChanging()) return false; // mid scene transition - if (typeof $gamePlayer !== 'undefined' && $gamePlayer && $gamePlayer.isTransferring && $gamePlayer.isTransferring()) return false; - if (typeof DataManager !== 'undefined' && DataManager.isMapLoaded && !DataManager.isMapLoaded()) return false; // map (re)loading - return true; - } - SceneManager.updateScene = function () { - var sp = CHEAT.speed || 1; - if (sp >= 1) { - _updateScene.call(this); - if (sp > 1 && this._scene && typeof this._scene.update === 'function' && speedSafe(this)) { - _spdAcc += (sp - 1); - var guard = 0; - while (_spdAcc >= 1 && guard++ < 64) { _spdAcc -= 1; try { this._scene.update(); } catch (e) { _spdAcc = 0; break; } } - } else { _spdAcc = 0; } // not safe / not boosting -> don't bank up a burst of catch-up updates - } else { - _spdAcc += sp; - if (_spdAcc >= 1) { _spdAcc -= 1; _updateScene.call(this); } - else if (this._scene) { // skip the game advance this frame, keep start/ready bookkeeping - var u = this._scene.update; this._scene.update = function () {}; - try { _updateScene.call(this); } finally { this._scene.update = u; } - } - } - }; - } - // Clear stale freeze snapshots when the engine swaps in fresh game objects (new game / load). - if (typeof DataManager !== 'undefined') { - if (DataManager.setupNewGame) { var _sng = DataManager.setupNewGame; DataManager.setupNewGame = function () { locks.clearAll(); _sng.call(this); }; } - if (DataManager.extractSaveContents) { var _esc = DataManager.extractSaveContents; DataManager.extractSaveContents = function (c) { locks.clearAll(); return _esc.call(this, c); }; } - } - }, - // Freeze setters update both the lock map and the live value once. Maps store parsed objects so - // the per-frame tick never re-parses string keys. - freezeVar: function (id, on) { if (on) { LOCK.vars.set(id, ops.vars.get(id)); ops.vars.set(id, ops.vars.get(id)); } else LOCK.vars.delete(id); }, - freezeSwitch: function (id, on) { if (on) LOCK.switches.set(id, ops.switches.get(id)); else LOCK.switches.delete(id); }, - freezeItem: function (kind, id, on) { var k = itemKey(kind, id); if (on) LOCK.items.set(k, { kind: kind, id: id, value: ops.inv.count(kind, id) }); else LOCK.items.delete(k); }, - freezeGold: function (on) { LOCK.gold = on ? ops.gold.get() : null; }, - freezeStat: function (actorId, stat, on) { var k = actorId + ':' + stat; if (on) { var a = defined(window.$gameActors) ? $gameActors.actor(actorId) : null; LOCK.stats.set(k, { actorId: actorId, stat: stat, value: a ? a[stat] : 0 }); } else LOCK.stats.delete(k); }, - isVarFrozen: function (id) { return LOCK.vars.has(id); }, - isSwitchFrozen: function (id) { return LOCK.switches.has(id); }, - isItemFrozen: function (kind, id) { return LOCK.items.has(itemKey(kind, id)); }, - isStatFrozen: function (actorId, stat) { return LOCK.stats.has(actorId + ':' + stat); }, - // Per-frame: re-assert values the overrides can't catch (hp/mp/tp, gold target, item counts, noclip). - tick: function () { - if (!LOCK.noclip && LOCK.gold == null && !LOCK.stats.size && !LOCK.items.size) return; // early-out - if (LOCK.noclip && defined(window.$gamePlayer) && !$gamePlayer.isThrough()) $gamePlayer.setThrough(true); - if (LOCK.gold != null && defined(window.$gameParty) && $gameParty.gold() !== LOCK.gold) (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); - if (LOCK.stats.size && defined(window.$gameActors)) { - LOCK.stats.forEach(function (e) { - var a = $gameActors.actor(e.actorId); if (!a) return; - if (e.stat === 'hp' && a.hp !== e.value) a.setHp(Math.min(e.value, a.mhp)); - else if (e.stat === 'mp' && a.mp !== e.value) a.setMp(Math.min(e.value, a.mmp)); - else if (e.stat === 'tp' && a.tp !== e.value && a.setTp) a.setTp(e.value); - }); - } - if (LOCK.items.size && defined(window.$gameParty)) { - LOCK.items.forEach(function (e) { if (ops.inv.count(e.kind, e.id) !== e.value) { var d = ops.inv.data(e.kind, e.id); if (d) $gameParty.gainItem(d, e.value - ops.inv.count(e.kind, e.id), false); } }); - } - }, - summary: function () { - var out = []; - LOCK.vars.forEach(function (v, id) { out.push({ type: 'var', id: id, label: 'Var ' + id + ' · ' + ops.vars.name(id), value: v }); }); - LOCK.switches.forEach(function (v, id) { out.push({ type: 'switch', id: id, label: 'Switch ' + id + ' · ' + ops.switches.name(id), value: v ? 'ON' : 'OFF' }); }); - LOCK.items.forEach(function (e, key) { out.push({ type: 'item', key: key, label: e.kind + ' ' + e.id + ' · ' + (ops.inv.data(e.kind, e.id) ? ops.inv.data(e.kind, e.id).name : ''), value: e.value }); }); - LOCK.stats.forEach(function (e, key) { out.push({ type: 'stat', key: key, label: 'Actor ' + e.actorId + ' · ' + e.stat.toUpperCase(), value: e.value }); }); - if (LOCK.gold != null) out.push({ type: 'gold', label: 'Gold (frozen)', value: LOCK.gold }); - if (LOCK.noclip) out.push({ type: 'noclip', label: 'Noclip (active)', value: 'ON' }); - return out; - }, - clearAll: function () { LOCK.vars.clear(); LOCK.switches.clear(); LOCK.items.clear(); LOCK.stats.clear(); LOCK.gold = null; if (LOCK.noclip) ops.map.noclip(false); } - }; - - // =================================================================================== - // CHEATS — global toggles consumed by the lock overrides + battle actions. - // =================================================================================== - var CHEAT = { god: false, ohko: false, noEncounter: false, speed: 1, uiFocused: false }; - var cheats = { - state: CHEAT, - setGod: function (b) { CHEAT.god = !!b; }, - setOhko: function (b) { CHEAT.ohko = !!b; }, - setNoEncounter: function (b) { CHEAT.noEncounter = !!b; }, - setSpeed: function (n) { CHEAT.speed = Math.max(0.1, Math.min(Number(n) || 1, 16)); }, - toggleSpeed: function () { this.setSpeed(CHEAT.speed !== 1 ? 1 : (MTC._speedBoost || 2)); return CHEAT.speed; }, - instantWin: function () { ops.battle.instantWin(); }, - flee: function () { ops.battle.flee(); } - }; - - // expose the assembled API (UI is attached below if a real DOM is present) - var MTC = { env: { IS_MZ: IS_MZ }, ops: ops, locks: locks, cheats: cheats, LOCK: LOCK, CHEAT: CHEAT, PARAM_NAMES: PARAM_NAMES, _itemMaxOverride: 0, _hotkey: 'F10', _speedKey: 'Control', _speedBoost: 2 }; - if (root) { root.Forge = MTC; root.__FORGE_CORE__ = true; } - if (typeof module !== 'undefined' && module.exports) module.exports = MTC; - - // ---- engine boot hooks (guarded; only when classes exist) ---- - if (typeof Scene_Base !== 'undefined') { - var _su = Scene_Base.prototype.update; - Scene_Base.prototype.update = function () { _su.call(this); try { locks.tick(); } catch (e) {} }; - } - // install lock overrides as soon as the game classes are available - try { locks.install(); } catch (e) {} - - // ---- UI: attach only when a real browser DOM is available (skipped in Node tests) ---- - if (typeof document !== 'undefined' && document.body && typeof document.body.attachShadow === 'function' && typeof window !== 'undefined') { - try { MTC.ui = buildUI(MTC); } catch (e) { try { console.error('[Forge] UI init failed', e); } catch (_) {} } - } - - // =================================================================================== - // UI — Shadow-DOM overlay. Inlined so the single ship file works with zero deps. - // =================================================================================== - function buildUI(API) { - var LS = 'forge:'; - function store(k, v) { try { localStorage.setItem(LS + k, JSON.stringify(v)); } catch (e) {} } - function load(k, d) { try { var s = localStorage.getItem(LS + k); return s == null ? d : JSON.parse(s); } catch (e) { return d; } } - // persisted speed settings (UI-controlled; override core/param defaults if the user changed them) - API._speedKey = load('speedKey', API._speedKey || 'Control'); - API._speedUseKey = load('speedUseKey', true); - API._speedBoost = load('speedBoost', API._speedBoost || 2); - if (!API._speedUseKey) API.cheats.setSpeed(API._speedBoost); // "always on" mode applies immediately - - function el(tag, props, kids) { - var n = document.createElement(tag); - if (props) for (var k in props) { - if (k === 'class') n.className = props[k]; - else if (k === 'text') n.textContent = props[k]; - else if (k === 'html') n.innerHTML = props[k]; - else if (k === 'style') n.setAttribute('style', props[k]); - else if (k.slice(0, 2) === 'on' && typeof props[k] === 'function') n.addEventListener(k.slice(2).toLowerCase(), props[k]); - else if (props[k] != null) n.setAttribute(k, props[k]); - } - if (kids) (Array.isArray(kids) ? kids : [kids]).forEach(function (c) { if (c != null) n.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); }); - return n; - } - - // Inline SVG icons (no font/emoji dependency -> render identically on Windows/macOS/Linux). - function svg(inner) { return ''; } - var ICONS = { - vars: svg(''), - switches: svg(''), - inv: svg(''), - actors: svg(''), - party: svg(''), - map: svg(''), - commonev: svg(''), - locks: svg(''), - battle: svg(''), - tool: svg(''), - refresh: svg(''), - theme: svg(''), - close: svg(''), - lock: svg(''), - unlock: svg('') - }; - - var CSS = "\ -:host{position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important;contain:none}\ -*{box-sizing:border-box;font-family:var(--font-ui);-webkit-user-select:none;user-select:none}\ -#forge-root{--font-ui:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-mono:ui-monospace,'Cascadia Code',Consolas,monospace;\ ---fg-bg:#15171c;--fg-bg-elev:#1c1f27;--fg-bg-input:#21242d;--fg-bg-row-alt:#181b22;--fg-border:#2b2f3a;--fg-border-strong:#3a3f4d;\ ---fg-text:#e6e9ef;--fg-text-dim:#9aa1b1;--fg-text-faint:#646b7d;--fg-accent:#5b8cff;--fg-accent-weak:#2a3a63;--fg-success:#3ecf8e;--fg-warn:#f0b132;--fg-danger:#f0556a;--fg-frozen:#8b5cf6;\ ---sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--rad-sm:4px;--rad-md:7px;--rad-lg:11px;--rad-pill:999px;\ ---sh-panel:0 18px 50px rgba(0,0,0,.5),0 0 0 1px var(--fg-border);--row-h:30px;--rail-w:64px;--ease:cubic-bezier(.2,.7,.3,1);--dur:120ms;\ ---fs-xs:11px;--fs-sm:12px;--fs-md:13px;--fs-lg:15px;color:var(--fg-text);font-size:var(--fs-md)}\ -#forge-root[data-theme=light]{--fg-bg:#f6f7f9;--fg-bg-elev:#fff;--fg-bg-input:#eef0f4;--fg-bg-row-alt:#f0f2f5;--fg-border:#dde0e7;--fg-border-strong:#c7ccd8;--fg-text:#1a1d24;--fg-text-dim:#5a6172;--fg-text-faint:#9097a6;--fg-accent-weak:#dce6ff}\ -.fg-panel{position:fixed;display:flex;flex-direction:column;background:var(--fg-bg);border-radius:var(--rad-lg);box-shadow:var(--sh-panel);overflow:hidden;z-index:2147483000;min-width:480px;min-height:360px;pointer-events:auto}\ -.fg-titlebar{display:flex;align-items:center;gap:6px;height:33px;padding:0 6px 0 10px;background:var(--fg-bg-elev);border-bottom:1px solid var(--fg-border);cursor:move;flex:0 0 auto}\ -.fg-brand{font-weight:700;font-size:var(--fs-md);letter-spacing:.3px;color:var(--fg-text);margin-right:8px;white-space:nowrap}\ -.fg-brand b{color:var(--fg-accent)}\ -.fg-search{flex:1;height:23px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:var(--rad-md);color:var(--fg-text);padding:0 9px;font-size:var(--fs-sm);outline:none;min-width:80px}\ -.fg-search:focus{border-color:var(--fg-accent)}\ -.fg-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:23px;height:23px;border-radius:var(--rad-md);background:transparent;color:var(--fg-text-dim);border:0;cursor:pointer;font-size:13px;transition:background var(--dur)}\ -.fg-iconbtn:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-body{flex:1;display:flex;min-height:0}\ -.fg-rail{flex:0 0 var(--rail-w);display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) var(--sp-1);background:var(--fg-bg-elev);border-right:1px solid var(--fg-border);overflow-y:auto}\ -.fg-rail__item{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--sp-2) 0;border-radius:var(--rad-md);cursor:pointer;color:var(--fg-text-dim);font-size:10px;transition:all var(--dur);border:0;background:transparent}\ -.fg-rail__item .ic{display:flex;align-items:center;justify-content:center}\n.fg-rail__item .ic svg{width:19px;height:19px}\n.fg-iconbtn svg{width:15px;height:15px}\n.fg-lock svg{width:15px;height:15px}\n.fg-launcher svg{width:21px;height:21px}\ -.fg-rail__item:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-rail__item.is-active{background:var(--fg-accent-weak);color:var(--fg-accent)}\ -.fg-content{flex:1;display:flex;flex-direction:column;min-width:0}\ -.fg-section-head{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4) var(--sp-2);flex:0 0 auto}\ -.fg-section-head h2{margin:0;font-size:var(--fs-lg);font-weight:600}\ -.fg-count{font-size:var(--fs-xs);color:var(--fg-text-faint);background:var(--fg-bg-input);padding:2px 7px;border-radius:var(--rad-pill)}\ -.fg-spacer{flex:1}\ -.fg-subtoolbar{display:flex;align-items:center;gap:var(--sp-2);padding:0 var(--sp-4) var(--sp-2);flex-wrap:wrap}\ -.fg-segmented{display:inline-flex;background:var(--fg-bg-input);border-radius:var(--rad-md);padding:2px}\ -.fg-segmented button{border:0;background:transparent;color:var(--fg-text-dim);padding:3px 12px;border-radius:5px;cursor:pointer;font-size:var(--fs-sm)}\ -.fg-segmented button.is-active{background:var(--fg-accent);color:#fff}\ -.fg-btn{border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text);padding:4px 11px;border-radius:var(--rad-md);cursor:pointer;font-size:var(--fs-sm);transition:all var(--dur)}\ -.fg-btn:hover{border-color:var(--fg-accent);color:var(--fg-accent)}\ -.fg-btn--ghost{background:transparent;border-color:transparent;color:var(--fg-text-dim)}\ -.fg-btn--danger:hover{border-color:var(--fg-danger);color:var(--fg-danger)}\ -.fg-list{flex:1;overflow-y:auto;overflow-x:hidden;position:relative;border-top:1px solid var(--fg-border)}\ -.fg-list__sizer{position:relative;width:100%}\ -.fg-list__window{position:absolute;top:0;left:0;right:0}\ -.fg-row{display:flex;align-items:center;gap:var(--sp-2);height:var(--row-h);padding:0 var(--sp-4);border-bottom:1px solid var(--fg-border);font-size:var(--fs-sm)}\ -.fg-row:nth-child(even){background:var(--fg-bg-row-alt)}\ -.fg-row.is-frozen{box-shadow:inset 3px 0 0 var(--fg-frozen)}\ -.fg-row.is-selected{background:var(--fg-accent-weak)!important;box-shadow:inset 2px 0 0 var(--fg-accent)}\ -.fg-cell--id{flex:0 0 52px;color:var(--fg-text-faint);font-family:var(--font-mono);font-size:var(--fs-xs)}\ -.fg-cell--name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\ -.fg-cell--name .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--fg-accent);margin-right:6px;vertical-align:middle}\ -.fg-cell--val{flex:0 0 auto;display:flex;align-items:center;gap:4px}\ -.fg-stepper{display:inline-flex;align-items:center;gap:3px}\ -.fg-step{min-width:30px;width:auto;padding:0 5px;height:22px;white-space:nowrap;border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text-dim);border-radius:5px;cursor:pointer;font-size:var(--fs-xs);font-family:var(--font-mono)}\ -.fg-step:hover{color:var(--fg-accent);border-color:var(--fg-accent)}\ -.fg-num{width:68px;height:22px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:5px;color:var(--fg-text);text-align:right;padding:0 6px;font-family:var(--font-mono);font-size:var(--fs-sm);outline:none}\ -.fg-num:focus{border-color:var(--fg-accent)}\ -.fg-toggle{width:38px;height:21px;border-radius:var(--rad-pill);background:var(--fg-border-strong);position:relative;cursor:pointer;transition:background var(--dur);border:0;flex:0 0 auto}\ -.fg-toggle::after{content:'';position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;transition:transform var(--dur)}\ -.fg-toggle.is-on{background:var(--fg-success)}\ -.fg-toggle.is-on::after{transform:translateX(17px)}\ -.fg-lock{width:24px;height:24px;border:0;background:transparent;color:var(--fg-text-faint);cursor:pointer;border-radius:5px;font-size:13px;flex:0 0 auto}\ -.fg-lock:hover{color:var(--fg-frozen);background:var(--fg-bg-input)}\ -.fg-lock.is-frozen{color:var(--fg-frozen)}\ -.fg-statusbar{display:flex;align-items:center;gap:var(--sp-2);height:24px;padding:0 var(--sp-3);background:var(--fg-bg-elev);border-top:1px solid var(--fg-border);font-size:var(--fs-xs);color:var(--fg-text-faint);flex:0 0 auto}\ -.fg-detail{padding:var(--sp-3) var(--sp-4);overflow-y:auto;flex:1}\ -.fg-field{display:flex;align-items:center;gap:var(--sp-2);padding:5px 0;border-bottom:1px solid var(--fg-border);min-width:0}\n.fg-field .fg-stepper{margin-left:auto;flex:0 0 auto}\ -.fg-field label{flex:0 0 96px;color:var(--fg-text-dim);font-size:var(--fs-sm)}\ -.fg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:var(--sp-2) var(--sp-4)}\ -.fg-toasts{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;gap:6px;z-index:2147483100;pointer-events:none}\ -.fg-toast{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-left:3px solid var(--fg-accent);color:var(--fg-text);padding:8px 14px;border-radius:var(--rad-md);font-size:var(--fs-sm);box-shadow:var(--sh-panel);animation:fgin var(--dur) var(--ease)}\ -.fg-toast.warn{border-left-color:var(--fg-warn)}.fg-toast.danger{border-left-color:var(--fg-danger)}.fg-toast.ok{border-left-color:var(--fg-success)}\ -@keyframes fgin{from{opacity:0;transform:translateY(6px)}to{opacity:1}}\ -.fg-launcher{position:fixed;pointer-events:auto;width:42px;height:42px;border-radius:50%;background:var(--fg-accent);color:#fff;border:0;cursor:pointer;font-size:18px;z-index:2147482999;box-shadow:var(--sh-panel);display:flex;align-items:center;justify-content:center}\ -.fg-launcher:hover{filter:brightness(1.1)}\ -.fg-resize{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}\ -.fg-resize::after{content:'';position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--fg-text-faint);border-bottom:2px solid var(--fg-text-faint)}\ -.fg-empty{padding:var(--sp-5);text-align:center;color:var(--fg-text-faint);font-size:var(--fs-sm)}\ -.fg-confirm{position:fixed;pointer-events:auto;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);z-index:2147483200}\ -.fg-confirm__box{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-radius:var(--rad-lg);padding:var(--sp-4);max-width:340px;box-shadow:var(--sh-panel)}\ -.fg-confirm__box p{margin:0 0 var(--sp-4)}.fg-confirm__row{display:flex;justify-content:flex-end;gap:var(--sp-2)}\ -input::placeholder{color:var(--fg-text-faint)}\ -::-webkit-scrollbar{width:9px;height:9px}\ -::-webkit-scrollbar-track{background:transparent}\ -::-webkit-scrollbar-thumb{background:var(--fg-border-strong);border-radius:5px}\ -::-webkit-scrollbar-thumb:hover{background:var(--fg-text-faint)}"; - - // ---------- shadow host ---------- - var host = el('div', { id: 'forge-host' }); - host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important'; - document.body.appendChild(host); - var shadow = host.attachShadow({ mode: 'open' }); - var rootEl = el('div', { id: 'forge-root' }); - rootEl.setAttribute('data-theme', load('theme', 'dark')); - shadow.appendChild(el('style', { text: CSS })); - shadow.appendChild(rootEl); - - // Swallow events so panel interaction never leaks to the game. BUBBLE phase: the panel's own - // inputs receive the event first (target phase), then we stop it before it reaches document - // (where RPG Maker's Input/TouchInput listen). Capture phase would block the inputs themselves. - ['keydown', 'keyup', 'keypress', 'wheel', 'mousedown', 'mouseup', 'mousemove', 'click', 'dblclick', - 'pointerdown', 'pointerup', 'pointermove', 'pointercancel', 'touchstart', 'touchend', 'touchmove', 'touchcancel', 'contextmenu'].forEach(function (t) { - rootEl.addEventListener(t, function (e) { e.stopPropagation(); }, false); - }); - function isEditable(el) { return el && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA'); } - rootEl.addEventListener('focusin', function (e) { if (isEditable(e.target)) API.CHEAT.uiFocused = true; }, true); - rootEl.addEventListener('focusout', function () { setTimeout(function () { API.CHEAT.uiFocused = !!(shadow.activeElement && isEditable(shadow.activeElement)); }, 0); }, true); - window.addEventListener('blur', function () { API.CHEAT.uiFocused = false; }); // never latch the game-input gate - // Backup engine-level gate: while a panel input is focused, drop the game's keyboard handler. - if (typeof Input !== 'undefined' && Input._onKeyDown) { var _okd = Input._onKeyDown; Input._onKeyDown = function (e) { if (API.CHEAT.uiFocused) return; _okd.call(this, e); }; } - if (typeof Input !== 'undefined' && Input._onKeyUp) { var _oku = Input._onKeyUp; Input._onKeyUp = function (e) { if (API.CHEAT.uiFocused) return; _oku.call(this, e); }; } - - // ---------- toasts ---------- - var toasts = el('div', { class: 'fg-toasts' }); rootEl.appendChild(toasts); - function toast(msg, kind) { var t = el('div', { class: 'fg-toast ' + (kind || ''), text: msg }); toasts.appendChild(t); setTimeout(function () { t.remove(); }, 2200); } - function confirmBox(msg, onYes) { - var box = el('div', { class: 'fg-confirm' }, el('div', { class: 'fg-confirm__box' }, [ - el('p', { text: msg }), - el('div', { class: 'fg-confirm__row' }, [ - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Cancel', onclick: function () { box.remove(); } }), - el('button', { class: 'fg-btn fg-btn--danger', text: 'Confirm', onclick: function () { box.remove(); onYes(); } }) - ]) - ])); - rootEl.appendChild(box); - } - - // ---------- panel skeleton ---------- - var vw = window.innerWidth || 816, vh = window.innerHeight || 624; - // Default size fits the window (many MV games are ~816x624); leave a margin. - var st = load('panel', { x: 16, y: 16, w: Math.min(880, vw - 32), h: Math.min(560, vh - 32) }); - st.w = Math.max(420, Math.min(st.w, vw - 8)); st.h = Math.max(320, Math.min(st.h, vh - 8)); - st.x = Math.max(0, Math.min(st.x, vw - st.w)); st.y = Math.max(0, Math.min(st.y, vh - st.h)); // keep fully on-screen - var panel = el('div', { class: 'fg-panel' }); - panel.style.left = st.x + 'px'; panel.style.top = st.y + 'px'; panel.style.width = st.w + 'px'; panel.style.height = st.h + 'px'; - var search = el('input', { class: 'fg-search', type: 'text', placeholder: 'Search… (Ctrl+K)' }); - var titlebar = el('div', { class: 'fg-titlebar' }, [ - el('span', { class: 'fg-brand', html: 'Forge' }), - search, - el('button', { class: 'fg-iconbtn', title: 'Rescan', html: ICONS.refresh, onclick: function () { render(); toast('Rescanned'); } }), - el('button', { class: 'fg-iconbtn', title: 'Theme', html: ICONS.theme, onclick: function () { var t = rootEl.getAttribute('data-theme') === 'light' ? 'dark' : 'light'; rootEl.setAttribute('data-theme', t); store('theme', t); } }), - el('button', { class: 'fg-iconbtn', title: 'Close (F10)', html: ICONS.close, onclick: function () { hide(); } }) - ]); - var rail = el('div', { class: 'fg-rail' }); - var content = el('div', { class: 'fg-content' }); - var statusbar = el('div', { class: 'fg-statusbar' }); - panel.appendChild(titlebar); - panel.appendChild(el('div', { class: 'fg-body' }, [rail, content])); - panel.appendChild(statusbar); - var resize = el('div', { class: 'fg-resize' }); panel.appendChild(resize); - rootEl.appendChild(panel); - - // ---------- launcher (docks to bottom-right corner by default; 'launcherPos' is a fresh key so - // any stale mid-screen position from older builds is ignored) ---------- - var lp = load('launcherPos', { x: vw - 56, y: vh - 56 }); - lp.x = Math.max(4, Math.min(lp.x, vw - 46)); lp.y = Math.max(4, Math.min(lp.y, vh - 46)); - var launcher = el('button', { class: 'fg-launcher', html: ICONS.tool, title: 'Forge (F10)' }); - launcher.style.left = lp.x + 'px'; launcher.style.top = lp.y + 'px'; - launcher.addEventListener('click', function (e) { if (!launcher._dragged) toggle(); }); - rootEl.appendChild(launcher); - makeDraggable(launcher, launcher, function (x, y) { store('launcherPos', { x: x, y: y }); }, true); - - // ---------- drag / resize ---------- - function makeDraggable(handle, target, onEnd, isLauncher) { - handle.addEventListener('mousedown', function (e) { - if (e.target.closest && e.target.closest('input,button.fg-iconbtn')) return; - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ox = parseInt(target.style.left) || 0, oy = parseInt(target.style.top) || 0, moved = false; - if (isLauncher) target._dragged = false; - function mv(ev) { ev.stopPropagation(); var dx = ev.clientX - sx, dy = ev.clientY - sy; if (Math.abs(dx) + Math.abs(dy) > 3) moved = true; var nx = Math.max(0, Math.min(window.innerWidth - target.offsetWidth, ox + dx)), ny = Math.max(0, Math.min(window.innerHeight - 30, oy + dy)); target.style.left = nx + 'px'; target.style.top = ny + 'px'; if (isLauncher) target._dragged = moved; } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); if (onEnd) onEnd(parseInt(target.style.left), parseInt(target.style.top)); setTimeout(function () { if (isLauncher) target._dragged = false; }, 0); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - } - makeDraggable(titlebar, panel, function (x, y) { st.x = x; st.y = y; store('panel', st); }); - resize.addEventListener('mousedown', function (e) { - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ow = panel.offsetWidth, oh = panel.offsetHeight; - function mv(ev) { ev.stopPropagation(); var w = Math.max(480, ow + ev.clientX - sx), h = Math.max(360, oh + ev.clientY - sy); panel.style.width = w + 'px'; panel.style.height = h + 'px'; if (activeRenderer && activeRenderer.onResize) activeRenderer.onResize(); } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); st.w = panel.offsetWidth; st.h = panel.offsetHeight; store('panel', st); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - - // ---------- reusable virtualized list ---------- - function VirtualList(opts) { - // opts: rowH, getModel()->[], renderRow(rowEl, item), matches(item, query) - var listEl = el('div', { class: 'fg-list' }); - var sizer = el('div', { class: 'fg-list__sizer' }); - var win = el('div', { class: 'fg-list__window' }); - sizer.appendChild(win); listEl.appendChild(sizer); - var rowH = opts.rowH || 30, pool = [], model = [], view = [], query = ''; - // ONE delegated row click (recycled rows must not accumulate per-draw listeners). - if (opts.onRowClick) listEl.addEventListener('click', function (e) { var r = e.target && e.target.closest ? e.target.closest('.fg-row') : null; if (r && r._item) opts.onRowClick(r._item); }); - function rebuild() { model = opts.getModel() || []; applyFilter(); } - function applyFilter() { - view = query ? model.filter(function (it) { return opts.matches(it, query); }) : model; - sizer.style.height = (view.length * rowH) + 'px'; - var em = listEl.querySelector('.fg-empty'); - if (!view.length) { pool.forEach(function (r) { r.style.display = 'none'; }); if (!em) listEl.appendChild(el('div', { class: 'fg-empty', text: 'Nothing here' })); } - else if (em) em.remove(); - lastFirst = -1; draw(true); // content changed -> force re-render - } - var lastFirst = -1; - function draw(force) { - var scroll = listEl.scrollTop, h = listEl.clientHeight || 400; - var first = Math.max(0, Math.floor(scroll / rowH) - 4); - if (!force && first === lastFirst) return; // window unchanged during scroll -> skip re-render - lastFirst = first; - var count = Math.ceil(h / rowH) + 8; - var last = Math.min(view.length, first + count); - win.style.transform = 'translateY(' + (first * rowH) + 'px)'; - var need = last - first; - while (pool.length < need) { var r = el('div', { class: 'fg-row' }); win.appendChild(r); pool.push(r); } - for (var i = 0; i < pool.length; i++) { - var r = pool[i]; - if (i < need) { r.style.display = 'flex'; r._item = view[first + i]; opts.renderRow(r, view[first + i]); } else { r.style.display = 'none'; r._item = null; } - } - } - var raf = null; - listEl.addEventListener('scroll', function () { if (raf) return; raf = requestAnimationFrame(function () { raf = null; draw(false); }); }); - return { el: listEl, rebuild: rebuild, applyFilter: applyFilter, draw: function () { draw(true); }, setQuery: function (q) { query = q; applyFilter(); }, onResize: function () { draw(true); }, - refresh: function () { draw(true); } }; - } - - // numeric stepper control - function stepper(getVal, setVal, opts) { - opts = opts || {}; - var wrap = el('div', { class: 'fg-stepper' }); - var input = el('input', { class: 'fg-num', type: 'text' }); - function sync() { input.value = getVal(); } - function commit(v) { setVal(v); sync(); if (opts.after) opts.after(); } - [['−100', -100], ['−1', -1]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - wrap.appendChild(input); - [['+1', 1], ['+100', 100]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - input.addEventListener('keydown', function (e) { if (e.key === 'Enter') { commit(parse(input.value)); input.blur(); } else if (e.key === 'Escape') { sync(); input.blur(); } }); - input.addEventListener('blur', function () { commit(parse(input.value)); }); - function parse(s) { var n = Number(String(s).replace(/[^0-9.\-]/g, '')); return isNaN(n) ? getVal() : n; } - sync(); - return { el: wrap, sync: sync }; - } - - // ---------- sections ---------- - var activeRenderer = null, currentSection = null; - var SECTIONS = []; - function section(id, icon, title, builder) { SECTIONS.push({ id: id, icon: icon, title: title, builder: builder }); } - - function listSection(getModel, renderRow, matches, headExtra) { - return function (body, head) { - if (headExtra) headExtra(head); - var vl = VirtualList({ getModel: getModel, renderRow: renderRow, matches: matches || defaultMatch }); - body.appendChild(vl.el); - vl.rebuild(); - return { vl: vl, onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return (getModel() || []).length; } }; - }; - } - function defaultMatch(it, q) { q = q.toLowerCase(); return String(it.id) === q || (it.name && it.name.toLowerCase().indexOf(q) >= 0); } - - // Variables - section('vars', ICONS.vars, 'Variables', listSection( - function () { return API.ops.vars.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isVarFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.vars.get(it.id); }, function (v) { API.ops.vars.set(it.id, v); if (API.locks.isVarFrozen(it.id)) API.locks.freezeVar(it.id, true); }, {}); - val.appendChild(sp.el); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isVarFrozen(it.id), function (on) { API.locks.freezeVar(it.id, on); refreshActive(); })); - } - )); - - // Switches - section('switches', ICONS.switches, 'Switches', listSection( - function () { return API.ops.switches.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isSwitchFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var tg = el('button', { class: 'fg-toggle' + (API.ops.switches.get(it.id) ? ' is-on' : '') }); - tg.addEventListener('click', function () { API.ops.switches.set(it.id, !API.ops.switches.get(it.id)); if (API.locks.isSwitchFrozen(it.id)) API.locks.freezeSwitch(it.id, true); tg.classList.toggle('is-on', API.ops.switches.get(it.id)); }); - val.appendChild(tg); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isSwitchFrozen(it.id), function (on) { API.locks.freezeSwitch(it.id, on); refreshActive(); })); - } - )); - - // Items / Weapons / Armors (segmented) - section('inv', ICONS.inv, 'Items', function (body, head) { - var kind = 'item'; - var seg = el('div', { class: 'fg-segmented' }); - ['item', 'weapon', 'armor'].forEach(function (k) { - var b = el('button', { class: k === kind ? 'is-active' : '', text: k.charAt(0).toUpperCase() + k.slice(1) + 's' }); - b.addEventListener('click', function () { kind = k; seg.querySelectorAll('button').forEach(function (x) { x.classList.remove('is-active'); }); b.classList.add('is-active'); vl.rebuild(); }); - seg.appendChild(b); - }); - head.appendChild(seg); - var vl = VirtualList({ - getModel: function () { return API.ops.inv.list(kind); }, - matches: defaultMatch, - renderRow: function (row, it) { - row.className = 'fg-row' + (API.locks.isItemFrozen(kind, it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.description || it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.inv.count(kind, it.id); }, function (v) { API.ops.inv.setCount(kind, it.id, v); }, {}); - val.appendChild(sp.el); - val.appendChild(el('button', { class: 'fg-step', text: 'Max', style: 'width:auto;padding:0 6px', onclick: function () { API.ops.inv.max(kind, it.id); sp.sync(); } })); - row.appendChild(val); - row.appendChild(lockBtn(API.locks.isItemFrozen(kind, it.id), function (on) { API.locks.freezeItem(kind, it.id, on); refreshActive(); })); - } - }); - body.appendChild(vl.el); vl.rebuild(); - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.inv.list(kind).length; } }; - }); - - // Actors (master-detail) - section('actors', ICONS.actors, 'Actors', function (body) { - var detail = el('div', { class: 'fg-detail' }); - var selectedId = null; - var vl = VirtualList({ - rowH: 30, matches: defaultMatch, - getModel: function () { return API.ops.actors.list(); }, - onRowClick: function (it) { showActor(it.id); }, - renderRow: function (row, it) { - row.className = 'fg-row' + (it.id === selectedId ? ' is-selected' : ''); - row.style.cursor = 'pointer'; - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', html: (it.inParty ? '' : '') + escapeHtml(it.name) })); - row.appendChild(el('span', { class: 'fg-cell--val', text: 'Lv ' + it.level })); - } - }); - var split = el('div', { style: 'flex:1;display:flex;min-height:0' }); - var left = el('div', { style: 'flex:0 0 240px;display:flex;flex-direction:column;border-right:1px solid var(--fg-border)' }); - left.appendChild(vl.el); - split.appendChild(left); split.appendChild(detail); - body.appendChild(split); vl.rebuild(); - var firstA = API.ops.actors.list()[0]; // auto-select first actor so detail isn't empty - if (firstA) showActor(firstA.id); - function showActor(id) { - selectedId = id; vl.draw(); // re-highlight the selected row in the (virtualized) list - var a = API.ops.actors.get(id); detail.innerHTML = ''; - if (!a) { detail.appendChild(el('div', { class: 'fg-empty', text: 'Actor not initialized (start a game first)' })); return; } - detail.appendChild(el('h2', { text: a.name + ' · Lv ' + a.level, style: 'margin:0 0 12px;font-size:15px' })); - var grid = el('div', { class: 'fg-grid' }); - grid.appendChild(numField('Level', function () { return API.ops.actors.get(id).level; }, function (v) { API.ops.actors.setLevel(id, v); showActor(id); })); - grid.appendChild(numField('EXP', function () { return API.ops.actors.get(id).exp; }, function (v) { API.ops.actors.setExp(id, v); showActor(id); })); - grid.appendChild(statField('HP', id, 'hp', function () { return API.ops.actors.get(id).hp; }, function () { return API.ops.actors.get(id).mhp; }, API.ops.actors.setHp)); - grid.appendChild(statField('MP', id, 'mp', function () { return API.ops.actors.get(id).mp; }, function () { return API.ops.actors.get(id).mmp; }, API.ops.actors.setMp)); - grid.appendChild(statField('TP', id, 'tp', function () { return API.ops.actors.get(id).tp; }, function () { return 100; }, API.ops.actors.setTp)); - a.params.forEach(function (p) { grid.appendChild(numField(p.name, function () { return API.ops.actors.get(id).params[p.id].value; }, function (v) { API.ops.actors.setParam(id, p.id, v); })); }); - detail.appendChild(grid); - var actbar = el('div', { style: 'display:flex;gap:8px;margin:14px 0' }, [ - el('button', { class: 'fg-btn', text: 'Recover All', onclick: function () { API.ops.actors.recover(id); showActor(id); } }), - el('button', { class: 'fg-btn', text: a.inParty ? 'Remove from Party' : 'Add to Party', onclick: function () { if (a.inParty) API.ops.actors.removeFromParty(id); else API.ops.actors.addToParty(id); vl.rebuild(); showActor(id); } }) - ]); - detail.appendChild(actbar); - // skills - detail.appendChild(el('h2', { text: 'Skills', style: 'font-size:13px;margin:10px 0 4px;color:var(--fg-text-dim)' })); - var skbox = el('div', { style: 'max-height:140px;overflow:auto;border:1px solid var(--fg-border);border-radius:7px' }); - a.skills.forEach(function (s) { - var r = el('div', { class: 'fg-field', style: 'padding:3px 10px' }, [ - el('span', { style: 'flex:1;font-size:12px', text: s.id + ': ' + s.name }), - el('button', { class: 'fg-btn fg-btn--ghost', text: s.learned ? 'Forget' : 'Learn', onclick: function () { if (s.learned) API.ops.actors.forget(id, s.id); else API.ops.actors.learn(id, s.id); showActor(id); } }) - ]); - skbox.appendChild(r); - }); - detail.appendChild(skbox); - } - function numField(label, get, set) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, set, {}).el); - f.appendChild(el('span', { style: 'flex:0 0 24px;width:24px' })); // empty lock slot -> steppers align with HP/MP/TP rows - return f; - } - function statField(label, id, stat, get, getMax, setFn) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, function (v) { setFn(id, v); if (API.locks.isStatFrozen(id, stat)) API.locks.freezeStat(id, stat, true); }, {}).el); - f.appendChild(lockBtn(API.locks.isStatFrozen(id, stat), function (on) { API.locks.freezeStat(id, stat, on); })); - return f; - } - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.actors.list().length; } }; - }); - - // Party / Main - section('party', ICONS.party, 'Party', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - d.appendChild(el('div', { class: 'fg-field' }, [ - el('label', { text: 'Gold' }), - stepper(function () { return API.ops.gold.get(); }, function (v) { API.ops.gold.set(v); }, {}).el, - lockBtn(API.LOCK.gold != null, function (on) { API.locks.freezeGold(on); rebuild(); }) - ])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Steps' }), el('span', { text: API.ops.party.steps() })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Members' }), el('span', { text: API.ops.party.members().map(function (m) { return m.name; }).join(', ') || '(none)' })])); - d.appendChild(el('h2', { text: 'Quick actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Gold = Max', onclick: function () { API.ops.gold.set(API.ops.gold.max()); rebuild(); toast('Gold maxed', 'ok'); } }), - el('button', { class: 'fg-btn', text: 'Heal Party', onclick: function () { API.ops.party.members().forEach(function (m) { API.ops.actors.recover(m.id); }); toast('Party healed', 'ok'); } }) - ])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.party.members().length; } }; - }); - - // Map / Teleport - section('map', ICONS.map, 'Map', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var cur = API.ops.map.current(); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Current' }), el('span', { text: 'Map ' + cur.mapId + ' @ (' + cur.x + ',' + cur.y + ')' })])); - var sel = el('select', { class: 'fg-search', style: 'flex:1' }); - API.ops.map.list().forEach(function (m) { sel.appendChild(el('option', { value: m.id, text: m.id + ': ' + m.name })); }); - sel.value = cur.mapId; - var xIn = el('input', { class: 'fg-num', value: cur.x }), yIn = el('input', { class: 'fg-num', value: cur.y }); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Teleport to' }), sel])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'X / Y' }), xIn, yIn, - el('button', { class: 'fg-btn', text: 'Go', onclick: function () { API.ops.map.teleport(Number(sel.value), Number(xIn.value), Number(yIn.value), 0, 2); toast('Teleporting…', 'ok'); } })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Noclip' }), - (function () { var t = el('button', { class: 'fg-toggle' + (API.ops.map.isNoclip() ? ' is-on' : '') }); t.addEventListener('click', function () { var on = !API.ops.map.isNoclip(); API.ops.map.noclip(on); t.classList.toggle('is-on', on); }); return t; })()])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Move speed' }), - stepper(function () { return (window.$gamePlayer && $gamePlayer._moveSpeed) || 4; }, function (v) { API.ops.map.speed(v); }, {}).el])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.map.list().length; } }; - }); - - // Common Events - section('commonev', ICONS.commonev, 'Common Ev.', listSection( - function () { return API.ops.commonev.list(); }, - function (row, it) { - row.className = 'fg-row'; row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - row.appendChild(el('span', { class: 'fg-cell--val' }, el('button', { class: 'fg-btn', text: 'Run', onclick: function () { confirmBox('Run common event ' + it.id + ' (' + it.name + ')?', function () { API.ops.commonev.run(it.id); toast('Reserved CE ' + it.id, 'ok'); }); } }))); - } - )); - - // Data Lock (aggregated frozen targets) - section('locks', ICONS.locks, 'Data Lock', function (body, head) { - head.appendChild(el('button', { class: 'fg-btn fg-btn--danger', text: 'Unfreeze all', onclick: function () { API.locks.clearAll(); rebuild(); toast('All unfrozen'); } })); - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var s = API.locks.summary(); - if (!s.length) { d.appendChild(el('div', { class: 'fg-empty', text: 'No frozen values. Use the lock icon on any row to freeze it.' })); return; } - s.forEach(function (row) { - d.appendChild(el('div', { class: 'fg-field' }, [ - el('span', { style: 'flex:1;font-size:12px', text: row.label }), - el('span', { style: 'color:var(--fg-frozen);font-family:var(--font-mono);margin-right:8px', text: String(row.value) }), - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Unfreeze', onclick: function () { unfreeze(row); rebuild(); } }) - ])); - }); - } - function unfreeze(row) { - if (row.type === 'var') API.locks.freezeVar(row.id, false); - else if (row.type === 'switch') API.locks.freezeSwitch(row.id, false); - else if (row.type === 'item') { var p = row.key.split(':'); API.LOCK.items.delete(row.key); } - else if (row.type === 'stat') { API.LOCK.stats.delete(row.key); } - else if (row.type === 'gold') API.locks.freezeGold(false); - else if (row.type === 'noclip') API.ops.map.noclip(false); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.locks.summary().length; } }; - }); - - // Battle cheats - section('battle', ICONS.battle, 'Cheats', function (body) { - var d = el('div', { class: 'fg-detail' }); - function tog(label, get, set) { - var t = el('button', { class: 'fg-toggle' + (get() ? ' is-on' : '') }); - t.addEventListener('click', function () { var v = !get(); set(v); t.classList.toggle('is-on', v); }); - return el('div', { class: 'fg-field' }, [el('label', { text: label }), t]); - } - d.appendChild(tog('God mode (blocks HP loss)', function () { return API.CHEAT.god; }, API.cheats.setGod)); - d.appendChild(tog('One-hit kill', function () { return API.CHEAT.ohko; }, API.cheats.setOhko)); - d.appendChild(tog('No random encounters', function () { return API.CHEAT.noEncounter; }, API.cheats.setNoEncounter)); - // ---- game speed (speedhack) ---- - d.appendChild(el('h2', { text: 'Game speed', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - var speedRow = el('div', { class: 'fg-field' }); - speedRow.appendChild(el('label', { text: 'Speed' })); - var seg = el('div', { class: 'fg-segmented', style: 'flex-wrap:wrap' }); - var presets = [['0.5×', 0.5], ['1×', 1], ['2×', 2], ['3×', 3], ['5×', 5], ['8×', 8]]; - function keyLabel(k) { return k === 'Control' ? 'Ctrl' : (k === ' ' ? 'Space' : k); } - // In KEY mode the highlight = the ARMED target (_speedBoost); in ALWAYS-ON mode = the live speed. - function targetSpeed() { return API._speedUseKey ? (API._speedBoost || 2) : (API.CHEAT.speed || 1); } - function syncSeg() { var t = targetSpeed(); Array.prototype.forEach.call(seg.children, function (b) { b.classList.toggle('is-active', Number(b.dataset.v) === t); }); if (typeof custom !== 'undefined' && custom) custom.value = t; } - // Picking a speed ARMS the target. It only changes the live game speed if key-mode is OFF, or if - // the speedhack is already active (then it live-updates). So buttons respect the key toggle. - function pick(v) { - API._speedBoost = v; store('speedBoost', v); - if (!API._speedUseKey || API.CHEAT.speed !== 1) { API.cheats.setSpeed(v); toast('Speed ' + v + '×', 'ok'); } - else { toast('Armed ' + v + '× — hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - syncSeg(); - } - presets.forEach(function (p) { - var b = el('button', { text: p[0] }); b.dataset.v = p[1]; - b.addEventListener('click', function () { pick(p[1]); }); - seg.appendChild(b); - }); - speedRow.appendChild(seg); - d.appendChild(speedRow); - var customRow = el('div', { class: 'fg-field' }); - customRow.appendChild(el('label', { text: 'Custom ×' })); - var custom = el('input', { class: 'fg-num', type: 'text', value: targetSpeed() }); - custom.addEventListener('keydown', function (e) { if (e.key === 'Enter') { pick(Number(custom.value) || 1); custom.blur(); } }); - custom.addEventListener('blur', function () { pick(Number(custom.value) || 1); }); - customRow.appendChild(custom); - d.appendChild(customRow); - - // ---- use-key toggle (off => speed is always on) ---- - var useKeyRow = el('div', { class: 'fg-field' }); - useKeyRow.appendChild(el('label', { text: 'Use hold key' })); - var ukTog = el('button', { class: 'fg-toggle' + (API._speedUseKey ? ' is-on' : '') }); - ukTog.addEventListener('click', function () { - speedHeld = false; // changing mode ends any active hold so a later key-release won't reset speed - var on = !API._speedUseKey; API._speedUseKey = on; store('speedUseKey', on); ukTog.classList.toggle('is-on', on); - keyRow.style.display = on ? '' : 'none'; - if (on) { API.cheats.setSpeed(1); toast('Speed: hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - else { API.cheats.setSpeed(API._speedBoost || 2); toast('Speed: always on at ' + (API._speedBoost || 2) + '×', 'ok'); } - syncSeg(); - }); - useKeyRow.appendChild(ukTog); - d.appendChild(useKeyRow); - - // ---- rebindable key ---- - var keyRow = el('div', { class: 'fg-field' }); - keyRow.appendChild(el('label', { text: 'Hold key' })); - var keyBtn = el('button', { class: 'fg-btn', text: keyLabel(API._speedKey) }); - keyBtn.addEventListener('click', function () { - keyBtn.textContent = 'Press a key…'; API._capturingSpeedKey = true; - function cap(ev) { - ev.preventDefault(); ev.stopPropagation(); - window.removeEventListener('keydown', cap, true); API._capturingSpeedKey = false; - if (ev.key !== 'Escape') { API._speedKey = ev.key; store('speedKey', ev.key); } - keyBtn.textContent = keyLabel(API._speedKey); - } - window.addEventListener('keydown', cap, true); - }); - keyRow.appendChild(keyBtn); - keyRow.style.display = API._speedUseKey ? '' : 'none'; - d.appendChild(keyRow); - syncSeg(); - d.appendChild(el('h2', { text: 'In-battle actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Instant Win', onclick: function () { API.cheats.instantWin(); toast(API.ops.battle.inBattle() ? 'Enemies downed' : 'Not in battle', API.ops.battle.inBattle() ? 'ok' : 'warn'); } }), - el('button', { class: 'fg-btn', text: 'Flee / Abort', onclick: function () { API.cheats.flee(); } }) - ])); - body.appendChild(d); - return { refresh: function () {}, count: function () { return 0; } }; - }); - - // ---------- render / navigation ---------- - function escapeHtml(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } - function lockBtn(frozen, onToggle) { - var b = el('button', { class: 'fg-lock' + (frozen ? ' is-frozen' : ''), html: frozen ? ICONS.lock : ICONS.unlock, title: 'Freeze value' }); - b.addEventListener('click', function () { frozen = !frozen; b.className = 'fg-lock' + (frozen ? ' is-frozen' : ''); b.innerHTML = frozen ? ICONS.lock : ICONS.unlock; onToggle(frozen); }); - return b; - } - function refreshActive() { if (activeRenderer && activeRenderer.refresh) activeRenderer.refresh(); updateStatus(); } - - SECTIONS.forEach(function (s) { - var item = el('button', { class: 'fg-rail__item', title: s.title }, [el('span', { class: 'ic', html: s.icon }), el('span', { text: s.title.split(' ')[0] })]); - item.addEventListener('click', function () { selectSection(s.id); }); - s._rail = item; rail.appendChild(item); - }); - - function selectSection(id) { - currentSection = id; - SECTIONS.forEach(function (s) { s._rail.classList.toggle('is-active', s.id === id); }); - render(); - store('lastSection', id); - } - function render() { - var s = SECTIONS.filter(function (x) { return x.id === currentSection; })[0]; if (!s) return; - content.innerHTML = ''; - var head = el('div', { class: 'fg-subtoolbar' }); - var sectionHead = el('div', { class: 'fg-section-head' }, [el('h2', { text: s.title }), el('span', { class: 'fg-count', text: '' }), el('span', { class: 'fg-spacer' })]); - content.appendChild(sectionHead); - content.appendChild(head); - var body = el('div', { style: 'flex:1;display:flex;flex-direction:column;min-height:0' }); - content.appendChild(body); - activeRenderer = s.builder(body, head) || {}; - if (head.children.length === 0) head.remove(); - var cnt = activeRenderer.count ? activeRenderer.count() : 0; - sectionHead.querySelector('.fg-count').textContent = cnt + (cnt === 1 ? ' entry' : ' entries'); - // Search only applies to list sections (those expose setQuery); hide it on form sections. - var searchable = !!activeRenderer.setQuery; - // keep the search box's flex space (invisible, not removed) so the titlebar buttons stay anchored right - search.style.visibility = searchable ? 'visible' : 'hidden'; - if (searchable && search.value) activeRenderer.setQuery(search.value.trim()); - updateStatus(); - } - function updateStatus() { - var frozen = API.locks.summary().length; - statusbar.innerHTML = ''; - statusbar.appendChild(el('span', { text: API.env.IS_MZ ? 'RPG Maker MZ' : 'RPG Maker MV' })); - statusbar.appendChild(el('span', { class: 'fg-spacer', style: 'flex:1' })); - statusbar.appendChild(el('span', { text: (frozen ? frozen + ' frozen · ' : '') + 'F10 to toggle' })); - } - - search.addEventListener('input', debounce(function () { if (activeRenderer && activeRenderer.setQuery) activeRenderer.setQuery(search.value.trim()); }, 120)); - function debounce(fn, ms) { var t; return function () { clearTimeout(t); t = setTimeout(fn, ms); }; } - - // ---------- show / hide / hotkeys ---------- - var visible = false; - function show() { visible = true; try { document.body.appendChild(host); } catch (e) {} panel.style.display = 'flex'; launcher.style.display = 'none'; if (!currentSection) selectSection(load('lastSection', 'vars')); else render(); } - function hide() { visible = false; panel.style.display = 'none'; launcher.style.display = 'flex'; API.CHEAT.uiFocused = false; if (typeof Input !== 'undefined' && Input.clear) Input.clear(); } - function toggle() { if (visible) hide(); else show(); } - panel.style.display = 'none'; - - // Speed key = HOLD to fast-forward: while the key is held the game runs at the armed boost speed; - // on release it returns to 1x. Only active when the "use key" option is on. Gated to !uiFocused so - // holding a key while typing in the panel never fast-forwards. - var speedHeld = false; - function isSpeedKey(k) { var sk = API._speedKey || 'Control'; return k === sk || (sk === 'Control' && k === 'Ctrl'); } - function holdStart() { if (!speedHeld) { speedHeld = true; API.cheats.setSpeed(API._speedBoost || 2); toast('Fast-forward ' + API.CHEAT.speed + '×', 'ok'); } } - function holdEnd() { if (speedHeld) { speedHeld = false; API.cheats.setSpeed(1); } } - window.addEventListener('keydown', function (e) { - if (API._capturingSpeedKey) return; // a key-rebind is in progress - var key = e.key || ''; - if (key === (API._hotkey || 'F10')) { e.preventDefault(); toggle(); return; } - if (visible && (e.ctrlKey || e.metaKey) && key.toLowerCase() === 'k') { e.preventDefault(); search.focus(); search.select(); } - else if (visible && key === 'Escape') { if (shadow.activeElement && shadow.activeElement.tagName === 'INPUT') shadow.activeElement.blur(); else hide(); } - if (API._speedUseKey && isSpeedKey(key) && !API.CHEAT.uiFocused) holdStart(); // hold to fast-forward - }, true); - window.addEventListener('keyup', function (e) { - if (API._capturingSpeedKey) return; - if (isSpeedKey(e.key || '')) holdEnd(); - }, true); - window.addEventListener('blur', holdEnd); // alt-tab / focus loss -> stop fast-forward (no stuck key) - - // expose - return { - show: show, hide: hide, toggle: toggle, toast: toast, render: render, - isVisible: function () { return visible; }, root: rootEl, host: host, - select: selectSection, sections: SECTIONS.map(function (s) { return s.id; }) - }; - } - -})(typeof window !== 'undefined' ? window : (typeof globalThis !== 'undefined' ? globalThis : this)); - -/* ---- MZ scaffolding (registerCommand + start-open) ---- */ -(function () { - var P = (typeof PluginManager !== 'undefined' && PluginManager.parameters) ? PluginManager.parameters('Forge_MZ') : {}; - if (window.Forge) { - window.Forge._hotkey = (P.hotkey || 'F10').trim(); - window.Forge._itemMaxOverride = Number(P.itemMaxOverride) || 0; - try { if (!localStorage.getItem('forge:speedKey')) window.Forge._speedKey = (P.speedKey || 'Control').trim(); } catch (e) { window.Forge._speedKey = (P.speedKey || 'Control').trim(); } - } - if (typeof PluginManager !== 'undefined' && PluginManager.registerCommand) { - PluginManager.registerCommand('Forge_MZ', 'open', function () { if (window.Forge && window.Forge.ui) window.Forge.ui.toggle(); }); - } - if (String(P.startOpen) === 'true' && typeof Scene_Map !== 'undefined') { - var _s = Scene_Map.prototype.start; - Scene_Map.prototype.start = function () { _s.call(this); if (window.Forge && window.Forge.ui && !window.Forge.ui.isVisible()) window.Forge.ui.show(); }; - } -})(); - +(function(){var e=document.createElement(`style`);e.textContent=`@import "https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap";:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:#ff6568;--color-orange-400:#ff8b1a;--color-yellow-300:#ffe02a;--color-yellow-400:#fac800;--color-yellow-500:#edb200;--color-fuchsia-500:#e12afb;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c10;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}@supports (color:lab(0% 0 0)){:root,:host{--color-red-400:lab(63.7053% 60.745 31.3109);--color-orange-400:lab(70.0429% 42.5156 75.8207);--color-yellow-300:lab(89.7033% -.480294 84.4917);--color-yellow-400:lab(83.2664% 8.65132 106.895);--color-yellow-500:lab(76.3898% 14.5258 98.4589);--color-fuchsia-500:lab(56.4256% 83.132 -64.639);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425)}}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-left:20px}:where(select:is([multiple],[size])) optgroup option{padding-left:20px}::-webkit-file-upload-button{margin-right:4px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{top:0;bottom:0;left:0;right:0}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\\[-0\\.5px\\]{top:-.5px}.top-\\[4px\\]{top:4px}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.left-4{left:calc(var(--spacing) * 4)}.left-\\[4px\\]{left:4px}.left-\\[24px\\]{left:24px}.z-2147482999{z-index:2147482999}.z-2147483000{z-index:2147483000}.z-2147483647{z-index:2147483647}.m-0{margin:0}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-0{min-height:0}.w-1\\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(140px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(160px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(260px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(300px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{grid-gap:calc(var(--spacing) * 2);gap:calc(var(--spacing) * 2)}.gap-3{grid-gap:calc(var(--spacing) * 3);gap:calc(var(--spacing) * 3)}.gap-4{grid-gap:calc(var(--spacing) * 4);gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(var(--spacing) * var(--tw-space-y-reverse));margin-bottom:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(var(--spacing) * var(--tw-space-x-reverse));margin-right:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.divide-border\\/50>:not(:last-child)){border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\\[\\#2a2d3a\\]{border-color:#2a2d3a}.border-accent{border-color:var(--color-accent)}.border-accent\\/30{border-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/30{border-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.border-accent\\/50{border-color:rgba(99,102,241,.5)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/50{border-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.border-border{border-color:var(--color-border)}.border-border\\/50{border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-danger\\/30{border-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.border-danger\\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-fuchsia-500\\/30{border-color:rgba(225,42,251,.3)}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\\/30{border-color:color-mix(in oklab, var(--color-fuchsia-500) 30%, transparent)}}.border-gray-500\\/30{border-color:rgba(106,114,130,.3)}@supports (color:color-mix(in lab, red, red)){.border-gray-500\\/30{border-color:color-mix(in oklab, var(--color-gray-500) 30%, transparent)}}.border-ok\\/30{border-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.border-ok\\/30{border-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.border-warn\\/30{border-color:rgba(251,146,60,.3)}@supports (color:color-mix(in lab, red, red)){.border-warn\\/30{border-color:color-mix(in oklab, var(--color-warn) 30%, transparent)}}.border-yellow-500\\/30{border-color:rgba(237,178,0,.3)}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\\/30{border-color:color-mix(in oklab, var(--color-yellow-500) 30%, transparent)}}.border-l-frozen{border-left-color:var(--color-frozen)}.bg-\\[\\#1a1d24\\]{background-color:#1a1d24}.bg-\\[\\#3a3f4d\\]{background-color:#3a3f4d}.bg-\\[\\#7ba4ff\\]\\/10{background-color:rgba(123,164,255,.1);background-color:lab(67.3388% 4.90472 -50.2993/.1)}.bg-\\[\\#13151a\\]{background-color:#13151a}.bg-accent{background-color:var(--color-accent)}.bg-accent-weak{background-color:var(--color-accent-weak)}.bg-accent\\/5{background-color:rgba(99,102,241,.05)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/5{background-color:color-mix(in oklab, var(--color-accent) 5%, transparent)}}.bg-accent\\/10{background-color:rgba(99,102,241,.1)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/10{background-color:color-mix(in oklab, var(--color-accent) 10%, transparent)}}.bg-accent\\/20{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/20{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg2{background-color:var(--color-bg2)}.bg-border{background-color:var(--color-border)}.bg-border\\/50{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.bg-border\\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-danger{background-color:var(--color-danger)}.bg-danger\\/10{background-color:rgba(239,68,68,.1)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-danger\\/20{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/20{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.bg-frozen\\/20{background-color:rgba(139,92,246,.2)}@supports (color:color-mix(in lab, red, red)){.bg-frozen\\/20{background-color:color-mix(in oklab, var(--color-frozen) 20%, transparent)}}.bg-fuchsia-500\\/10{background-color:rgba(225,42,251,.1)}@supports (color:color-mix(in lab, red, red)){.bg-fuchsia-500\\/10{background-color:color-mix(in oklab, var(--color-fuchsia-500) 10%, transparent)}}.bg-gray-500\\/10{background-color:rgba(106,114,130,.1)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-ok{background-color:var(--color-ok)}.bg-ok\\/10{background-color:rgba(16,185,129,.1)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/10{background-color:color-mix(in oklab, var(--color-ok) 10%, transparent)}}.bg-ok\\/20{background-color:rgba(16,185,129,.2)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/20{background-color:color-mix(in oklab, var(--color-ok) 20%, transparent)}}.bg-transparent{background-color:transparent}.bg-warn\\/10{background-color:rgba(251,146,60,.1)}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500\\/10{background-color:rgba(237,178,0,.1)}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\\/10{background-color:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-left:var(--spacing);padding-right:var(--spacing)}.px-1\\.5{padding-left:calc(var(--spacing) * 1.5);padding-right:calc(var(--spacing) * 1.5)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-2\\.5{padding-left:calc(var(--spacing) * 2.5);padding-right:calc(var(--spacing) * 2.5)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-3\\.5{padding-left:calc(var(--spacing) * 3.5);padding-right:calc(var(--spacing) * 3.5)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.py-0\\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:var(--spacing);padding-bottom:var(--spacing)}.py-1\\.5{padding-top:calc(var(--spacing) * 1.5);padding-bottom:calc(var(--spacing) * 1.5)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[\\#7ba4ff\\]{color:#7ba4ff}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-frozen{color:var(--color-frozen)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-ok{color:var(--color-ok)}.text-orange-400{color:var(--color-orange-400)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,rgba(0,0,0,.1)), 0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{user-select:none}.select-text{user-select:text}@media (hover:hover){.group-hover\\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.first-letter\\:text-\\[\\#7ba4ff\\]:first-letter{color:#7ba4ff}@media (hover:hover){.hover\\:bg-\\[\\#2a2d3a\\]:hover{background-color:#2a2d3a}.hover\\:bg-accent\\/20:hover{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/20:hover{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.hover\\:bg-accent\\/30:hover{background-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\\:bg-accent\\/80:hover{background-color:rgba(99,102,241,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--color-accent) 80%, transparent)}}.hover\\:bg-accent\\/85:hover{background-color:rgba(99,102,241,.85)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/85:hover{background-color:color-mix(in oklab, var(--color-accent) 85%, transparent)}}.hover\\:bg-border:hover{background-color:var(--color-border)}.hover\\:bg-border\\/30:hover{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/30:hover{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.hover\\:bg-border\\/50:hover{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/50:hover{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.hover\\:bg-border\\/80:hover{background-color:rgba(34,37,51,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/80:hover{background-color:color-mix(in oklab, var(--color-border) 80%, transparent)}}.hover\\:bg-danger\\/20:hover{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/20:hover{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-danger\\/80:hover{background-color:rgba(239,68,68,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/80:hover{background-color:color-mix(in oklab, var(--color-danger) 80%, transparent)}}.hover\\:bg-frozen\\/30:hover{background-color:rgba(139,92,246,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-frozen\\/30:hover{background-color:color-mix(in oklab, var(--color-frozen) 30%, transparent)}}.hover\\:bg-ok\\/30:hover{background-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-ok\\/30:hover{background-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-gray-200:hover{color:var(--color-gray-200)}.hover\\:text-gray-300:hover{color:var(--color-gray-300)}.hover\\:text-gray-400:hover{color:var(--color-gray-400)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\\:opacity-100:hover{opacity:1}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.focus\\:bg-border\\/30:focus{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.focus\\:bg-border\\/30:focus{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:opacity-50:disabled{opacity:.5}:host{--color-bg:#0b0c10;--color-bg-elev:#13151f;--color-bg-input:#1a1c29;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-text-faint:#646b7d;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#222533;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#6366f1}body,:host{color:#f1f5f9;font-family:Outfit,system-ui,-apple-system,sans-serif}*,:after,:before{--tw-border-style:solid}.cursor-grab{cursor:-webkit-grab;cursor:grab}.active\\:cursor-grabbing:active{cursor:-webkit-grabbing;cursor:grabbing}.space-x-1>:not([hidden])~:not([hidden]){margin-left:4px}.space-x-1\\.5>:not([hidden])~:not([hidden]){margin-left:6px}.space-x-2>:not([hidden])~:not([hidden]){margin-left:8px}.space-x-2\\.5>:not([hidden])~:not([hidden]){margin-left:10px}.space-x-3>:not([hidden])~:not([hidden]){margin-left:12px}.space-x-4>:not([hidden])~:not([hidden]){margin-left:16px}.space-y-0\\.5>:not([hidden])~:not([hidden]){margin-top:2px}.space-y-1>:not([hidden])~:not([hidden]){margin-top:4px}.space-y-2>:not([hidden])~:not([hidden]){margin-top:8px}.space-y-2\\.5>:not([hidden])~:not([hidden]){margin-top:10px}.space-y-3>:not([hidden])~:not([hidden]){margin-top:12px}.space-y-4>:not([hidden])~:not([hidden]){margin-top:16px}.space-y-6>:not([hidden])~:not([hidden]){margin-top:24px}.divide-y>:not([hidden])~:not([hidden]){border-top-width:1px;border-color:var(--color-border)}input,textarea,[contenteditable=true]{user-select:text!important}button,button:focus{outline:none!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-duration{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-duration:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}} +/*$vite$:1*/`,document.head.appendChild(e);var t=!1,n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}function y(e){"@babel/helpers - typeof";return y=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},y(e)}function b(e,t){if(y(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(y(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function x(e){var t=b(e,`string`);return y(t)==`symbol`?t:t+``}function S(e,t,n){return(t=x(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ee,C=1<<24,w=1024,te=2048,ne=4096,re=8192,ie=16384,ae=32768,oe=1<<25,se=65536,ce=1<<19,le=1<<20,ue=1<<25,de=65536,fe=1<<21,pe=1<<22,me=1<<23,he=Symbol(`$state`),ge=Symbol(`legacy props`),_e=Symbol(``),ve=Symbol(`proxy path`),ye=Symbol(`attributes`),be=Symbol(`class`),xe=Symbol(`style`),Se=Symbol(`text`),Ce=Symbol(`form reset`),we=Symbol(`hmr anchor`),Te=new class extends Error{constructor(...e){super(...e),S(this,`name`,`StaleReactionError`),S(this,`message`,"The reaction that called `getAbortSignal()` was re-run or destroyed")}},Ee=!!((ee=globalThis.document)!=null&&ee.contentType)&&globalThis.document.contentType.includes(`xml`);function De(e){if(t){let t=Error(`invariant_violation\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: "${e}"\nhttps://svelte.dev/e/invariant_violation`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/invariant_violation`)}function Oe(e){if(t){let t=Error(`lifecycle_outside_component\n\`${e}(...)\` can only be used during component initialisation\nhttps://svelte.dev/e/lifecycle_outside_component`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){if(t){let e=Error("async_derived_orphan\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\nhttps://svelte.dev/e/async_derived_orphan");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(){if(t){let e=Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/bind_invalid_checkbox_value`)}function je(){if(t){let e=Error(`derived_references_self +A derived value cannot reference itself recursively +https://svelte.dev/e/derived_references_self`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/derived_references_self`)}function Me(e,n,r){if(t){let t=Error(`each_key_duplicate\n${r?`Keyed each block has duplicate key \`${r}\` at indexes ${e} and ${n}`:`Keyed each block has duplicate key at indexes ${e} and ${n}`}\nhttps://svelte.dev/e/each_key_duplicate`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ne(e,n,r){if(t){let t=Error(`each_key_volatile\nKeyed each block has key that is not idempotent — the key for item at index ${e} was \`${n}\` but is now \`${r}\`. Keys must be the same each time for a given item\nhttps://svelte.dev/e/each_key_volatile`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_volatile`)}function Pe(e){if(t){let t=Error(`effect_in_teardown\n\`${e}\` cannot be used inside an effect cleanup function\nhttps://svelte.dev/e/effect_in_teardown`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Fe(){if(t){let e=Error(`effect_in_unowned_derived +Effect cannot be created inside a \`$derived\` value that was not itself created inside an effect +https://svelte.dev/e/effect_in_unowned_derived`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ie(e){if(t){let t=Error(`effect_orphan\n\`${e}\` can only be used inside an effect (e.g. during component initialisation)\nhttps://svelte.dev/e/effect_orphan`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_orphan`)}function Le(){if(t){let e=Error(`effect_update_depth_exceeded +Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state +https://svelte.dev/e/effect_update_depth_exceeded`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Re(){if(t){let e=Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/invalid_snippet`)}function ze(e){if(t){let t=Error(`props_invalid_value\nCannot do \`bind:${e}={undefined}\` when \`${e}\` has a fallback value\nhttps://svelte.dev/e/props_invalid_value`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_invalid_value`)}function Be(e){if(t){let t=Error(`props_rest_readonly\nRest element properties of \`$props()\` such as \`${e}\` are readonly\nhttps://svelte.dev/e/props_rest_readonly`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_rest_readonly`)}function Ve(e){if(t){let t=Error(`rune_outside_svelte\nThe \`${e}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files\nhttps://svelte.dev/e/rune_outside_svelte`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/rune_outside_svelte`)}function He(){if(t){let e=Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){if(t){let e=Error(`state_prototype_fixed +Cannot set prototype of \`$state\` object +https://svelte.dev/e/state_prototype_fixed`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){if(t){let e=Error("state_unsafe_mutation\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){if(t){let e=Error("svelte_boundary_reset_onerror\nA `` `reset` function cannot be called while an error is still being handled\nhttps://svelte.dev/e/svelte_boundary_reset_onerror");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke={},qe=Symbol(`uninitialized`),Je=Symbol(`filename`),Ye=`http://www.w3.org/1999/xhtml`,Xe=`http://www.w3.org/2000/svg`,Ze=`font-weight: bold`,Qe=`font-weight: normal`;function $e(e){t?console.warn(`%c[svelte] await_reactivity_loss\n%cDetected reactivity loss when reading \`${e}\`. This happens when state is read in an async function after an earlier \`await\`\nhttps://svelte.dev/e/await_reactivity_loss`,Ze,Qe):console.warn(`https://svelte.dev/e/await_reactivity_loss`)}function et(e,n){t?console.warn(`%c[svelte] await_waterfall\n%cAn async derived, \`${e}\` (${n}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\nhttps://svelte.dev/e/await_waterfall`,Ze,Qe):console.warn(`https://svelte.dev/e/await_waterfall`)}function tt(){t?console.warn(`%c[svelte] derived_inert +%cReading a derived belonging to a now-destroyed effect may result in stale values +https://svelte.dev/e/derived_inert`,Ze,Qe):console.warn(`https://svelte.dev/e/derived_inert`)}function nt(e,n,r){t?console.warn(`%c[svelte] hydration_attribute_changed\n%cThe \`${e}\` attribute on \`${n}\` changed its value between server and client renders. The client value, \`${r}\`, will be ignored in favour of the server value\nhttps://svelte.dev/e/hydration_attribute_changed`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_attribute_changed`)}function rt(e){t?console.warn(`%c[svelte] hydration_mismatch\n%c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:`Hydration failed because the initial UI does not match what was rendered on the server`}\nhttps://svelte.dev/e/hydration_mismatch`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_mismatch`)}function it(){t?console.warn("%c[svelte] select_multiple_invalid_value\n%cThe `value` property of a ` `);function fl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,0),r=Hs(t,`min`,19,()=>-1/0),i=Hs(t,`max`,3,1/0),a=P(I(String(n())));Mi(()=>{F(a,String(n()),!0)});let o=()=>{var e;let o=parseFloat(H(a));isNaN(o)&&(o=n()),o=Math.max(r(),Math.min(i(),o)),n(o),F(a,String(o),!0),(e=t.onchange)==null||e.call(t,n())},s=(e,o)=>{var s;o.shiftKey&&(e*=10);let c=n()+e;c=Math.max(r(),Math.min(i(),c)),n(c),F(a,String(c),!0),(s=t.onchange)==null||s.call(t,n())},c=e=>{e.stopPropagation(),e.key===`Enter`?(o(),e.target.blur()):e.key===`Escape`&&(F(a,String(n()),!0),e.target.blur())};var l=dl(),u=L(l),d=R(u,2);us(d);var f=R(d,2);D(l),U(`click`,u,e=>s(-1,e)),Ua(`blur`,d,o),U(`keydown`,d,c),Cs(d,()=>H(a),e=>F(a,e)),U(`click`,f,e=>s(1,e)),G(e,l),Nt()}Wa([`click`,`keydown`]);var pl=W(``);function ml(e,t){Mt(t,!0);let n=Hs(t,`locked`,3,!1);var r=pl(),i=L(r),a=e=>{uc(e,{size:14})},o=e=>{cc(e,{size:14})};mo(i,e=>{n()?e(a):e(o,-1)}),D(r),z(()=>{Jo(r,1,`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors focus:outline-none ${n()?`bg-frozen/20 text-frozen hover:bg-frozen/30`:`hover:bg-border text-gray-500 hover:text-gray-300`}`),ps(r,`title`,n()?`Unfreeze`:`Freeze`),ps(r,`aria-label`,n()?`Unfreeze state`:`Freeze state`)}),U(`click`,r,()=>{var e;return(e=t.ontoggle)==null?void 0:e.call(t,!n())}),G(e,r),Nt()}Wa([`click`]);var hl=W(``),gl=W(``),_l=W(`
`),vl=W(`
`);function yl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetVarId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetVarId);e!==-1&&H(a).scrollToIndex(e),Q.targetVarId=null}});let o,s=P(!1),c=new Set,l=I({}),u=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||t.value!==void 0&&t.value!==null&&String(t.value).toLowerCase().includes(e));c=new Set(t.map(e=>e.id))}},d=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`variables`,e.id),r=Zc.isFavorite(`variables`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},f=()=>{F(n,q.vars.list(),!0),u(),d()},p=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(s)||(F(n,q.vars.list(),!0),d())},1e3);return()=>clearInterval(e)});let h=(e,t)=>{q.vars.set(e,t),Y.vars.has(e)&&X.freezeVar(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)};var g=vl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y);D(y),D(_);var x=R(_,2);Ps(ul(L(x),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{let r=Wn(()=>l[t().id]||typeof t().value);var i=_l(),a=L(i),o=L(a,!0);D(a);var c=R(a,2),u=L(c),f=L(u,!0);D(u),D(c);var p=R(c,2),g=L(p),_=L(g);{let e=Wn(()=>Zc.isFavorite(`variables`,t().id)?`fill-current`:``);bc(_,{size:16,get class(){return H(e)}})}D(g);var v=R(g,2),y=L(v,!0);D(v);var b=R(v,2),x=e=>{{let n=Wn(()=>Number(t().value)||0);fl(e,{get value(){return H(n)},onchange:e=>h(t().id,e)})}},S=e=>{var n=hl(),r=L(n);r.value=r.__value=`true`;var i=R(r);i.value=i.__value=`false`,D(n);var a;Qo(n),z(()=>{a!==(a=t().value?`true`:`false`)&&(n.value=n.__value=t().value?`true`:`false`,Zo(n,t().value?`true`:`false`))}),U(`change`,n,e=>h(t().id,e.currentTarget.value===`true`)),G(e,n)},ee=e=>{var n=gl();us(n),z(e=>ds(n,e),[()=>String(t().value===void 0||t().value===null?``:t().value)]),Ua(`blur`,n,e=>h(t().id,e.currentTarget.value)),U(`keydown`,n,e=>{e.stopPropagation(),e.key===`Enter`&&e.currentTarget.blur()}),G(e,n)};mo(b,e=>{H(r)===`number`?e(x):H(r)===`boolean`?e(S,1):e(ee,-1)});var C=R(b,2),w=L(C);{let e=Wn(()=>Y.vars.has(t().id));ml(w,{get locked(){return H(e)},ontoggle:e=>{X.freezeVar(t().id,e),F(n,[...H(n)],!0),d()}})}D(C),D(p),D(i),z((e,n,a)=>{Jo(i,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(o,n),ps(u,`title`,t().name),K(f,t().name),Jo(g,1,`mr-2 flex items-center justify-center transition-colors ${a==null?``:a}`),K(y,H(r)===`number`?`NUM`:H(r)===`string`?`STR`:`BOOL`)},[()=>Y.vars.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`variables`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,p,()=>F(s,!0)),U(`focusout`,p,()=>F(s,!1)),U(`click`,g,()=>{Zc.toggleFavorite(`variables`,t().id),d()}),U(`click`,v,()=>{(l[t().id]||typeof t().value)===`number`?l[t().id]=`string`:l[t().id]=`number`}),G(e,i)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(x),D(g),z(()=>{var e;ds(v,H(i)),K(b,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,p),G(e,g),Nt()}Wa([`input`,`focusin`,`focusout`,`click`,`change`,`keydown`]);var bl=W(``);function xl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,!1),r=()=>{var e;n(!n()),(e=t.onchange)==null||e.call(t,n())};var i=bl(),a=L(i);D(i),z(()=>{Jo(i,1,`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${n()?`bg-ok`:`bg-[#3a3f4d]`}`),Jo(a,1,`absolute top-[4px] h-4 w-4 rounded-full bg-white shadow transition-all ${n()?`left-[24px]`:`left-[4px]`}`)}),U(`click`,i,r),G(e,i),Nt()}Wa([`click`]);var Sl=W(`
`),Cl=W(`
`);function wl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetSwitchId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetSwitchId);e!==-1&&H(a).scrollToIndex(e),Q.targetSwitchId=null}});let o,s=P(!1),c=new Set,l=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||(t.value?`true`:`false`).includes(e));c=new Set(t.map(e=>e.id))}},u=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`switches`,e.id),r=Zc.isFavorite(`switches`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},d=()=>{F(n,q.switches.list(),!0),l(),u()},f=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{l(),u()},300)};Ws(()=>{d();let e=setInterval(()=>{H(s)||(F(n,q.switches.list(),!0),u())},1e3);return()=>clearInterval(e)});let p=(e,t)=>{q.switches.set(e,t),Y.switches.has(e)&&X.freezeSwitch(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)},h=e=>{H(r).forEach(t=>p(t.id,e)),d(),zc.show(`All filtered switches turned ${e?`ON`:`OFF`}`,`success`)};var g=Cl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y),x=R(b,2),S=R(x,2),ee=L(S);D(S),D(y),D(_);var C=R(_,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{var r=Sl(),i=L(r),a=L(i,!0);D(i);var o=R(i,2),c=L(o),l=L(c,!0);D(c),D(o);var d=R(o,2),f=L(d),h=L(f);{let e=Wn(()=>Zc.isFavorite(`switches`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(f);var g=R(f,2);xl(g,{get value(){return t().value},onchange:e=>p(t().id,e)});var _=R(g,2),v=L(_);{let e=Wn(()=>Y.switches.has(t().id));ml(v,{get locked(){return H(e)},ontoggle:e=>{X.freezeSwitch(t().id,e),F(n,[...H(n)],!0),u()}})}D(_),D(d),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),Jo(c,1,`truncate text-sm select-text cursor-text ${t().value?`text-white font-bold`:`text-gray-400`}`),K(l,t().name),Jo(f,1,`flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.switches.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`switches`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),Ua(`mouseenter`,d,()=>F(s,!0)),Ua(`mouseleave`,d,()=>F(s,!1)),U(`click`,f,()=>{Zc.toggleFavorite(`switches`,t().id),u()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(g),z(()=>{var e;ds(v,H(i)),K(ee,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,f),U(`click`,b,()=>h(!0)),U(`click`,x,()=>h(!1)),G(e,g),Nt()}Wa([`input`,`click`]);var Tl=W(`
`),El=W(`
`),Dl=W(`
`);function Ol(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetItemKey!==null&&H(a)){let[e,t]=Q.targetItemKey.split(`:`);if(e===H(o)){if(H(r).length>0){let e=H(r).findIndex(e=>e.id===parseInt(t,10));e!==-1&&H(a).scrollToIndex(e),Q.targetItemKey=null}}else p(e)}});let o=P(I(Fc.Item)),s,c=P(!1),l=new Set,u=()=>{if(!H(i).trim())l=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||String(t.count).includes(e)||t.description&&t.description.toLowerCase().includes(e));l=new Set(t.map(e=>e.id))}},d=()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;F(r,H(n).filter(e=>l.has(e.id)).sort((t,n)=>{let r=Zc.isFavorite(e,t.id),i=Zc.isFavorite(e,n.id);return r&&!i?-1:!r&&i?1:t.id-n.id}),!0)},f=()=>{F(n,q.inv.list(H(o)),!0),u(),d()},p=e=>{F(o,e,!0),f(),H(a)&&H(a).resetScroll()},h=e=>{F(i,e.target.value,!0),clearTimeout(s),s=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(c)||(F(n,q.inv.list(H(o)),!0),d())},1e3);return()=>clearInterval(e)});let g=(e,t)=>{q.inv.setCount(H(o),e,t),Y.items.has(`${H(o)}:${e}`)&&X.freezeItem(H(o),e,!0)};var _=Dl(),v=L(_),y=L(v),b=L(y),x=R(b,2),S=R(x,2);D(y);var ee=R(y,2);us(ee),D(v);var C=R(v,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:48,itemTemplate:(e,t=m)=>{var r=El(),i=L(r),a=L(i,!0);D(i);var s=R(i,2),l=L(s),u=L(l,!0);D(l);var f=R(l,2),p=e=>{var n=Tl(),r=L(n,!0);D(n),z((e,t)=>{ps(n,`title`,e),K(r,t)},[()=>t().description.replace(/\n/g,` `),()=>t().description.replace(/\n/g,` `)]),G(e,n)};mo(f,e=>{t().description&&e(p)}),D(s);var h=R(s,2),_=L(h),v=L(_);{let e=Wn(()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`fill-current`:``);bc(v,{size:16,get class(){return H(e)}})}D(_);var y=R(_,2);{let e=Wn(()=>q.inv.maxStack(H(o),t().id));fl(y,{get value(){return t().count},min:0,get max(){return H(e)},onchange:e=>g(t().id,e)})}var b=R(y,2),x=L(b);{let e=Wn(()=>Y.items.has(`${H(o)}:${t().id}`));ml(x,{get locked(){return H(e)},ontoggle:e=>{X.freezeItem(H(o),t().id,e),F(n,[...H(n)],!0),d()}})}D(b),D(h),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),ps(l,`title`,t().name),K(u,t().name),Jo(_,1,`mr-1 flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.items.has(`${H(o)}:${t().id}`)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,h,()=>F(c,!0)),U(`focusout`,h,()=>F(c,!1)),U(`click`,_,()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;Zc.toggleFavorite(e,t().id),d()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(_),z(()=>{Jo(b,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Item?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(x,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Weapon?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(S,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Armor?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),ds(ee,H(i))}),U(`click`,b,()=>p(Fc.Item)),U(`click`,x,()=>p(Fc.Weapon)),U(`click`,S,()=>p(Fc.Armor)),U(`input`,ee,h),G(e,_),Nt()}Wa([`click`,`input`,`focusin`,`focusout`]);var kl=W(``),Al=W(``),jl=W(`
`),Ml=W(`
`),Nl=W(`
No skills in database.
`),Pl=W(``),Fl=W(`
`),Il=W(`No active states.`),Ll=W(``),Rl=W(`

Core Status

Level
EXP
HP
MP
TP

Parameters

Skills

States

`,1),zl=W(`
Start a game or select an actor to edit stats.
`),Bl=W(`
Actors
`);function Vl(e,t){Mt(t,!0);let n=P(I([])),r=P(null),i=P(null),a=P(null),o=P(``),s=P(``);Mi(()=>{Q.targetActorId!==null&&H(n).length>0&&(F(r,Q.targetActorId,!0),Q.targetActorId=null,Q.targetActorStat=null,c())});let c=()=>{F(n,J.list(),!0),H(r)===null&&H(n).length>0&&F(r,H(n)[0].id,!0),H(r)!==null&&F(i,J.get(H(r)),!0)};Ws(()=>{c();let e=setInterval(()=>{c()},1e3);return()=>clearInterval(e)});let l=e=>{F(r,e,!0),F(i,J.get(e),!0)},u=(e,t)=>{H(r)!==null&&(e===`hp`?J.setHp(H(r),t):e===`mp`?J.setMp(H(r),t):e===`tp`&&J.setTp(H(r),t),Y.stats.has(`${H(r)}:${e}`)&&X.freezeStat(H(r),e,!0),F(i,J.get(H(r)),!0))},d=(e,t)=>{H(r)!==null&&(J.setParam(H(r),e,t),F(i,J.get(H(r)),!0))},f=()=>{H(r)===null||!H(i)||(H(i).inParty?J.removeFromParty(H(r)):J.addToParty(H(r)),c())},p=(e,t)=>{H(r)!==null&&(t?J.forgetSkill(H(r),e):J.learnSkill(H(r),e),F(i,J.get(H(r)),!0))},m={[Lc.MHP]:`Max HP`,[Lc.MMP]:`Max MP`,[Lc.ATK]:`Attack`,[Lc.DEF]:`Defense`,[Lc.MAT]:`M. Attack`,[Lc.MDF]:`M. Defense`,[Lc.AGI]:`Agility`,[Lc.LUK]:`Luck`};var h=Bl(),g=L(h),_=R(L(g),2);yo(_,21,()=>H(n),ho,(e,t)=>{var n=Al(),i=L(n),a=L(i),o=e=>{G(e,kl())};mo(a,e=>{H(t).inParty&&e(o)});var s=R(a,2),c=L(s,!0);D(s),D(i);var u=R(i,2),d=L(u);D(u),D(n),z(()=>{var e;ps(n,`id`,`actor-btn-${H(t).id}`),Jo(n,1,`flex w-full items-center justify-between rounded px-2.5 py-2 text-left text-sm transition-colors ${H(r)===H(t).id?`bg-accent text-white font-semibold`:`hover:bg-border/50 text-gray-300`}`),K(c,H(t).name),K(d,`Lv.${(e=H(t).level)==null?``:e}`)}),U(`click`,n,()=>l(H(t).id)),G(e,n)}),D(_),D(g);var v=R(g,2),y=L(v),b=e=>{var t,n=Rl(),l=_i(n),h=L(l),g=L(h),_=L(g,!0);D(g);var v=R(g,2),y=L(v);D(v),D(h);var b=R(h,2),x=L(b),S=R(x,2),ee=L(S,!0);D(S),D(b),D(l);var C=R(l,2),w=L(C),te=R(L(w),2),ne=R(L(te),2),re=L(ne);fl(re,{get value(){return H(i).level},min:1,max:99,onchange:e=>{H(r)!==null&&(J.setLevel(H(r),e),Y.stats.has(`${H(r)}:level`)&&X.freezeStat(H(r),`level`,!0),F(i,J.get(H(r)),!0),c())}});var ie=R(re,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:level`));ml(ie,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`level`,e),F(i,J.get(H(r)),!0))}})}D(ne),D(te);var ae=R(te,2),oe=R(L(ae),2),se=L(oe);fl(se,{get value(){return H(i).exp},min:0,onchange:e=>{H(r)!==null&&(J.setExp(H(r),e),Y.stats.has(`${H(r)}:exp`)&&X.freezeStat(H(r),`exp`,!0),F(i,J.get(H(r)),!0),c())}});var ce=R(se,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:exp`));ml(ce,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`exp`,e),F(i,J.get(H(r)),!0))}})}D(oe),D(ae);var le=R(ae,2),ue=R(L(le),2),de=L(ue);fl(de,{get value(){return H(i).hp},min:0,get max(){return H(i).mhp},onchange:e=>u(`hp`,e)});var fe=R(de,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:hp`));ml(fe,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`hp`,e),F(i,J.get(H(r)),!0))}})}D(ue),D(le);var pe=R(le,2),me=R(L(pe),2),he=L(me);fl(he,{get value(){return H(i).mp},min:0,get max(){return H(i).mmp},onchange:e=>u(`mp`,e)});var ge=R(he,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:mp`));ml(ge,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`mp`,e),F(i,J.get(H(r)),!0))}})}D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve);fl(ye,{get value(){return H(i).tp},min:0,get max(){return H(i).mtp},onchange:e=>u(`tp`,e)});var be=R(ye,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:tp`));ml(be,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`tp`,e),F(i,J.get(H(r)),!0))}})}D(ve),D(_e),D(w);var xe=R(w,2);yo(R(L(xe),2),17,()=>H(i).params,e=>e.id,(e,t)=>{var n=jl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2),c=L(s);fl(c,{get value(){return H(t).value},min:1,onchange:e=>{d(H(t).id,e),Y.stats.has(`${H(r)}:param_${H(t).id}`)&&X.freezeStat(H(r),`param_${H(t).id}`,!0)}});var l=R(c,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:param_${H(t).id}`));ml(l,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`param_${H(t).id}`,e),F(i,J.get(H(r)),!0))}})}D(s),D(n),z(()=>{ps(n,`id`,`stat-param_${H(t).id}`),K(o,m[H(t).id]||`Stat`)}),G(e,n)}),D(xe),D(C);var Se=R(C,2),Ce=L(Se),we=R(L(Ce),2);us(we),D(Ce);var Te=R(Ce,2);yo(Te,21,()=>H(i).skills.filter(e=>!H(o).trim()||e.name.toLowerCase().includes(H(o).trim().toLowerCase())||e.id.toString().includes(H(o).trim())),e=>e.id,(e,t)=>{var n=Ml(),r=L(n),i=L(r);D(r);var a=R(r,2),o=L(a,!0);D(a),D(n),z(e=>{var n;K(i,`${e==null?``:e}: ${(n=H(t).name)==null?``:n}`),Jo(a,1,`rounded border px-3 py-1 text-xs font-semibold transition-colors ${H(t).learned?`border-danger/30 text-danger bg-danger/10 hover:bg-danger/20`:`border-accent/30 text-accent bg-accent/10 hover:bg-accent/20`}`),K(o,H(t).learned?`Forget`:`Learn`)},[()=>H(t).id.toString().padStart(3,`0`)]),U(`click`,a,()=>p(H(t).id,H(t).learned)),G(e,n)},e=>{G(e,Nl())}),D(Te),D(Se);var Ee=R(Se,2),De=L(Ee),Oe=R(L(De),2),ke=L(Oe);us(ke);var Ae=R(ke,2),je=e=>{var t=Pl();U(`click`,t,()=>{H(r)!==null&&(J.clearStates(H(r)),F(i,J.get(H(r)),!0))}),G(e,t)};mo(Ae,e=>{H(i).states.length>0&&e(je)}),D(Oe),D(De);var Me=R(De,2);yo(Me,21,()=>H(i).states,ho,(e,t)=>{var n=Fl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2);D(n),z(()=>K(o,H(t).name)),U(`click`,s,()=>{H(r)!==null&&(J.removeState(H(r),H(t).id),F(i,J.get(H(r)),!0))}),G(e,n)},e=>{G(e,Il())}),D(Me);var Ne=R(Me,2),Pe=L(Ne),Fe=L(Pe);Fe.value=(t=Fe.__value=null)!=null&&t!==void 0?t:``,yo(R(Fe),17,()=>J.listStates().filter(e=>!H(s).trim()||e.name.toLowerCase().includes(H(s).trim().toLowerCase())||e.id.toString().includes(H(s).trim())),ho,(e,t)=>{var n=Ll(),r=L(n);D(n);var i={};z(e=>{var a;if(K(r,`${e==null?``:e}: ${(a=H(t).name)==null?``:a}`),i!==(i=H(t).id)){var o;n.value=(o=n.__value=H(t).id)==null?``:o}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,n)}),D(Pe);var Ie=R(Pe,2);D(Ne),D(Ee),z(()=>{var e;K(_,H(i).name),K(y,`Actor ID: ${(e=H(i).id)==null?``:e}`),Jo(S,1,`rounded border px-3 py-1.5 text-xs font-semibold transition-colors ${H(i).inParty?`border-danger/30 bg-danger/20 text-danger hover:bg-danger/30`:`border-ok/30 bg-ok/20 text-ok hover:bg-ok/30`}`),K(ee,H(i).inParty?`Remove Party`:`Add Party`),Ie.disabled=H(a)===null}),U(`click`,x,()=>{H(r)!==null&&(J.recover(H(r)),F(i,J.get(H(r)),!0))}),U(`click`,S,f),Cs(we,()=>H(o),e=>F(o,e)),Cs(ke,()=>H(s),e=>F(s,e)),$o(Pe,()=>H(a),e=>F(a,e)),U(`click`,Ie,()=>{H(r)!==null&&H(a)!==null&&(J.addState(H(r),H(a)),F(i,J.get(H(r)),!0),F(a,null))}),G(e,n)},x=e=>{G(e,zl())};mo(y,e=>{H(i)?e(b):e(x,-1)}),D(v),D(h),G(e,h),Nt()}Wa([`click`]);function Hl(e){let t=e-1;return t*t*t+1}function Ul(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Hl}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=Wl(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function Wl(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var Gl=W(` `),Kl=W(``),ql=W(`

`),Jl=W(`
Configure the hold key in the Keys panel.
`),Yl=W(`
Warning: Game is permanently sped up. Turn this back on to require holding a key.
`),Xl=W(``),Zl=W(`
`),Ql=W(`

Active Enemies

`),$l=W(`LEAD`),eu=W(`
`),tu=W(`
No active party members found (start/load a game).
`),nu=W(`

Quick Actions

Party Resources

Gold
Steps
Playtime

Battle Settings

God Mode
One-Hit Kill
Disable Encounters

Movement

Noclip (Walk Through Walls)
Move Speed

Game Speed

Hold Key to Fast Forward
Speed Multiplier
`);function ru(e,t){Mt(t,!0);let n=P(0),r=P(0),i=P(0),a=P(4),o=P(!1),s=P(I([])),c=P(I([])),l=[{title:`System & Menus`,actions:[`quick_save`,`quick_load`,`open_save_scene`,`open_load_scene`,`goto_title`]},{title:`Battle Actions`,actions:[`force_victory`,`force_defeat`,`force_escape`,`trigger_encounter`]},{title:`Health Controls`,actions:[`party_recovery`,`party_wound`,`enemy_recovery`,`enemy_wound`]}],u=()=>{F(n,q.gold.get(),!0),F(r,q.party.steps(),!0),F(i,q.party.playtime(),!0),window.$gamePlayer&&F(a,window.$gamePlayer._moveSpeed||4,!0),F(o,!!(window.SceneManager&&window.SceneManager._scene&&window.SceneManager._scene.constructor.name===`Scene_Battle`)),H(o)&&window.$gameTroop?F(s,window.$gameTroop.members().map(e=>({ref:e,name:e.name(),hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(s,[],!0),window.$gameParty?F(c,window.$gameParty.members().map(e=>({ref:e,id:e.actorId(),name:e.name(),level:typeof e.level==`function`?e.level():e._level||1,hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(c,[],!0)};Ws(()=>{u();let e=setInterval(u,1e3);return()=>clearInterval(e)});let d=e=>{q.gold.set(e),Y.gold!==null&&X.freezeGold(!0),F(n,q.gold.get(),!0)},f=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`},p=(e,t)=>{e.ref.setHp(t),u()},m=(e,t)=>{e.ref.setMp(t),u()},h=(e,t)=>{e.ref.setTp?e.ref.setTp(t):e.ref.tp=t,u()},g=P(null),_=(e,t)=>{e!==t&&window.$gameParty&&typeof window.$gameParty.swapOrder==`function`&&(window.$gameParty.swapOrder(e,t),u())};var v=nu(),y=L(v),b=R(L(y),2);yo(b,21,()=>l,ho,(e,t)=>{var n=ql(),r=L(n),i=L(r,!0);D(r);var a=R(r,2);yo(a,21,()=>H(t).actions,ho,(e,t)=>{let n=Wn(()=>nl.find(e=>e.id===H(t)));var r=eo(),i=_i(r),a=e=>{var t=Kl(),r=L(t),i=L(r,!0);D(r);var a=R(r,2),o=e=>{var t=Gl(),r=L(t,!0);D(t),z(e=>K(r,e),[()=>{var e;return Yc.fromString(((e=$.get(H(n).id))==null?void 0:e.keyStr)||``).asDisplayString()}]),G(e,t)},s=Wn(()=>{var e;return(e=$.get(H(n).id))==null?void 0:e.keyStr});mo(a,e=>{H(s)&&e(o)}),D(t),z(()=>K(i,H(n).name)),U(`click`,t,()=>{var e,t;(e=(t=H(n)).onEnter)==null||e.call(t),u()}),G(e,t)};mo(i,e=>{H(n)&&e(a)}),G(e,r)}),D(a),D(n),z(()=>K(i,H(t).title)),G(e,n)}),D(b),D(y);var x=R(y,2),S=L(x),ee=R(L(S),2),C=R(L(ee),2),w=L(C);fl(w,{get value(){return H(n)},min:0,max:99999999,onchange:d});var te=R(w,2);{let e=Wn(()=>Y.gold!==null);ml(te,{get locked(){return H(e)},ontoggle:e=>{X.freezeGold(e),u()}})}D(C),D(ee);var ne=R(ee,2),re=R(L(ne),2),ie=L(re,!0);D(re),D(ne);var ae=R(ne,2),oe=R(L(ae),2),se=L(oe,!0);D(oe),D(ae),D(S);var ce=R(S,2),le=R(L(ce),2),ue=L(le);xl(R(L(ue),2),{get value(){return Z.god},onchange:e=>Wc.setGod(e)}),D(ue);var de=R(ue,2);xl(R(L(de),2),{get value(){return Z.ohko},onchange:e=>Wc.setOhko(e)}),D(de);var fe=R(de,2);xl(R(L(fe),2),{get value(){return Z.noEncounter},onchange:e=>Wc.setNoEncounter(e)}),D(fe),D(le),D(ce),D(x);var pe=R(x,2),me=R(L(pe),2),he=L(me);xl(R(L(he),2),{get value(){return Y.noclip},onchange:e=>X.setNoclip(e)}),D(he);var ge=R(he,2);fl(R(L(ge),2),{get value(){return H(a)},min:1,max:8,onchange:e=>q.map.speed(e)}),D(ge),D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve),be=L(ye);xl(R(L(be),2),{get value(){return Z.speedUseKey},onchange:e=>{Wc.setSpeedUseKey(e),e?Wc.setSpeed(1):Wc.setSpeed(Z.speedBoost)}}),D(be);var xe=R(be,2),Se=e=>{G(e,Jl())},Ce=e=>{G(e,Yl())};mo(xe,e=>{Z.speedUseKey?e(Se):e(Ce,-1)}),D(ye);var we=R(ye,2),Te=R(L(we),2);yo(Te,20,()=>[.5,1,2,3,5,8],ho,(e,t)=>{var n=Xl(),r=L(n);D(n),z(()=>{Jo(n,1,`border-border h-7 w-9 rounded border text-xs transition-colors ${Z.speedBoost===t?`border-accent bg-accent text-white font-semibold`:`bg-bg hover:bg-border/50 text-gray-300`}`),K(r,`${t==null?``:t}x`)}),U(`click`,n,()=>{Wc.setSpeedBoost(t),Z.speedUseKey||Wc.setSpeed(t)}),G(e,n)}),D(Te),D(we),D(ve),D(_e);var Ee=R(_e,2),De=e=>{var t=Ql(),n=R(L(t),2);yo(n,21,()=>H(s),ho,(e,t)=>{var n=Zl(),r=L(n),i=L(r),a=L(i,!0);D(i),D(r);var o=R(r,2),s=L(o),c=L(s),l=L(c);D(c),fl(R(c,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(s);var u=R(s,2),d=L(u),f=L(d);D(d),fl(R(d,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(u);var g=R(u,2),_=L(g),v=L(_);D(_),fl(R(_,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(g),D(o),D(n),z(()=>{var e,n,r,i,o;K(a,H(t).name),K(l,`HP (${(e=H(t).hp)==null?``:e}/${(n=H(t).mhp)==null?``:n})`),K(f,`MP (${(r=H(t).mp)==null?``:r}/${(i=H(t).mmp)==null?``:i})`),K(v,`TP (${(o=H(t).tp)==null?``:o})`)}),G(e,n)}),D(n),D(t),G(e,t)};mo(Ee,e=>{H(o)&&H(s).length>0&&e(De)});var Oe=R(Ee,2),ke=R(L(Oe),2);yo(ke,31,()=>H(c),e=>e.id,(e,t,n)=>{var r=eu(),i=L(r),a=L(i),o=L(a),s=R(L(o),2),c=L(s),l=R(c),u=e=>{G(e,$l())};mo(l,e=>{H(n)===0&&e(u)}),D(s),D(o);var d=R(o,2),f=L(d);D(d),D(a);var v=R(a,2),y=L(v),b=L(y),x=L(b);D(b),fl(R(b,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(y);var S=R(y,2),ee=L(S),C=L(ee);D(ee),fl(R(ee,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(S);var w=R(S,2),te=L(w),ne=L(te);D(te),fl(R(te,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(w),D(v),D(i),D(r),z(()=>{var e,o,s,l,u,d,p;Jo(r,1,`rounded p-2.5 transition-all duration-200 ${H(g)===H(n)?`border border-dashed border-accent/50 bg-accent/5`:`border border-border bg-bg`}`),Jo(i,1,`space-y-2 ${H(g)===H(n)?`invisible`:``}`),Jo(a,1,`flex w-full items-center justify-between pb-2 text-xs font-bold text-white ${H(g)===null?`cursor-grab active:cursor-grabbing`:``}`),K(c,`${(e=H(t).name)==null?``:e} `),K(f,`Lv.${(o=H(t).level)==null?``:o}`),K(x,`HP (${(s=H(t).hp)==null?``:s}/${(l=H(t).mhp)==null?``:l})`),K(C,`MP (${(u=H(t).mp)==null?``:u}/${(d=H(t).mmp)==null?``:d})`),K(ne,`TP (${(p=H(t).tp)==null?``:p})`)}),Ua(`dragenter`,r,e=>e.preventDefault()),Ua(`dragover`,r,e=>{if(e.preventDefault(),H(g)!==null&&H(g)!==H(n)){let t=e.currentTarget.getBoundingClientRect(),r=t.top+t.height/2;if(H(g)H(n)&&e.clientY>r)return;_(H(g),H(n)),F(g,H(n),!0)}}),Ua(`dragstart`,a,e=>{if(e.dataTransfer){e.dataTransfer.effectAllowed=`move`;let t=e.currentTarget.closest(`[role="listitem"]`);t&&e.dataTransfer.setDragImage(t,20,20)}setTimeout(()=>{F(g,H(n),!0)},0)}),Ua(`dragend`,a,()=>{F(g,null)}),Io(r,()=>Ul,()=>({duration:250})),G(e,r)},e=>{G(e,tu())}),D(ke),D(Oe),D(v),z(e=>{K(ie,H(r)),K(se,e)},[()=>f(H(i))]),Ua(`dragenter`,Oe,e=>e.preventDefault()),Ua(`dragover`,Oe,e=>e.preventDefault()),Ua(`dragenter`,ke,e=>e.preventDefault()),Ua(`dragover`,ke,e=>e.preventDefault()),G(e,v),Nt()}Wa([`click`]);var iu=W(``),au=W(`
No saved locations yet.
`),ou=W(`
`),su=W(`

Teleport

Saved Locations

`);function cu(e,t){Mt(t,!0);let n=P(I({mapId:0,x:0,y:0,dir:0})),r=P(I([])),i=P(0),a=P(0),o=P(0),s=P(I([])),c=P(``),l=P(``),u=P(``);Mi(()=>{H(o)>0&&q.map.loadMapEvents(H(o)).then(e=>{F(s,e,!0),e.find(e=>e.id.toString()===H(c))||F(c,``)})});let d=P(I([])),f=P(``),p=()=>{let e=q.map.current();e&&(F(n,e,!0),F(o,H(o)||e.mapId,!0),F(i,e.x,!0),F(a,e.y,!0)),F(r,q.map.list(),!0);try{let e=localStorage.getItem(`forge:locations`);e&&F(d,JSON.parse(e),!0)}catch(e){}};Ws(()=>{p();let e=setInterval(()=>{let e=q.map.current();e&&(e.mapId!==H(n).mapId||e.x!==H(n).x||e.y!==H(n).y)&&F(n,e,!0)},1e3);return()=>clearInterval(e)});let m=()=>{q.map.teleport(H(o),H(i),H(a),0,0)},h=()=>{let e=q.map.current();if(!e)return;let t=H(r).find(t=>t.id===e.mapId);F(d,[...H(d),{id:Date.now().toString(),name:H(f)||`Saved Location`,mapId:e.mapId,mapName:t?t.name:`Map ${e.mapId}`,x:e.x,y:e.y}],!0),F(f,``),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},g=e=>{F(d,H(d).filter(t=>t.id!==e),!0),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},_=e=>{q.map.teleport(e.mapId,e.x,e.y,0,0)};var v=su(),y=L(v),b=R(L(y),2),x=L(b);D(b);var S=R(b,2),ee=L(S),C=L(ee),w=R(L(C),2);us(w),D(C);var te=R(C,2);yo(te,21,()=>H(r).filter(e=>!H(l).trim()||e.name.toLowerCase().includes(H(l).trim().toLowerCase())||e.id.toString().includes(H(l).trim())),ho,(e,t)=>{var r=iu(),i=L(r);D(r);var a={};z(e=>{var o;if(K(i,`${H(t).id===H(n).mapId?`[CURRENT] `:``}${e==null?``:e}: ${(o=H(t).name)==null?``:o}`),a!==(a=H(t).id)){var s;r.value=(s=r.__value=H(t).id)==null?``:s}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,r)}),D(te),D(ee);var ne=R(ee,2),re=L(ne),ie=R(L(re),2);us(ie),D(re);var ae=R(re,2),oe=L(ae);oe.value=oe.__value=``,yo(R(oe),17,()=>H(s).filter(e=>!H(u).trim()||e.name.toLowerCase().includes(H(u).trim().toLowerCase())||e.id.toString().includes(H(u).trim())),ho,(e,t)=>{var n=iu(),r=L(n);D(n);var i={};z(()=>{var e,a,o;if(K(r,`${(e=H(t).name)==null?``:e} (X:${(a=H(t).x)==null?``:a}, Y:${(o=H(t).y)==null?``:o})`),i!==(i=H(t).id)){var s;n.value=(s=n.__value=H(t).id)==null?``:s}}),G(e,n)}),D(ae),D(ne);var se=R(ne,2),ce=L(se),le=R(L(ce),2);us(le),D(ce);var ue=R(ce,2),de=R(L(ue),2);us(de),D(ue),D(se);var fe=R(se,2);D(S),D(y);var pe=R(y,2),me=R(L(pe),2),he=L(me);us(he);var ge=R(he,2);D(me);var _e=R(me,2),ve=L(_e),ye=e=>{G(e,au())},be=e=>{var t=eo();yo(_i(t),17,()=>H(d),e=>e.id,(e,t)=>{var n=ou(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o);D(o),D(r);var c=R(r,2),l=L(c),u=R(l,2);Ec(L(u),{size:14}),D(u),D(c),D(n),z(()=>{var e,n,r,i;K(a,H(t).name),K(s,`${(e=H(t).mapName)==null?``:e} (Map ${(n=H(t).mapId)==null?``:n}) • X:${(r=H(t).x)==null?``:r} Y:${(i=H(t).y)==null?``:i}`)}),U(`click`,l,()=>_(H(t))),U(`click`,u,()=>g(H(t).id)),G(e,n)}),G(e,t)};mo(ve,e=>{H(d).length===0?e(ye):e(be,-1)}),D(_e),D(pe),D(v),z(()=>{var e,t,r;return K(x,`Current: Map ${(e=H(n).mapId)==null?``:e} (${(t=H(n).x)==null?``:t}, ${(r=H(n).y)==null?``:r})`)}),Cs(w,()=>H(l),e=>F(l,e)),$o(te,()=>H(o),e=>F(o,e)),Cs(ie,()=>H(u),e=>F(u,e)),U(`change`,ae,e=>{let t=parseInt(e.target.value);if(isNaN(t))return;let n=H(s).find(e=>e.id===t);n&&(F(i,n.x,!0),F(a,n.y,!0))}),$o(ae,()=>H(c),e=>F(c,e)),Cs(le,()=>H(i),e=>F(i,e)),Cs(de,()=>H(a),e=>F(a,e)),U(`click`,fe,m),U(`keydown`,he,e=>{e.stopPropagation(),e.key===`Enter`&&h()}),Cs(he,()=>H(f),e=>F(f,e)),U(`click`,ge,h),G(e,v),Nt()}Wa([`change`,`click`,`keydown`]);var lu=W(` `,1),uu=W(``),du=W(`
`),fu=W(`
`);function pu(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(null),o,s=()=>{let e=H(n);if(H(i).trim()){let t=H(i).trim().toLowerCase();e=H(n).filter(e=>String(e.id)===t||e.name.toLowerCase().includes(t))}F(r,e.sort((e,t)=>{let n=Zc.isFavorite(`commonEvents`,e.id),r=Zc.isFavorite(`commonEvents`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},c=()=>{F(n,q.commonev.list(),!0),s()},l=e=>{F(i,e.target.value,!0),s()};Ws(()=>{c()});let u=e=>{H(a)===e?(q.commonev.run(e),F(a,null),clearTimeout(o)):(F(a,e,!0),clearTimeout(o),o=setTimeout(()=>{H(a)===e&&F(a,null)},3e3))},d=()=>{F(a,null),clearTimeout(o)};var f=fu(),p=L(f),h=L(p);us(h);var g=R(h,2),_=L(g);D(g),D(p);var v=R(p,2);ul(L(v),{get items(){return H(r)},itemHeight:38,itemTemplate:(e,t=m)=>{var n=du(),r=L(n),i=L(r),o=L(i,!0);D(i);var c=R(i,2),l=L(c,!0);D(c),D(r);var f=R(r,2),p=L(f),h=L(p);{let e=Wn(()=>Zc.isFavorite(`commonEvents`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(p);var g=R(p,2),_=L(g),v=e=>{var n=lu(),r=_i(n),i=R(r,2);U(`click`,r,()=>u(t().id)),U(`click`,i,d),G(e,n)},y=e=>{var n=uu();U(`click`,n,()=>u(t().id)),G(e,n)};mo(_,e=>{H(a)===t().id?e(v):e(y,-1)}),D(g),D(f),D(n),z((e,n)=>{K(o,e),ps(c,`title`,t().name),K(l,t().name),Jo(p,1,`mr-2 flex items-center justify-center transition-colors ${n==null?``:n}`)},[()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`commonEvents`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`click`,p,()=>{Zc.toggleFavorite(`commonEvents`,t().id),s()}),G(e,n)},$$slots:{itemTemplate:!0}}),D(v),D(f),z(()=>{var e;ds(h,H(i)),K(_,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,h,l),G(e,f),Nt()}Wa([`input`,`click`]);var mu=W(``),hu=W(`
`),gu=W(`
No active data locks. Use the lock icon on variables, switches, items, or stats to freeze their value.
`),_u=W(`
`);function vu(e,t){Mt(t,!0);let n=P(I([])),r=()=>{F(n,X.summary(),!0)};Ws(()=>{r();let e=setInterval(r,1e3);return()=>clearInterval(e)});let i=e=>{if(e.type===`var`)X.freezeVar(e.id,!1);else if(e.type===`switch`)X.freezeSwitch(e.id,!1);else if(e.type===`item`){let[t,n]=e.key.split(`:`);X.freezeItem(t,parseInt(n,10),!1)}else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);X.freezeStat(parseInt(t,10),n,!1)}else e.type===`gold`&&X.freezeGold(!1);r()},a=e=>{if(e.type===`var`)Q.targetVarId=e.id,Q.activeTab=Ic.Vars;else if(e.type===`switch`)Q.targetSwitchId=e.id,Q.activeTab=Ic.Switches;else if(e.type===`item`)Q.targetItemKey=e.key,Q.activeTab=Ic.Inv;else if(e.type===`gold`)Q.activeTab=Ic.General;else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);Q.targetActorId=parseInt(t,10),Q.targetActorStat=n,Q.activeTab=Ic.Actors}},o=()=>{X.clearAll(),r()},s=e=>e===`var`?`VAR`:e===`switch`?`SW`:e===`item`?`ITEM`:e===`stat`?`STAT`:e===`param`?`PARAM`:e===`gold`?`GOLD`:`LOCK`,c=e=>e===`var`?`border-accent/30 bg-accent/10 text-accent`:e===`switch`?`border-ok/30 bg-ok/10 text-ok`:e===`item`?`border-warn/30 bg-warn/10 text-warn`:e===`stat`?`border-danger/30 bg-danger/10 text-danger`:e===`param`?`border-fuchsia-500/30 bg-fuchsia-500/10 text-fuchsia-500`:e===`gold`?`border-yellow-500/30 bg-yellow-500/10 text-yellow-500`:`border-gray-500/30 bg-gray-500/10 text-gray-400`;var l=_u(),u=L(l),d=L(u),f=L(d);D(d);var p=R(d,2),m=e=>{var t=mu();U(`click`,t,o),G(e,t)};mo(p,e=>{H(n).length>0&&e(m)}),D(u);var h=R(u,2);yo(h,21,()=>H(n),ho,(e,t)=>{var n=hu(),r=L(n),o=L(r),l=L(o,!0);D(o);var u=R(o,2),d=L(u,!0);D(u),D(r);var f=R(r,2),p=L(f),m=L(p,!0);D(p);var h=R(p,2);D(f),D(n),z((e,n)=>{Jo(o,1,`rounded border px-1.5 py-0.5 text-[10px] font-bold font-mono tracking-wide ${e==null?``:e}`),K(l,n),ps(u,`title`,H(t).label),K(d,H(t).label),K(m,typeof H(t).value==`boolean`?H(t).value?`ON`:`OFF`:H(t).value)},[()=>c(H(t).type),()=>s(H(t).type)]),U(`keydown`,n,e=>e.key===`Enter`&&a(H(t))),U(`click`,n,()=>a(H(t))),U(`click`,h,e=>{e.stopPropagation(),i(H(t))}),G(e,n)},e=>{G(e,gu())}),D(h),D(l),z(()=>{var e;return K(f,`${(e=H(n).length)==null?``:e} active locks`)}),G(e,l),Nt()}Wa([`click`,`keydown`]);var yu=W(`
Press a key...
`),bu=W(``),xu=W(``),Su=W(`
`);function Cu(e,t){Mt(t,!0);let n=Hs(t,`value`,15,``),r=Hs(t,`required`,3,!1),i=Hs(t,`combiningKeyAlone`,3,!1),a=P(!1),o=()=>{F(a,!0);let e=e=>{var a;e.preventDefault(),e.stopPropagation();let o=Yc.fromEvent(e);o.isCombiningKey()&&!i()||(n(o.asString()),(a=t.onchange)==null||a.call(t,n()),r())},r=()=>{F(a,!1),window.removeEventListener(`keydown`,e,{capture:!0})};window.addEventListener(`keydown`,e,{capture:!0}),setTimeout(()=>{window.addEventListener(`click`,r,{capture:!0,once:!0})},100)},s=e=>{if(!e)return`None`;try{return Yc.fromString(e).asDisplayString()}catch(t){return e}};var c=Su(),l=L(c),u=e=>{G(e,yu())},d=e=>{var t=bu(),r=L(t,!0);D(t),z(e=>{Jo(t,1,`border-border bg-bg2 hover:bg-border/50 flex h-8 flex-1 items-center rounded border px-3 text-sm font-medium transition-colors ${n()?`text-white`:`text-gray-500`}`),K(r,e)},[()=>s(n())]),U(`click`,t,o),G(e,t)};mo(l,e=>{H(a)?e(u):e(d,-1)});var f=R(l,2),p=e=>{var r=xu();Mc(L(r),{size:14}),D(r),U(`click`,r,()=>{var e;n(``),(e=t.onchange)==null||e.call(t,n())}),G(e,r)};mo(f,e=>{!r()&&n()&&!H(a)&&e(p)}),D(c),G(e,c),Nt()}Wa([`click`]);var wu=W(`
`),Tu=W(`
`);function Eu(e,t){Mt(t,!0);let n=P(I([])),r=P(``),i=P(I([])),a=()=>{if(!H(r).trim())F(i,H(n),!0);else{let e=H(r).trim().toLowerCase();F(i,H(n).filter(t=>t.name.toLowerCase().includes(e)||t.desc.toLowerCase().includes(e)||t.keyStr.toLowerCase().includes(e)),!0)}},o=()=>{F(n,$.shortcuts.map(e=>({...e})),!0),a()};Ws(()=>{o()});let s=e=>{F(r,e.target.value,!0),a()},c=(e,t)=>{$.update(e,{keyStr:t}),o()},l=(e,t)=>{$.update(e,{enabled:t}),o()},u=()=>{localStorage.removeItem(`forge:shortcuts`),zc.show(`Defaults restored. Please reload the game.`,`success`)};var d=Tu(),f=L(d),p=L(f);us(p);var m=R(p,2);D(f);var h=R(f,2);yo(h,21,()=>H(i),e=>e.id,(e,t)=>{var n=wu(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o,!0);D(o),D(r);var u=R(r,2),d=L(u);{let e=Wn(()=>H(t).id===`speed_hold`||H(t).id===`skip_message`);Cu(d,{get value(){return H(t).keyStr},get required(){return H(t).required},get combiningKeyAlone(){return H(e)},onchange:e=>c(H(t).id,e)})}D(u);var f=R(u,2);xl(L(f),{get value(){return H(t).enabled},onchange:e=>l(H(t).id,e)}),D(f),D(n),z(()=>{Jo(i,1,`font-semibold text-sm ${H(t).enabled?`text-white`:`text-gray-500`}`),K(a,H(t).name),K(s,H(t).desc)}),G(e,n)}),D(h),D(d),z(()=>ds(p,H(r))),U(`input`,p,s),U(`click`,m,u),G(e,d),Nt()}Wa([`input`,`click`]),yt();var Du=Ls(()=>Xc),Ou=W(`

UI Preferences

Inactive Opacity
Controls how transparent the panel becomes when the mouse leaves.
Remember Window Position
Save the exact window dimensions and position between game boots.
Auto-Open on Boot
Automatically display the Forge panel when the game finishes loading.
Show Launcher Icon
Display a draggable icon to open the panel without a shortcut.

Gameplay

Quick Save / Load Slot
The save file slot used by the Quick Save and Quick Load shortcuts.

Data Management

Factory Reset
Wipes all Forge settings, locks, and saved layout data.
`);function ku(e,t){Mt(t,!1);let n=()=>Zc.save();Fs();var r=Ou(),i=L(r),a=R(L(i),2),o=R(L(a),2);fl(L(o),{get value(){return Du().inactiveOpacity},min:10,max:100,onchange:e=>{Du(Du().inactiveOpacity=e),n()}}),D(o),D(a);var s=R(a,2);xl(R(L(s),2),{onchange:()=>n(),get value(){return Du().rememberPosition},set value(e){Du(Du().rememberPosition=e)},$$legacy:!0}),D(s);var c=R(s,2);xl(R(L(c),2),{onchange:()=>n(),get value(){return Du().autoOpen},set value(e){Du(Du().autoOpen=e)},$$legacy:!0}),D(c);var l=R(c,2);xl(R(L(l),2),{onchange:()=>n(),get value(){return Du().showLauncher},set value(e){Du(Du().showLauncher=e)},$$legacy:!0}),D(l),D(i);var u=R(i,2),d=R(L(u),2),f=R(L(d),2);fl(L(f),{get value(){return Du().quickSaveSlot},min:1,max:20,onchange:e=>{Du(Du().quickSaveSlot=e),n()}}),D(f),D(d),D(u);var p=R(u,2),m=R(L(p),2),h=R(L(m),2);D(m),D(p),D(r),U(`click`,h,()=>Zc.resetAll()),G(e,r),Nt()}Wa([`click`]);var Au=W(`
No logs recorded yet.
`),ju=W(` `),Mu=W(`Narrator / Unknown`),Nu=W(`
`),Pu=W(`

Game Dialogue Logs

`);function Fu(e,t){Mt(t,!0);let n=P(void 0),r=e=>{let t=new Date(e);return`${t.getHours().toString().padStart(2,`0`)}:${t.getMinutes().toString().padStart(2,`0`)}:${t.getSeconds().toString().padStart(2,`0`)}`};Mi(()=>{Qc.entries.length&&setTimeout(()=>{var e,t;H(n)&&((e=(t=H(n)).scrollToBottom)==null||e.call(t))},10)});var i=Pu(),a=L(i),o=L(a),s=R(L(o),2);wc(L(s),{size:14}),ut(2),D(s),D(o);var c=R(o,2),l=L(c),u=e=>{var t=Au();mc(L(t),{size:32,class:`opacity-50`}),ut(2),D(t),G(e,t)},d=e=>{Ps(ul(e,{get items(){return Qc.entries},itemHeight:80,containerHeight:400,itemTemplate:(e,t=m)=>{var n=Nu(),i=L(n),a=L(i),o=e=>{var n=ju(),r=L(n,!0);D(n),z(()=>K(r,t().speaker)),G(e,n)},s=e=>{G(e,Mu())};mo(a,e=>{t().speaker?e(o):e(s,-1)});var c=R(a,2),l=L(c,!0);D(c),D(i);var u=R(i,2),d=L(u,!0);D(u),D(n),z(e=>{K(l,e),K(d,t().text)},[()=>r(t().timestamp)]),G(e,n)},$$slots:{itemTemplate:!0}}),e=>F(n,e,!0),()=>H(n))};mo(l,e=>{Qc.entries.length===0?e(u):e(d,-1)}),D(c),D(a),D(i),U(`click`,s,()=>tl.clear()),G(e,i),Nt()}Wa([`click`]);var Iu=W(``),Lu=W(``),Ru=W(`
`),zu=W(`
`,1);function Bu(e,t){Mt(t,!0),Mi(()=>{let e=document.getElementById(`forge-mvmz-host`);if(!e)return;let t=!1,n=()=>{t=!1},r=[`mousedown`,`mousemove`,`mouseup`,`click`,`dblclick`,`pointerdown`,`pointermove`,`pointerup`,`contextmenu`,`wheel`,`touchstart`,`touchmove`,`touchend`,`keydown`,`keyup`],i=e=>{(e.type===`mousedown`||e.type===`pointerdown`||e.type===`touchstart`)&&(t=!0);let n=e.type===`mousemove`||e.type===`pointermove`||e.type===`touchmove`,r=e.type===`mouseup`||e.type===`pointerup`||e.type===`touchend`;if(n){let n=!1;if(`buttons`in e?n=e.buttons>0:`touches`in e&&(n=e.touches.length>0),n&&!t)return}r&&!t||e.stopPropagation()};if(window.addEventListener(`mouseup`,n,{capture:!0}),window.addEventListener(`pointerup`,n,{capture:!0}),window.addEventListener(`touchend`,n,{capture:!0}),Q.visible)for(let t of r)e.addEventListener(t,i,!1);else for(let t of r)e.removeEventListener(t,i,!1);return()=>{window.removeEventListener(`mouseup`,n,{capture:!0}),window.removeEventListener(`pointerup`,n,{capture:!0}),window.removeEventListener(`touchend`,n,{capture:!0});for(let t of r)e.removeEventListener(t,i,!1)}});let n=[{id:Ic.General,label:`General`},{id:Ic.Vars,label:`Variables`},{id:Ic.Switches,label:`Switches`},{id:Ic.Inv,label:`Inventory`},{id:Ic.Actors,label:`Actors`},{id:Ic.Map,label:`Map`},{id:Ic.CommonEv,label:`Events`},{id:Ic.Locks,label:`Locks`},{id:Ic.Logs,label:`Logs`},{id:Ic.Shortcuts,label:`Keys`},{id:Ic.Settings,label:`Settings`}],r=P(0),i=P(0),a=P(840),o=P(520),s=P(!1);Ws(()=>{Zc.load(),X.install(),Wc.install(),tl.install(),$.init(nl);try{let e=JSON.parse(localStorage.getItem(`forge:panel`)||`null`);e&&Xc.rememberPosition?(F(r,e.x,!0),F(i,e.y,!0),F(a,e.w,!0),F(o,e.h,!0)):typeof window<`u`&&(F(r,0),F(i,0),F(a,Math.min(840,window.innerWidth||840),!0),F(o,Math.min(520,window.innerHeight||520),!0));let t=localStorage.getItem(`forge:lastTab`);t&&Object.values(Ic).includes(t)&&(Q.activeTab=t)}catch(e){}Xc.autoOpen&&!Q.visible&&(Q.visible=!0)});let c=()=>{Xc.rememberPosition&&localStorage.setItem(`forge:panel`,JSON.stringify({x:H(r),y:H(i),w:H(a),h:H(o)})),localStorage.setItem(`forge:lastTab`,Q.activeTab)},l=P(!1),u=P(0),d=P(0),f=P(0),p=P(0),m=e=>{H(l)&&(F(r,Math.max(0,Math.min(window.innerWidth-H(a),H(f)+e.clientX-H(u))),!0),F(i,Math.max(0,Math.min(window.innerHeight-H(o),H(p)+e.clientY-H(d))),!0))},h=()=>{F(l,!1),window.removeEventListener(`mousemove`,m,!0),window.removeEventListener(`mouseup`,h,!0),c()},g=e=>{e.target.closest(`button, input, select`)||(F(l,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(f,H(r),!0),F(p,H(i),!0),window.addEventListener(`mousemove`,m,!0),window.addEventListener(`mouseup`,h,!0))},_=P(!1),v=P(0),y=P(0),b=e=>{H(_)&&(F(a,Math.max(560,Math.min(window.innerWidth-H(r),H(v)+e.clientX-H(u))),!0),F(o,Math.max(360,Math.min(window.innerHeight-H(i),H(y)+e.clientY-H(d))),!0))},x=()=>{F(_,!1),window.removeEventListener(`mousemove`,b,!0),window.removeEventListener(`mouseup`,x,!0),c()},S=e=>{F(_,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(v,H(a),!0),F(y,H(o),!0),window.addEventListener(`mousemove`,b,!0),window.addEventListener(`mouseup`,x,!0),e.stopPropagation()};var ee=zu(),C=_i(ee),w=e=>{var t=Lu(),u=L(t),d=L(u),f=R(d,2);yo(f,21,()=>n,ho,(e,t)=>{var n=Iu(),r=L(n),i=e=>{Ac(e,{size:14})},a=e=>{ic(e,{size:14})},o=e=>{Sc(e,{size:14})},s=e=>{gc(e,{size:14})},l=e=>{Oc(e,{size:14})},u=e=>{fc(e,{size:14})},d=e=>{Pc(e,{size:14})},f=e=>{uc(e,{size:14})},p=e=>{mc(e,{size:14})},m=e=>{oc(e,{size:14})},h=e=>{vc(e,{size:14})};mo(r,e=>{H(t).id===`general`?e(i):H(t).id===`vars`?e(a,1):H(t).id===`switches`?e(o,2):H(t).id===`inv`?e(s,3):H(t).id===`actors`?e(l,4):H(t).id===`map`?e(u,5):H(t).id===`commonev`?e(d,6):H(t).id===`locks`?e(f,7):H(t).id===`logs`?e(p,8):H(t).id===`shortcuts`?e(m,9):H(t).id===`settings`&&e(h,10)});var g=R(r,2),_=L(g,!0);D(g),D(n),z(()=>{Jo(n,1,`w-full text-left rounded px-3 py-2 text-xs font-semibold transition-all flex items-center space-x-2.5 focus:outline-none ${Q.activeTab===H(t).id?`bg-[#7ba4ff]/10 text-[#7ba4ff] shadow-sm`:`text-gray-400 hover:bg-[#2a2d3a] hover:text-gray-200`}`),K(_,H(t).label)}),U(`click`,n,()=>{var e;Q.activeTab=H(t).id,(e=window.getSelection())==null||e.removeAllRanges(),c()}),G(e,n)}),D(f);var p=R(f,2),m=L(p);ps(m,`title`,`1.0.0`),m.textContent=`1.0.0`,D(p),D(u);var h=R(u,2),v=L(h),y=L(v),b=L(y,!0);D(y);var x=R(y,2);Mc(L(x),{size:14}),D(x),D(v);var ee=R(v,2),C=L(ee),w=e=>{yl(e,{})},te=e=>{wl(e,{})},ne=e=>{Ol(e,{})},re=e=>{Vl(e,{})},ie=e=>{ru(e,{})},ae=e=>{cu(e,{})},oe=e=>{pu(e,{})},se=e=>{vu(e,{})},ce=e=>{Fu(e,{})},le=e=>{Eu(e,{})},ue=e=>{ku(e,{})};mo(C,e=>{Q.activeTab===Ic.Vars?e(w):Q.activeTab===Ic.Switches?e(te,1):Q.activeTab===Ic.Inv?e(ne,2):Q.activeTab===Ic.Actors?e(re,3):Q.activeTab===Ic.General?e(ie,4):Q.activeTab===Ic.Map?e(ae,5):Q.activeTab===Ic.CommonEv?e(oe,6):Q.activeTab===Ic.Locks?e(se,7):Q.activeTab===Ic.Logs?e(ce,8):Q.activeTab===Ic.Shortcuts?e(le,9):Q.activeTab===Ic.Settings&&e(ue,10)}),D(ee),D(h),il(R(h,2),{onmousedown:S}),D(t),z(e=>{var n,c,u,d;Xo(t,`opacity: ${H(l)||H(_)||H(s)?1:Xc.inactiveOpacity/100}; left: ${(n=H(r))==null?``:n}px; top: ${(c=H(i))==null?``:c}px; width: ${(u=H(a))==null?``:u}px; height: ${(d=H(o))==null?``:d}px; background: #13151a; color: #d4d8e3;`),K(b,e)},[()=>{var e;return((e=n.find(e=>e.id===Q.activeTab))==null?void 0:e.label)||``}]),Ua(`mouseenter`,t,()=>F(s,!0)),Ua(`mouseleave`,t,()=>F(s,!1)),U(`mousedown`,d,g),U(`mousedown`,v,g),U(`click`,x,()=>Q.visible=!1),G(e,t)};mo(C,e=>{Q.visible&&e(w)});var te=R(C,2);yo(te,21,()=>zc.toasts,e=>e.id,(e,t)=>{var n=Ru(),r=L(n),i=R(r,2),a=L(i,!0);D(i),D(n),z(()=>{Xo(n,`background: #1a1d24; border-color: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`}; opacity: 0.95; min-width: 160px; max-width: 320px;`),Xo(r,`background: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`};`),K(a,H(t).message)}),G(e,n)}),D(te),ol(R(te,2),{}),G(e,ee),Nt()}Wa([`mousedown`,`click`]);var Vu=`forge-mvmz-host`,Hu=document.getElementById(Vu);Hu||(Hu=document.createElement(`div`),Hu.id=Vu,Hu.style.position=`fixed`,Hu.style.top=`0`,Hu.style.left=`0`,Hu.style.width=`100vw`,Hu.style.height=`100vh`,Hu.style.pointerEvents=`none`,Hu.style.zIndex=`2147483647`,document.body.appendChild(Hu));var Uu=document.createElement(`style`);Uu.textContent=`#${Vu} { z-index: 2147483647 !important; }`,document.head.appendChild(Uu);var Wu=null,Gu;typeof Hu.attachShadow==`function`?(Wu=Hu.attachShadow({mode:`open`}),Gu=Wu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,Wu.appendChild(e)}}},0)):(Gu=Hu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,document.head.appendChild(e)}}},0));var Ku=document.createElement(`div`);Ku.style.pointerEvents=`none`,Ku.style.width=`100%`,Ku.style.height=`100%`,Gu.appendChild(Ku);try{to(Bu,{target:Ku})}catch(e){console.error(`[FORGE] Error mounting Svelte App:`,e)}if(window.Input!==void 0&&window.Input._onKeyDown){let e=window.Input._onKeyDown;window.Input._onKeyDown=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}if(window.Input!==void 0&&window.Input._onKeyUp){let e=window.Input._onKeyUp;window.Input._onKeyUp=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}})(); \ No newline at end of file diff --git a/util/forge/config.py b/util/forge/config.py index c28c7e6..97534f7 100644 --- a/util/forge/config.py +++ b/util/forge/config.py @@ -140,14 +140,23 @@ def _patch_forge_runtime(forge_text: str, hotkey: str, ui_scale: str, engine: st return forge_text +def is_legacy_forge_plugin(text: str) -> bool: + """True for pre-rewrite Forge_MV/MZ plugins with RPG Maker @param blocks.""" + return "@param Hotkey" in text or "@param hotkey" in text + + def prepare_forge_js(engine: str, source: Path | None = None, cfg: dict | None = None) -> str: """Build the Forge plugin written into a game folder (vanilla source + Dazed patches).""" src = source or bundled_plugin_path(engine) + text = src.read_text(encoding="utf-8") + if not is_legacy_forge_plugin(text): + return text + effective = {**load_config(), **(cfg or {})} hotkey = effective.get("forgeHotkey", "F10") ui_scale = effective.get("uiScale", "auto") - text = apply_ui_scale_patches(src.read_text(encoding="utf-8"), engine) + text = apply_ui_scale_patches(text, engine) text = _patch_forge_hotkey(text, hotkey, engine) text = _patch_forge_ui_scale_default(text, str(ui_scale), engine) text = _patch_forge_mtc_defaults(text, hotkey, str(ui_scale)) diff --git a/util/forge/scale_patches.py b/util/forge/scale_patches.py index a727ad2..3e5f9bf 100644 --- a/util/forge/scale_patches.py +++ b/util/forge/scale_patches.py @@ -81,6 +81,8 @@ def _sub(text: str, pattern: str, repl, *, label: str, count: int = 1) -> str: def apply_ui_scale_patches(text: str, engine: str) -> str: """Return upstream Forge JS with Dazed overlay scaling (install-time only).""" + if not ("@param Hotkey" in text or "@param hotkey" in text): + return text if engine == "MZ": text = _sub( text, diff --git a/util/forge/update_tools.py b/util/forge/update_tools.py index 57b9236..2bf8369 100644 --- a/util/forge/update_tools.py +++ b/util/forge/update_tools.py @@ -1,6 +1,7 @@ """Download / update Forge plugins from len's upstream repo (gitgud.io). Upstream: https://gitgud.io/zero64801/forge-mvmz +CI builds a unified forge.js plugin (master branch artifacts). Offline copies: util/forge/upstream/ Active plugins: util/forge/Forge_MZ.js, util/forge/Forge_MV.js """ @@ -81,11 +82,11 @@ def _upstream_commit() -> str: return commit -def _raw_file_url(filename: str) -> str: - enc = urllib.parse.quote(filename, safe="") +def _artifact_url(filename: str) -> str: + """Latest successful build_job artifact on the tracked branch.""" return ( - f"{GITGUD_API}/projects/{_project_id()}/repository/files/{enc}/raw" - f"?ref={FORGE_BRANCH}" + f"https://gitgud.io/{FORGE_PROJECT}/-/jobs/artifacts/{FORGE_BRANCH}" + f"/raw/{filename}?job=build_job" ) @@ -109,13 +110,18 @@ def _seed_from_offline(engine: str, log_fn) -> bool: return True -def _fetch_plugin(engine: str, log_fn) -> None: - name = PLUGIN_BY_ENGINE[engine] - _log(f"Downloading {name}.js from {FORGE_PROJECT}...", log_fn) - data = _download_bytes(_raw_file_url(f"{name}.js")) - bundled_plugin_path(engine).write_bytes(data) +def _fetch_plugins(log_fn) -> bytes: + """Download the unified forge.js CI artifact.""" + _log(f"Downloading forge.js from {FORGE_PROJECT} ({FORGE_BRANCH} CI)...", log_fn) + return _download_bytes(_artifact_url("forge.js")) + + +def _install_plugin_bytes(data: bytes) -> None: + """Write forge.js into both engine plugin paths and the offline bundle.""" UPSTREAM_DIR.mkdir(parents=True, exist_ok=True) - upstream_plugin_path(engine).write_bytes(data) + for engine in PLUGIN_BY_ENGINE: + bundled_plugin_path(engine).write_bytes(data) + upstream_plugin_path(engine).write_bytes(data) def _download_bytes(url: str) -> bytes: @@ -125,24 +131,25 @@ def _download_bytes(url: str) -> bytes: def refresh_forge_plugins(log_fn=print) -> bool: - """Download len's latest Forge_MV.js and Forge_MZ.js.""" + """Download len's latest forge.js and install Forge_MV/MZ copies.""" try: commit = _upstream_commit() except Exception as exc: _log(f"ERROR: could not contact upstream ({exc})", log_fn) return False - ok = True - for engine in PLUGIN_BY_ENGINE: - try: - _fetch_plugin(engine, log_fn) - except Exception as exc: - _log(f"ERROR: download failed for {PLUGIN_BY_ENGINE[engine]} ({exc})", log_fn) - ok = False - - if not ok: + try: + data = _fetch_plugins(log_fn) + except Exception as exc: + _log(f"ERROR: download failed for forge.js ({exc})", log_fn) return False + if not data.strip().startswith(b"//"): + _log("ERROR: forge.js download did not look like a plugin file.", log_fn) + return False + + _install_plugin_bytes(data) + versions = _load_versions() versions["commit"] = commit versions["branch"] = FORGE_BRANCH @@ -193,7 +200,11 @@ def ensure_forge_plugins(force: bool = False, log_fn=print) -> bool: if need_fetch: if refresh_forge_plugins(log_fn=log_fn): return True - return all(bundled_plugin_path(e).is_file() for e in PLUGIN_BY_ENGINE) + have_local = all(bundled_plugin_path(e).is_file() for e in PLUGIN_BY_ENGINE) + if force or not have_local: + _log("ERROR: Forge plugin update failed.", log_fn) + return False + _log("Warning: could not update Forge plugins; using local copy.", log_fn) return True diff --git a/util/forge/upstream/Forge_MV.js b/util/forge/upstream/Forge_MV.js index 675f210..7023672 100644 --- a/util/forge/upstream/Forge_MV.js +++ b/util/forge/upstream/Forge_MV.js @@ -1,1104 +1,28 @@ //============================================================================= -// Forge_MV.js — In-game cheat & editor overlay for RPG Maker MV +// forge.js - In-game cheat & editor overlay for RPG Maker MV/MZ //============================================================================= /*: - * @plugindesc Forge — modern in-game editor: variables, switches, items, actors, gold, teleport, common events, freeze/lock & battle cheats. (MV) - * @author len (Forge - clean-room, MTool-inspired) - * - * @param Hotkey - * @desc Key to toggle the panel. - * @default F10 - * - * @param SpeedKey - * @desc Key to toggle the speedhack (fast-forward). Use a key name like Control, Shift, Alt, or a letter. - * @default Control - * - * @param StartOpen - * @desc Open the panel automatically on new game / load (true/false). - * @default false - * - * @param ItemMaxOverride - * @desc Value used by the "Max" button for item stacks (0 = use engine maxItems). - * @default 0 - * - * @help - * Forge — drop-in cheat & editor for RPG Maker MV. - * Place in js/plugins/ and enable. Press F10 in-game to open the overlay. - * - * Sections: Variables · Switches · Items/Weapons/Armors · Actors · Party/Gold · - * Map/Teleport · Common Events · Data Lock (freeze) · Battle cheats. - * - * All edits are RAM-only and never written to save files. No external requests. - * Plugin command: MTC open (toggles the panel) + * @target MZ MV + * @plugindesc Forge - modern in-game editor + * @author len, shellawa + * @url https://gitgud.io/zero64801/forge-mvmz/ */ - -/* =================================================================================== - * Forge — in-game cheat & editor overlay for RPG Maker MV / MZ (shared core) - * Clean-room reimplementation of MTool's variable/value editor. Vanilla JS, zero deps. - * This file is the engine-agnostic core; the MV/MZ ship files prepend the plugin header. - * Layers: ops (DOM-free, testable) · locks (prototype monkeypatches) · cheats · ui (Shadow DOM) - * =================================================================================== */ -(function (root) { - 'use strict'; - if (root && root.__FORGE_CORE__) return; - - // ---------- environment ---------- - var IS_MZ = (typeof Utils !== 'undefined' && Utils.RPGMAKER_NAME === 'MZ'); - var nodeFs = null, nodePath = null; - try { if (typeof require === 'function') { nodeFs = require('fs'); nodePath = require('path'); } } catch (e) {} - function gameCwd() { try { return process.cwd(); } catch (e) { return '.'; } } - - var PARAM_NAMES = ['Max HP', 'Max MP', 'Attack', 'Defense', 'M.Attack', 'M.Defense', 'Agility', 'Luck']; - - // ---------- small utils ---------- - function clampInt(v, lo, hi) { v = Math.floor(Number(v) || 0); if (v < lo) v = lo; if (hi != null && v > hi) v = hi; return v; } - function defined(x) { return typeof x !== 'undefined' && x !== null; } - function dataName(d) { return d && d.name ? d.name : ''; } - // actor.level may be a getter (number), a method, or only the _level field across engines/plugins. - function actorLevel(a) { if (!a) return 0; if (typeof a.level === 'number') return a.level; if (typeof a.level === 'function') return a.level(); return a._level || 1; } - - // =================================================================================== - // OPS — pure logic, only touches $game*/$data* globals. Unit-testable. - // =================================================================================== - var ops = {}; - - ops.vars = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.variables.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.variables[id]) || ('Variable ' + id); }, - get: function (id) { return defined(window.$gameVariables) ? $gameVariables.value(id) : 0; }, - set: function (id, v) { if (!defined(window.$gameVariables)) return; $gameVariables.setValue(id, typeof v === 'string' && v.trim() !== '' && !isNaN(v) ? Number(v) : v); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - ops.switches = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.switches.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.switches[id]) || ('Switch ' + id); }, - get: function (id) { return defined(window.$gameSwitches) ? $gameSwitches.value(id) : false; }, - set: function (id, v) { if (!defined(window.$gameSwitches)) return; $gameSwitches.setValue(id, !!v); }, - toggle: function (id) { this.set(id, !this.get(id)); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - var INV_TABLES = { item: '$dataItems', weapon: '$dataWeapons', armor: '$dataArmors' }; - ops.inv = { - table: function (kind) { return window[INV_TABLES[kind]] || []; }, - data: function (kind, id) { return this.table(kind)[id] || null; }, - count: function (kind, id) { var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.numItems(d) : 0; }, - maxStack: function (kind, id) { if (MTC._itemMaxOverride > 0) return MTC._itemMaxOverride; var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.maxItems(d) : 99; }, - grant: function (kind, id, n) { var d = this.data(kind, id); if (d && defined(window.$gameParty)) $gameParty.gainItem(d, n, false); if (locks.isItemFrozen(kind, id)) LOCK.items.set(itemKey(kind, id), { kind: kind, id: id, value: this.count(kind, id) }); }, - setCount: function (kind, id, target) { this.grant(kind, id, clampInt(target, 0, null) - this.count(kind, id)); }, - max: function (kind, id) { this.setCount(kind, id, this.maxStack(kind, id)); }, - list: function (kind) { - var t = this.table(kind), out = []; - for (var id = 1; id < t.length; id++) { - var d = t[id]; if (!d || !d.name) continue; - out.push({ id: id, name: d.name, description: d.description || '', iconIndex: d.iconIndex || 0, count: $gameParty.numItems(d) }); - } - return out; - } - }; - - ops.gold = { - get: function () { return defined(window.$gameParty) ? $gameParty.gold() : 0; }, - max: function () { return defined(window.$gameParty) && $gameParty.maxGold ? $gameParty.maxGold() : 99999999; }, - add: function (n) { - if (!defined(window.$gameParty)) return; - if (LOCK.gold != null) { LOCK.gold = clampInt(LOCK.gold + n, 0, this.max()); (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); return; } - if (n >= 0) $gameParty.gainGold(n); else $gameParty.loseGold(-n); - }, - set: function (target) { this.add(clampInt(target, 0, this.max()) - this.get()); } - }; - - ops.actors = { - list: function () { - var out = []; - if (!defined(window.$dataActors)) return out; - for (var id = 1; id < $dataActors.length; id++) { - var d = $dataActors[id]; if (!d) continue; - var a = $gameActors.actor(id); - out.push({ id: id, name: a ? a.name() : d.name, level: a ? actorLevel(a) : (d.initialLevel || 1), inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false }); - } - return out; - }, - get: function (id) { - var a = $gameActors.actor(id); if (!a) return null; - var params = []; - for (var p = 0; p < 8; p++) params.push({ id: p, name: PARAM_NAMES[p], value: a.param(p) }); - var skills = []; - if (defined(window.$dataSkills)) for (var s = 1; s < $dataSkills.length; s++) { var sk = $dataSkills[s]; if (sk && sk.name) skills.push({ id: s, name: sk.name, learned: a.isLearnedSkill ? a.isLearnedSkill(s) : (a.skills().indexOf(sk) >= 0) }); } - var equips = [], slots = a.equipSlots ? a.equipSlots() : [], cur = a.equips(); - for (var e = 0; e < slots.length; e++) equips.push({ slot: e, etypeId: slots[e], current: cur[e] ? cur[e].name : '(none)' }); - return { - id: id, name: a.name(), level: actorLevel(a), exp: a.currentExp ? a.currentExp() : 0, - nextExp: a.nextLevelExp ? a.nextLevelExp() : 0, - hp: a.hp, mp: a.mp, tp: a.tp, mhp: a.mhp, mmp: a.mmp, - params: params, skills: skills, equips: equips, - inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false - }; - }, - setLevel: function (id, lv) { var a = $gameActors.actor(id); if (a) { var cap = a.maxLevel ? a.maxLevel() : 99; a.changeLevel(clampInt(lv, 1, cap), false); a.refresh(); } }, - setExp: function (id, exp) { var a = $gameActors.actor(id); if (a) { a.changeExp(clampInt(exp, 0, null), false); a.refresh(); } }, - setHp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setHp(clampInt(v, 0, a.mhp)); a.refresh(); } }, - setMp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setMp(clampInt(v, 0, a.mmp)); a.refresh(); } }, - setTp: function (id, v) { var a = $gameActors.actor(id); if (a && a.setTp) { a.setTp(clampInt(v, 0, 100)); a.refresh(); } }, - addParam: function (id, pid, delta) { var a = $gameActors.actor(id); if (a) { a.addParam(pid, Math.floor(delta)); a.refresh(); } }, - // param(pid) = round((paramBase+paramPlus) * paramRate * paramBuffRate) clamped to [paramMin,paramMax]. - // addParam only mutates paramPlus, so invert the rate to land the *visible* param on target. - setParam: function (id, pid, target) { - var a = $gameActors.actor(id); if (!a) return; - var rate = (a.paramRate ? a.paramRate(pid) : 1) * (a.paramBuffRate ? a.paramBuffRate(pid) : 1) || 1; - var cap = a.paramMax ? a.paramMax(pid) : null; - var want = clampInt(target, a.paramMin ? a.paramMin(pid) : 0, cap); - var base = a.paramBase ? a.paramBase(pid) : 0, plus = (a.paramPlus ? a.paramPlus(pid) : (a._paramPlus ? a._paramPlus[pid] : 0)) || 0; - a.addParam(pid, Math.round(want / rate) - base - plus); - a.refresh(); - }, - learn: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.learnSkill(skillId); }, - forget: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.forgetSkill(skillId); }, - equip: function (id, slotId, kind, itemId) { var a = $gameActors.actor(id); if (!a) return; var item = itemId ? ops.inv.data(kind, itemId) : null; if (a.forceChangeEquip) a.forceChangeEquip(slotId, item); else a.changeEquip(slotId, item); a.refresh(); }, - recover: function (id) { var a = $gameActors.actor(id); if (a) { a.recoverAll(); a.refresh(); } }, - setName: function (id, name) { var a = $gameActors.actor(id); if (a) a.setName(String(name)); }, - addToParty: function (id) { $gameParty.addActor(id); }, - removeFromParty: function (id) { $gameParty.removeActor(id); } - }; - - ops.party = { - members: function () { return defined(window.$gameParty) ? $gameParty.members().map(function (a) { return { id: a.actorId(), name: a.name(), level: actorLevel(a) }; }) : []; }, - add: function (id) { if (defined(window.$gameParty)) $gameParty.addActor(id); }, - remove: function (id) { if (defined(window.$gameParty)) $gameParty.removeActor(id); }, - steps: function () { return defined(window.$gameParty) ? $gameParty.steps() : 0; }, - // RPG Maker derives playtime from frame count (Game_System has no playtime()). - playtime: function () { return (typeof Graphics !== 'undefined' && Graphics.frameCount) ? Math.floor(Graphics.frameCount / 60) : 0; } - }; - - ops.map = { - list: function () { - var out = []; - if (!defined(window.$dataMapInfos)) return out; - for (var id = 1; id < $dataMapInfos.length; id++) { var m = $dataMapInfos[id]; if (m) out.push({ id: id, name: m.name || ('Map ' + id) }); } - return out; - }, - current: function () { if (!defined(window.$gameMap) || !defined(window.$gamePlayer)) return { mapId: 0, x: 0, y: 0, dir: 2 }; return { mapId: $gameMap.mapId(), x: $gamePlayer.x, y: $gamePlayer.y, dir: $gamePlayer.direction ? $gamePlayer.direction() : 2 }; }, - teleport: function (mapId, x, y, dir, fade) { $gamePlayer.reserveTransfer(mapId, clampInt(x, 0, null), clampInt(y, 0, null), dir || 0, fade == null ? 0 : fade); }, - loadMapFile: function (mapId) { - if (!nodeFs) return null; - try { var f = 'Map' + String(mapId).padStart(3, '0') + '.json'; return JSON.parse(nodeFs.readFileSync(nodePath.join(gameCwd(), 'data', f), 'utf8')); } - catch (e) { return null; } - }, - noclip: function (b) { locks.state.noclip = !!b; if (defined(window.$gamePlayer)) $gamePlayer.setThrough(!!b); }, - isNoclip: function () { return !!locks.state.noclip; }, - speed: function (n) { if (defined(window.$gamePlayer)) $gamePlayer.setMoveSpeed(clampInt(n, 1, 8)); } - }; - - ops.commonev = { - list: function () { - var out = []; - if (!defined(window.$dataCommonEvents)) return out; - for (var id = 1; id < $dataCommonEvents.length; id++) { var c = $dataCommonEvents[id]; if (c) out.push({ id: id, name: c.name || ('Common Event ' + id) }); } - return out; - }, - run: function (id) { if (defined(window.$gameTemp)) $gameTemp.reserveCommonEvent(id); } - }; - - ops.battle = { - inBattle: function () { - if (typeof SceneManager === 'undefined' || !SceneManager._scene) return false; - if (typeof Scene_Battle !== 'undefined' && SceneManager._scene instanceof Scene_Battle) return true; - var c = SceneManager._scene.constructor; // fallback if class binding unavailable - return !!(c && c.name === 'Scene_Battle'); - }, - instantWin: function () { - if (typeof $gameTroop === 'undefined' || !$gameTroop) return; - $gameTroop.members().forEach(function (e) { - e.setHp(0); - if (e.deathStateId && e.addState) e.addState(e.deathStateId()); // mark actually dead - else if (e.die) e.die(); - if (e.performCollapse) e.performCollapse(); // visual collapse - e.refresh(); - }); - if (typeof BattleManager !== 'undefined' && BattleManager.checkBattleEnd) BattleManager.checkBattleEnd(); - }, - flee: function () { if (typeof BattleManager !== 'undefined' && BattleManager.processAbort) BattleManager.processAbort(); } - }; - - // =================================================================================== - // LOCKS — prototype-level monkeypatches + per-frame re-assertion. Installed once. - // =================================================================================== - var LOCK = { vars: new Map(), switches: new Map(), items: new Map(), gold: null, stats: new Map(), noclip: false }; - function itemKey(kind, id) { return kind + ':' + id; } - - var locks = { - state: LOCK, - _installed: false, - install: function () { - if (this._installed) return; this._installed = true; - // Variables - if (typeof Game_Variables !== 'undefined') { - var _sv = Game_Variables.prototype.setValue; - Game_Variables.prototype.setValue = function (id, value) { if (LOCK.vars.has(id)) value = LOCK.vars.get(id); _sv.call(this, id, value); }; - } - // Switches - if (typeof Game_Switches !== 'undefined') { - var _ss = Game_Switches.prototype.setValue; - Game_Switches.prototype.setValue = function (id, value) { if (LOCK.switches.has(id)) value = LOCK.switches.get(id); _ss.call(this, id, value); }; - } - // Gold: substitute (not block) so freezeGold can re-snapshot on edit; item freeze is tick-based - // (NOT a gainItem block) so equip bookkeeping / give-take still runs, corrected next frame. - if (typeof Game_Party !== 'undefined') { - var _gg = Game_Party.prototype.gainGold; - locks._origGainGold = _gg; - Game_Party.prototype.gainGold = function (n) { if (LOCK.gold != null) return; _gg.call(this, n); }; - } - // Battle: god mode + OHKO via one executeHpDamage override - if (typeof Game_Action !== 'undefined') { - var _ehd = Game_Action.prototype.executeHpDamage; - Game_Action.prototype.executeHpDamage = function (target, value) { - if (CHEAT.god && target.isActor && target.isActor() && value > 0) value = 0; - if (CHEAT.ohko && this.subject().isActor && this.subject().isActor() && target.isEnemy && target.isEnemy()) value = target.hp; - _ehd.call(this, target, value); - }; - } - // God mode also blocks non-action HP loss for actors (slip/regen, event Change-HP) + floor damage. - if (typeof Game_Battler !== 'undefined' && Game_Battler.prototype.gainHp) { - var _gh = Game_Battler.prototype.gainHp; - Game_Battler.prototype.gainHp = function (value) { if (CHEAT.god && this.isActor && this.isActor() && value < 0) value = 0; _gh.call(this, value); }; - } - if (typeof Game_Actor !== 'undefined' && Game_Actor.prototype.executeFloorDamage) { - var _efd = Game_Actor.prototype.executeFloorDamage; - Game_Actor.prototype.executeFloorDamage = function () { if (CHEAT.god) return; _efd.call(this); }; - } - // No encounters - if (typeof Game_Player !== 'undefined') { - var _epv = Game_Player.prototype.encounterProgressValue; - Game_Player.prototype.encounterProgressValue = function () { return CHEAT.noEncounter ? 0 : _epv.call(this); }; - } - // Speedhack: drive the scene update extra times per frame (speed>1) or skip frames (speed<1). - // Input is still read once per real frame, so the whole game (movement, anim, battle, messages, - // events, timers) runs faster/slower. Works for MV and MZ (both expose SceneManager.updateScene). - if (typeof SceneManager !== 'undefined' && SceneManager.updateScene) { - var _updateScene = SceneManager.updateScene, _spdAcc = 0; - // Extra updates are only safe in a steady scene: the scene must be started, not changing, and - // (on a map) not mid-transfer — otherwise $dataMap is briefly null and the scroll code throws. - function speedSafe(mgr) { - if (mgr.isCurrentSceneStarted) { if (!mgr.isCurrentSceneStarted()) return false; } // MV - else if (mgr._scene && mgr._scene.isStarted) { if (!mgr._scene.isStarted()) return false; } // MZ - if (mgr.isSceneChanging && mgr.isSceneChanging()) return false; // mid scene transition - if (typeof $gamePlayer !== 'undefined' && $gamePlayer && $gamePlayer.isTransferring && $gamePlayer.isTransferring()) return false; - if (typeof DataManager !== 'undefined' && DataManager.isMapLoaded && !DataManager.isMapLoaded()) return false; // map (re)loading - return true; - } - SceneManager.updateScene = function () { - var sp = CHEAT.speed || 1; - if (sp >= 1) { - _updateScene.call(this); - if (sp > 1 && this._scene && typeof this._scene.update === 'function' && speedSafe(this)) { - _spdAcc += (sp - 1); - var guard = 0; - while (_spdAcc >= 1 && guard++ < 64) { _spdAcc -= 1; try { this._scene.update(); } catch (e) { _spdAcc = 0; break; } } - } else { _spdAcc = 0; } // not safe / not boosting -> don't bank up a burst of catch-up updates - } else { - _spdAcc += sp; - if (_spdAcc >= 1) { _spdAcc -= 1; _updateScene.call(this); } - else if (this._scene) { // skip the game advance this frame, keep start/ready bookkeeping - var u = this._scene.update; this._scene.update = function () {}; - try { _updateScene.call(this); } finally { this._scene.update = u; } - } - } - }; - } - // Clear stale freeze snapshots when the engine swaps in fresh game objects (new game / load). - if (typeof DataManager !== 'undefined') { - if (DataManager.setupNewGame) { var _sng = DataManager.setupNewGame; DataManager.setupNewGame = function () { locks.clearAll(); _sng.call(this); }; } - if (DataManager.extractSaveContents) { var _esc = DataManager.extractSaveContents; DataManager.extractSaveContents = function (c) { locks.clearAll(); return _esc.call(this, c); }; } - } - }, - // Freeze setters update both the lock map and the live value once. Maps store parsed objects so - // the per-frame tick never re-parses string keys. - freezeVar: function (id, on) { if (on) { LOCK.vars.set(id, ops.vars.get(id)); ops.vars.set(id, ops.vars.get(id)); } else LOCK.vars.delete(id); }, - freezeSwitch: function (id, on) { if (on) LOCK.switches.set(id, ops.switches.get(id)); else LOCK.switches.delete(id); }, - freezeItem: function (kind, id, on) { var k = itemKey(kind, id); if (on) LOCK.items.set(k, { kind: kind, id: id, value: ops.inv.count(kind, id) }); else LOCK.items.delete(k); }, - freezeGold: function (on) { LOCK.gold = on ? ops.gold.get() : null; }, - freezeStat: function (actorId, stat, on) { var k = actorId + ':' + stat; if (on) { var a = defined(window.$gameActors) ? $gameActors.actor(actorId) : null; LOCK.stats.set(k, { actorId: actorId, stat: stat, value: a ? a[stat] : 0 }); } else LOCK.stats.delete(k); }, - isVarFrozen: function (id) { return LOCK.vars.has(id); }, - isSwitchFrozen: function (id) { return LOCK.switches.has(id); }, - isItemFrozen: function (kind, id) { return LOCK.items.has(itemKey(kind, id)); }, - isStatFrozen: function (actorId, stat) { return LOCK.stats.has(actorId + ':' + stat); }, - // Per-frame: re-assert values the overrides can't catch (hp/mp/tp, gold target, item counts, noclip). - tick: function () { - if (!LOCK.noclip && LOCK.gold == null && !LOCK.stats.size && !LOCK.items.size) return; // early-out - if (LOCK.noclip && defined(window.$gamePlayer) && !$gamePlayer.isThrough()) $gamePlayer.setThrough(true); - if (LOCK.gold != null && defined(window.$gameParty) && $gameParty.gold() !== LOCK.gold) (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); - if (LOCK.stats.size && defined(window.$gameActors)) { - LOCK.stats.forEach(function (e) { - var a = $gameActors.actor(e.actorId); if (!a) return; - if (e.stat === 'hp' && a.hp !== e.value) a.setHp(Math.min(e.value, a.mhp)); - else if (e.stat === 'mp' && a.mp !== e.value) a.setMp(Math.min(e.value, a.mmp)); - else if (e.stat === 'tp' && a.tp !== e.value && a.setTp) a.setTp(e.value); - }); - } - if (LOCK.items.size && defined(window.$gameParty)) { - LOCK.items.forEach(function (e) { if (ops.inv.count(e.kind, e.id) !== e.value) { var d = ops.inv.data(e.kind, e.id); if (d) $gameParty.gainItem(d, e.value - ops.inv.count(e.kind, e.id), false); } }); - } - }, - summary: function () { - var out = []; - LOCK.vars.forEach(function (v, id) { out.push({ type: 'var', id: id, label: 'Var ' + id + ' · ' + ops.vars.name(id), value: v }); }); - LOCK.switches.forEach(function (v, id) { out.push({ type: 'switch', id: id, label: 'Switch ' + id + ' · ' + ops.switches.name(id), value: v ? 'ON' : 'OFF' }); }); - LOCK.items.forEach(function (e, key) { out.push({ type: 'item', key: key, label: e.kind + ' ' + e.id + ' · ' + (ops.inv.data(e.kind, e.id) ? ops.inv.data(e.kind, e.id).name : ''), value: e.value }); }); - LOCK.stats.forEach(function (e, key) { out.push({ type: 'stat', key: key, label: 'Actor ' + e.actorId + ' · ' + e.stat.toUpperCase(), value: e.value }); }); - if (LOCK.gold != null) out.push({ type: 'gold', label: 'Gold (frozen)', value: LOCK.gold }); - if (LOCK.noclip) out.push({ type: 'noclip', label: 'Noclip (active)', value: 'ON' }); - return out; - }, - clearAll: function () { LOCK.vars.clear(); LOCK.switches.clear(); LOCK.items.clear(); LOCK.stats.clear(); LOCK.gold = null; if (LOCK.noclip) ops.map.noclip(false); } - }; - - // =================================================================================== - // CHEATS — global toggles consumed by the lock overrides + battle actions. - // =================================================================================== - var CHEAT = { god: false, ohko: false, noEncounter: false, speed: 1, uiFocused: false }; - var cheats = { - state: CHEAT, - setGod: function (b) { CHEAT.god = !!b; }, - setOhko: function (b) { CHEAT.ohko = !!b; }, - setNoEncounter: function (b) { CHEAT.noEncounter = !!b; }, - setSpeed: function (n) { CHEAT.speed = Math.max(0.1, Math.min(Number(n) || 1, 16)); }, - toggleSpeed: function () { this.setSpeed(CHEAT.speed !== 1 ? 1 : (MTC._speedBoost || 2)); return CHEAT.speed; }, - instantWin: function () { ops.battle.instantWin(); }, - flee: function () { ops.battle.flee(); } - }; - - // expose the assembled API (UI is attached below if a real DOM is present) - var MTC = { env: { IS_MZ: IS_MZ }, ops: ops, locks: locks, cheats: cheats, LOCK: LOCK, CHEAT: CHEAT, PARAM_NAMES: PARAM_NAMES, _itemMaxOverride: 0, _hotkey: 'F10', _speedKey: 'Control', _speedBoost: 2 }; - if (root) { root.Forge = MTC; root.__FORGE_CORE__ = true; } - if (typeof module !== 'undefined' && module.exports) module.exports = MTC; - - // ---- engine boot hooks (guarded; only when classes exist) ---- - if (typeof Scene_Base !== 'undefined') { - var _su = Scene_Base.prototype.update; - Scene_Base.prototype.update = function () { _su.call(this); try { locks.tick(); } catch (e) {} }; - } - // install lock overrides as soon as the game classes are available - try { locks.install(); } catch (e) {} - - // ---- UI: attach only when a real browser DOM is available (skipped in Node tests) ---- - if (typeof document !== 'undefined' && document.body && typeof document.body.attachShadow === 'function' && typeof window !== 'undefined') { - try { MTC.ui = buildUI(MTC); } catch (e) { try { console.error('[Forge] UI init failed', e); } catch (_) {} } - } - - // =================================================================================== - // UI — Shadow-DOM overlay. Inlined so the single ship file works with zero deps. - // =================================================================================== - function buildUI(API) { - var LS = 'forge:'; - function store(k, v) { try { localStorage.setItem(LS + k, JSON.stringify(v)); } catch (e) {} } - function load(k, d) { try { var s = localStorage.getItem(LS + k); return s == null ? d : JSON.parse(s); } catch (e) { return d; } } - // persisted speed settings (UI-controlled; override core/param defaults if the user changed them) - API._speedKey = load('speedKey', API._speedKey || 'Control'); - API._speedUseKey = load('speedUseKey', true); - API._speedBoost = load('speedBoost', API._speedBoost || 2); - if (!API._speedUseKey) API.cheats.setSpeed(API._speedBoost); // "always on" mode applies immediately - - function el(tag, props, kids) { - var n = document.createElement(tag); - if (props) for (var k in props) { - if (k === 'class') n.className = props[k]; - else if (k === 'text') n.textContent = props[k]; - else if (k === 'html') n.innerHTML = props[k]; - else if (k === 'style') n.setAttribute('style', props[k]); - else if (k.slice(0, 2) === 'on' && typeof props[k] === 'function') n.addEventListener(k.slice(2).toLowerCase(), props[k]); - else if (props[k] != null) n.setAttribute(k, props[k]); - } - if (kids) (Array.isArray(kids) ? kids : [kids]).forEach(function (c) { if (c != null) n.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); }); - return n; - } - - // Inline SVG icons (no font/emoji dependency -> render identically on Windows/macOS/Linux). - function svg(inner) { return ''; } - var ICONS = { - vars: svg(''), - switches: svg(''), - inv: svg(''), - actors: svg(''), - party: svg(''), - map: svg(''), - commonev: svg(''), - locks: svg(''), - battle: svg(''), - tool: svg(''), - refresh: svg(''), - theme: svg(''), - close: svg(''), - lock: svg(''), - unlock: svg('') - }; - - var CSS = "\ -:host{position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important;contain:none}\ -*{box-sizing:border-box;font-family:var(--font-ui);-webkit-user-select:none;user-select:none}\ -#forge-root{--font-ui:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-mono:ui-monospace,'Cascadia Code',Consolas,monospace;\ ---fg-bg:#15171c;--fg-bg-elev:#1c1f27;--fg-bg-input:#21242d;--fg-bg-row-alt:#181b22;--fg-border:#2b2f3a;--fg-border-strong:#3a3f4d;\ ---fg-text:#e6e9ef;--fg-text-dim:#9aa1b1;--fg-text-faint:#646b7d;--fg-accent:#5b8cff;--fg-accent-weak:#2a3a63;--fg-success:#3ecf8e;--fg-warn:#f0b132;--fg-danger:#f0556a;--fg-frozen:#8b5cf6;\ ---sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--rad-sm:4px;--rad-md:7px;--rad-lg:11px;--rad-pill:999px;\ ---sh-panel:0 18px 50px rgba(0,0,0,.5),0 0 0 1px var(--fg-border);--row-h:30px;--rail-w:64px;--ease:cubic-bezier(.2,.7,.3,1);--dur:120ms;\ ---fs-xs:11px;--fs-sm:12px;--fs-md:13px;--fs-lg:15px;color:var(--fg-text);font-size:var(--fs-md)}\ -#forge-root[data-theme=light]{--fg-bg:#f6f7f9;--fg-bg-elev:#fff;--fg-bg-input:#eef0f4;--fg-bg-row-alt:#f0f2f5;--fg-border:#dde0e7;--fg-border-strong:#c7ccd8;--fg-text:#1a1d24;--fg-text-dim:#5a6172;--fg-text-faint:#9097a6;--fg-accent-weak:#dce6ff}\ -.fg-panel{position:fixed;display:flex;flex-direction:column;background:var(--fg-bg);border-radius:var(--rad-lg);box-shadow:var(--sh-panel);overflow:hidden;z-index:2147483000;min-width:480px;min-height:360px;pointer-events:auto}\ -.fg-titlebar{display:flex;align-items:center;gap:6px;height:33px;padding:0 6px 0 10px;background:var(--fg-bg-elev);border-bottom:1px solid var(--fg-border);cursor:move;flex:0 0 auto}\ -.fg-brand{font-weight:700;font-size:var(--fs-md);letter-spacing:.3px;color:var(--fg-text);margin-right:8px;white-space:nowrap}\ -.fg-brand b{color:var(--fg-accent)}\ -.fg-search{flex:1;height:23px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:var(--rad-md);color:var(--fg-text);padding:0 9px;font-size:var(--fs-sm);outline:none;min-width:80px}\ -.fg-search:focus{border-color:var(--fg-accent)}\ -.fg-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:23px;height:23px;border-radius:var(--rad-md);background:transparent;color:var(--fg-text-dim);border:0;cursor:pointer;font-size:13px;transition:background var(--dur)}\ -.fg-iconbtn:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-body{flex:1;display:flex;min-height:0}\ -.fg-rail{flex:0 0 var(--rail-w);display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) var(--sp-1);background:var(--fg-bg-elev);border-right:1px solid var(--fg-border);overflow-y:auto}\ -.fg-rail__item{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--sp-2) 0;border-radius:var(--rad-md);cursor:pointer;color:var(--fg-text-dim);font-size:10px;transition:all var(--dur);border:0;background:transparent}\ -.fg-rail__item .ic{display:flex;align-items:center;justify-content:center}\n.fg-rail__item .ic svg{width:19px;height:19px}\n.fg-iconbtn svg{width:15px;height:15px}\n.fg-lock svg{width:15px;height:15px}\n.fg-launcher svg{width:21px;height:21px}\ -.fg-rail__item:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-rail__item.is-active{background:var(--fg-accent-weak);color:var(--fg-accent)}\ -.fg-content{flex:1;display:flex;flex-direction:column;min-width:0}\ -.fg-section-head{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4) var(--sp-2);flex:0 0 auto}\ -.fg-section-head h2{margin:0;font-size:var(--fs-lg);font-weight:600}\ -.fg-count{font-size:var(--fs-xs);color:var(--fg-text-faint);background:var(--fg-bg-input);padding:2px 7px;border-radius:var(--rad-pill)}\ -.fg-spacer{flex:1}\ -.fg-subtoolbar{display:flex;align-items:center;gap:var(--sp-2);padding:0 var(--sp-4) var(--sp-2);flex-wrap:wrap}\ -.fg-segmented{display:inline-flex;background:var(--fg-bg-input);border-radius:var(--rad-md);padding:2px}\ -.fg-segmented button{border:0;background:transparent;color:var(--fg-text-dim);padding:3px 12px;border-radius:5px;cursor:pointer;font-size:var(--fs-sm)}\ -.fg-segmented button.is-active{background:var(--fg-accent);color:#fff}\ -.fg-btn{border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text);padding:4px 11px;border-radius:var(--rad-md);cursor:pointer;font-size:var(--fs-sm);transition:all var(--dur)}\ -.fg-btn:hover{border-color:var(--fg-accent);color:var(--fg-accent)}\ -.fg-btn--ghost{background:transparent;border-color:transparent;color:var(--fg-text-dim)}\ -.fg-btn--danger:hover{border-color:var(--fg-danger);color:var(--fg-danger)}\ -.fg-list{flex:1;overflow-y:auto;overflow-x:hidden;position:relative;border-top:1px solid var(--fg-border)}\ -.fg-list__sizer{position:relative;width:100%}\ -.fg-list__window{position:absolute;top:0;left:0;right:0}\ -.fg-row{display:flex;align-items:center;gap:var(--sp-2);height:var(--row-h);padding:0 var(--sp-4);border-bottom:1px solid var(--fg-border);font-size:var(--fs-sm)}\ -.fg-row:nth-child(even){background:var(--fg-bg-row-alt)}\ -.fg-row.is-frozen{box-shadow:inset 3px 0 0 var(--fg-frozen)}\ -.fg-row.is-selected{background:var(--fg-accent-weak)!important;box-shadow:inset 2px 0 0 var(--fg-accent)}\ -.fg-cell--id{flex:0 0 52px;color:var(--fg-text-faint);font-family:var(--font-mono);font-size:var(--fs-xs)}\ -.fg-cell--name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\ -.fg-cell--name .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--fg-accent);margin-right:6px;vertical-align:middle}\ -.fg-cell--val{flex:0 0 auto;display:flex;align-items:center;gap:4px}\ -.fg-stepper{display:inline-flex;align-items:center;gap:3px}\ -.fg-step{min-width:30px;width:auto;padding:0 5px;height:22px;white-space:nowrap;border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text-dim);border-radius:5px;cursor:pointer;font-size:var(--fs-xs);font-family:var(--font-mono)}\ -.fg-step:hover{color:var(--fg-accent);border-color:var(--fg-accent)}\ -.fg-num{width:68px;height:22px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:5px;color:var(--fg-text);text-align:right;padding:0 6px;font-family:var(--font-mono);font-size:var(--fs-sm);outline:none}\ -.fg-num:focus{border-color:var(--fg-accent)}\ -.fg-toggle{width:38px;height:21px;border-radius:var(--rad-pill);background:var(--fg-border-strong);position:relative;cursor:pointer;transition:background var(--dur);border:0;flex:0 0 auto}\ -.fg-toggle::after{content:'';position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;transition:transform var(--dur)}\ -.fg-toggle.is-on{background:var(--fg-success)}\ -.fg-toggle.is-on::after{transform:translateX(17px)}\ -.fg-lock{width:24px;height:24px;border:0;background:transparent;color:var(--fg-text-faint);cursor:pointer;border-radius:5px;font-size:13px;flex:0 0 auto}\ -.fg-lock:hover{color:var(--fg-frozen);background:var(--fg-bg-input)}\ -.fg-lock.is-frozen{color:var(--fg-frozen)}\ -.fg-statusbar{display:flex;align-items:center;gap:var(--sp-2);height:24px;padding:0 var(--sp-3);background:var(--fg-bg-elev);border-top:1px solid var(--fg-border);font-size:var(--fs-xs);color:var(--fg-text-faint);flex:0 0 auto}\ -.fg-detail{padding:var(--sp-3) var(--sp-4);overflow-y:auto;flex:1}\ -.fg-field{display:flex;align-items:center;gap:var(--sp-2);padding:5px 0;border-bottom:1px solid var(--fg-border);min-width:0}\n.fg-field .fg-stepper{margin-left:auto;flex:0 0 auto}\ -.fg-field label{flex:0 0 96px;color:var(--fg-text-dim);font-size:var(--fs-sm)}\ -.fg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:var(--sp-2) var(--sp-4)}\ -.fg-toasts{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;gap:6px;z-index:2147483100;pointer-events:none}\ -.fg-toast{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-left:3px solid var(--fg-accent);color:var(--fg-text);padding:8px 14px;border-radius:var(--rad-md);font-size:var(--fs-sm);box-shadow:var(--sh-panel);animation:fgin var(--dur) var(--ease)}\ -.fg-toast.warn{border-left-color:var(--fg-warn)}.fg-toast.danger{border-left-color:var(--fg-danger)}.fg-toast.ok{border-left-color:var(--fg-success)}\ -@keyframes fgin{from{opacity:0;transform:translateY(6px)}to{opacity:1}}\ -.fg-launcher{position:fixed;pointer-events:auto;width:42px;height:42px;border-radius:50%;background:var(--fg-accent);color:#fff;border:0;cursor:pointer;font-size:18px;z-index:2147482999;box-shadow:var(--sh-panel);display:flex;align-items:center;justify-content:center}\ -.fg-launcher:hover{filter:brightness(1.1)}\ -.fg-resize{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}\ -.fg-resize::after{content:'';position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--fg-text-faint);border-bottom:2px solid var(--fg-text-faint)}\ -.fg-empty{padding:var(--sp-5);text-align:center;color:var(--fg-text-faint);font-size:var(--fs-sm)}\ -.fg-confirm{position:fixed;pointer-events:auto;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);z-index:2147483200}\ -.fg-confirm__box{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-radius:var(--rad-lg);padding:var(--sp-4);max-width:340px;box-shadow:var(--sh-panel)}\ -.fg-confirm__box p{margin:0 0 var(--sp-4)}.fg-confirm__row{display:flex;justify-content:flex-end;gap:var(--sp-2)}\ -input::placeholder{color:var(--fg-text-faint)}\ -::-webkit-scrollbar{width:9px;height:9px}\ -::-webkit-scrollbar-track{background:transparent}\ -::-webkit-scrollbar-thumb{background:var(--fg-border-strong);border-radius:5px}\ -::-webkit-scrollbar-thumb:hover{background:var(--fg-text-faint)}"; - - // ---------- shadow host ---------- - var host = el('div', { id: 'forge-host' }); - host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important'; - document.body.appendChild(host); - var shadow = host.attachShadow({ mode: 'open' }); - var rootEl = el('div', { id: 'forge-root' }); - rootEl.setAttribute('data-theme', load('theme', 'dark')); - shadow.appendChild(el('style', { text: CSS })); - shadow.appendChild(rootEl); - - // Swallow events so panel interaction never leaks to the game. BUBBLE phase: the panel's own - // inputs receive the event first (target phase), then we stop it before it reaches document - // (where RPG Maker's Input/TouchInput listen). Capture phase would block the inputs themselves. - ['keydown', 'keyup', 'keypress', 'wheel', 'mousedown', 'mouseup', 'mousemove', 'click', 'dblclick', - 'pointerdown', 'pointerup', 'pointermove', 'pointercancel', 'touchstart', 'touchend', 'touchmove', 'touchcancel', 'contextmenu'].forEach(function (t) { - rootEl.addEventListener(t, function (e) { e.stopPropagation(); }, false); - }); - function isEditable(el) { return el && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA'); } - rootEl.addEventListener('focusin', function (e) { if (isEditable(e.target)) API.CHEAT.uiFocused = true; }, true); - rootEl.addEventListener('focusout', function () { setTimeout(function () { API.CHEAT.uiFocused = !!(shadow.activeElement && isEditable(shadow.activeElement)); }, 0); }, true); - window.addEventListener('blur', function () { API.CHEAT.uiFocused = false; }); // never latch the game-input gate - // Backup engine-level gate: while a panel input is focused, drop the game's keyboard handler. - if (typeof Input !== 'undefined' && Input._onKeyDown) { var _okd = Input._onKeyDown; Input._onKeyDown = function (e) { if (API.CHEAT.uiFocused) return; _okd.call(this, e); }; } - if (typeof Input !== 'undefined' && Input._onKeyUp) { var _oku = Input._onKeyUp; Input._onKeyUp = function (e) { if (API.CHEAT.uiFocused) return; _oku.call(this, e); }; } - - // ---------- toasts ---------- - var toasts = el('div', { class: 'fg-toasts' }); rootEl.appendChild(toasts); - function toast(msg, kind) { var t = el('div', { class: 'fg-toast ' + (kind || ''), text: msg }); toasts.appendChild(t); setTimeout(function () { t.remove(); }, 2200); } - function confirmBox(msg, onYes) { - var box = el('div', { class: 'fg-confirm' }, el('div', { class: 'fg-confirm__box' }, [ - el('p', { text: msg }), - el('div', { class: 'fg-confirm__row' }, [ - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Cancel', onclick: function () { box.remove(); } }), - el('button', { class: 'fg-btn fg-btn--danger', text: 'Confirm', onclick: function () { box.remove(); onYes(); } }) - ]) - ])); - rootEl.appendChild(box); - } - - // ---------- panel skeleton ---------- - var vw = window.innerWidth || 816, vh = window.innerHeight || 624; - // Default size fits the window (many MV games are ~816x624); leave a margin. - var st = load('panel', { x: 16, y: 16, w: Math.min(880, vw - 32), h: Math.min(560, vh - 32) }); - st.w = Math.max(420, Math.min(st.w, vw - 8)); st.h = Math.max(320, Math.min(st.h, vh - 8)); - st.x = Math.max(0, Math.min(st.x, vw - st.w)); st.y = Math.max(0, Math.min(st.y, vh - st.h)); // keep fully on-screen - var panel = el('div', { class: 'fg-panel' }); - panel.style.left = st.x + 'px'; panel.style.top = st.y + 'px'; panel.style.width = st.w + 'px'; panel.style.height = st.h + 'px'; - var search = el('input', { class: 'fg-search', type: 'text', placeholder: 'Search… (Ctrl+K)' }); - var titlebar = el('div', { class: 'fg-titlebar' }, [ - el('span', { class: 'fg-brand', html: 'Forge' }), - search, - el('button', { class: 'fg-iconbtn', title: 'Rescan', html: ICONS.refresh, onclick: function () { render(); toast('Rescanned'); } }), - el('button', { class: 'fg-iconbtn', title: 'Theme', html: ICONS.theme, onclick: function () { var t = rootEl.getAttribute('data-theme') === 'light' ? 'dark' : 'light'; rootEl.setAttribute('data-theme', t); store('theme', t); } }), - el('button', { class: 'fg-iconbtn', title: 'Close (F10)', html: ICONS.close, onclick: function () { hide(); } }) - ]); - var rail = el('div', { class: 'fg-rail' }); - var content = el('div', { class: 'fg-content' }); - var statusbar = el('div', { class: 'fg-statusbar' }); - panel.appendChild(titlebar); - panel.appendChild(el('div', { class: 'fg-body' }, [rail, content])); - panel.appendChild(statusbar); - var resize = el('div', { class: 'fg-resize' }); panel.appendChild(resize); - rootEl.appendChild(panel); - - // ---------- launcher (docks to bottom-right corner by default; 'launcherPos' is a fresh key so - // any stale mid-screen position from older builds is ignored) ---------- - var lp = load('launcherPos', { x: vw - 56, y: vh - 56 }); - lp.x = Math.max(4, Math.min(lp.x, vw - 46)); lp.y = Math.max(4, Math.min(lp.y, vh - 46)); - var launcher = el('button', { class: 'fg-launcher', html: ICONS.tool, title: 'Forge (F10)' }); - launcher.style.left = lp.x + 'px'; launcher.style.top = lp.y + 'px'; - launcher.addEventListener('click', function (e) { if (!launcher._dragged) toggle(); }); - rootEl.appendChild(launcher); - makeDraggable(launcher, launcher, function (x, y) { store('launcherPos', { x: x, y: y }); }, true); - - // ---------- drag / resize ---------- - function makeDraggable(handle, target, onEnd, isLauncher) { - handle.addEventListener('mousedown', function (e) { - if (e.target.closest && e.target.closest('input,button.fg-iconbtn')) return; - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ox = parseInt(target.style.left) || 0, oy = parseInt(target.style.top) || 0, moved = false; - if (isLauncher) target._dragged = false; - function mv(ev) { ev.stopPropagation(); var dx = ev.clientX - sx, dy = ev.clientY - sy; if (Math.abs(dx) + Math.abs(dy) > 3) moved = true; var nx = Math.max(0, Math.min(window.innerWidth - target.offsetWidth, ox + dx)), ny = Math.max(0, Math.min(window.innerHeight - 30, oy + dy)); target.style.left = nx + 'px'; target.style.top = ny + 'px'; if (isLauncher) target._dragged = moved; } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); if (onEnd) onEnd(parseInt(target.style.left), parseInt(target.style.top)); setTimeout(function () { if (isLauncher) target._dragged = false; }, 0); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - } - makeDraggable(titlebar, panel, function (x, y) { st.x = x; st.y = y; store('panel', st); }); - resize.addEventListener('mousedown', function (e) { - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ow = panel.offsetWidth, oh = panel.offsetHeight; - function mv(ev) { ev.stopPropagation(); var w = Math.max(480, ow + ev.clientX - sx), h = Math.max(360, oh + ev.clientY - sy); panel.style.width = w + 'px'; panel.style.height = h + 'px'; if (activeRenderer && activeRenderer.onResize) activeRenderer.onResize(); } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); st.w = panel.offsetWidth; st.h = panel.offsetHeight; store('panel', st); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - - // ---------- reusable virtualized list ---------- - function VirtualList(opts) { - // opts: rowH, getModel()->[], renderRow(rowEl, item), matches(item, query) - var listEl = el('div', { class: 'fg-list' }); - var sizer = el('div', { class: 'fg-list__sizer' }); - var win = el('div', { class: 'fg-list__window' }); - sizer.appendChild(win); listEl.appendChild(sizer); - var rowH = opts.rowH || 30, pool = [], model = [], view = [], query = ''; - // ONE delegated row click (recycled rows must not accumulate per-draw listeners). - if (opts.onRowClick) listEl.addEventListener('click', function (e) { var r = e.target && e.target.closest ? e.target.closest('.fg-row') : null; if (r && r._item) opts.onRowClick(r._item); }); - function rebuild() { model = opts.getModel() || []; applyFilter(); } - function applyFilter() { - view = query ? model.filter(function (it) { return opts.matches(it, query); }) : model; - sizer.style.height = (view.length * rowH) + 'px'; - var em = listEl.querySelector('.fg-empty'); - if (!view.length) { pool.forEach(function (r) { r.style.display = 'none'; }); if (!em) listEl.appendChild(el('div', { class: 'fg-empty', text: 'Nothing here' })); } - else if (em) em.remove(); - lastFirst = -1; draw(true); // content changed -> force re-render - } - var lastFirst = -1; - function draw(force) { - var scroll = listEl.scrollTop, h = listEl.clientHeight || 400; - var first = Math.max(0, Math.floor(scroll / rowH) - 4); - if (!force && first === lastFirst) return; // window unchanged during scroll -> skip re-render - lastFirst = first; - var count = Math.ceil(h / rowH) + 8; - var last = Math.min(view.length, first + count); - win.style.transform = 'translateY(' + (first * rowH) + 'px)'; - var need = last - first; - while (pool.length < need) { var r = el('div', { class: 'fg-row' }); win.appendChild(r); pool.push(r); } - for (var i = 0; i < pool.length; i++) { - var r = pool[i]; - if (i < need) { r.style.display = 'flex'; r._item = view[first + i]; opts.renderRow(r, view[first + i]); } else { r.style.display = 'none'; r._item = null; } - } - } - var raf = null; - listEl.addEventListener('scroll', function () { if (raf) return; raf = requestAnimationFrame(function () { raf = null; draw(false); }); }); - return { el: listEl, rebuild: rebuild, applyFilter: applyFilter, draw: function () { draw(true); }, setQuery: function (q) { query = q; applyFilter(); }, onResize: function () { draw(true); }, - refresh: function () { draw(true); } }; - } - - // numeric stepper control - function stepper(getVal, setVal, opts) { - opts = opts || {}; - var wrap = el('div', { class: 'fg-stepper' }); - var input = el('input', { class: 'fg-num', type: 'text' }); - function sync() { input.value = getVal(); } - function commit(v) { setVal(v); sync(); if (opts.after) opts.after(); } - [['−100', -100], ['−1', -1]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - wrap.appendChild(input); - [['+1', 1], ['+100', 100]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - input.addEventListener('keydown', function (e) { if (e.key === 'Enter') { commit(parse(input.value)); input.blur(); } else if (e.key === 'Escape') { sync(); input.blur(); } }); - input.addEventListener('blur', function () { commit(parse(input.value)); }); - function parse(s) { var n = Number(String(s).replace(/[^0-9.\-]/g, '')); return isNaN(n) ? getVal() : n; } - sync(); - return { el: wrap, sync: sync }; - } - - // ---------- sections ---------- - var activeRenderer = null, currentSection = null; - var SECTIONS = []; - function section(id, icon, title, builder) { SECTIONS.push({ id: id, icon: icon, title: title, builder: builder }); } - - function listSection(getModel, renderRow, matches, headExtra) { - return function (body, head) { - if (headExtra) headExtra(head); - var vl = VirtualList({ getModel: getModel, renderRow: renderRow, matches: matches || defaultMatch }); - body.appendChild(vl.el); - vl.rebuild(); - return { vl: vl, onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return (getModel() || []).length; } }; - }; - } - function defaultMatch(it, q) { q = q.toLowerCase(); return String(it.id) === q || (it.name && it.name.toLowerCase().indexOf(q) >= 0); } - - // Variables - section('vars', ICONS.vars, 'Variables', listSection( - function () { return API.ops.vars.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isVarFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.vars.get(it.id); }, function (v) { API.ops.vars.set(it.id, v); if (API.locks.isVarFrozen(it.id)) API.locks.freezeVar(it.id, true); }, {}); - val.appendChild(sp.el); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isVarFrozen(it.id), function (on) { API.locks.freezeVar(it.id, on); refreshActive(); })); - } - )); - - // Switches - section('switches', ICONS.switches, 'Switches', listSection( - function () { return API.ops.switches.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isSwitchFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var tg = el('button', { class: 'fg-toggle' + (API.ops.switches.get(it.id) ? ' is-on' : '') }); - tg.addEventListener('click', function () { API.ops.switches.set(it.id, !API.ops.switches.get(it.id)); if (API.locks.isSwitchFrozen(it.id)) API.locks.freezeSwitch(it.id, true); tg.classList.toggle('is-on', API.ops.switches.get(it.id)); }); - val.appendChild(tg); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isSwitchFrozen(it.id), function (on) { API.locks.freezeSwitch(it.id, on); refreshActive(); })); - } - )); - - // Items / Weapons / Armors (segmented) - section('inv', ICONS.inv, 'Items', function (body, head) { - var kind = 'item'; - var seg = el('div', { class: 'fg-segmented' }); - ['item', 'weapon', 'armor'].forEach(function (k) { - var b = el('button', { class: k === kind ? 'is-active' : '', text: k.charAt(0).toUpperCase() + k.slice(1) + 's' }); - b.addEventListener('click', function () { kind = k; seg.querySelectorAll('button').forEach(function (x) { x.classList.remove('is-active'); }); b.classList.add('is-active'); vl.rebuild(); }); - seg.appendChild(b); - }); - head.appendChild(seg); - var vl = VirtualList({ - getModel: function () { return API.ops.inv.list(kind); }, - matches: defaultMatch, - renderRow: function (row, it) { - row.className = 'fg-row' + (API.locks.isItemFrozen(kind, it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.description || it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.inv.count(kind, it.id); }, function (v) { API.ops.inv.setCount(kind, it.id, v); }, {}); - val.appendChild(sp.el); - val.appendChild(el('button', { class: 'fg-step', text: 'Max', style: 'width:auto;padding:0 6px', onclick: function () { API.ops.inv.max(kind, it.id); sp.sync(); } })); - row.appendChild(val); - row.appendChild(lockBtn(API.locks.isItemFrozen(kind, it.id), function (on) { API.locks.freezeItem(kind, it.id, on); refreshActive(); })); - } - }); - body.appendChild(vl.el); vl.rebuild(); - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.inv.list(kind).length; } }; - }); - - // Actors (master-detail) - section('actors', ICONS.actors, 'Actors', function (body) { - var detail = el('div', { class: 'fg-detail' }); - var selectedId = null; - var vl = VirtualList({ - rowH: 30, matches: defaultMatch, - getModel: function () { return API.ops.actors.list(); }, - onRowClick: function (it) { showActor(it.id); }, - renderRow: function (row, it) { - row.className = 'fg-row' + (it.id === selectedId ? ' is-selected' : ''); - row.style.cursor = 'pointer'; - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', html: (it.inParty ? '' : '') + escapeHtml(it.name) })); - row.appendChild(el('span', { class: 'fg-cell--val', text: 'Lv ' + it.level })); - } - }); - var split = el('div', { style: 'flex:1;display:flex;min-height:0' }); - var left = el('div', { style: 'flex:0 0 240px;display:flex;flex-direction:column;border-right:1px solid var(--fg-border)' }); - left.appendChild(vl.el); - split.appendChild(left); split.appendChild(detail); - body.appendChild(split); vl.rebuild(); - var firstA = API.ops.actors.list()[0]; // auto-select first actor so detail isn't empty - if (firstA) showActor(firstA.id); - function showActor(id) { - selectedId = id; vl.draw(); // re-highlight the selected row in the (virtualized) list - var a = API.ops.actors.get(id); detail.innerHTML = ''; - if (!a) { detail.appendChild(el('div', { class: 'fg-empty', text: 'Actor not initialized (start a game first)' })); return; } - detail.appendChild(el('h2', { text: a.name + ' · Lv ' + a.level, style: 'margin:0 0 12px;font-size:15px' })); - var grid = el('div', { class: 'fg-grid' }); - grid.appendChild(numField('Level', function () { return API.ops.actors.get(id).level; }, function (v) { API.ops.actors.setLevel(id, v); showActor(id); })); - grid.appendChild(numField('EXP', function () { return API.ops.actors.get(id).exp; }, function (v) { API.ops.actors.setExp(id, v); showActor(id); })); - grid.appendChild(statField('HP', id, 'hp', function () { return API.ops.actors.get(id).hp; }, function () { return API.ops.actors.get(id).mhp; }, API.ops.actors.setHp)); - grid.appendChild(statField('MP', id, 'mp', function () { return API.ops.actors.get(id).mp; }, function () { return API.ops.actors.get(id).mmp; }, API.ops.actors.setMp)); - grid.appendChild(statField('TP', id, 'tp', function () { return API.ops.actors.get(id).tp; }, function () { return 100; }, API.ops.actors.setTp)); - a.params.forEach(function (p) { grid.appendChild(numField(p.name, function () { return API.ops.actors.get(id).params[p.id].value; }, function (v) { API.ops.actors.setParam(id, p.id, v); })); }); - detail.appendChild(grid); - var actbar = el('div', { style: 'display:flex;gap:8px;margin:14px 0' }, [ - el('button', { class: 'fg-btn', text: 'Recover All', onclick: function () { API.ops.actors.recover(id); showActor(id); } }), - el('button', { class: 'fg-btn', text: a.inParty ? 'Remove from Party' : 'Add to Party', onclick: function () { if (a.inParty) API.ops.actors.removeFromParty(id); else API.ops.actors.addToParty(id); vl.rebuild(); showActor(id); } }) - ]); - detail.appendChild(actbar); - // skills - detail.appendChild(el('h2', { text: 'Skills', style: 'font-size:13px;margin:10px 0 4px;color:var(--fg-text-dim)' })); - var skbox = el('div', { style: 'max-height:140px;overflow:auto;border:1px solid var(--fg-border);border-radius:7px' }); - a.skills.forEach(function (s) { - var r = el('div', { class: 'fg-field', style: 'padding:3px 10px' }, [ - el('span', { style: 'flex:1;font-size:12px', text: s.id + ': ' + s.name }), - el('button', { class: 'fg-btn fg-btn--ghost', text: s.learned ? 'Forget' : 'Learn', onclick: function () { if (s.learned) API.ops.actors.forget(id, s.id); else API.ops.actors.learn(id, s.id); showActor(id); } }) - ]); - skbox.appendChild(r); - }); - detail.appendChild(skbox); - } - function numField(label, get, set) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, set, {}).el); - f.appendChild(el('span', { style: 'flex:0 0 24px;width:24px' })); // empty lock slot -> steppers align with HP/MP/TP rows - return f; - } - function statField(label, id, stat, get, getMax, setFn) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, function (v) { setFn(id, v); if (API.locks.isStatFrozen(id, stat)) API.locks.freezeStat(id, stat, true); }, {}).el); - f.appendChild(lockBtn(API.locks.isStatFrozen(id, stat), function (on) { API.locks.freezeStat(id, stat, on); })); - return f; - } - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.actors.list().length; } }; - }); - - // Party / Main - section('party', ICONS.party, 'Party', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - d.appendChild(el('div', { class: 'fg-field' }, [ - el('label', { text: 'Gold' }), - stepper(function () { return API.ops.gold.get(); }, function (v) { API.ops.gold.set(v); }, {}).el, - lockBtn(API.LOCK.gold != null, function (on) { API.locks.freezeGold(on); rebuild(); }) - ])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Steps' }), el('span', { text: API.ops.party.steps() })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Members' }), el('span', { text: API.ops.party.members().map(function (m) { return m.name; }).join(', ') || '(none)' })])); - d.appendChild(el('h2', { text: 'Quick actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Gold = Max', onclick: function () { API.ops.gold.set(API.ops.gold.max()); rebuild(); toast('Gold maxed', 'ok'); } }), - el('button', { class: 'fg-btn', text: 'Heal Party', onclick: function () { API.ops.party.members().forEach(function (m) { API.ops.actors.recover(m.id); }); toast('Party healed', 'ok'); } }) - ])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.party.members().length; } }; - }); - - // Map / Teleport - section('map', ICONS.map, 'Map', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var cur = API.ops.map.current(); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Current' }), el('span', { text: 'Map ' + cur.mapId + ' @ (' + cur.x + ',' + cur.y + ')' })])); - var sel = el('select', { class: 'fg-search', style: 'flex:1' }); - API.ops.map.list().forEach(function (m) { sel.appendChild(el('option', { value: m.id, text: m.id + ': ' + m.name })); }); - sel.value = cur.mapId; - var xIn = el('input', { class: 'fg-num', value: cur.x }), yIn = el('input', { class: 'fg-num', value: cur.y }); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Teleport to' }), sel])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'X / Y' }), xIn, yIn, - el('button', { class: 'fg-btn', text: 'Go', onclick: function () { API.ops.map.teleport(Number(sel.value), Number(xIn.value), Number(yIn.value), 0, 2); toast('Teleporting…', 'ok'); } })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Noclip' }), - (function () { var t = el('button', { class: 'fg-toggle' + (API.ops.map.isNoclip() ? ' is-on' : '') }); t.addEventListener('click', function () { var on = !API.ops.map.isNoclip(); API.ops.map.noclip(on); t.classList.toggle('is-on', on); }); return t; })()])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Move speed' }), - stepper(function () { return (window.$gamePlayer && $gamePlayer._moveSpeed) || 4; }, function (v) { API.ops.map.speed(v); }, {}).el])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.map.list().length; } }; - }); - - // Common Events - section('commonev', ICONS.commonev, 'Common Ev.', listSection( - function () { return API.ops.commonev.list(); }, - function (row, it) { - row.className = 'fg-row'; row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - row.appendChild(el('span', { class: 'fg-cell--val' }, el('button', { class: 'fg-btn', text: 'Run', onclick: function () { confirmBox('Run common event ' + it.id + ' (' + it.name + ')?', function () { API.ops.commonev.run(it.id); toast('Reserved CE ' + it.id, 'ok'); }); } }))); - } - )); - - // Data Lock (aggregated frozen targets) - section('locks', ICONS.locks, 'Data Lock', function (body, head) { - head.appendChild(el('button', { class: 'fg-btn fg-btn--danger', text: 'Unfreeze all', onclick: function () { API.locks.clearAll(); rebuild(); toast('All unfrozen'); } })); - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var s = API.locks.summary(); - if (!s.length) { d.appendChild(el('div', { class: 'fg-empty', text: 'No frozen values. Use the lock icon on any row to freeze it.' })); return; } - s.forEach(function (row) { - d.appendChild(el('div', { class: 'fg-field' }, [ - el('span', { style: 'flex:1;font-size:12px', text: row.label }), - el('span', { style: 'color:var(--fg-frozen);font-family:var(--font-mono);margin-right:8px', text: String(row.value) }), - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Unfreeze', onclick: function () { unfreeze(row); rebuild(); } }) - ])); - }); - } - function unfreeze(row) { - if (row.type === 'var') API.locks.freezeVar(row.id, false); - else if (row.type === 'switch') API.locks.freezeSwitch(row.id, false); - else if (row.type === 'item') { var p = row.key.split(':'); API.LOCK.items.delete(row.key); } - else if (row.type === 'stat') { API.LOCK.stats.delete(row.key); } - else if (row.type === 'gold') API.locks.freezeGold(false); - else if (row.type === 'noclip') API.ops.map.noclip(false); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.locks.summary().length; } }; - }); - - // Battle cheats - section('battle', ICONS.battle, 'Cheats', function (body) { - var d = el('div', { class: 'fg-detail' }); - function tog(label, get, set) { - var t = el('button', { class: 'fg-toggle' + (get() ? ' is-on' : '') }); - t.addEventListener('click', function () { var v = !get(); set(v); t.classList.toggle('is-on', v); }); - return el('div', { class: 'fg-field' }, [el('label', { text: label }), t]); - } - d.appendChild(tog('God mode (blocks HP loss)', function () { return API.CHEAT.god; }, API.cheats.setGod)); - d.appendChild(tog('One-hit kill', function () { return API.CHEAT.ohko; }, API.cheats.setOhko)); - d.appendChild(tog('No random encounters', function () { return API.CHEAT.noEncounter; }, API.cheats.setNoEncounter)); - // ---- game speed (speedhack) ---- - d.appendChild(el('h2', { text: 'Game speed', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - var speedRow = el('div', { class: 'fg-field' }); - speedRow.appendChild(el('label', { text: 'Speed' })); - var seg = el('div', { class: 'fg-segmented', style: 'flex-wrap:wrap' }); - var presets = [['0.5×', 0.5], ['1×', 1], ['2×', 2], ['3×', 3], ['5×', 5], ['8×', 8]]; - function keyLabel(k) { return k === 'Control' ? 'Ctrl' : (k === ' ' ? 'Space' : k); } - // In KEY mode the highlight = the ARMED target (_speedBoost); in ALWAYS-ON mode = the live speed. - function targetSpeed() { return API._speedUseKey ? (API._speedBoost || 2) : (API.CHEAT.speed || 1); } - function syncSeg() { var t = targetSpeed(); Array.prototype.forEach.call(seg.children, function (b) { b.classList.toggle('is-active', Number(b.dataset.v) === t); }); if (typeof custom !== 'undefined' && custom) custom.value = t; } - // Picking a speed ARMS the target. It only changes the live game speed if key-mode is OFF, or if - // the speedhack is already active (then it live-updates). So buttons respect the key toggle. - function pick(v) { - API._speedBoost = v; store('speedBoost', v); - if (!API._speedUseKey || API.CHEAT.speed !== 1) { API.cheats.setSpeed(v); toast('Speed ' + v + '×', 'ok'); } - else { toast('Armed ' + v + '× — hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - syncSeg(); - } - presets.forEach(function (p) { - var b = el('button', { text: p[0] }); b.dataset.v = p[1]; - b.addEventListener('click', function () { pick(p[1]); }); - seg.appendChild(b); - }); - speedRow.appendChild(seg); - d.appendChild(speedRow); - var customRow = el('div', { class: 'fg-field' }); - customRow.appendChild(el('label', { text: 'Custom ×' })); - var custom = el('input', { class: 'fg-num', type: 'text', value: targetSpeed() }); - custom.addEventListener('keydown', function (e) { if (e.key === 'Enter') { pick(Number(custom.value) || 1); custom.blur(); } }); - custom.addEventListener('blur', function () { pick(Number(custom.value) || 1); }); - customRow.appendChild(custom); - d.appendChild(customRow); - - // ---- use-key toggle (off => speed is always on) ---- - var useKeyRow = el('div', { class: 'fg-field' }); - useKeyRow.appendChild(el('label', { text: 'Use hold key' })); - var ukTog = el('button', { class: 'fg-toggle' + (API._speedUseKey ? ' is-on' : '') }); - ukTog.addEventListener('click', function () { - speedHeld = false; // changing mode ends any active hold so a later key-release won't reset speed - var on = !API._speedUseKey; API._speedUseKey = on; store('speedUseKey', on); ukTog.classList.toggle('is-on', on); - keyRow.style.display = on ? '' : 'none'; - if (on) { API.cheats.setSpeed(1); toast('Speed: hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - else { API.cheats.setSpeed(API._speedBoost || 2); toast('Speed: always on at ' + (API._speedBoost || 2) + '×', 'ok'); } - syncSeg(); - }); - useKeyRow.appendChild(ukTog); - d.appendChild(useKeyRow); - - // ---- rebindable key ---- - var keyRow = el('div', { class: 'fg-field' }); - keyRow.appendChild(el('label', { text: 'Hold key' })); - var keyBtn = el('button', { class: 'fg-btn', text: keyLabel(API._speedKey) }); - keyBtn.addEventListener('click', function () { - keyBtn.textContent = 'Press a key…'; API._capturingSpeedKey = true; - function cap(ev) { - ev.preventDefault(); ev.stopPropagation(); - window.removeEventListener('keydown', cap, true); API._capturingSpeedKey = false; - if (ev.key !== 'Escape') { API._speedKey = ev.key; store('speedKey', ev.key); } - keyBtn.textContent = keyLabel(API._speedKey); - } - window.addEventListener('keydown', cap, true); - }); - keyRow.appendChild(keyBtn); - keyRow.style.display = API._speedUseKey ? '' : 'none'; - d.appendChild(keyRow); - syncSeg(); - d.appendChild(el('h2', { text: 'In-battle actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Instant Win', onclick: function () { API.cheats.instantWin(); toast(API.ops.battle.inBattle() ? 'Enemies downed' : 'Not in battle', API.ops.battle.inBattle() ? 'ok' : 'warn'); } }), - el('button', { class: 'fg-btn', text: 'Flee / Abort', onclick: function () { API.cheats.flee(); } }) - ])); - body.appendChild(d); - return { refresh: function () {}, count: function () { return 0; } }; - }); - - // ---------- render / navigation ---------- - function escapeHtml(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } - function lockBtn(frozen, onToggle) { - var b = el('button', { class: 'fg-lock' + (frozen ? ' is-frozen' : ''), html: frozen ? ICONS.lock : ICONS.unlock, title: 'Freeze value' }); - b.addEventListener('click', function () { frozen = !frozen; b.className = 'fg-lock' + (frozen ? ' is-frozen' : ''); b.innerHTML = frozen ? ICONS.lock : ICONS.unlock; onToggle(frozen); }); - return b; - } - function refreshActive() { if (activeRenderer && activeRenderer.refresh) activeRenderer.refresh(); updateStatus(); } - - SECTIONS.forEach(function (s) { - var item = el('button', { class: 'fg-rail__item', title: s.title }, [el('span', { class: 'ic', html: s.icon }), el('span', { text: s.title.split(' ')[0] })]); - item.addEventListener('click', function () { selectSection(s.id); }); - s._rail = item; rail.appendChild(item); - }); - - function selectSection(id) { - currentSection = id; - SECTIONS.forEach(function (s) { s._rail.classList.toggle('is-active', s.id === id); }); - render(); - store('lastSection', id); - } - function render() { - var s = SECTIONS.filter(function (x) { return x.id === currentSection; })[0]; if (!s) return; - content.innerHTML = ''; - var head = el('div', { class: 'fg-subtoolbar' }); - var sectionHead = el('div', { class: 'fg-section-head' }, [el('h2', { text: s.title }), el('span', { class: 'fg-count', text: '' }), el('span', { class: 'fg-spacer' })]); - content.appendChild(sectionHead); - content.appendChild(head); - var body = el('div', { style: 'flex:1;display:flex;flex-direction:column;min-height:0' }); - content.appendChild(body); - activeRenderer = s.builder(body, head) || {}; - if (head.children.length === 0) head.remove(); - var cnt = activeRenderer.count ? activeRenderer.count() : 0; - sectionHead.querySelector('.fg-count').textContent = cnt + (cnt === 1 ? ' entry' : ' entries'); - // Search only applies to list sections (those expose setQuery); hide it on form sections. - var searchable = !!activeRenderer.setQuery; - // keep the search box's flex space (invisible, not removed) so the titlebar buttons stay anchored right - search.style.visibility = searchable ? 'visible' : 'hidden'; - if (searchable && search.value) activeRenderer.setQuery(search.value.trim()); - updateStatus(); - } - function updateStatus() { - var frozen = API.locks.summary().length; - statusbar.innerHTML = ''; - statusbar.appendChild(el('span', { text: API.env.IS_MZ ? 'RPG Maker MZ' : 'RPG Maker MV' })); - statusbar.appendChild(el('span', { class: 'fg-spacer', style: 'flex:1' })); - statusbar.appendChild(el('span', { text: (frozen ? frozen + ' frozen · ' : '') + 'F10 to toggle' })); - } - - search.addEventListener('input', debounce(function () { if (activeRenderer && activeRenderer.setQuery) activeRenderer.setQuery(search.value.trim()); }, 120)); - function debounce(fn, ms) { var t; return function () { clearTimeout(t); t = setTimeout(fn, ms); }; } - - // ---------- show / hide / hotkeys ---------- - var visible = false; - function show() { visible = true; try { document.body.appendChild(host); } catch (e) {} panel.style.display = 'flex'; launcher.style.display = 'none'; if (!currentSection) selectSection(load('lastSection', 'vars')); else render(); } - function hide() { visible = false; panel.style.display = 'none'; launcher.style.display = 'flex'; API.CHEAT.uiFocused = false; if (typeof Input !== 'undefined' && Input.clear) Input.clear(); } - function toggle() { if (visible) hide(); else show(); } - panel.style.display = 'none'; - - // Speed key = HOLD to fast-forward: while the key is held the game runs at the armed boost speed; - // on release it returns to 1x. Only active when the "use key" option is on. Gated to !uiFocused so - // holding a key while typing in the panel never fast-forwards. - var speedHeld = false; - function isSpeedKey(k) { var sk = API._speedKey || 'Control'; return k === sk || (sk === 'Control' && k === 'Ctrl'); } - function holdStart() { if (!speedHeld) { speedHeld = true; API.cheats.setSpeed(API._speedBoost || 2); toast('Fast-forward ' + API.CHEAT.speed + '×', 'ok'); } } - function holdEnd() { if (speedHeld) { speedHeld = false; API.cheats.setSpeed(1); } } - window.addEventListener('keydown', function (e) { - if (API._capturingSpeedKey) return; // a key-rebind is in progress - var key = e.key || ''; - if (key === (API._hotkey || 'F10')) { e.preventDefault(); toggle(); return; } - if (visible && (e.ctrlKey || e.metaKey) && key.toLowerCase() === 'k') { e.preventDefault(); search.focus(); search.select(); } - else if (visible && key === 'Escape') { if (shadow.activeElement && shadow.activeElement.tagName === 'INPUT') shadow.activeElement.blur(); else hide(); } - if (API._speedUseKey && isSpeedKey(key) && !API.CHEAT.uiFocused) holdStart(); // hold to fast-forward - }, true); - window.addEventListener('keyup', function (e) { - if (API._capturingSpeedKey) return; - if (isSpeedKey(e.key || '')) holdEnd(); - }, true); - window.addEventListener('blur', holdEnd); // alt-tab / focus loss -> stop fast-forward (no stuck key) - - // expose - return { - show: show, hide: hide, toggle: toggle, toast: toast, render: render, - isVisible: function () { return visible; }, root: rootEl, host: host, - select: selectSection, sections: SECTIONS.map(function (s) { return s.id; }) - }; - } - -})(typeof window !== 'undefined' ? window : (typeof globalThis !== 'undefined' ? globalThis : this)); - -/* ---- MV scaffolding (plugin command + start-open) ---- */ -(function () { - if (typeof Game_Interpreter === 'undefined') return; - var P = (typeof PluginManager !== 'undefined' && PluginManager.parameters) ? PluginManager.parameters('Forge_MV') : {}; - if (window.Forge) { - window.Forge._hotkey = (P.Hotkey || 'F10').trim(); - window.Forge._itemMaxOverride = Number(P.ItemMaxOverride) || 0; - // speed key: plugin-param is the first-run default; a key rebound in the panel (persisted) wins - try { if (!localStorage.getItem('forge:speedKey')) window.Forge._speedKey = (P.SpeedKey || 'Control').trim(); } catch (e) { window.Forge._speedKey = (P.SpeedKey || 'Control').trim(); } - } - var _pc = Game_Interpreter.prototype.pluginCommand; - Game_Interpreter.prototype.pluginCommand = function (cmd, args) { - _pc.call(this, cmd, args); - if (cmd === 'MTC' && window.Forge && window.Forge.ui) window.Forge.ui.toggle(); - }; - if (String(P.StartOpen) === 'true' && typeof Scene_Map !== 'undefined') { - var _s = Scene_Map.prototype.start; - Scene_Map.prototype.start = function () { _s.call(this); if (window.Forge && window.Forge.ui && !window.Forge.ui.isVisible()) window.Forge.ui.show(); }; - } -})(); - +(function(){var e=document.createElement(`style`);e.textContent=`@import "https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap";:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:#ff6568;--color-orange-400:#ff8b1a;--color-yellow-300:#ffe02a;--color-yellow-400:#fac800;--color-yellow-500:#edb200;--color-fuchsia-500:#e12afb;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c10;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}@supports (color:lab(0% 0 0)){:root,:host{--color-red-400:lab(63.7053% 60.745 31.3109);--color-orange-400:lab(70.0429% 42.5156 75.8207);--color-yellow-300:lab(89.7033% -.480294 84.4917);--color-yellow-400:lab(83.2664% 8.65132 106.895);--color-yellow-500:lab(76.3898% 14.5258 98.4589);--color-fuchsia-500:lab(56.4256% 83.132 -64.639);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425)}}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-left:20px}:where(select:is([multiple],[size])) optgroup option{padding-left:20px}::-webkit-file-upload-button{margin-right:4px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{top:0;bottom:0;left:0;right:0}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\\[-0\\.5px\\]{top:-.5px}.top-\\[4px\\]{top:4px}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.left-4{left:calc(var(--spacing) * 4)}.left-\\[4px\\]{left:4px}.left-\\[24px\\]{left:24px}.z-2147482999{z-index:2147482999}.z-2147483000{z-index:2147483000}.z-2147483647{z-index:2147483647}.m-0{margin:0}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-0{min-height:0}.w-1\\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(140px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(160px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(260px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(300px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{grid-gap:calc(var(--spacing) * 2);gap:calc(var(--spacing) * 2)}.gap-3{grid-gap:calc(var(--spacing) * 3);gap:calc(var(--spacing) * 3)}.gap-4{grid-gap:calc(var(--spacing) * 4);gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(var(--spacing) * var(--tw-space-y-reverse));margin-bottom:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(var(--spacing) * var(--tw-space-x-reverse));margin-right:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.divide-border\\/50>:not(:last-child)){border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\\[\\#2a2d3a\\]{border-color:#2a2d3a}.border-accent{border-color:var(--color-accent)}.border-accent\\/30{border-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/30{border-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.border-accent\\/50{border-color:rgba(99,102,241,.5)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/50{border-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.border-border{border-color:var(--color-border)}.border-border\\/50{border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-danger\\/30{border-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.border-danger\\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-fuchsia-500\\/30{border-color:rgba(225,42,251,.3)}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\\/30{border-color:color-mix(in oklab, var(--color-fuchsia-500) 30%, transparent)}}.border-gray-500\\/30{border-color:rgba(106,114,130,.3)}@supports (color:color-mix(in lab, red, red)){.border-gray-500\\/30{border-color:color-mix(in oklab, var(--color-gray-500) 30%, transparent)}}.border-ok\\/30{border-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.border-ok\\/30{border-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.border-warn\\/30{border-color:rgba(251,146,60,.3)}@supports (color:color-mix(in lab, red, red)){.border-warn\\/30{border-color:color-mix(in oklab, var(--color-warn) 30%, transparent)}}.border-yellow-500\\/30{border-color:rgba(237,178,0,.3)}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\\/30{border-color:color-mix(in oklab, var(--color-yellow-500) 30%, transparent)}}.border-l-frozen{border-left-color:var(--color-frozen)}.bg-\\[\\#1a1d24\\]{background-color:#1a1d24}.bg-\\[\\#3a3f4d\\]{background-color:#3a3f4d}.bg-\\[\\#7ba4ff\\]\\/10{background-color:rgba(123,164,255,.1);background-color:lab(67.3388% 4.90472 -50.2993/.1)}.bg-\\[\\#13151a\\]{background-color:#13151a}.bg-accent{background-color:var(--color-accent)}.bg-accent-weak{background-color:var(--color-accent-weak)}.bg-accent\\/5{background-color:rgba(99,102,241,.05)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/5{background-color:color-mix(in oklab, var(--color-accent) 5%, transparent)}}.bg-accent\\/10{background-color:rgba(99,102,241,.1)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/10{background-color:color-mix(in oklab, var(--color-accent) 10%, transparent)}}.bg-accent\\/20{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/20{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg2{background-color:var(--color-bg2)}.bg-border{background-color:var(--color-border)}.bg-border\\/50{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.bg-border\\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-danger{background-color:var(--color-danger)}.bg-danger\\/10{background-color:rgba(239,68,68,.1)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-danger\\/20{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/20{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.bg-frozen\\/20{background-color:rgba(139,92,246,.2)}@supports (color:color-mix(in lab, red, red)){.bg-frozen\\/20{background-color:color-mix(in oklab, var(--color-frozen) 20%, transparent)}}.bg-fuchsia-500\\/10{background-color:rgba(225,42,251,.1)}@supports (color:color-mix(in lab, red, red)){.bg-fuchsia-500\\/10{background-color:color-mix(in oklab, var(--color-fuchsia-500) 10%, transparent)}}.bg-gray-500\\/10{background-color:rgba(106,114,130,.1)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-ok{background-color:var(--color-ok)}.bg-ok\\/10{background-color:rgba(16,185,129,.1)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/10{background-color:color-mix(in oklab, var(--color-ok) 10%, transparent)}}.bg-ok\\/20{background-color:rgba(16,185,129,.2)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/20{background-color:color-mix(in oklab, var(--color-ok) 20%, transparent)}}.bg-transparent{background-color:transparent}.bg-warn\\/10{background-color:rgba(251,146,60,.1)}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500\\/10{background-color:rgba(237,178,0,.1)}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\\/10{background-color:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-left:var(--spacing);padding-right:var(--spacing)}.px-1\\.5{padding-left:calc(var(--spacing) * 1.5);padding-right:calc(var(--spacing) * 1.5)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-2\\.5{padding-left:calc(var(--spacing) * 2.5);padding-right:calc(var(--spacing) * 2.5)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-3\\.5{padding-left:calc(var(--spacing) * 3.5);padding-right:calc(var(--spacing) * 3.5)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.py-0\\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:var(--spacing);padding-bottom:var(--spacing)}.py-1\\.5{padding-top:calc(var(--spacing) * 1.5);padding-bottom:calc(var(--spacing) * 1.5)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[\\#7ba4ff\\]{color:#7ba4ff}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-frozen{color:var(--color-frozen)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-ok{color:var(--color-ok)}.text-orange-400{color:var(--color-orange-400)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,rgba(0,0,0,.1)), 0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{user-select:none}.select-text{user-select:text}@media (hover:hover){.group-hover\\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.first-letter\\:text-\\[\\#7ba4ff\\]:first-letter{color:#7ba4ff}@media (hover:hover){.hover\\:bg-\\[\\#2a2d3a\\]:hover{background-color:#2a2d3a}.hover\\:bg-accent\\/20:hover{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/20:hover{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.hover\\:bg-accent\\/30:hover{background-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\\:bg-accent\\/80:hover{background-color:rgba(99,102,241,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--color-accent) 80%, transparent)}}.hover\\:bg-accent\\/85:hover{background-color:rgba(99,102,241,.85)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/85:hover{background-color:color-mix(in oklab, var(--color-accent) 85%, transparent)}}.hover\\:bg-border:hover{background-color:var(--color-border)}.hover\\:bg-border\\/30:hover{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/30:hover{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.hover\\:bg-border\\/50:hover{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/50:hover{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.hover\\:bg-border\\/80:hover{background-color:rgba(34,37,51,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/80:hover{background-color:color-mix(in oklab, var(--color-border) 80%, transparent)}}.hover\\:bg-danger\\/20:hover{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/20:hover{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-danger\\/80:hover{background-color:rgba(239,68,68,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/80:hover{background-color:color-mix(in oklab, var(--color-danger) 80%, transparent)}}.hover\\:bg-frozen\\/30:hover{background-color:rgba(139,92,246,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-frozen\\/30:hover{background-color:color-mix(in oklab, var(--color-frozen) 30%, transparent)}}.hover\\:bg-ok\\/30:hover{background-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-ok\\/30:hover{background-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-gray-200:hover{color:var(--color-gray-200)}.hover\\:text-gray-300:hover{color:var(--color-gray-300)}.hover\\:text-gray-400:hover{color:var(--color-gray-400)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\\:opacity-100:hover{opacity:1}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.focus\\:bg-border\\/30:focus{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.focus\\:bg-border\\/30:focus{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:opacity-50:disabled{opacity:.5}:host{--color-bg:#0b0c10;--color-bg-elev:#13151f;--color-bg-input:#1a1c29;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-text-faint:#646b7d;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#222533;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#6366f1}body,:host{color:#f1f5f9;font-family:Outfit,system-ui,-apple-system,sans-serif}*,:after,:before{--tw-border-style:solid}.cursor-grab{cursor:-webkit-grab;cursor:grab}.active\\:cursor-grabbing:active{cursor:-webkit-grabbing;cursor:grabbing}.space-x-1>:not([hidden])~:not([hidden]){margin-left:4px}.space-x-1\\.5>:not([hidden])~:not([hidden]){margin-left:6px}.space-x-2>:not([hidden])~:not([hidden]){margin-left:8px}.space-x-2\\.5>:not([hidden])~:not([hidden]){margin-left:10px}.space-x-3>:not([hidden])~:not([hidden]){margin-left:12px}.space-x-4>:not([hidden])~:not([hidden]){margin-left:16px}.space-y-0\\.5>:not([hidden])~:not([hidden]){margin-top:2px}.space-y-1>:not([hidden])~:not([hidden]){margin-top:4px}.space-y-2>:not([hidden])~:not([hidden]){margin-top:8px}.space-y-2\\.5>:not([hidden])~:not([hidden]){margin-top:10px}.space-y-3>:not([hidden])~:not([hidden]){margin-top:12px}.space-y-4>:not([hidden])~:not([hidden]){margin-top:16px}.space-y-6>:not([hidden])~:not([hidden]){margin-top:24px}.divide-y>:not([hidden])~:not([hidden]){border-top-width:1px;border-color:var(--color-border)}input,textarea,[contenteditable=true]{user-select:text!important}button,button:focus{outline:none!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-duration{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-duration:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}} +/*$vite$:1*/`,document.head.appendChild(e);var t=!1,n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}function y(e){"@babel/helpers - typeof";return y=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},y(e)}function b(e,t){if(y(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(y(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function x(e){var t=b(e,`string`);return y(t)==`symbol`?t:t+``}function S(e,t,n){return(t=x(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ee,C=1<<24,w=1024,te=2048,ne=4096,re=8192,ie=16384,ae=32768,oe=1<<25,se=65536,ce=1<<19,le=1<<20,ue=1<<25,de=65536,fe=1<<21,pe=1<<22,me=1<<23,he=Symbol(`$state`),ge=Symbol(`legacy props`),_e=Symbol(``),ve=Symbol(`proxy path`),ye=Symbol(`attributes`),be=Symbol(`class`),xe=Symbol(`style`),Se=Symbol(`text`),Ce=Symbol(`form reset`),we=Symbol(`hmr anchor`),Te=new class extends Error{constructor(...e){super(...e),S(this,`name`,`StaleReactionError`),S(this,`message`,"The reaction that called `getAbortSignal()` was re-run or destroyed")}},Ee=!!((ee=globalThis.document)!=null&&ee.contentType)&&globalThis.document.contentType.includes(`xml`);function De(e){if(t){let t=Error(`invariant_violation\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: "${e}"\nhttps://svelte.dev/e/invariant_violation`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/invariant_violation`)}function Oe(e){if(t){let t=Error(`lifecycle_outside_component\n\`${e}(...)\` can only be used during component initialisation\nhttps://svelte.dev/e/lifecycle_outside_component`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){if(t){let e=Error("async_derived_orphan\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\nhttps://svelte.dev/e/async_derived_orphan");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(){if(t){let e=Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/bind_invalid_checkbox_value`)}function je(){if(t){let e=Error(`derived_references_self +A derived value cannot reference itself recursively +https://svelte.dev/e/derived_references_self`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/derived_references_self`)}function Me(e,n,r){if(t){let t=Error(`each_key_duplicate\n${r?`Keyed each block has duplicate key \`${r}\` at indexes ${e} and ${n}`:`Keyed each block has duplicate key at indexes ${e} and ${n}`}\nhttps://svelte.dev/e/each_key_duplicate`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ne(e,n,r){if(t){let t=Error(`each_key_volatile\nKeyed each block has key that is not idempotent — the key for item at index ${e} was \`${n}\` but is now \`${r}\`. Keys must be the same each time for a given item\nhttps://svelte.dev/e/each_key_volatile`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_volatile`)}function Pe(e){if(t){let t=Error(`effect_in_teardown\n\`${e}\` cannot be used inside an effect cleanup function\nhttps://svelte.dev/e/effect_in_teardown`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Fe(){if(t){let e=Error(`effect_in_unowned_derived +Effect cannot be created inside a \`$derived\` value that was not itself created inside an effect +https://svelte.dev/e/effect_in_unowned_derived`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ie(e){if(t){let t=Error(`effect_orphan\n\`${e}\` can only be used inside an effect (e.g. during component initialisation)\nhttps://svelte.dev/e/effect_orphan`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_orphan`)}function Le(){if(t){let e=Error(`effect_update_depth_exceeded +Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state +https://svelte.dev/e/effect_update_depth_exceeded`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Re(){if(t){let e=Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/invalid_snippet`)}function ze(e){if(t){let t=Error(`props_invalid_value\nCannot do \`bind:${e}={undefined}\` when \`${e}\` has a fallback value\nhttps://svelte.dev/e/props_invalid_value`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_invalid_value`)}function Be(e){if(t){let t=Error(`props_rest_readonly\nRest element properties of \`$props()\` such as \`${e}\` are readonly\nhttps://svelte.dev/e/props_rest_readonly`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_rest_readonly`)}function Ve(e){if(t){let t=Error(`rune_outside_svelte\nThe \`${e}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files\nhttps://svelte.dev/e/rune_outside_svelte`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/rune_outside_svelte`)}function He(){if(t){let e=Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){if(t){let e=Error(`state_prototype_fixed +Cannot set prototype of \`$state\` object +https://svelte.dev/e/state_prototype_fixed`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){if(t){let e=Error("state_unsafe_mutation\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){if(t){let e=Error("svelte_boundary_reset_onerror\nA `` `reset` function cannot be called while an error is still being handled\nhttps://svelte.dev/e/svelte_boundary_reset_onerror");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke={},qe=Symbol(`uninitialized`),Je=Symbol(`filename`),Ye=`http://www.w3.org/1999/xhtml`,Xe=`http://www.w3.org/2000/svg`,Ze=`font-weight: bold`,Qe=`font-weight: normal`;function $e(e){t?console.warn(`%c[svelte] await_reactivity_loss\n%cDetected reactivity loss when reading \`${e}\`. This happens when state is read in an async function after an earlier \`await\`\nhttps://svelte.dev/e/await_reactivity_loss`,Ze,Qe):console.warn(`https://svelte.dev/e/await_reactivity_loss`)}function et(e,n){t?console.warn(`%c[svelte] await_waterfall\n%cAn async derived, \`${e}\` (${n}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\nhttps://svelte.dev/e/await_waterfall`,Ze,Qe):console.warn(`https://svelte.dev/e/await_waterfall`)}function tt(){t?console.warn(`%c[svelte] derived_inert +%cReading a derived belonging to a now-destroyed effect may result in stale values +https://svelte.dev/e/derived_inert`,Ze,Qe):console.warn(`https://svelte.dev/e/derived_inert`)}function nt(e,n,r){t?console.warn(`%c[svelte] hydration_attribute_changed\n%cThe \`${e}\` attribute on \`${n}\` changed its value between server and client renders. The client value, \`${r}\`, will be ignored in favour of the server value\nhttps://svelte.dev/e/hydration_attribute_changed`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_attribute_changed`)}function rt(e){t?console.warn(`%c[svelte] hydration_mismatch\n%c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:`Hydration failed because the initial UI does not match what was rendered on the server`}\nhttps://svelte.dev/e/hydration_mismatch`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_mismatch`)}function it(){t?console.warn("%c[svelte] select_multiple_invalid_value\n%cThe `value` property of a ` `);function fl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,0),r=Hs(t,`min`,19,()=>-1/0),i=Hs(t,`max`,3,1/0),a=P(I(String(n())));Mi(()=>{F(a,String(n()),!0)});let o=()=>{var e;let o=parseFloat(H(a));isNaN(o)&&(o=n()),o=Math.max(r(),Math.min(i(),o)),n(o),F(a,String(o),!0),(e=t.onchange)==null||e.call(t,n())},s=(e,o)=>{var s;o.shiftKey&&(e*=10);let c=n()+e;c=Math.max(r(),Math.min(i(),c)),n(c),F(a,String(c),!0),(s=t.onchange)==null||s.call(t,n())},c=e=>{e.stopPropagation(),e.key===`Enter`?(o(),e.target.blur()):e.key===`Escape`&&(F(a,String(n()),!0),e.target.blur())};var l=dl(),u=L(l),d=R(u,2);us(d);var f=R(d,2);D(l),U(`click`,u,e=>s(-1,e)),Ua(`blur`,d,o),U(`keydown`,d,c),Cs(d,()=>H(a),e=>F(a,e)),U(`click`,f,e=>s(1,e)),G(e,l),Nt()}Wa([`click`,`keydown`]);var pl=W(``);function ml(e,t){Mt(t,!0);let n=Hs(t,`locked`,3,!1);var r=pl(),i=L(r),a=e=>{uc(e,{size:14})},o=e=>{cc(e,{size:14})};mo(i,e=>{n()?e(a):e(o,-1)}),D(r),z(()=>{Jo(r,1,`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors focus:outline-none ${n()?`bg-frozen/20 text-frozen hover:bg-frozen/30`:`hover:bg-border text-gray-500 hover:text-gray-300`}`),ps(r,`title`,n()?`Unfreeze`:`Freeze`),ps(r,`aria-label`,n()?`Unfreeze state`:`Freeze state`)}),U(`click`,r,()=>{var e;return(e=t.ontoggle)==null?void 0:e.call(t,!n())}),G(e,r),Nt()}Wa([`click`]);var hl=W(``),gl=W(``),_l=W(`
`),vl=W(`
`);function yl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetVarId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetVarId);e!==-1&&H(a).scrollToIndex(e),Q.targetVarId=null}});let o,s=P(!1),c=new Set,l=I({}),u=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||t.value!==void 0&&t.value!==null&&String(t.value).toLowerCase().includes(e));c=new Set(t.map(e=>e.id))}},d=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`variables`,e.id),r=Zc.isFavorite(`variables`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},f=()=>{F(n,q.vars.list(),!0),u(),d()},p=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(s)||(F(n,q.vars.list(),!0),d())},1e3);return()=>clearInterval(e)});let h=(e,t)=>{q.vars.set(e,t),Y.vars.has(e)&&X.freezeVar(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)};var g=vl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y);D(y),D(_);var x=R(_,2);Ps(ul(L(x),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{let r=Wn(()=>l[t().id]||typeof t().value);var i=_l(),a=L(i),o=L(a,!0);D(a);var c=R(a,2),u=L(c),f=L(u,!0);D(u),D(c);var p=R(c,2),g=L(p),_=L(g);{let e=Wn(()=>Zc.isFavorite(`variables`,t().id)?`fill-current`:``);bc(_,{size:16,get class(){return H(e)}})}D(g);var v=R(g,2),y=L(v,!0);D(v);var b=R(v,2),x=e=>{{let n=Wn(()=>Number(t().value)||0);fl(e,{get value(){return H(n)},onchange:e=>h(t().id,e)})}},S=e=>{var n=hl(),r=L(n);r.value=r.__value=`true`;var i=R(r);i.value=i.__value=`false`,D(n);var a;Qo(n),z(()=>{a!==(a=t().value?`true`:`false`)&&(n.value=n.__value=t().value?`true`:`false`,Zo(n,t().value?`true`:`false`))}),U(`change`,n,e=>h(t().id,e.currentTarget.value===`true`)),G(e,n)},ee=e=>{var n=gl();us(n),z(e=>ds(n,e),[()=>String(t().value===void 0||t().value===null?``:t().value)]),Ua(`blur`,n,e=>h(t().id,e.currentTarget.value)),U(`keydown`,n,e=>{e.stopPropagation(),e.key===`Enter`&&e.currentTarget.blur()}),G(e,n)};mo(b,e=>{H(r)===`number`?e(x):H(r)===`boolean`?e(S,1):e(ee,-1)});var C=R(b,2),w=L(C);{let e=Wn(()=>Y.vars.has(t().id));ml(w,{get locked(){return H(e)},ontoggle:e=>{X.freezeVar(t().id,e),F(n,[...H(n)],!0),d()}})}D(C),D(p),D(i),z((e,n,a)=>{Jo(i,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(o,n),ps(u,`title`,t().name),K(f,t().name),Jo(g,1,`mr-2 flex items-center justify-center transition-colors ${a==null?``:a}`),K(y,H(r)===`number`?`NUM`:H(r)===`string`?`STR`:`BOOL`)},[()=>Y.vars.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`variables`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,p,()=>F(s,!0)),U(`focusout`,p,()=>F(s,!1)),U(`click`,g,()=>{Zc.toggleFavorite(`variables`,t().id),d()}),U(`click`,v,()=>{(l[t().id]||typeof t().value)===`number`?l[t().id]=`string`:l[t().id]=`number`}),G(e,i)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(x),D(g),z(()=>{var e;ds(v,H(i)),K(b,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,p),G(e,g),Nt()}Wa([`input`,`focusin`,`focusout`,`click`,`change`,`keydown`]);var bl=W(``);function xl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,!1),r=()=>{var e;n(!n()),(e=t.onchange)==null||e.call(t,n())};var i=bl(),a=L(i);D(i),z(()=>{Jo(i,1,`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${n()?`bg-ok`:`bg-[#3a3f4d]`}`),Jo(a,1,`absolute top-[4px] h-4 w-4 rounded-full bg-white shadow transition-all ${n()?`left-[24px]`:`left-[4px]`}`)}),U(`click`,i,r),G(e,i),Nt()}Wa([`click`]);var Sl=W(`
`),Cl=W(`
`);function wl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetSwitchId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetSwitchId);e!==-1&&H(a).scrollToIndex(e),Q.targetSwitchId=null}});let o,s=P(!1),c=new Set,l=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||(t.value?`true`:`false`).includes(e));c=new Set(t.map(e=>e.id))}},u=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`switches`,e.id),r=Zc.isFavorite(`switches`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},d=()=>{F(n,q.switches.list(),!0),l(),u()},f=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{l(),u()},300)};Ws(()=>{d();let e=setInterval(()=>{H(s)||(F(n,q.switches.list(),!0),u())},1e3);return()=>clearInterval(e)});let p=(e,t)=>{q.switches.set(e,t),Y.switches.has(e)&&X.freezeSwitch(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)},h=e=>{H(r).forEach(t=>p(t.id,e)),d(),zc.show(`All filtered switches turned ${e?`ON`:`OFF`}`,`success`)};var g=Cl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y),x=R(b,2),S=R(x,2),ee=L(S);D(S),D(y),D(_);var C=R(_,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{var r=Sl(),i=L(r),a=L(i,!0);D(i);var o=R(i,2),c=L(o),l=L(c,!0);D(c),D(o);var d=R(o,2),f=L(d),h=L(f);{let e=Wn(()=>Zc.isFavorite(`switches`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(f);var g=R(f,2);xl(g,{get value(){return t().value},onchange:e=>p(t().id,e)});var _=R(g,2),v=L(_);{let e=Wn(()=>Y.switches.has(t().id));ml(v,{get locked(){return H(e)},ontoggle:e=>{X.freezeSwitch(t().id,e),F(n,[...H(n)],!0),u()}})}D(_),D(d),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),Jo(c,1,`truncate text-sm select-text cursor-text ${t().value?`text-white font-bold`:`text-gray-400`}`),K(l,t().name),Jo(f,1,`flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.switches.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`switches`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),Ua(`mouseenter`,d,()=>F(s,!0)),Ua(`mouseleave`,d,()=>F(s,!1)),U(`click`,f,()=>{Zc.toggleFavorite(`switches`,t().id),u()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(g),z(()=>{var e;ds(v,H(i)),K(ee,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,f),U(`click`,b,()=>h(!0)),U(`click`,x,()=>h(!1)),G(e,g),Nt()}Wa([`input`,`click`]);var Tl=W(`
`),El=W(`
`),Dl=W(`
`);function Ol(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetItemKey!==null&&H(a)){let[e,t]=Q.targetItemKey.split(`:`);if(e===H(o)){if(H(r).length>0){let e=H(r).findIndex(e=>e.id===parseInt(t,10));e!==-1&&H(a).scrollToIndex(e),Q.targetItemKey=null}}else p(e)}});let o=P(I(Fc.Item)),s,c=P(!1),l=new Set,u=()=>{if(!H(i).trim())l=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||String(t.count).includes(e)||t.description&&t.description.toLowerCase().includes(e));l=new Set(t.map(e=>e.id))}},d=()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;F(r,H(n).filter(e=>l.has(e.id)).sort((t,n)=>{let r=Zc.isFavorite(e,t.id),i=Zc.isFavorite(e,n.id);return r&&!i?-1:!r&&i?1:t.id-n.id}),!0)},f=()=>{F(n,q.inv.list(H(o)),!0),u(),d()},p=e=>{F(o,e,!0),f(),H(a)&&H(a).resetScroll()},h=e=>{F(i,e.target.value,!0),clearTimeout(s),s=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(c)||(F(n,q.inv.list(H(o)),!0),d())},1e3);return()=>clearInterval(e)});let g=(e,t)=>{q.inv.setCount(H(o),e,t),Y.items.has(`${H(o)}:${e}`)&&X.freezeItem(H(o),e,!0)};var _=Dl(),v=L(_),y=L(v),b=L(y),x=R(b,2),S=R(x,2);D(y);var ee=R(y,2);us(ee),D(v);var C=R(v,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:48,itemTemplate:(e,t=m)=>{var r=El(),i=L(r),a=L(i,!0);D(i);var s=R(i,2),l=L(s),u=L(l,!0);D(l);var f=R(l,2),p=e=>{var n=Tl(),r=L(n,!0);D(n),z((e,t)=>{ps(n,`title`,e),K(r,t)},[()=>t().description.replace(/\n/g,` `),()=>t().description.replace(/\n/g,` `)]),G(e,n)};mo(f,e=>{t().description&&e(p)}),D(s);var h=R(s,2),_=L(h),v=L(_);{let e=Wn(()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`fill-current`:``);bc(v,{size:16,get class(){return H(e)}})}D(_);var y=R(_,2);{let e=Wn(()=>q.inv.maxStack(H(o),t().id));fl(y,{get value(){return t().count},min:0,get max(){return H(e)},onchange:e=>g(t().id,e)})}var b=R(y,2),x=L(b);{let e=Wn(()=>Y.items.has(`${H(o)}:${t().id}`));ml(x,{get locked(){return H(e)},ontoggle:e=>{X.freezeItem(H(o),t().id,e),F(n,[...H(n)],!0),d()}})}D(b),D(h),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),ps(l,`title`,t().name),K(u,t().name),Jo(_,1,`mr-1 flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.items.has(`${H(o)}:${t().id}`)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,h,()=>F(c,!0)),U(`focusout`,h,()=>F(c,!1)),U(`click`,_,()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;Zc.toggleFavorite(e,t().id),d()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(_),z(()=>{Jo(b,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Item?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(x,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Weapon?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(S,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Armor?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),ds(ee,H(i))}),U(`click`,b,()=>p(Fc.Item)),U(`click`,x,()=>p(Fc.Weapon)),U(`click`,S,()=>p(Fc.Armor)),U(`input`,ee,h),G(e,_),Nt()}Wa([`click`,`input`,`focusin`,`focusout`]);var kl=W(``),Al=W(``),jl=W(`
`),Ml=W(`
`),Nl=W(`
No skills in database.
`),Pl=W(``),Fl=W(`
`),Il=W(`No active states.`),Ll=W(``),Rl=W(`

Core Status

Level
EXP
HP
MP
TP

Parameters

Skills

States

`,1),zl=W(`
Start a game or select an actor to edit stats.
`),Bl=W(`
Actors
`);function Vl(e,t){Mt(t,!0);let n=P(I([])),r=P(null),i=P(null),a=P(null),o=P(``),s=P(``);Mi(()=>{Q.targetActorId!==null&&H(n).length>0&&(F(r,Q.targetActorId,!0),Q.targetActorId=null,Q.targetActorStat=null,c())});let c=()=>{F(n,J.list(),!0),H(r)===null&&H(n).length>0&&F(r,H(n)[0].id,!0),H(r)!==null&&F(i,J.get(H(r)),!0)};Ws(()=>{c();let e=setInterval(()=>{c()},1e3);return()=>clearInterval(e)});let l=e=>{F(r,e,!0),F(i,J.get(e),!0)},u=(e,t)=>{H(r)!==null&&(e===`hp`?J.setHp(H(r),t):e===`mp`?J.setMp(H(r),t):e===`tp`&&J.setTp(H(r),t),Y.stats.has(`${H(r)}:${e}`)&&X.freezeStat(H(r),e,!0),F(i,J.get(H(r)),!0))},d=(e,t)=>{H(r)!==null&&(J.setParam(H(r),e,t),F(i,J.get(H(r)),!0))},f=()=>{H(r)===null||!H(i)||(H(i).inParty?J.removeFromParty(H(r)):J.addToParty(H(r)),c())},p=(e,t)=>{H(r)!==null&&(t?J.forgetSkill(H(r),e):J.learnSkill(H(r),e),F(i,J.get(H(r)),!0))},m={[Lc.MHP]:`Max HP`,[Lc.MMP]:`Max MP`,[Lc.ATK]:`Attack`,[Lc.DEF]:`Defense`,[Lc.MAT]:`M. Attack`,[Lc.MDF]:`M. Defense`,[Lc.AGI]:`Agility`,[Lc.LUK]:`Luck`};var h=Bl(),g=L(h),_=R(L(g),2);yo(_,21,()=>H(n),ho,(e,t)=>{var n=Al(),i=L(n),a=L(i),o=e=>{G(e,kl())};mo(a,e=>{H(t).inParty&&e(o)});var s=R(a,2),c=L(s,!0);D(s),D(i);var u=R(i,2),d=L(u);D(u),D(n),z(()=>{var e;ps(n,`id`,`actor-btn-${H(t).id}`),Jo(n,1,`flex w-full items-center justify-between rounded px-2.5 py-2 text-left text-sm transition-colors ${H(r)===H(t).id?`bg-accent text-white font-semibold`:`hover:bg-border/50 text-gray-300`}`),K(c,H(t).name),K(d,`Lv.${(e=H(t).level)==null?``:e}`)}),U(`click`,n,()=>l(H(t).id)),G(e,n)}),D(_),D(g);var v=R(g,2),y=L(v),b=e=>{var t,n=Rl(),l=_i(n),h=L(l),g=L(h),_=L(g,!0);D(g);var v=R(g,2),y=L(v);D(v),D(h);var b=R(h,2),x=L(b),S=R(x,2),ee=L(S,!0);D(S),D(b),D(l);var C=R(l,2),w=L(C),te=R(L(w),2),ne=R(L(te),2),re=L(ne);fl(re,{get value(){return H(i).level},min:1,max:99,onchange:e=>{H(r)!==null&&(J.setLevel(H(r),e),Y.stats.has(`${H(r)}:level`)&&X.freezeStat(H(r),`level`,!0),F(i,J.get(H(r)),!0),c())}});var ie=R(re,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:level`));ml(ie,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`level`,e),F(i,J.get(H(r)),!0))}})}D(ne),D(te);var ae=R(te,2),oe=R(L(ae),2),se=L(oe);fl(se,{get value(){return H(i).exp},min:0,onchange:e=>{H(r)!==null&&(J.setExp(H(r),e),Y.stats.has(`${H(r)}:exp`)&&X.freezeStat(H(r),`exp`,!0),F(i,J.get(H(r)),!0),c())}});var ce=R(se,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:exp`));ml(ce,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`exp`,e),F(i,J.get(H(r)),!0))}})}D(oe),D(ae);var le=R(ae,2),ue=R(L(le),2),de=L(ue);fl(de,{get value(){return H(i).hp},min:0,get max(){return H(i).mhp},onchange:e=>u(`hp`,e)});var fe=R(de,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:hp`));ml(fe,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`hp`,e),F(i,J.get(H(r)),!0))}})}D(ue),D(le);var pe=R(le,2),me=R(L(pe),2),he=L(me);fl(he,{get value(){return H(i).mp},min:0,get max(){return H(i).mmp},onchange:e=>u(`mp`,e)});var ge=R(he,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:mp`));ml(ge,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`mp`,e),F(i,J.get(H(r)),!0))}})}D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve);fl(ye,{get value(){return H(i).tp},min:0,get max(){return H(i).mtp},onchange:e=>u(`tp`,e)});var be=R(ye,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:tp`));ml(be,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`tp`,e),F(i,J.get(H(r)),!0))}})}D(ve),D(_e),D(w);var xe=R(w,2);yo(R(L(xe),2),17,()=>H(i).params,e=>e.id,(e,t)=>{var n=jl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2),c=L(s);fl(c,{get value(){return H(t).value},min:1,onchange:e=>{d(H(t).id,e),Y.stats.has(`${H(r)}:param_${H(t).id}`)&&X.freezeStat(H(r),`param_${H(t).id}`,!0)}});var l=R(c,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:param_${H(t).id}`));ml(l,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`param_${H(t).id}`,e),F(i,J.get(H(r)),!0))}})}D(s),D(n),z(()=>{ps(n,`id`,`stat-param_${H(t).id}`),K(o,m[H(t).id]||`Stat`)}),G(e,n)}),D(xe),D(C);var Se=R(C,2),Ce=L(Se),we=R(L(Ce),2);us(we),D(Ce);var Te=R(Ce,2);yo(Te,21,()=>H(i).skills.filter(e=>!H(o).trim()||e.name.toLowerCase().includes(H(o).trim().toLowerCase())||e.id.toString().includes(H(o).trim())),e=>e.id,(e,t)=>{var n=Ml(),r=L(n),i=L(r);D(r);var a=R(r,2),o=L(a,!0);D(a),D(n),z(e=>{var n;K(i,`${e==null?``:e}: ${(n=H(t).name)==null?``:n}`),Jo(a,1,`rounded border px-3 py-1 text-xs font-semibold transition-colors ${H(t).learned?`border-danger/30 text-danger bg-danger/10 hover:bg-danger/20`:`border-accent/30 text-accent bg-accent/10 hover:bg-accent/20`}`),K(o,H(t).learned?`Forget`:`Learn`)},[()=>H(t).id.toString().padStart(3,`0`)]),U(`click`,a,()=>p(H(t).id,H(t).learned)),G(e,n)},e=>{G(e,Nl())}),D(Te),D(Se);var Ee=R(Se,2),De=L(Ee),Oe=R(L(De),2),ke=L(Oe);us(ke);var Ae=R(ke,2),je=e=>{var t=Pl();U(`click`,t,()=>{H(r)!==null&&(J.clearStates(H(r)),F(i,J.get(H(r)),!0))}),G(e,t)};mo(Ae,e=>{H(i).states.length>0&&e(je)}),D(Oe),D(De);var Me=R(De,2);yo(Me,21,()=>H(i).states,ho,(e,t)=>{var n=Fl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2);D(n),z(()=>K(o,H(t).name)),U(`click`,s,()=>{H(r)!==null&&(J.removeState(H(r),H(t).id),F(i,J.get(H(r)),!0))}),G(e,n)},e=>{G(e,Il())}),D(Me);var Ne=R(Me,2),Pe=L(Ne),Fe=L(Pe);Fe.value=(t=Fe.__value=null)!=null&&t!==void 0?t:``,yo(R(Fe),17,()=>J.listStates().filter(e=>!H(s).trim()||e.name.toLowerCase().includes(H(s).trim().toLowerCase())||e.id.toString().includes(H(s).trim())),ho,(e,t)=>{var n=Ll(),r=L(n);D(n);var i={};z(e=>{var a;if(K(r,`${e==null?``:e}: ${(a=H(t).name)==null?``:a}`),i!==(i=H(t).id)){var o;n.value=(o=n.__value=H(t).id)==null?``:o}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,n)}),D(Pe);var Ie=R(Pe,2);D(Ne),D(Ee),z(()=>{var e;K(_,H(i).name),K(y,`Actor ID: ${(e=H(i).id)==null?``:e}`),Jo(S,1,`rounded border px-3 py-1.5 text-xs font-semibold transition-colors ${H(i).inParty?`border-danger/30 bg-danger/20 text-danger hover:bg-danger/30`:`border-ok/30 bg-ok/20 text-ok hover:bg-ok/30`}`),K(ee,H(i).inParty?`Remove Party`:`Add Party`),Ie.disabled=H(a)===null}),U(`click`,x,()=>{H(r)!==null&&(J.recover(H(r)),F(i,J.get(H(r)),!0))}),U(`click`,S,f),Cs(we,()=>H(o),e=>F(o,e)),Cs(ke,()=>H(s),e=>F(s,e)),$o(Pe,()=>H(a),e=>F(a,e)),U(`click`,Ie,()=>{H(r)!==null&&H(a)!==null&&(J.addState(H(r),H(a)),F(i,J.get(H(r)),!0),F(a,null))}),G(e,n)},x=e=>{G(e,zl())};mo(y,e=>{H(i)?e(b):e(x,-1)}),D(v),D(h),G(e,h),Nt()}Wa([`click`]);function Hl(e){let t=e-1;return t*t*t+1}function Ul(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Hl}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=Wl(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function Wl(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var Gl=W(` `),Kl=W(``),ql=W(`

`),Jl=W(`
Configure the hold key in the Keys panel.
`),Yl=W(`
Warning: Game is permanently sped up. Turn this back on to require holding a key.
`),Xl=W(``),Zl=W(`
`),Ql=W(`

Active Enemies

`),$l=W(`LEAD`),eu=W(`
`),tu=W(`
No active party members found (start/load a game).
`),nu=W(`

Quick Actions

Party Resources

Gold
Steps
Playtime

Battle Settings

God Mode
One-Hit Kill
Disable Encounters

Movement

Noclip (Walk Through Walls)
Move Speed

Game Speed

Hold Key to Fast Forward
Speed Multiplier
`);function ru(e,t){Mt(t,!0);let n=P(0),r=P(0),i=P(0),a=P(4),o=P(!1),s=P(I([])),c=P(I([])),l=[{title:`System & Menus`,actions:[`quick_save`,`quick_load`,`open_save_scene`,`open_load_scene`,`goto_title`]},{title:`Battle Actions`,actions:[`force_victory`,`force_defeat`,`force_escape`,`trigger_encounter`]},{title:`Health Controls`,actions:[`party_recovery`,`party_wound`,`enemy_recovery`,`enemy_wound`]}],u=()=>{F(n,q.gold.get(),!0),F(r,q.party.steps(),!0),F(i,q.party.playtime(),!0),window.$gamePlayer&&F(a,window.$gamePlayer._moveSpeed||4,!0),F(o,!!(window.SceneManager&&window.SceneManager._scene&&window.SceneManager._scene.constructor.name===`Scene_Battle`)),H(o)&&window.$gameTroop?F(s,window.$gameTroop.members().map(e=>({ref:e,name:e.name(),hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(s,[],!0),window.$gameParty?F(c,window.$gameParty.members().map(e=>({ref:e,id:e.actorId(),name:e.name(),level:typeof e.level==`function`?e.level():e._level||1,hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(c,[],!0)};Ws(()=>{u();let e=setInterval(u,1e3);return()=>clearInterval(e)});let d=e=>{q.gold.set(e),Y.gold!==null&&X.freezeGold(!0),F(n,q.gold.get(),!0)},f=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`},p=(e,t)=>{e.ref.setHp(t),u()},m=(e,t)=>{e.ref.setMp(t),u()},h=(e,t)=>{e.ref.setTp?e.ref.setTp(t):e.ref.tp=t,u()},g=P(null),_=(e,t)=>{e!==t&&window.$gameParty&&typeof window.$gameParty.swapOrder==`function`&&(window.$gameParty.swapOrder(e,t),u())};var v=nu(),y=L(v),b=R(L(y),2);yo(b,21,()=>l,ho,(e,t)=>{var n=ql(),r=L(n),i=L(r,!0);D(r);var a=R(r,2);yo(a,21,()=>H(t).actions,ho,(e,t)=>{let n=Wn(()=>nl.find(e=>e.id===H(t)));var r=eo(),i=_i(r),a=e=>{var t=Kl(),r=L(t),i=L(r,!0);D(r);var a=R(r,2),o=e=>{var t=Gl(),r=L(t,!0);D(t),z(e=>K(r,e),[()=>{var e;return Yc.fromString(((e=$.get(H(n).id))==null?void 0:e.keyStr)||``).asDisplayString()}]),G(e,t)},s=Wn(()=>{var e;return(e=$.get(H(n).id))==null?void 0:e.keyStr});mo(a,e=>{H(s)&&e(o)}),D(t),z(()=>K(i,H(n).name)),U(`click`,t,()=>{var e,t;(e=(t=H(n)).onEnter)==null||e.call(t),u()}),G(e,t)};mo(i,e=>{H(n)&&e(a)}),G(e,r)}),D(a),D(n),z(()=>K(i,H(t).title)),G(e,n)}),D(b),D(y);var x=R(y,2),S=L(x),ee=R(L(S),2),C=R(L(ee),2),w=L(C);fl(w,{get value(){return H(n)},min:0,max:99999999,onchange:d});var te=R(w,2);{let e=Wn(()=>Y.gold!==null);ml(te,{get locked(){return H(e)},ontoggle:e=>{X.freezeGold(e),u()}})}D(C),D(ee);var ne=R(ee,2),re=R(L(ne),2),ie=L(re,!0);D(re),D(ne);var ae=R(ne,2),oe=R(L(ae),2),se=L(oe,!0);D(oe),D(ae),D(S);var ce=R(S,2),le=R(L(ce),2),ue=L(le);xl(R(L(ue),2),{get value(){return Z.god},onchange:e=>Wc.setGod(e)}),D(ue);var de=R(ue,2);xl(R(L(de),2),{get value(){return Z.ohko},onchange:e=>Wc.setOhko(e)}),D(de);var fe=R(de,2);xl(R(L(fe),2),{get value(){return Z.noEncounter},onchange:e=>Wc.setNoEncounter(e)}),D(fe),D(le),D(ce),D(x);var pe=R(x,2),me=R(L(pe),2),he=L(me);xl(R(L(he),2),{get value(){return Y.noclip},onchange:e=>X.setNoclip(e)}),D(he);var ge=R(he,2);fl(R(L(ge),2),{get value(){return H(a)},min:1,max:8,onchange:e=>q.map.speed(e)}),D(ge),D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve),be=L(ye);xl(R(L(be),2),{get value(){return Z.speedUseKey},onchange:e=>{Wc.setSpeedUseKey(e),e?Wc.setSpeed(1):Wc.setSpeed(Z.speedBoost)}}),D(be);var xe=R(be,2),Se=e=>{G(e,Jl())},Ce=e=>{G(e,Yl())};mo(xe,e=>{Z.speedUseKey?e(Se):e(Ce,-1)}),D(ye);var we=R(ye,2),Te=R(L(we),2);yo(Te,20,()=>[.5,1,2,3,5,8],ho,(e,t)=>{var n=Xl(),r=L(n);D(n),z(()=>{Jo(n,1,`border-border h-7 w-9 rounded border text-xs transition-colors ${Z.speedBoost===t?`border-accent bg-accent text-white font-semibold`:`bg-bg hover:bg-border/50 text-gray-300`}`),K(r,`${t==null?``:t}x`)}),U(`click`,n,()=>{Wc.setSpeedBoost(t),Z.speedUseKey||Wc.setSpeed(t)}),G(e,n)}),D(Te),D(we),D(ve),D(_e);var Ee=R(_e,2),De=e=>{var t=Ql(),n=R(L(t),2);yo(n,21,()=>H(s),ho,(e,t)=>{var n=Zl(),r=L(n),i=L(r),a=L(i,!0);D(i),D(r);var o=R(r,2),s=L(o),c=L(s),l=L(c);D(c),fl(R(c,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(s);var u=R(s,2),d=L(u),f=L(d);D(d),fl(R(d,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(u);var g=R(u,2),_=L(g),v=L(_);D(_),fl(R(_,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(g),D(o),D(n),z(()=>{var e,n,r,i,o;K(a,H(t).name),K(l,`HP (${(e=H(t).hp)==null?``:e}/${(n=H(t).mhp)==null?``:n})`),K(f,`MP (${(r=H(t).mp)==null?``:r}/${(i=H(t).mmp)==null?``:i})`),K(v,`TP (${(o=H(t).tp)==null?``:o})`)}),G(e,n)}),D(n),D(t),G(e,t)};mo(Ee,e=>{H(o)&&H(s).length>0&&e(De)});var Oe=R(Ee,2),ke=R(L(Oe),2);yo(ke,31,()=>H(c),e=>e.id,(e,t,n)=>{var r=eu(),i=L(r),a=L(i),o=L(a),s=R(L(o),2),c=L(s),l=R(c),u=e=>{G(e,$l())};mo(l,e=>{H(n)===0&&e(u)}),D(s),D(o);var d=R(o,2),f=L(d);D(d),D(a);var v=R(a,2),y=L(v),b=L(y),x=L(b);D(b),fl(R(b,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(y);var S=R(y,2),ee=L(S),C=L(ee);D(ee),fl(R(ee,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(S);var w=R(S,2),te=L(w),ne=L(te);D(te),fl(R(te,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(w),D(v),D(i),D(r),z(()=>{var e,o,s,l,u,d,p;Jo(r,1,`rounded p-2.5 transition-all duration-200 ${H(g)===H(n)?`border border-dashed border-accent/50 bg-accent/5`:`border border-border bg-bg`}`),Jo(i,1,`space-y-2 ${H(g)===H(n)?`invisible`:``}`),Jo(a,1,`flex w-full items-center justify-between pb-2 text-xs font-bold text-white ${H(g)===null?`cursor-grab active:cursor-grabbing`:``}`),K(c,`${(e=H(t).name)==null?``:e} `),K(f,`Lv.${(o=H(t).level)==null?``:o}`),K(x,`HP (${(s=H(t).hp)==null?``:s}/${(l=H(t).mhp)==null?``:l})`),K(C,`MP (${(u=H(t).mp)==null?``:u}/${(d=H(t).mmp)==null?``:d})`),K(ne,`TP (${(p=H(t).tp)==null?``:p})`)}),Ua(`dragenter`,r,e=>e.preventDefault()),Ua(`dragover`,r,e=>{if(e.preventDefault(),H(g)!==null&&H(g)!==H(n)){let t=e.currentTarget.getBoundingClientRect(),r=t.top+t.height/2;if(H(g)H(n)&&e.clientY>r)return;_(H(g),H(n)),F(g,H(n),!0)}}),Ua(`dragstart`,a,e=>{if(e.dataTransfer){e.dataTransfer.effectAllowed=`move`;let t=e.currentTarget.closest(`[role="listitem"]`);t&&e.dataTransfer.setDragImage(t,20,20)}setTimeout(()=>{F(g,H(n),!0)},0)}),Ua(`dragend`,a,()=>{F(g,null)}),Io(r,()=>Ul,()=>({duration:250})),G(e,r)},e=>{G(e,tu())}),D(ke),D(Oe),D(v),z(e=>{K(ie,H(r)),K(se,e)},[()=>f(H(i))]),Ua(`dragenter`,Oe,e=>e.preventDefault()),Ua(`dragover`,Oe,e=>e.preventDefault()),Ua(`dragenter`,ke,e=>e.preventDefault()),Ua(`dragover`,ke,e=>e.preventDefault()),G(e,v),Nt()}Wa([`click`]);var iu=W(``),au=W(`
No saved locations yet.
`),ou=W(`
`),su=W(`

Teleport

Saved Locations

`);function cu(e,t){Mt(t,!0);let n=P(I({mapId:0,x:0,y:0,dir:0})),r=P(I([])),i=P(0),a=P(0),o=P(0),s=P(I([])),c=P(``),l=P(``),u=P(``);Mi(()=>{H(o)>0&&q.map.loadMapEvents(H(o)).then(e=>{F(s,e,!0),e.find(e=>e.id.toString()===H(c))||F(c,``)})});let d=P(I([])),f=P(``),p=()=>{let e=q.map.current();e&&(F(n,e,!0),F(o,H(o)||e.mapId,!0),F(i,e.x,!0),F(a,e.y,!0)),F(r,q.map.list(),!0);try{let e=localStorage.getItem(`forge:locations`);e&&F(d,JSON.parse(e),!0)}catch(e){}};Ws(()=>{p();let e=setInterval(()=>{let e=q.map.current();e&&(e.mapId!==H(n).mapId||e.x!==H(n).x||e.y!==H(n).y)&&F(n,e,!0)},1e3);return()=>clearInterval(e)});let m=()=>{q.map.teleport(H(o),H(i),H(a),0,0)},h=()=>{let e=q.map.current();if(!e)return;let t=H(r).find(t=>t.id===e.mapId);F(d,[...H(d),{id:Date.now().toString(),name:H(f)||`Saved Location`,mapId:e.mapId,mapName:t?t.name:`Map ${e.mapId}`,x:e.x,y:e.y}],!0),F(f,``),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},g=e=>{F(d,H(d).filter(t=>t.id!==e),!0),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},_=e=>{q.map.teleport(e.mapId,e.x,e.y,0,0)};var v=su(),y=L(v),b=R(L(y),2),x=L(b);D(b);var S=R(b,2),ee=L(S),C=L(ee),w=R(L(C),2);us(w),D(C);var te=R(C,2);yo(te,21,()=>H(r).filter(e=>!H(l).trim()||e.name.toLowerCase().includes(H(l).trim().toLowerCase())||e.id.toString().includes(H(l).trim())),ho,(e,t)=>{var r=iu(),i=L(r);D(r);var a={};z(e=>{var o;if(K(i,`${H(t).id===H(n).mapId?`[CURRENT] `:``}${e==null?``:e}: ${(o=H(t).name)==null?``:o}`),a!==(a=H(t).id)){var s;r.value=(s=r.__value=H(t).id)==null?``:s}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,r)}),D(te),D(ee);var ne=R(ee,2),re=L(ne),ie=R(L(re),2);us(ie),D(re);var ae=R(re,2),oe=L(ae);oe.value=oe.__value=``,yo(R(oe),17,()=>H(s).filter(e=>!H(u).trim()||e.name.toLowerCase().includes(H(u).trim().toLowerCase())||e.id.toString().includes(H(u).trim())),ho,(e,t)=>{var n=iu(),r=L(n);D(n);var i={};z(()=>{var e,a,o;if(K(r,`${(e=H(t).name)==null?``:e} (X:${(a=H(t).x)==null?``:a}, Y:${(o=H(t).y)==null?``:o})`),i!==(i=H(t).id)){var s;n.value=(s=n.__value=H(t).id)==null?``:s}}),G(e,n)}),D(ae),D(ne);var se=R(ne,2),ce=L(se),le=R(L(ce),2);us(le),D(ce);var ue=R(ce,2),de=R(L(ue),2);us(de),D(ue),D(se);var fe=R(se,2);D(S),D(y);var pe=R(y,2),me=R(L(pe),2),he=L(me);us(he);var ge=R(he,2);D(me);var _e=R(me,2),ve=L(_e),ye=e=>{G(e,au())},be=e=>{var t=eo();yo(_i(t),17,()=>H(d),e=>e.id,(e,t)=>{var n=ou(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o);D(o),D(r);var c=R(r,2),l=L(c),u=R(l,2);Ec(L(u),{size:14}),D(u),D(c),D(n),z(()=>{var e,n,r,i;K(a,H(t).name),K(s,`${(e=H(t).mapName)==null?``:e} (Map ${(n=H(t).mapId)==null?``:n}) • X:${(r=H(t).x)==null?``:r} Y:${(i=H(t).y)==null?``:i}`)}),U(`click`,l,()=>_(H(t))),U(`click`,u,()=>g(H(t).id)),G(e,n)}),G(e,t)};mo(ve,e=>{H(d).length===0?e(ye):e(be,-1)}),D(_e),D(pe),D(v),z(()=>{var e,t,r;return K(x,`Current: Map ${(e=H(n).mapId)==null?``:e} (${(t=H(n).x)==null?``:t}, ${(r=H(n).y)==null?``:r})`)}),Cs(w,()=>H(l),e=>F(l,e)),$o(te,()=>H(o),e=>F(o,e)),Cs(ie,()=>H(u),e=>F(u,e)),U(`change`,ae,e=>{let t=parseInt(e.target.value);if(isNaN(t))return;let n=H(s).find(e=>e.id===t);n&&(F(i,n.x,!0),F(a,n.y,!0))}),$o(ae,()=>H(c),e=>F(c,e)),Cs(le,()=>H(i),e=>F(i,e)),Cs(de,()=>H(a),e=>F(a,e)),U(`click`,fe,m),U(`keydown`,he,e=>{e.stopPropagation(),e.key===`Enter`&&h()}),Cs(he,()=>H(f),e=>F(f,e)),U(`click`,ge,h),G(e,v),Nt()}Wa([`change`,`click`,`keydown`]);var lu=W(` `,1),uu=W(``),du=W(`
`),fu=W(`
`);function pu(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(null),o,s=()=>{let e=H(n);if(H(i).trim()){let t=H(i).trim().toLowerCase();e=H(n).filter(e=>String(e.id)===t||e.name.toLowerCase().includes(t))}F(r,e.sort((e,t)=>{let n=Zc.isFavorite(`commonEvents`,e.id),r=Zc.isFavorite(`commonEvents`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},c=()=>{F(n,q.commonev.list(),!0),s()},l=e=>{F(i,e.target.value,!0),s()};Ws(()=>{c()});let u=e=>{H(a)===e?(q.commonev.run(e),F(a,null),clearTimeout(o)):(F(a,e,!0),clearTimeout(o),o=setTimeout(()=>{H(a)===e&&F(a,null)},3e3))},d=()=>{F(a,null),clearTimeout(o)};var f=fu(),p=L(f),h=L(p);us(h);var g=R(h,2),_=L(g);D(g),D(p);var v=R(p,2);ul(L(v),{get items(){return H(r)},itemHeight:38,itemTemplate:(e,t=m)=>{var n=du(),r=L(n),i=L(r),o=L(i,!0);D(i);var c=R(i,2),l=L(c,!0);D(c),D(r);var f=R(r,2),p=L(f),h=L(p);{let e=Wn(()=>Zc.isFavorite(`commonEvents`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(p);var g=R(p,2),_=L(g),v=e=>{var n=lu(),r=_i(n),i=R(r,2);U(`click`,r,()=>u(t().id)),U(`click`,i,d),G(e,n)},y=e=>{var n=uu();U(`click`,n,()=>u(t().id)),G(e,n)};mo(_,e=>{H(a)===t().id?e(v):e(y,-1)}),D(g),D(f),D(n),z((e,n)=>{K(o,e),ps(c,`title`,t().name),K(l,t().name),Jo(p,1,`mr-2 flex items-center justify-center transition-colors ${n==null?``:n}`)},[()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`commonEvents`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`click`,p,()=>{Zc.toggleFavorite(`commonEvents`,t().id),s()}),G(e,n)},$$slots:{itemTemplate:!0}}),D(v),D(f),z(()=>{var e;ds(h,H(i)),K(_,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,h,l),G(e,f),Nt()}Wa([`input`,`click`]);var mu=W(``),hu=W(`
`),gu=W(`
No active data locks. Use the lock icon on variables, switches, items, or stats to freeze their value.
`),_u=W(`
`);function vu(e,t){Mt(t,!0);let n=P(I([])),r=()=>{F(n,X.summary(),!0)};Ws(()=>{r();let e=setInterval(r,1e3);return()=>clearInterval(e)});let i=e=>{if(e.type===`var`)X.freezeVar(e.id,!1);else if(e.type===`switch`)X.freezeSwitch(e.id,!1);else if(e.type===`item`){let[t,n]=e.key.split(`:`);X.freezeItem(t,parseInt(n,10),!1)}else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);X.freezeStat(parseInt(t,10),n,!1)}else e.type===`gold`&&X.freezeGold(!1);r()},a=e=>{if(e.type===`var`)Q.targetVarId=e.id,Q.activeTab=Ic.Vars;else if(e.type===`switch`)Q.targetSwitchId=e.id,Q.activeTab=Ic.Switches;else if(e.type===`item`)Q.targetItemKey=e.key,Q.activeTab=Ic.Inv;else if(e.type===`gold`)Q.activeTab=Ic.General;else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);Q.targetActorId=parseInt(t,10),Q.targetActorStat=n,Q.activeTab=Ic.Actors}},o=()=>{X.clearAll(),r()},s=e=>e===`var`?`VAR`:e===`switch`?`SW`:e===`item`?`ITEM`:e===`stat`?`STAT`:e===`param`?`PARAM`:e===`gold`?`GOLD`:`LOCK`,c=e=>e===`var`?`border-accent/30 bg-accent/10 text-accent`:e===`switch`?`border-ok/30 bg-ok/10 text-ok`:e===`item`?`border-warn/30 bg-warn/10 text-warn`:e===`stat`?`border-danger/30 bg-danger/10 text-danger`:e===`param`?`border-fuchsia-500/30 bg-fuchsia-500/10 text-fuchsia-500`:e===`gold`?`border-yellow-500/30 bg-yellow-500/10 text-yellow-500`:`border-gray-500/30 bg-gray-500/10 text-gray-400`;var l=_u(),u=L(l),d=L(u),f=L(d);D(d);var p=R(d,2),m=e=>{var t=mu();U(`click`,t,o),G(e,t)};mo(p,e=>{H(n).length>0&&e(m)}),D(u);var h=R(u,2);yo(h,21,()=>H(n),ho,(e,t)=>{var n=hu(),r=L(n),o=L(r),l=L(o,!0);D(o);var u=R(o,2),d=L(u,!0);D(u),D(r);var f=R(r,2),p=L(f),m=L(p,!0);D(p);var h=R(p,2);D(f),D(n),z((e,n)=>{Jo(o,1,`rounded border px-1.5 py-0.5 text-[10px] font-bold font-mono tracking-wide ${e==null?``:e}`),K(l,n),ps(u,`title`,H(t).label),K(d,H(t).label),K(m,typeof H(t).value==`boolean`?H(t).value?`ON`:`OFF`:H(t).value)},[()=>c(H(t).type),()=>s(H(t).type)]),U(`keydown`,n,e=>e.key===`Enter`&&a(H(t))),U(`click`,n,()=>a(H(t))),U(`click`,h,e=>{e.stopPropagation(),i(H(t))}),G(e,n)},e=>{G(e,gu())}),D(h),D(l),z(()=>{var e;return K(f,`${(e=H(n).length)==null?``:e} active locks`)}),G(e,l),Nt()}Wa([`click`,`keydown`]);var yu=W(`
Press a key...
`),bu=W(``),xu=W(``),Su=W(`
`);function Cu(e,t){Mt(t,!0);let n=Hs(t,`value`,15,``),r=Hs(t,`required`,3,!1),i=Hs(t,`combiningKeyAlone`,3,!1),a=P(!1),o=()=>{F(a,!0);let e=e=>{var a;e.preventDefault(),e.stopPropagation();let o=Yc.fromEvent(e);o.isCombiningKey()&&!i()||(n(o.asString()),(a=t.onchange)==null||a.call(t,n()),r())},r=()=>{F(a,!1),window.removeEventListener(`keydown`,e,{capture:!0})};window.addEventListener(`keydown`,e,{capture:!0}),setTimeout(()=>{window.addEventListener(`click`,r,{capture:!0,once:!0})},100)},s=e=>{if(!e)return`None`;try{return Yc.fromString(e).asDisplayString()}catch(t){return e}};var c=Su(),l=L(c),u=e=>{G(e,yu())},d=e=>{var t=bu(),r=L(t,!0);D(t),z(e=>{Jo(t,1,`border-border bg-bg2 hover:bg-border/50 flex h-8 flex-1 items-center rounded border px-3 text-sm font-medium transition-colors ${n()?`text-white`:`text-gray-500`}`),K(r,e)},[()=>s(n())]),U(`click`,t,o),G(e,t)};mo(l,e=>{H(a)?e(u):e(d,-1)});var f=R(l,2),p=e=>{var r=xu();Mc(L(r),{size:14}),D(r),U(`click`,r,()=>{var e;n(``),(e=t.onchange)==null||e.call(t,n())}),G(e,r)};mo(f,e=>{!r()&&n()&&!H(a)&&e(p)}),D(c),G(e,c),Nt()}Wa([`click`]);var wu=W(`
`),Tu=W(`
`);function Eu(e,t){Mt(t,!0);let n=P(I([])),r=P(``),i=P(I([])),a=()=>{if(!H(r).trim())F(i,H(n),!0);else{let e=H(r).trim().toLowerCase();F(i,H(n).filter(t=>t.name.toLowerCase().includes(e)||t.desc.toLowerCase().includes(e)||t.keyStr.toLowerCase().includes(e)),!0)}},o=()=>{F(n,$.shortcuts.map(e=>({...e})),!0),a()};Ws(()=>{o()});let s=e=>{F(r,e.target.value,!0),a()},c=(e,t)=>{$.update(e,{keyStr:t}),o()},l=(e,t)=>{$.update(e,{enabled:t}),o()},u=()=>{localStorage.removeItem(`forge:shortcuts`),zc.show(`Defaults restored. Please reload the game.`,`success`)};var d=Tu(),f=L(d),p=L(f);us(p);var m=R(p,2);D(f);var h=R(f,2);yo(h,21,()=>H(i),e=>e.id,(e,t)=>{var n=wu(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o,!0);D(o),D(r);var u=R(r,2),d=L(u);{let e=Wn(()=>H(t).id===`speed_hold`||H(t).id===`skip_message`);Cu(d,{get value(){return H(t).keyStr},get required(){return H(t).required},get combiningKeyAlone(){return H(e)},onchange:e=>c(H(t).id,e)})}D(u);var f=R(u,2);xl(L(f),{get value(){return H(t).enabled},onchange:e=>l(H(t).id,e)}),D(f),D(n),z(()=>{Jo(i,1,`font-semibold text-sm ${H(t).enabled?`text-white`:`text-gray-500`}`),K(a,H(t).name),K(s,H(t).desc)}),G(e,n)}),D(h),D(d),z(()=>ds(p,H(r))),U(`input`,p,s),U(`click`,m,u),G(e,d),Nt()}Wa([`input`,`click`]),yt();var Du=Ls(()=>Xc),Ou=W(`

UI Preferences

Inactive Opacity
Controls how transparent the panel becomes when the mouse leaves.
Remember Window Position
Save the exact window dimensions and position between game boots.
Auto-Open on Boot
Automatically display the Forge panel when the game finishes loading.
Show Launcher Icon
Display a draggable icon to open the panel without a shortcut.

Gameplay

Quick Save / Load Slot
The save file slot used by the Quick Save and Quick Load shortcuts.

Data Management

Factory Reset
Wipes all Forge settings, locks, and saved layout data.
`);function ku(e,t){Mt(t,!1);let n=()=>Zc.save();Fs();var r=Ou(),i=L(r),a=R(L(i),2),o=R(L(a),2);fl(L(o),{get value(){return Du().inactiveOpacity},min:10,max:100,onchange:e=>{Du(Du().inactiveOpacity=e),n()}}),D(o),D(a);var s=R(a,2);xl(R(L(s),2),{onchange:()=>n(),get value(){return Du().rememberPosition},set value(e){Du(Du().rememberPosition=e)},$$legacy:!0}),D(s);var c=R(s,2);xl(R(L(c),2),{onchange:()=>n(),get value(){return Du().autoOpen},set value(e){Du(Du().autoOpen=e)},$$legacy:!0}),D(c);var l=R(c,2);xl(R(L(l),2),{onchange:()=>n(),get value(){return Du().showLauncher},set value(e){Du(Du().showLauncher=e)},$$legacy:!0}),D(l),D(i);var u=R(i,2),d=R(L(u),2),f=R(L(d),2);fl(L(f),{get value(){return Du().quickSaveSlot},min:1,max:20,onchange:e=>{Du(Du().quickSaveSlot=e),n()}}),D(f),D(d),D(u);var p=R(u,2),m=R(L(p),2),h=R(L(m),2);D(m),D(p),D(r),U(`click`,h,()=>Zc.resetAll()),G(e,r),Nt()}Wa([`click`]);var Au=W(`
No logs recorded yet.
`),ju=W(` `),Mu=W(`Narrator / Unknown`),Nu=W(`
`),Pu=W(`

Game Dialogue Logs

`);function Fu(e,t){Mt(t,!0);let n=P(void 0),r=e=>{let t=new Date(e);return`${t.getHours().toString().padStart(2,`0`)}:${t.getMinutes().toString().padStart(2,`0`)}:${t.getSeconds().toString().padStart(2,`0`)}`};Mi(()=>{Qc.entries.length&&setTimeout(()=>{var e,t;H(n)&&((e=(t=H(n)).scrollToBottom)==null||e.call(t))},10)});var i=Pu(),a=L(i),o=L(a),s=R(L(o),2);wc(L(s),{size:14}),ut(2),D(s),D(o);var c=R(o,2),l=L(c),u=e=>{var t=Au();mc(L(t),{size:32,class:`opacity-50`}),ut(2),D(t),G(e,t)},d=e=>{Ps(ul(e,{get items(){return Qc.entries},itemHeight:80,containerHeight:400,itemTemplate:(e,t=m)=>{var n=Nu(),i=L(n),a=L(i),o=e=>{var n=ju(),r=L(n,!0);D(n),z(()=>K(r,t().speaker)),G(e,n)},s=e=>{G(e,Mu())};mo(a,e=>{t().speaker?e(o):e(s,-1)});var c=R(a,2),l=L(c,!0);D(c),D(i);var u=R(i,2),d=L(u,!0);D(u),D(n),z(e=>{K(l,e),K(d,t().text)},[()=>r(t().timestamp)]),G(e,n)},$$slots:{itemTemplate:!0}}),e=>F(n,e,!0),()=>H(n))};mo(l,e=>{Qc.entries.length===0?e(u):e(d,-1)}),D(c),D(a),D(i),U(`click`,s,()=>tl.clear()),G(e,i),Nt()}Wa([`click`]);var Iu=W(``),Lu=W(``),Ru=W(`
`),zu=W(`
`,1);function Bu(e,t){Mt(t,!0),Mi(()=>{let e=document.getElementById(`forge-mvmz-host`);if(!e)return;let t=!1,n=()=>{t=!1},r=[`mousedown`,`mousemove`,`mouseup`,`click`,`dblclick`,`pointerdown`,`pointermove`,`pointerup`,`contextmenu`,`wheel`,`touchstart`,`touchmove`,`touchend`,`keydown`,`keyup`],i=e=>{(e.type===`mousedown`||e.type===`pointerdown`||e.type===`touchstart`)&&(t=!0);let n=e.type===`mousemove`||e.type===`pointermove`||e.type===`touchmove`,r=e.type===`mouseup`||e.type===`pointerup`||e.type===`touchend`;if(n){let n=!1;if(`buttons`in e?n=e.buttons>0:`touches`in e&&(n=e.touches.length>0),n&&!t)return}r&&!t||e.stopPropagation()};if(window.addEventListener(`mouseup`,n,{capture:!0}),window.addEventListener(`pointerup`,n,{capture:!0}),window.addEventListener(`touchend`,n,{capture:!0}),Q.visible)for(let t of r)e.addEventListener(t,i,!1);else for(let t of r)e.removeEventListener(t,i,!1);return()=>{window.removeEventListener(`mouseup`,n,{capture:!0}),window.removeEventListener(`pointerup`,n,{capture:!0}),window.removeEventListener(`touchend`,n,{capture:!0});for(let t of r)e.removeEventListener(t,i,!1)}});let n=[{id:Ic.General,label:`General`},{id:Ic.Vars,label:`Variables`},{id:Ic.Switches,label:`Switches`},{id:Ic.Inv,label:`Inventory`},{id:Ic.Actors,label:`Actors`},{id:Ic.Map,label:`Map`},{id:Ic.CommonEv,label:`Events`},{id:Ic.Locks,label:`Locks`},{id:Ic.Logs,label:`Logs`},{id:Ic.Shortcuts,label:`Keys`},{id:Ic.Settings,label:`Settings`}],r=P(0),i=P(0),a=P(840),o=P(520),s=P(!1);Ws(()=>{Zc.load(),X.install(),Wc.install(),tl.install(),$.init(nl);try{let e=JSON.parse(localStorage.getItem(`forge:panel`)||`null`);e&&Xc.rememberPosition?(F(r,e.x,!0),F(i,e.y,!0),F(a,e.w,!0),F(o,e.h,!0)):typeof window<`u`&&(F(r,0),F(i,0),F(a,Math.min(840,window.innerWidth||840),!0),F(o,Math.min(520,window.innerHeight||520),!0));let t=localStorage.getItem(`forge:lastTab`);t&&Object.values(Ic).includes(t)&&(Q.activeTab=t)}catch(e){}Xc.autoOpen&&!Q.visible&&(Q.visible=!0)});let c=()=>{Xc.rememberPosition&&localStorage.setItem(`forge:panel`,JSON.stringify({x:H(r),y:H(i),w:H(a),h:H(o)})),localStorage.setItem(`forge:lastTab`,Q.activeTab)},l=P(!1),u=P(0),d=P(0),f=P(0),p=P(0),m=e=>{H(l)&&(F(r,Math.max(0,Math.min(window.innerWidth-H(a),H(f)+e.clientX-H(u))),!0),F(i,Math.max(0,Math.min(window.innerHeight-H(o),H(p)+e.clientY-H(d))),!0))},h=()=>{F(l,!1),window.removeEventListener(`mousemove`,m,!0),window.removeEventListener(`mouseup`,h,!0),c()},g=e=>{e.target.closest(`button, input, select`)||(F(l,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(f,H(r),!0),F(p,H(i),!0),window.addEventListener(`mousemove`,m,!0),window.addEventListener(`mouseup`,h,!0))},_=P(!1),v=P(0),y=P(0),b=e=>{H(_)&&(F(a,Math.max(560,Math.min(window.innerWidth-H(r),H(v)+e.clientX-H(u))),!0),F(o,Math.max(360,Math.min(window.innerHeight-H(i),H(y)+e.clientY-H(d))),!0))},x=()=>{F(_,!1),window.removeEventListener(`mousemove`,b,!0),window.removeEventListener(`mouseup`,x,!0),c()},S=e=>{F(_,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(v,H(a),!0),F(y,H(o),!0),window.addEventListener(`mousemove`,b,!0),window.addEventListener(`mouseup`,x,!0),e.stopPropagation()};var ee=zu(),C=_i(ee),w=e=>{var t=Lu(),u=L(t),d=L(u),f=R(d,2);yo(f,21,()=>n,ho,(e,t)=>{var n=Iu(),r=L(n),i=e=>{Ac(e,{size:14})},a=e=>{ic(e,{size:14})},o=e=>{Sc(e,{size:14})},s=e=>{gc(e,{size:14})},l=e=>{Oc(e,{size:14})},u=e=>{fc(e,{size:14})},d=e=>{Pc(e,{size:14})},f=e=>{uc(e,{size:14})},p=e=>{mc(e,{size:14})},m=e=>{oc(e,{size:14})},h=e=>{vc(e,{size:14})};mo(r,e=>{H(t).id===`general`?e(i):H(t).id===`vars`?e(a,1):H(t).id===`switches`?e(o,2):H(t).id===`inv`?e(s,3):H(t).id===`actors`?e(l,4):H(t).id===`map`?e(u,5):H(t).id===`commonev`?e(d,6):H(t).id===`locks`?e(f,7):H(t).id===`logs`?e(p,8):H(t).id===`shortcuts`?e(m,9):H(t).id===`settings`&&e(h,10)});var g=R(r,2),_=L(g,!0);D(g),D(n),z(()=>{Jo(n,1,`w-full text-left rounded px-3 py-2 text-xs font-semibold transition-all flex items-center space-x-2.5 focus:outline-none ${Q.activeTab===H(t).id?`bg-[#7ba4ff]/10 text-[#7ba4ff] shadow-sm`:`text-gray-400 hover:bg-[#2a2d3a] hover:text-gray-200`}`),K(_,H(t).label)}),U(`click`,n,()=>{var e;Q.activeTab=H(t).id,(e=window.getSelection())==null||e.removeAllRanges(),c()}),G(e,n)}),D(f);var p=R(f,2),m=L(p);ps(m,`title`,`1.0.0`),m.textContent=`1.0.0`,D(p),D(u);var h=R(u,2),v=L(h),y=L(v),b=L(y,!0);D(y);var x=R(y,2);Mc(L(x),{size:14}),D(x),D(v);var ee=R(v,2),C=L(ee),w=e=>{yl(e,{})},te=e=>{wl(e,{})},ne=e=>{Ol(e,{})},re=e=>{Vl(e,{})},ie=e=>{ru(e,{})},ae=e=>{cu(e,{})},oe=e=>{pu(e,{})},se=e=>{vu(e,{})},ce=e=>{Fu(e,{})},le=e=>{Eu(e,{})},ue=e=>{ku(e,{})};mo(C,e=>{Q.activeTab===Ic.Vars?e(w):Q.activeTab===Ic.Switches?e(te,1):Q.activeTab===Ic.Inv?e(ne,2):Q.activeTab===Ic.Actors?e(re,3):Q.activeTab===Ic.General?e(ie,4):Q.activeTab===Ic.Map?e(ae,5):Q.activeTab===Ic.CommonEv?e(oe,6):Q.activeTab===Ic.Locks?e(se,7):Q.activeTab===Ic.Logs?e(ce,8):Q.activeTab===Ic.Shortcuts?e(le,9):Q.activeTab===Ic.Settings&&e(ue,10)}),D(ee),D(h),il(R(h,2),{onmousedown:S}),D(t),z(e=>{var n,c,u,d;Xo(t,`opacity: ${H(l)||H(_)||H(s)?1:Xc.inactiveOpacity/100}; left: ${(n=H(r))==null?``:n}px; top: ${(c=H(i))==null?``:c}px; width: ${(u=H(a))==null?``:u}px; height: ${(d=H(o))==null?``:d}px; background: #13151a; color: #d4d8e3;`),K(b,e)},[()=>{var e;return((e=n.find(e=>e.id===Q.activeTab))==null?void 0:e.label)||``}]),Ua(`mouseenter`,t,()=>F(s,!0)),Ua(`mouseleave`,t,()=>F(s,!1)),U(`mousedown`,d,g),U(`mousedown`,v,g),U(`click`,x,()=>Q.visible=!1),G(e,t)};mo(C,e=>{Q.visible&&e(w)});var te=R(C,2);yo(te,21,()=>zc.toasts,e=>e.id,(e,t)=>{var n=Ru(),r=L(n),i=R(r,2),a=L(i,!0);D(i),D(n),z(()=>{Xo(n,`background: #1a1d24; border-color: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`}; opacity: 0.95; min-width: 160px; max-width: 320px;`),Xo(r,`background: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`};`),K(a,H(t).message)}),G(e,n)}),D(te),ol(R(te,2),{}),G(e,ee),Nt()}Wa([`mousedown`,`click`]);var Vu=`forge-mvmz-host`,Hu=document.getElementById(Vu);Hu||(Hu=document.createElement(`div`),Hu.id=Vu,Hu.style.position=`fixed`,Hu.style.top=`0`,Hu.style.left=`0`,Hu.style.width=`100vw`,Hu.style.height=`100vh`,Hu.style.pointerEvents=`none`,Hu.style.zIndex=`2147483647`,document.body.appendChild(Hu));var Uu=document.createElement(`style`);Uu.textContent=`#${Vu} { z-index: 2147483647 !important; }`,document.head.appendChild(Uu);var Wu=null,Gu;typeof Hu.attachShadow==`function`?(Wu=Hu.attachShadow({mode:`open`}),Gu=Wu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,Wu.appendChild(e)}}},0)):(Gu=Hu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,document.head.appendChild(e)}}},0));var Ku=document.createElement(`div`);Ku.style.pointerEvents=`none`,Ku.style.width=`100%`,Ku.style.height=`100%`,Gu.appendChild(Ku);try{to(Bu,{target:Ku})}catch(e){console.error(`[FORGE] Error mounting Svelte App:`,e)}if(window.Input!==void 0&&window.Input._onKeyDown){let e=window.Input._onKeyDown;window.Input._onKeyDown=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}if(window.Input!==void 0&&window.Input._onKeyUp){let e=window.Input._onKeyUp;window.Input._onKeyUp=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}})(); \ No newline at end of file diff --git a/util/forge/upstream/Forge_MZ.js b/util/forge/upstream/Forge_MZ.js index 98111b9..7023672 100644 --- a/util/forge/upstream/Forge_MZ.js +++ b/util/forge/upstream/Forge_MZ.js @@ -1,1115 +1,28 @@ //============================================================================= -// Forge_MZ.js — In-game cheat & editor overlay for RPG Maker MZ +// forge.js - In-game cheat & editor overlay for RPG Maker MV/MZ //============================================================================= /*: - * @target MZ - * @plugindesc Forge — modern in-game editor: variables, switches, items, actors, gold, teleport, common events, freeze/lock & battle cheats. (MZ) - * @author len (Forge - clean-room, MTool-inspired) - * @url - * - * @param hotkey - * @text Toggle Hotkey - * @desc Key to toggle the panel. - * @type string - * @default F10 - * - * @param speedKey - * @text Speedhack Key - * @desc Key to toggle fast-forward (e.g. Control, Shift, Alt, or a letter). - * @type string - * @default Control - * - * @param startOpen - * @text Open on start - * @desc Open the panel automatically on new game / load. - * @type boolean - * @default false - * - * @param itemMaxOverride - * @text Item "Max" value - * @desc Value used by the "Max" button for item stacks (0 = use engine maxItems). - * @type number - * @min 0 - * @default 0 - * - * @command open - * @text Open / Toggle Panel - * @desc Toggle the Forge overlay. - * - * @help - * Forge — drop-in cheat & editor for RPG Maker MZ. - * Place in js/plugins/ and enable in the Plugin Manager. Press F10 to open. - * - * Sections: Variables · Switches · Items/Weapons/Armors · Actors · Party/Gold · - * Map/Teleport · Common Events · Data Lock (freeze) · Battle cheats. - * - * All edits are RAM-only and never written to save files. No external requests. - * Plugin command "Open / Toggle Panel" toggles the overlay from events. + * @target MZ MV + * @plugindesc Forge - modern in-game editor + * @author len, shellawa + * @url https://gitgud.io/zero64801/forge-mvmz/ */ - -/* =================================================================================== - * Forge — in-game cheat & editor overlay for RPG Maker MV / MZ (shared core) - * Clean-room reimplementation of MTool's variable/value editor. Vanilla JS, zero deps. - * This file is the engine-agnostic core; the MV/MZ ship files prepend the plugin header. - * Layers: ops (DOM-free, testable) · locks (prototype monkeypatches) · cheats · ui (Shadow DOM) - * =================================================================================== */ -(function (root) { - 'use strict'; - if (root && root.__FORGE_CORE__) return; - - // ---------- environment ---------- - var IS_MZ = (typeof Utils !== 'undefined' && Utils.RPGMAKER_NAME === 'MZ'); - var nodeFs = null, nodePath = null; - try { if (typeof require === 'function') { nodeFs = require('fs'); nodePath = require('path'); } } catch (e) {} - function gameCwd() { try { return process.cwd(); } catch (e) { return '.'; } } - - var PARAM_NAMES = ['Max HP', 'Max MP', 'Attack', 'Defense', 'M.Attack', 'M.Defense', 'Agility', 'Luck']; - - // ---------- small utils ---------- - function clampInt(v, lo, hi) { v = Math.floor(Number(v) || 0); if (v < lo) v = lo; if (hi != null && v > hi) v = hi; return v; } - function defined(x) { return typeof x !== 'undefined' && x !== null; } - function dataName(d) { return d && d.name ? d.name : ''; } - // actor.level may be a getter (number), a method, or only the _level field across engines/plugins. - function actorLevel(a) { if (!a) return 0; if (typeof a.level === 'number') return a.level; if (typeof a.level === 'function') return a.level(); return a._level || 1; } - - // =================================================================================== - // OPS — pure logic, only touches $game*/$data* globals. Unit-testable. - // =================================================================================== - var ops = {}; - - ops.vars = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.variables.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.variables[id]) || ('Variable ' + id); }, - get: function (id) { return defined(window.$gameVariables) ? $gameVariables.value(id) : 0; }, - set: function (id, v) { if (!defined(window.$gameVariables)) return; $gameVariables.setValue(id, typeof v === 'string' && v.trim() !== '' && !isNaN(v) ? Number(v) : v); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - ops.switches = { - count: function () { return defined(window.$dataSystem) ? $dataSystem.switches.length - 1 : 0; }, - name: function (id) { return (defined(window.$dataSystem) && $dataSystem.switches[id]) || ('Switch ' + id); }, - get: function (id) { return defined(window.$gameSwitches) ? $gameSwitches.value(id) : false; }, - set: function (id, v) { if (!defined(window.$gameSwitches)) return; $gameSwitches.setValue(id, !!v); }, - toggle: function (id) { this.set(id, !this.get(id)); }, - list: function () { - var out = [], n = this.count(); - for (var id = 1; id <= n; id++) out.push({ id: id, name: this.name(id), value: this.get(id) }); - return out; - } - }; - - var INV_TABLES = { item: '$dataItems', weapon: '$dataWeapons', armor: '$dataArmors' }; - ops.inv = { - table: function (kind) { return window[INV_TABLES[kind]] || []; }, - data: function (kind, id) { return this.table(kind)[id] || null; }, - count: function (kind, id) { var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.numItems(d) : 0; }, - maxStack: function (kind, id) { if (MTC._itemMaxOverride > 0) return MTC._itemMaxOverride; var d = this.data(kind, id); return d && defined(window.$gameParty) ? $gameParty.maxItems(d) : 99; }, - grant: function (kind, id, n) { var d = this.data(kind, id); if (d && defined(window.$gameParty)) $gameParty.gainItem(d, n, false); if (locks.isItemFrozen(kind, id)) LOCK.items.set(itemKey(kind, id), { kind: kind, id: id, value: this.count(kind, id) }); }, - setCount: function (kind, id, target) { this.grant(kind, id, clampInt(target, 0, null) - this.count(kind, id)); }, - max: function (kind, id) { this.setCount(kind, id, this.maxStack(kind, id)); }, - list: function (kind) { - var t = this.table(kind), out = []; - for (var id = 1; id < t.length; id++) { - var d = t[id]; if (!d || !d.name) continue; - out.push({ id: id, name: d.name, description: d.description || '', iconIndex: d.iconIndex || 0, count: $gameParty.numItems(d) }); - } - return out; - } - }; - - ops.gold = { - get: function () { return defined(window.$gameParty) ? $gameParty.gold() : 0; }, - max: function () { return defined(window.$gameParty) && $gameParty.maxGold ? $gameParty.maxGold() : 99999999; }, - add: function (n) { - if (!defined(window.$gameParty)) return; - if (LOCK.gold != null) { LOCK.gold = clampInt(LOCK.gold + n, 0, this.max()); (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); return; } - if (n >= 0) $gameParty.gainGold(n); else $gameParty.loseGold(-n); - }, - set: function (target) { this.add(clampInt(target, 0, this.max()) - this.get()); } - }; - - ops.actors = { - list: function () { - var out = []; - if (!defined(window.$dataActors)) return out; - for (var id = 1; id < $dataActors.length; id++) { - var d = $dataActors[id]; if (!d) continue; - var a = $gameActors.actor(id); - out.push({ id: id, name: a ? a.name() : d.name, level: a ? actorLevel(a) : (d.initialLevel || 1), inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false }); - } - return out; - }, - get: function (id) { - var a = $gameActors.actor(id); if (!a) return null; - var params = []; - for (var p = 0; p < 8; p++) params.push({ id: p, name: PARAM_NAMES[p], value: a.param(p) }); - var skills = []; - if (defined(window.$dataSkills)) for (var s = 1; s < $dataSkills.length; s++) { var sk = $dataSkills[s]; if (sk && sk.name) skills.push({ id: s, name: sk.name, learned: a.isLearnedSkill ? a.isLearnedSkill(s) : (a.skills().indexOf(sk) >= 0) }); } - var equips = [], slots = a.equipSlots ? a.equipSlots() : [], cur = a.equips(); - for (var e = 0; e < slots.length; e++) equips.push({ slot: e, etypeId: slots[e], current: cur[e] ? cur[e].name : '(none)' }); - return { - id: id, name: a.name(), level: actorLevel(a), exp: a.currentExp ? a.currentExp() : 0, - nextExp: a.nextLevelExp ? a.nextLevelExp() : 0, - hp: a.hp, mp: a.mp, tp: a.tp, mhp: a.mhp, mmp: a.mmp, - params: params, skills: skills, equips: equips, - inParty: $gameParty._actors ? $gameParty._actors.indexOf(id) >= 0 : false - }; - }, - setLevel: function (id, lv) { var a = $gameActors.actor(id); if (a) { var cap = a.maxLevel ? a.maxLevel() : 99; a.changeLevel(clampInt(lv, 1, cap), false); a.refresh(); } }, - setExp: function (id, exp) { var a = $gameActors.actor(id); if (a) { a.changeExp(clampInt(exp, 0, null), false); a.refresh(); } }, - setHp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setHp(clampInt(v, 0, a.mhp)); a.refresh(); } }, - setMp: function (id, v) { var a = $gameActors.actor(id); if (a) { a.setMp(clampInt(v, 0, a.mmp)); a.refresh(); } }, - setTp: function (id, v) { var a = $gameActors.actor(id); if (a && a.setTp) { a.setTp(clampInt(v, 0, 100)); a.refresh(); } }, - addParam: function (id, pid, delta) { var a = $gameActors.actor(id); if (a) { a.addParam(pid, Math.floor(delta)); a.refresh(); } }, - // param(pid) = round((paramBase+paramPlus) * paramRate * paramBuffRate) clamped to [paramMin,paramMax]. - // addParam only mutates paramPlus, so invert the rate to land the *visible* param on target. - setParam: function (id, pid, target) { - var a = $gameActors.actor(id); if (!a) return; - var rate = (a.paramRate ? a.paramRate(pid) : 1) * (a.paramBuffRate ? a.paramBuffRate(pid) : 1) || 1; - var cap = a.paramMax ? a.paramMax(pid) : null; - var want = clampInt(target, a.paramMin ? a.paramMin(pid) : 0, cap); - var base = a.paramBase ? a.paramBase(pid) : 0, plus = (a.paramPlus ? a.paramPlus(pid) : (a._paramPlus ? a._paramPlus[pid] : 0)) || 0; - a.addParam(pid, Math.round(want / rate) - base - plus); - a.refresh(); - }, - learn: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.learnSkill(skillId); }, - forget: function (id, skillId) { var a = $gameActors.actor(id); if (a) a.forgetSkill(skillId); }, - equip: function (id, slotId, kind, itemId) { var a = $gameActors.actor(id); if (!a) return; var item = itemId ? ops.inv.data(kind, itemId) : null; if (a.forceChangeEquip) a.forceChangeEquip(slotId, item); else a.changeEquip(slotId, item); a.refresh(); }, - recover: function (id) { var a = $gameActors.actor(id); if (a) { a.recoverAll(); a.refresh(); } }, - setName: function (id, name) { var a = $gameActors.actor(id); if (a) a.setName(String(name)); }, - addToParty: function (id) { $gameParty.addActor(id); }, - removeFromParty: function (id) { $gameParty.removeActor(id); } - }; - - ops.party = { - members: function () { return defined(window.$gameParty) ? $gameParty.members().map(function (a) { return { id: a.actorId(), name: a.name(), level: actorLevel(a) }; }) : []; }, - add: function (id) { if (defined(window.$gameParty)) $gameParty.addActor(id); }, - remove: function (id) { if (defined(window.$gameParty)) $gameParty.removeActor(id); }, - steps: function () { return defined(window.$gameParty) ? $gameParty.steps() : 0; }, - // RPG Maker derives playtime from frame count (Game_System has no playtime()). - playtime: function () { return (typeof Graphics !== 'undefined' && Graphics.frameCount) ? Math.floor(Graphics.frameCount / 60) : 0; } - }; - - ops.map = { - list: function () { - var out = []; - if (!defined(window.$dataMapInfos)) return out; - for (var id = 1; id < $dataMapInfos.length; id++) { var m = $dataMapInfos[id]; if (m) out.push({ id: id, name: m.name || ('Map ' + id) }); } - return out; - }, - current: function () { if (!defined(window.$gameMap) || !defined(window.$gamePlayer)) return { mapId: 0, x: 0, y: 0, dir: 2 }; return { mapId: $gameMap.mapId(), x: $gamePlayer.x, y: $gamePlayer.y, dir: $gamePlayer.direction ? $gamePlayer.direction() : 2 }; }, - teleport: function (mapId, x, y, dir, fade) { $gamePlayer.reserveTransfer(mapId, clampInt(x, 0, null), clampInt(y, 0, null), dir || 0, fade == null ? 0 : fade); }, - loadMapFile: function (mapId) { - if (!nodeFs) return null; - try { var f = 'Map' + String(mapId).padStart(3, '0') + '.json'; return JSON.parse(nodeFs.readFileSync(nodePath.join(gameCwd(), 'data', f), 'utf8')); } - catch (e) { return null; } - }, - noclip: function (b) { locks.state.noclip = !!b; if (defined(window.$gamePlayer)) $gamePlayer.setThrough(!!b); }, - isNoclip: function () { return !!locks.state.noclip; }, - speed: function (n) { if (defined(window.$gamePlayer)) $gamePlayer.setMoveSpeed(clampInt(n, 1, 8)); } - }; - - ops.commonev = { - list: function () { - var out = []; - if (!defined(window.$dataCommonEvents)) return out; - for (var id = 1; id < $dataCommonEvents.length; id++) { var c = $dataCommonEvents[id]; if (c) out.push({ id: id, name: c.name || ('Common Event ' + id) }); } - return out; - }, - run: function (id) { if (defined(window.$gameTemp)) $gameTemp.reserveCommonEvent(id); } - }; - - ops.battle = { - inBattle: function () { - if (typeof SceneManager === 'undefined' || !SceneManager._scene) return false; - if (typeof Scene_Battle !== 'undefined' && SceneManager._scene instanceof Scene_Battle) return true; - var c = SceneManager._scene.constructor; // fallback if class binding unavailable - return !!(c && c.name === 'Scene_Battle'); - }, - instantWin: function () { - if (typeof $gameTroop === 'undefined' || !$gameTroop) return; - $gameTroop.members().forEach(function (e) { - e.setHp(0); - if (e.deathStateId && e.addState) e.addState(e.deathStateId()); // mark actually dead - else if (e.die) e.die(); - if (e.performCollapse) e.performCollapse(); // visual collapse - e.refresh(); - }); - if (typeof BattleManager !== 'undefined' && BattleManager.checkBattleEnd) BattleManager.checkBattleEnd(); - }, - flee: function () { if (typeof BattleManager !== 'undefined' && BattleManager.processAbort) BattleManager.processAbort(); } - }; - - // =================================================================================== - // LOCKS — prototype-level monkeypatches + per-frame re-assertion. Installed once. - // =================================================================================== - var LOCK = { vars: new Map(), switches: new Map(), items: new Map(), gold: null, stats: new Map(), noclip: false }; - function itemKey(kind, id) { return kind + ':' + id; } - - var locks = { - state: LOCK, - _installed: false, - install: function () { - if (this._installed) return; this._installed = true; - // Variables - if (typeof Game_Variables !== 'undefined') { - var _sv = Game_Variables.prototype.setValue; - Game_Variables.prototype.setValue = function (id, value) { if (LOCK.vars.has(id)) value = LOCK.vars.get(id); _sv.call(this, id, value); }; - } - // Switches - if (typeof Game_Switches !== 'undefined') { - var _ss = Game_Switches.prototype.setValue; - Game_Switches.prototype.setValue = function (id, value) { if (LOCK.switches.has(id)) value = LOCK.switches.get(id); _ss.call(this, id, value); }; - } - // Gold: substitute (not block) so freezeGold can re-snapshot on edit; item freeze is tick-based - // (NOT a gainItem block) so equip bookkeeping / give-take still runs, corrected next frame. - if (typeof Game_Party !== 'undefined') { - var _gg = Game_Party.prototype.gainGold; - locks._origGainGold = _gg; - Game_Party.prototype.gainGold = function (n) { if (LOCK.gold != null) return; _gg.call(this, n); }; - } - // Battle: god mode + OHKO via one executeHpDamage override - if (typeof Game_Action !== 'undefined') { - var _ehd = Game_Action.prototype.executeHpDamage; - Game_Action.prototype.executeHpDamage = function (target, value) { - if (CHEAT.god && target.isActor && target.isActor() && value > 0) value = 0; - if (CHEAT.ohko && this.subject().isActor && this.subject().isActor() && target.isEnemy && target.isEnemy()) value = target.hp; - _ehd.call(this, target, value); - }; - } - // God mode also blocks non-action HP loss for actors (slip/regen, event Change-HP) + floor damage. - if (typeof Game_Battler !== 'undefined' && Game_Battler.prototype.gainHp) { - var _gh = Game_Battler.prototype.gainHp; - Game_Battler.prototype.gainHp = function (value) { if (CHEAT.god && this.isActor && this.isActor() && value < 0) value = 0; _gh.call(this, value); }; - } - if (typeof Game_Actor !== 'undefined' && Game_Actor.prototype.executeFloorDamage) { - var _efd = Game_Actor.prototype.executeFloorDamage; - Game_Actor.prototype.executeFloorDamage = function () { if (CHEAT.god) return; _efd.call(this); }; - } - // No encounters - if (typeof Game_Player !== 'undefined') { - var _epv = Game_Player.prototype.encounterProgressValue; - Game_Player.prototype.encounterProgressValue = function () { return CHEAT.noEncounter ? 0 : _epv.call(this); }; - } - // Speedhack: drive the scene update extra times per frame (speed>1) or skip frames (speed<1). - // Input is still read once per real frame, so the whole game (movement, anim, battle, messages, - // events, timers) runs faster/slower. Works for MV and MZ (both expose SceneManager.updateScene). - if (typeof SceneManager !== 'undefined' && SceneManager.updateScene) { - var _updateScene = SceneManager.updateScene, _spdAcc = 0; - // Extra updates are only safe in a steady scene: the scene must be started, not changing, and - // (on a map) not mid-transfer — otherwise $dataMap is briefly null and the scroll code throws. - function speedSafe(mgr) { - if (mgr.isCurrentSceneStarted) { if (!mgr.isCurrentSceneStarted()) return false; } // MV - else if (mgr._scene && mgr._scene.isStarted) { if (!mgr._scene.isStarted()) return false; } // MZ - if (mgr.isSceneChanging && mgr.isSceneChanging()) return false; // mid scene transition - if (typeof $gamePlayer !== 'undefined' && $gamePlayer && $gamePlayer.isTransferring && $gamePlayer.isTransferring()) return false; - if (typeof DataManager !== 'undefined' && DataManager.isMapLoaded && !DataManager.isMapLoaded()) return false; // map (re)loading - return true; - } - SceneManager.updateScene = function () { - var sp = CHEAT.speed || 1; - if (sp >= 1) { - _updateScene.call(this); - if (sp > 1 && this._scene && typeof this._scene.update === 'function' && speedSafe(this)) { - _spdAcc += (sp - 1); - var guard = 0; - while (_spdAcc >= 1 && guard++ < 64) { _spdAcc -= 1; try { this._scene.update(); } catch (e) { _spdAcc = 0; break; } } - } else { _spdAcc = 0; } // not safe / not boosting -> don't bank up a burst of catch-up updates - } else { - _spdAcc += sp; - if (_spdAcc >= 1) { _spdAcc -= 1; _updateScene.call(this); } - else if (this._scene) { // skip the game advance this frame, keep start/ready bookkeeping - var u = this._scene.update; this._scene.update = function () {}; - try { _updateScene.call(this); } finally { this._scene.update = u; } - } - } - }; - } - // Clear stale freeze snapshots when the engine swaps in fresh game objects (new game / load). - if (typeof DataManager !== 'undefined') { - if (DataManager.setupNewGame) { var _sng = DataManager.setupNewGame; DataManager.setupNewGame = function () { locks.clearAll(); _sng.call(this); }; } - if (DataManager.extractSaveContents) { var _esc = DataManager.extractSaveContents; DataManager.extractSaveContents = function (c) { locks.clearAll(); return _esc.call(this, c); }; } - } - }, - // Freeze setters update both the lock map and the live value once. Maps store parsed objects so - // the per-frame tick never re-parses string keys. - freezeVar: function (id, on) { if (on) { LOCK.vars.set(id, ops.vars.get(id)); ops.vars.set(id, ops.vars.get(id)); } else LOCK.vars.delete(id); }, - freezeSwitch: function (id, on) { if (on) LOCK.switches.set(id, ops.switches.get(id)); else LOCK.switches.delete(id); }, - freezeItem: function (kind, id, on) { var k = itemKey(kind, id); if (on) LOCK.items.set(k, { kind: kind, id: id, value: ops.inv.count(kind, id) }); else LOCK.items.delete(k); }, - freezeGold: function (on) { LOCK.gold = on ? ops.gold.get() : null; }, - freezeStat: function (actorId, stat, on) { var k = actorId + ':' + stat; if (on) { var a = defined(window.$gameActors) ? $gameActors.actor(actorId) : null; LOCK.stats.set(k, { actorId: actorId, stat: stat, value: a ? a[stat] : 0 }); } else LOCK.stats.delete(k); }, - isVarFrozen: function (id) { return LOCK.vars.has(id); }, - isSwitchFrozen: function (id) { return LOCK.switches.has(id); }, - isItemFrozen: function (kind, id) { return LOCK.items.has(itemKey(kind, id)); }, - isStatFrozen: function (actorId, stat) { return LOCK.stats.has(actorId + ':' + stat); }, - // Per-frame: re-assert values the overrides can't catch (hp/mp/tp, gold target, item counts, noclip). - tick: function () { - if (!LOCK.noclip && LOCK.gold == null && !LOCK.stats.size && !LOCK.items.size) return; // early-out - if (LOCK.noclip && defined(window.$gamePlayer) && !$gamePlayer.isThrough()) $gamePlayer.setThrough(true); - if (LOCK.gold != null && defined(window.$gameParty) && $gameParty.gold() !== LOCK.gold) (locks._origGainGold || $gameParty.gainGold).call($gameParty, LOCK.gold - $gameParty.gold()); - if (LOCK.stats.size && defined(window.$gameActors)) { - LOCK.stats.forEach(function (e) { - var a = $gameActors.actor(e.actorId); if (!a) return; - if (e.stat === 'hp' && a.hp !== e.value) a.setHp(Math.min(e.value, a.mhp)); - else if (e.stat === 'mp' && a.mp !== e.value) a.setMp(Math.min(e.value, a.mmp)); - else if (e.stat === 'tp' && a.tp !== e.value && a.setTp) a.setTp(e.value); - }); - } - if (LOCK.items.size && defined(window.$gameParty)) { - LOCK.items.forEach(function (e) { if (ops.inv.count(e.kind, e.id) !== e.value) { var d = ops.inv.data(e.kind, e.id); if (d) $gameParty.gainItem(d, e.value - ops.inv.count(e.kind, e.id), false); } }); - } - }, - summary: function () { - var out = []; - LOCK.vars.forEach(function (v, id) { out.push({ type: 'var', id: id, label: 'Var ' + id + ' · ' + ops.vars.name(id), value: v }); }); - LOCK.switches.forEach(function (v, id) { out.push({ type: 'switch', id: id, label: 'Switch ' + id + ' · ' + ops.switches.name(id), value: v ? 'ON' : 'OFF' }); }); - LOCK.items.forEach(function (e, key) { out.push({ type: 'item', key: key, label: e.kind + ' ' + e.id + ' · ' + (ops.inv.data(e.kind, e.id) ? ops.inv.data(e.kind, e.id).name : ''), value: e.value }); }); - LOCK.stats.forEach(function (e, key) { out.push({ type: 'stat', key: key, label: 'Actor ' + e.actorId + ' · ' + e.stat.toUpperCase(), value: e.value }); }); - if (LOCK.gold != null) out.push({ type: 'gold', label: 'Gold (frozen)', value: LOCK.gold }); - if (LOCK.noclip) out.push({ type: 'noclip', label: 'Noclip (active)', value: 'ON' }); - return out; - }, - clearAll: function () { LOCK.vars.clear(); LOCK.switches.clear(); LOCK.items.clear(); LOCK.stats.clear(); LOCK.gold = null; if (LOCK.noclip) ops.map.noclip(false); } - }; - - // =================================================================================== - // CHEATS — global toggles consumed by the lock overrides + battle actions. - // =================================================================================== - var CHEAT = { god: false, ohko: false, noEncounter: false, speed: 1, uiFocused: false }; - var cheats = { - state: CHEAT, - setGod: function (b) { CHEAT.god = !!b; }, - setOhko: function (b) { CHEAT.ohko = !!b; }, - setNoEncounter: function (b) { CHEAT.noEncounter = !!b; }, - setSpeed: function (n) { CHEAT.speed = Math.max(0.1, Math.min(Number(n) || 1, 16)); }, - toggleSpeed: function () { this.setSpeed(CHEAT.speed !== 1 ? 1 : (MTC._speedBoost || 2)); return CHEAT.speed; }, - instantWin: function () { ops.battle.instantWin(); }, - flee: function () { ops.battle.flee(); } - }; - - // expose the assembled API (UI is attached below if a real DOM is present) - var MTC = { env: { IS_MZ: IS_MZ }, ops: ops, locks: locks, cheats: cheats, LOCK: LOCK, CHEAT: CHEAT, PARAM_NAMES: PARAM_NAMES, _itemMaxOverride: 0, _hotkey: 'F10', _speedKey: 'Control', _speedBoost: 2 }; - if (root) { root.Forge = MTC; root.__FORGE_CORE__ = true; } - if (typeof module !== 'undefined' && module.exports) module.exports = MTC; - - // ---- engine boot hooks (guarded; only when classes exist) ---- - if (typeof Scene_Base !== 'undefined') { - var _su = Scene_Base.prototype.update; - Scene_Base.prototype.update = function () { _su.call(this); try { locks.tick(); } catch (e) {} }; - } - // install lock overrides as soon as the game classes are available - try { locks.install(); } catch (e) {} - - // ---- UI: attach only when a real browser DOM is available (skipped in Node tests) ---- - if (typeof document !== 'undefined' && document.body && typeof document.body.attachShadow === 'function' && typeof window !== 'undefined') { - try { MTC.ui = buildUI(MTC); } catch (e) { try { console.error('[Forge] UI init failed', e); } catch (_) {} } - } - - // =================================================================================== - // UI — Shadow-DOM overlay. Inlined so the single ship file works with zero deps. - // =================================================================================== - function buildUI(API) { - var LS = 'forge:'; - function store(k, v) { try { localStorage.setItem(LS + k, JSON.stringify(v)); } catch (e) {} } - function load(k, d) { try { var s = localStorage.getItem(LS + k); return s == null ? d : JSON.parse(s); } catch (e) { return d; } } - // persisted speed settings (UI-controlled; override core/param defaults if the user changed them) - API._speedKey = load('speedKey', API._speedKey || 'Control'); - API._speedUseKey = load('speedUseKey', true); - API._speedBoost = load('speedBoost', API._speedBoost || 2); - if (!API._speedUseKey) API.cheats.setSpeed(API._speedBoost); // "always on" mode applies immediately - - function el(tag, props, kids) { - var n = document.createElement(tag); - if (props) for (var k in props) { - if (k === 'class') n.className = props[k]; - else if (k === 'text') n.textContent = props[k]; - else if (k === 'html') n.innerHTML = props[k]; - else if (k === 'style') n.setAttribute('style', props[k]); - else if (k.slice(0, 2) === 'on' && typeof props[k] === 'function') n.addEventListener(k.slice(2).toLowerCase(), props[k]); - else if (props[k] != null) n.setAttribute(k, props[k]); - } - if (kids) (Array.isArray(kids) ? kids : [kids]).forEach(function (c) { if (c != null) n.appendChild(typeof c === 'string' ? document.createTextNode(c) : c); }); - return n; - } - - // Inline SVG icons (no font/emoji dependency -> render identically on Windows/macOS/Linux). - function svg(inner) { return ''; } - var ICONS = { - vars: svg(''), - switches: svg(''), - inv: svg(''), - actors: svg(''), - party: svg(''), - map: svg(''), - commonev: svg(''), - locks: svg(''), - battle: svg(''), - tool: svg(''), - refresh: svg(''), - theme: svg(''), - close: svg(''), - lock: svg(''), - unlock: svg('') - }; - - var CSS = "\ -:host{position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important;contain:none}\ -*{box-sizing:border-box;font-family:var(--font-ui);-webkit-user-select:none;user-select:none}\ -#forge-root{--font-ui:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;--font-mono:ui-monospace,'Cascadia Code',Consolas,monospace;\ ---fg-bg:#15171c;--fg-bg-elev:#1c1f27;--fg-bg-input:#21242d;--fg-bg-row-alt:#181b22;--fg-border:#2b2f3a;--fg-border-strong:#3a3f4d;\ ---fg-text:#e6e9ef;--fg-text-dim:#9aa1b1;--fg-text-faint:#646b7d;--fg-accent:#5b8cff;--fg-accent-weak:#2a3a63;--fg-success:#3ecf8e;--fg-warn:#f0b132;--fg-danger:#f0556a;--fg-frozen:#8b5cf6;\ ---sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:24px;--rad-sm:4px;--rad-md:7px;--rad-lg:11px;--rad-pill:999px;\ ---sh-panel:0 18px 50px rgba(0,0,0,.5),0 0 0 1px var(--fg-border);--row-h:30px;--rail-w:64px;--ease:cubic-bezier(.2,.7,.3,1);--dur:120ms;\ ---fs-xs:11px;--fs-sm:12px;--fs-md:13px;--fs-lg:15px;color:var(--fg-text);font-size:var(--fs-md)}\ -#forge-root[data-theme=light]{--fg-bg:#f6f7f9;--fg-bg-elev:#fff;--fg-bg-input:#eef0f4;--fg-bg-row-alt:#f0f2f5;--fg-border:#dde0e7;--fg-border-strong:#c7ccd8;--fg-text:#1a1d24;--fg-text-dim:#5a6172;--fg-text-faint:#9097a6;--fg-accent-weak:#dce6ff}\ -.fg-panel{position:fixed;display:flex;flex-direction:column;background:var(--fg-bg);border-radius:var(--rad-lg);box-shadow:var(--sh-panel);overflow:hidden;z-index:2147483000;min-width:480px;min-height:360px;pointer-events:auto}\ -.fg-titlebar{display:flex;align-items:center;gap:6px;height:33px;padding:0 6px 0 10px;background:var(--fg-bg-elev);border-bottom:1px solid var(--fg-border);cursor:move;flex:0 0 auto}\ -.fg-brand{font-weight:700;font-size:var(--fs-md);letter-spacing:.3px;color:var(--fg-text);margin-right:8px;white-space:nowrap}\ -.fg-brand b{color:var(--fg-accent)}\ -.fg-search{flex:1;height:23px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:var(--rad-md);color:var(--fg-text);padding:0 9px;font-size:var(--fs-sm);outline:none;min-width:80px}\ -.fg-search:focus{border-color:var(--fg-accent)}\ -.fg-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:23px;height:23px;border-radius:var(--rad-md);background:transparent;color:var(--fg-text-dim);border:0;cursor:pointer;font-size:13px;transition:background var(--dur)}\ -.fg-iconbtn:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-body{flex:1;display:flex;min-height:0}\ -.fg-rail{flex:0 0 var(--rail-w);display:flex;flex-direction:column;gap:2px;padding:var(--sp-2) var(--sp-1);background:var(--fg-bg-elev);border-right:1px solid var(--fg-border);overflow-y:auto}\ -.fg-rail__item{display:flex;flex-direction:column;align-items:center;gap:2px;padding:var(--sp-2) 0;border-radius:var(--rad-md);cursor:pointer;color:var(--fg-text-dim);font-size:10px;transition:all var(--dur);border:0;background:transparent}\ -.fg-rail__item .ic{display:flex;align-items:center;justify-content:center}\n.fg-rail__item .ic svg{width:19px;height:19px}\n.fg-iconbtn svg{width:15px;height:15px}\n.fg-lock svg{width:15px;height:15px}\n.fg-launcher svg{width:21px;height:21px}\ -.fg-rail__item:hover{background:var(--fg-bg-input);color:var(--fg-text)}\ -.fg-rail__item.is-active{background:var(--fg-accent-weak);color:var(--fg-accent)}\ -.fg-content{flex:1;display:flex;flex-direction:column;min-width:0}\ -.fg-section-head{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4) var(--sp-2);flex:0 0 auto}\ -.fg-section-head h2{margin:0;font-size:var(--fs-lg);font-weight:600}\ -.fg-count{font-size:var(--fs-xs);color:var(--fg-text-faint);background:var(--fg-bg-input);padding:2px 7px;border-radius:var(--rad-pill)}\ -.fg-spacer{flex:1}\ -.fg-subtoolbar{display:flex;align-items:center;gap:var(--sp-2);padding:0 var(--sp-4) var(--sp-2);flex-wrap:wrap}\ -.fg-segmented{display:inline-flex;background:var(--fg-bg-input);border-radius:var(--rad-md);padding:2px}\ -.fg-segmented button{border:0;background:transparent;color:var(--fg-text-dim);padding:3px 12px;border-radius:5px;cursor:pointer;font-size:var(--fs-sm)}\ -.fg-segmented button.is-active{background:var(--fg-accent);color:#fff}\ -.fg-btn{border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text);padding:4px 11px;border-radius:var(--rad-md);cursor:pointer;font-size:var(--fs-sm);transition:all var(--dur)}\ -.fg-btn:hover{border-color:var(--fg-accent);color:var(--fg-accent)}\ -.fg-btn--ghost{background:transparent;border-color:transparent;color:var(--fg-text-dim)}\ -.fg-btn--danger:hover{border-color:var(--fg-danger);color:var(--fg-danger)}\ -.fg-list{flex:1;overflow-y:auto;overflow-x:hidden;position:relative;border-top:1px solid var(--fg-border)}\ -.fg-list__sizer{position:relative;width:100%}\ -.fg-list__window{position:absolute;top:0;left:0;right:0}\ -.fg-row{display:flex;align-items:center;gap:var(--sp-2);height:var(--row-h);padding:0 var(--sp-4);border-bottom:1px solid var(--fg-border);font-size:var(--fs-sm)}\ -.fg-row:nth-child(even){background:var(--fg-bg-row-alt)}\ -.fg-row.is-frozen{box-shadow:inset 3px 0 0 var(--fg-frozen)}\ -.fg-row.is-selected{background:var(--fg-accent-weak)!important;box-shadow:inset 2px 0 0 var(--fg-accent)}\ -.fg-cell--id{flex:0 0 52px;color:var(--fg-text-faint);font-family:var(--font-mono);font-size:var(--fs-xs)}\ -.fg-cell--name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\ -.fg-cell--name .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--fg-accent);margin-right:6px;vertical-align:middle}\ -.fg-cell--val{flex:0 0 auto;display:flex;align-items:center;gap:4px}\ -.fg-stepper{display:inline-flex;align-items:center;gap:3px}\ -.fg-step{min-width:30px;width:auto;padding:0 5px;height:22px;white-space:nowrap;border:1px solid var(--fg-border-strong);background:var(--fg-bg-input);color:var(--fg-text-dim);border-radius:5px;cursor:pointer;font-size:var(--fs-xs);font-family:var(--font-mono)}\ -.fg-step:hover{color:var(--fg-accent);border-color:var(--fg-accent)}\ -.fg-num{width:68px;height:22px;background:var(--fg-bg-input);border:1px solid var(--fg-border);border-radius:5px;color:var(--fg-text);text-align:right;padding:0 6px;font-family:var(--font-mono);font-size:var(--fs-sm);outline:none}\ -.fg-num:focus{border-color:var(--fg-accent)}\ -.fg-toggle{width:38px;height:21px;border-radius:var(--rad-pill);background:var(--fg-border-strong);position:relative;cursor:pointer;transition:background var(--dur);border:0;flex:0 0 auto}\ -.fg-toggle::after{content:'';position:absolute;top:2px;left:2px;width:17px;height:17px;border-radius:50%;background:#fff;transition:transform var(--dur)}\ -.fg-toggle.is-on{background:var(--fg-success)}\ -.fg-toggle.is-on::after{transform:translateX(17px)}\ -.fg-lock{width:24px;height:24px;border:0;background:transparent;color:var(--fg-text-faint);cursor:pointer;border-radius:5px;font-size:13px;flex:0 0 auto}\ -.fg-lock:hover{color:var(--fg-frozen);background:var(--fg-bg-input)}\ -.fg-lock.is-frozen{color:var(--fg-frozen)}\ -.fg-statusbar{display:flex;align-items:center;gap:var(--sp-2);height:24px;padding:0 var(--sp-3);background:var(--fg-bg-elev);border-top:1px solid var(--fg-border);font-size:var(--fs-xs);color:var(--fg-text-faint);flex:0 0 auto}\ -.fg-detail{padding:var(--sp-3) var(--sp-4);overflow-y:auto;flex:1}\ -.fg-field{display:flex;align-items:center;gap:var(--sp-2);padding:5px 0;border-bottom:1px solid var(--fg-border);min-width:0}\n.fg-field .fg-stepper{margin-left:auto;flex:0 0 auto}\ -.fg-field label{flex:0 0 96px;color:var(--fg-text-dim);font-size:var(--fs-sm)}\ -.fg-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:var(--sp-2) var(--sp-4)}\ -.fg-toasts{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);display:flex;flex-direction:column;gap:6px;z-index:2147483100;pointer-events:none}\ -.fg-toast{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-left:3px solid var(--fg-accent);color:var(--fg-text);padding:8px 14px;border-radius:var(--rad-md);font-size:var(--fs-sm);box-shadow:var(--sh-panel);animation:fgin var(--dur) var(--ease)}\ -.fg-toast.warn{border-left-color:var(--fg-warn)}.fg-toast.danger{border-left-color:var(--fg-danger)}.fg-toast.ok{border-left-color:var(--fg-success)}\ -@keyframes fgin{from{opacity:0;transform:translateY(6px)}to{opacity:1}}\ -.fg-launcher{position:fixed;pointer-events:auto;width:42px;height:42px;border-radius:50%;background:var(--fg-accent);color:#fff;border:0;cursor:pointer;font-size:18px;z-index:2147482999;box-shadow:var(--sh-panel);display:flex;align-items:center;justify-content:center}\ -.fg-launcher:hover{filter:brightness(1.1)}\ -.fg-resize{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize}\ -.fg-resize::after{content:'';position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--fg-text-faint);border-bottom:2px solid var(--fg-text-faint)}\ -.fg-empty{padding:var(--sp-5);text-align:center;color:var(--fg-text-faint);font-size:var(--fs-sm)}\ -.fg-confirm{position:fixed;pointer-events:auto;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(0,0,0,.45);z-index:2147483200}\ -.fg-confirm__box{background:var(--fg-bg-elev);border:1px solid var(--fg-border);border-radius:var(--rad-lg);padding:var(--sp-4);max-width:340px;box-shadow:var(--sh-panel)}\ -.fg-confirm__box p{margin:0 0 var(--sp-4)}.fg-confirm__row{display:flex;justify-content:flex-end;gap:var(--sp-2)}\ -input::placeholder{color:var(--fg-text-faint)}\ -::-webkit-scrollbar{width:9px;height:9px}\ -::-webkit-scrollbar-track{background:transparent}\ -::-webkit-scrollbar-thumb{background:var(--fg-border-strong);border-radius:5px}\ -::-webkit-scrollbar-thumb:hover{background:var(--fg-text-faint)}"; - - // ---------- shadow host ---------- - var host = el('div', { id: 'forge-host' }); - host.style.cssText = 'position:fixed!important;top:0!important;left:0!important;width:0!important;height:0!important;z-index:2147483647!important;margin:0!important;padding:0!important;border:0!important;pointer-events:none!important'; - document.body.appendChild(host); - var shadow = host.attachShadow({ mode: 'open' }); - var rootEl = el('div', { id: 'forge-root' }); - rootEl.setAttribute('data-theme', load('theme', 'dark')); - shadow.appendChild(el('style', { text: CSS })); - shadow.appendChild(rootEl); - - // Swallow events so panel interaction never leaks to the game. BUBBLE phase: the panel's own - // inputs receive the event first (target phase), then we stop it before it reaches document - // (where RPG Maker's Input/TouchInput listen). Capture phase would block the inputs themselves. - ['keydown', 'keyup', 'keypress', 'wheel', 'mousedown', 'mouseup', 'mousemove', 'click', 'dblclick', - 'pointerdown', 'pointerup', 'pointermove', 'pointercancel', 'touchstart', 'touchend', 'touchmove', 'touchcancel', 'contextmenu'].forEach(function (t) { - rootEl.addEventListener(t, function (e) { e.stopPropagation(); }, false); - }); - function isEditable(el) { return el && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA'); } - rootEl.addEventListener('focusin', function (e) { if (isEditable(e.target)) API.CHEAT.uiFocused = true; }, true); - rootEl.addEventListener('focusout', function () { setTimeout(function () { API.CHEAT.uiFocused = !!(shadow.activeElement && isEditable(shadow.activeElement)); }, 0); }, true); - window.addEventListener('blur', function () { API.CHEAT.uiFocused = false; }); // never latch the game-input gate - // Backup engine-level gate: while a panel input is focused, drop the game's keyboard handler. - if (typeof Input !== 'undefined' && Input._onKeyDown) { var _okd = Input._onKeyDown; Input._onKeyDown = function (e) { if (API.CHEAT.uiFocused) return; _okd.call(this, e); }; } - if (typeof Input !== 'undefined' && Input._onKeyUp) { var _oku = Input._onKeyUp; Input._onKeyUp = function (e) { if (API.CHEAT.uiFocused) return; _oku.call(this, e); }; } - - // ---------- toasts ---------- - var toasts = el('div', { class: 'fg-toasts' }); rootEl.appendChild(toasts); - function toast(msg, kind) { var t = el('div', { class: 'fg-toast ' + (kind || ''), text: msg }); toasts.appendChild(t); setTimeout(function () { t.remove(); }, 2200); } - function confirmBox(msg, onYes) { - var box = el('div', { class: 'fg-confirm' }, el('div', { class: 'fg-confirm__box' }, [ - el('p', { text: msg }), - el('div', { class: 'fg-confirm__row' }, [ - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Cancel', onclick: function () { box.remove(); } }), - el('button', { class: 'fg-btn fg-btn--danger', text: 'Confirm', onclick: function () { box.remove(); onYes(); } }) - ]) - ])); - rootEl.appendChild(box); - } - - // ---------- panel skeleton ---------- - var vw = window.innerWidth || 816, vh = window.innerHeight || 624; - // Default size fits the window (many MV games are ~816x624); leave a margin. - var st = load('panel', { x: 16, y: 16, w: Math.min(880, vw - 32), h: Math.min(560, vh - 32) }); - st.w = Math.max(420, Math.min(st.w, vw - 8)); st.h = Math.max(320, Math.min(st.h, vh - 8)); - st.x = Math.max(0, Math.min(st.x, vw - st.w)); st.y = Math.max(0, Math.min(st.y, vh - st.h)); // keep fully on-screen - var panel = el('div', { class: 'fg-panel' }); - panel.style.left = st.x + 'px'; panel.style.top = st.y + 'px'; panel.style.width = st.w + 'px'; panel.style.height = st.h + 'px'; - var search = el('input', { class: 'fg-search', type: 'text', placeholder: 'Search… (Ctrl+K)' }); - var titlebar = el('div', { class: 'fg-titlebar' }, [ - el('span', { class: 'fg-brand', html: 'Forge' }), - search, - el('button', { class: 'fg-iconbtn', title: 'Rescan', html: ICONS.refresh, onclick: function () { render(); toast('Rescanned'); } }), - el('button', { class: 'fg-iconbtn', title: 'Theme', html: ICONS.theme, onclick: function () { var t = rootEl.getAttribute('data-theme') === 'light' ? 'dark' : 'light'; rootEl.setAttribute('data-theme', t); store('theme', t); } }), - el('button', { class: 'fg-iconbtn', title: 'Close (F10)', html: ICONS.close, onclick: function () { hide(); } }) - ]); - var rail = el('div', { class: 'fg-rail' }); - var content = el('div', { class: 'fg-content' }); - var statusbar = el('div', { class: 'fg-statusbar' }); - panel.appendChild(titlebar); - panel.appendChild(el('div', { class: 'fg-body' }, [rail, content])); - panel.appendChild(statusbar); - var resize = el('div', { class: 'fg-resize' }); panel.appendChild(resize); - rootEl.appendChild(panel); - - // ---------- launcher (docks to bottom-right corner by default; 'launcherPos' is a fresh key so - // any stale mid-screen position from older builds is ignored) ---------- - var lp = load('launcherPos', { x: vw - 56, y: vh - 56 }); - lp.x = Math.max(4, Math.min(lp.x, vw - 46)); lp.y = Math.max(4, Math.min(lp.y, vh - 46)); - var launcher = el('button', { class: 'fg-launcher', html: ICONS.tool, title: 'Forge (F10)' }); - launcher.style.left = lp.x + 'px'; launcher.style.top = lp.y + 'px'; - launcher.addEventListener('click', function (e) { if (!launcher._dragged) toggle(); }); - rootEl.appendChild(launcher); - makeDraggable(launcher, launcher, function (x, y) { store('launcherPos', { x: x, y: y }); }, true); - - // ---------- drag / resize ---------- - function makeDraggable(handle, target, onEnd, isLauncher) { - handle.addEventListener('mousedown', function (e) { - if (e.target.closest && e.target.closest('input,button.fg-iconbtn')) return; - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ox = parseInt(target.style.left) || 0, oy = parseInt(target.style.top) || 0, moved = false; - if (isLauncher) target._dragged = false; - function mv(ev) { ev.stopPropagation(); var dx = ev.clientX - sx, dy = ev.clientY - sy; if (Math.abs(dx) + Math.abs(dy) > 3) moved = true; var nx = Math.max(0, Math.min(window.innerWidth - target.offsetWidth, ox + dx)), ny = Math.max(0, Math.min(window.innerHeight - 30, oy + dy)); target.style.left = nx + 'px'; target.style.top = ny + 'px'; if (isLauncher) target._dragged = moved; } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); if (onEnd) onEnd(parseInt(target.style.left), parseInt(target.style.top)); setTimeout(function () { if (isLauncher) target._dragged = false; }, 0); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - } - makeDraggable(titlebar, panel, function (x, y) { st.x = x; st.y = y; store('panel', st); }); - resize.addEventListener('mousedown', function (e) { - e.preventDefault(); e.stopPropagation(); var sx = e.clientX, sy = e.clientY, ow = panel.offsetWidth, oh = panel.offsetHeight; - function mv(ev) { ev.stopPropagation(); var w = Math.max(480, ow + ev.clientX - sx), h = Math.max(360, oh + ev.clientY - sy); panel.style.width = w + 'px'; panel.style.height = h + 'px'; if (activeRenderer && activeRenderer.onResize) activeRenderer.onResize(); } - function up(ev) { if (ev) { ev.stopPropagation(); ev.preventDefault(); } document.removeEventListener('mousemove', mv, true); document.removeEventListener('mouseup', up, true); st.w = panel.offsetWidth; st.h = panel.offsetHeight; store('panel', st); } - document.addEventListener('mousemove', mv, true); document.addEventListener('mouseup', up, true); - }); - - // ---------- reusable virtualized list ---------- - function VirtualList(opts) { - // opts: rowH, getModel()->[], renderRow(rowEl, item), matches(item, query) - var listEl = el('div', { class: 'fg-list' }); - var sizer = el('div', { class: 'fg-list__sizer' }); - var win = el('div', { class: 'fg-list__window' }); - sizer.appendChild(win); listEl.appendChild(sizer); - var rowH = opts.rowH || 30, pool = [], model = [], view = [], query = ''; - // ONE delegated row click (recycled rows must not accumulate per-draw listeners). - if (opts.onRowClick) listEl.addEventListener('click', function (e) { var r = e.target && e.target.closest ? e.target.closest('.fg-row') : null; if (r && r._item) opts.onRowClick(r._item); }); - function rebuild() { model = opts.getModel() || []; applyFilter(); } - function applyFilter() { - view = query ? model.filter(function (it) { return opts.matches(it, query); }) : model; - sizer.style.height = (view.length * rowH) + 'px'; - var em = listEl.querySelector('.fg-empty'); - if (!view.length) { pool.forEach(function (r) { r.style.display = 'none'; }); if (!em) listEl.appendChild(el('div', { class: 'fg-empty', text: 'Nothing here' })); } - else if (em) em.remove(); - lastFirst = -1; draw(true); // content changed -> force re-render - } - var lastFirst = -1; - function draw(force) { - var scroll = listEl.scrollTop, h = listEl.clientHeight || 400; - var first = Math.max(0, Math.floor(scroll / rowH) - 4); - if (!force && first === lastFirst) return; // window unchanged during scroll -> skip re-render - lastFirst = first; - var count = Math.ceil(h / rowH) + 8; - var last = Math.min(view.length, first + count); - win.style.transform = 'translateY(' + (first * rowH) + 'px)'; - var need = last - first; - while (pool.length < need) { var r = el('div', { class: 'fg-row' }); win.appendChild(r); pool.push(r); } - for (var i = 0; i < pool.length; i++) { - var r = pool[i]; - if (i < need) { r.style.display = 'flex'; r._item = view[first + i]; opts.renderRow(r, view[first + i]); } else { r.style.display = 'none'; r._item = null; } - } - } - var raf = null; - listEl.addEventListener('scroll', function () { if (raf) return; raf = requestAnimationFrame(function () { raf = null; draw(false); }); }); - return { el: listEl, rebuild: rebuild, applyFilter: applyFilter, draw: function () { draw(true); }, setQuery: function (q) { query = q; applyFilter(); }, onResize: function () { draw(true); }, - refresh: function () { draw(true); } }; - } - - // numeric stepper control - function stepper(getVal, setVal, opts) { - opts = opts || {}; - var wrap = el('div', { class: 'fg-stepper' }); - var input = el('input', { class: 'fg-num', type: 'text' }); - function sync() { input.value = getVal(); } - function commit(v) { setVal(v); sync(); if (opts.after) opts.after(); } - [['−100', -100], ['−1', -1]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - wrap.appendChild(input); - [['+1', 1], ['+100', 100]].forEach(function (s) { wrap.appendChild(el('button', { class: 'fg-step', text: s[0], onclick: function (e) { commit(getVal() + s[1] * (e.shiftKey ? 10 : 1)); } })); }); - input.addEventListener('keydown', function (e) { if (e.key === 'Enter') { commit(parse(input.value)); input.blur(); } else if (e.key === 'Escape') { sync(); input.blur(); } }); - input.addEventListener('blur', function () { commit(parse(input.value)); }); - function parse(s) { var n = Number(String(s).replace(/[^0-9.\-]/g, '')); return isNaN(n) ? getVal() : n; } - sync(); - return { el: wrap, sync: sync }; - } - - // ---------- sections ---------- - var activeRenderer = null, currentSection = null; - var SECTIONS = []; - function section(id, icon, title, builder) { SECTIONS.push({ id: id, icon: icon, title: title, builder: builder }); } - - function listSection(getModel, renderRow, matches, headExtra) { - return function (body, head) { - if (headExtra) headExtra(head); - var vl = VirtualList({ getModel: getModel, renderRow: renderRow, matches: matches || defaultMatch }); - body.appendChild(vl.el); - vl.rebuild(); - return { vl: vl, onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return (getModel() || []).length; } }; - }; - } - function defaultMatch(it, q) { q = q.toLowerCase(); return String(it.id) === q || (it.name && it.name.toLowerCase().indexOf(q) >= 0); } - - // Variables - section('vars', ICONS.vars, 'Variables', listSection( - function () { return API.ops.vars.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isVarFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.vars.get(it.id); }, function (v) { API.ops.vars.set(it.id, v); if (API.locks.isVarFrozen(it.id)) API.locks.freezeVar(it.id, true); }, {}); - val.appendChild(sp.el); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isVarFrozen(it.id), function (on) { API.locks.freezeVar(it.id, on); refreshActive(); })); - } - )); - - // Switches - section('switches', ICONS.switches, 'Switches', listSection( - function () { return API.ops.switches.list(); }, - function (row, it) { - row.className = 'fg-row' + (API.locks.isSwitchFrozen(it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var tg = el('button', { class: 'fg-toggle' + (API.ops.switches.get(it.id) ? ' is-on' : '') }); - tg.addEventListener('click', function () { API.ops.switches.set(it.id, !API.ops.switches.get(it.id)); if (API.locks.isSwitchFrozen(it.id)) API.locks.freezeSwitch(it.id, true); tg.classList.toggle('is-on', API.ops.switches.get(it.id)); }); - val.appendChild(tg); row.appendChild(val); - row.appendChild(lockBtn(API.locks.isSwitchFrozen(it.id), function (on) { API.locks.freezeSwitch(it.id, on); refreshActive(); })); - } - )); - - // Items / Weapons / Armors (segmented) - section('inv', ICONS.inv, 'Items', function (body, head) { - var kind = 'item'; - var seg = el('div', { class: 'fg-segmented' }); - ['item', 'weapon', 'armor'].forEach(function (k) { - var b = el('button', { class: k === kind ? 'is-active' : '', text: k.charAt(0).toUpperCase() + k.slice(1) + 's' }); - b.addEventListener('click', function () { kind = k; seg.querySelectorAll('button').forEach(function (x) { x.classList.remove('is-active'); }); b.classList.add('is-active'); vl.rebuild(); }); - seg.appendChild(b); - }); - head.appendChild(seg); - var vl = VirtualList({ - getModel: function () { return API.ops.inv.list(kind); }, - matches: defaultMatch, - renderRow: function (row, it) { - row.className = 'fg-row' + (API.locks.isItemFrozen(kind, it.id) ? ' is-frozen' : ''); - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.description || it.name })); - var val = el('span', { class: 'fg-cell--val' }); - var sp = stepper(function () { return API.ops.inv.count(kind, it.id); }, function (v) { API.ops.inv.setCount(kind, it.id, v); }, {}); - val.appendChild(sp.el); - val.appendChild(el('button', { class: 'fg-step', text: 'Max', style: 'width:auto;padding:0 6px', onclick: function () { API.ops.inv.max(kind, it.id); sp.sync(); } })); - row.appendChild(val); - row.appendChild(lockBtn(API.locks.isItemFrozen(kind, it.id), function (on) { API.locks.freezeItem(kind, it.id, on); refreshActive(); })); - } - }); - body.appendChild(vl.el); vl.rebuild(); - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.inv.list(kind).length; } }; - }); - - // Actors (master-detail) - section('actors', ICONS.actors, 'Actors', function (body) { - var detail = el('div', { class: 'fg-detail' }); - var selectedId = null; - var vl = VirtualList({ - rowH: 30, matches: defaultMatch, - getModel: function () { return API.ops.actors.list(); }, - onRowClick: function (it) { showActor(it.id); }, - renderRow: function (row, it) { - row.className = 'fg-row' + (it.id === selectedId ? ' is-selected' : ''); - row.style.cursor = 'pointer'; - row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', html: (it.inParty ? '' : '') + escapeHtml(it.name) })); - row.appendChild(el('span', { class: 'fg-cell--val', text: 'Lv ' + it.level })); - } - }); - var split = el('div', { style: 'flex:1;display:flex;min-height:0' }); - var left = el('div', { style: 'flex:0 0 240px;display:flex;flex-direction:column;border-right:1px solid var(--fg-border)' }); - left.appendChild(vl.el); - split.appendChild(left); split.appendChild(detail); - body.appendChild(split); vl.rebuild(); - var firstA = API.ops.actors.list()[0]; // auto-select first actor so detail isn't empty - if (firstA) showActor(firstA.id); - function showActor(id) { - selectedId = id; vl.draw(); // re-highlight the selected row in the (virtualized) list - var a = API.ops.actors.get(id); detail.innerHTML = ''; - if (!a) { detail.appendChild(el('div', { class: 'fg-empty', text: 'Actor not initialized (start a game first)' })); return; } - detail.appendChild(el('h2', { text: a.name + ' · Lv ' + a.level, style: 'margin:0 0 12px;font-size:15px' })); - var grid = el('div', { class: 'fg-grid' }); - grid.appendChild(numField('Level', function () { return API.ops.actors.get(id).level; }, function (v) { API.ops.actors.setLevel(id, v); showActor(id); })); - grid.appendChild(numField('EXP', function () { return API.ops.actors.get(id).exp; }, function (v) { API.ops.actors.setExp(id, v); showActor(id); })); - grid.appendChild(statField('HP', id, 'hp', function () { return API.ops.actors.get(id).hp; }, function () { return API.ops.actors.get(id).mhp; }, API.ops.actors.setHp)); - grid.appendChild(statField('MP', id, 'mp', function () { return API.ops.actors.get(id).mp; }, function () { return API.ops.actors.get(id).mmp; }, API.ops.actors.setMp)); - grid.appendChild(statField('TP', id, 'tp', function () { return API.ops.actors.get(id).tp; }, function () { return 100; }, API.ops.actors.setTp)); - a.params.forEach(function (p) { grid.appendChild(numField(p.name, function () { return API.ops.actors.get(id).params[p.id].value; }, function (v) { API.ops.actors.setParam(id, p.id, v); })); }); - detail.appendChild(grid); - var actbar = el('div', { style: 'display:flex;gap:8px;margin:14px 0' }, [ - el('button', { class: 'fg-btn', text: 'Recover All', onclick: function () { API.ops.actors.recover(id); showActor(id); } }), - el('button', { class: 'fg-btn', text: a.inParty ? 'Remove from Party' : 'Add to Party', onclick: function () { if (a.inParty) API.ops.actors.removeFromParty(id); else API.ops.actors.addToParty(id); vl.rebuild(); showActor(id); } }) - ]); - detail.appendChild(actbar); - // skills - detail.appendChild(el('h2', { text: 'Skills', style: 'font-size:13px;margin:10px 0 4px;color:var(--fg-text-dim)' })); - var skbox = el('div', { style: 'max-height:140px;overflow:auto;border:1px solid var(--fg-border);border-radius:7px' }); - a.skills.forEach(function (s) { - var r = el('div', { class: 'fg-field', style: 'padding:3px 10px' }, [ - el('span', { style: 'flex:1;font-size:12px', text: s.id + ': ' + s.name }), - el('button', { class: 'fg-btn fg-btn--ghost', text: s.learned ? 'Forget' : 'Learn', onclick: function () { if (s.learned) API.ops.actors.forget(id, s.id); else API.ops.actors.learn(id, s.id); showActor(id); } }) - ]); - skbox.appendChild(r); - }); - detail.appendChild(skbox); - } - function numField(label, get, set) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, set, {}).el); - f.appendChild(el('span', { style: 'flex:0 0 24px;width:24px' })); // empty lock slot -> steppers align with HP/MP/TP rows - return f; - } - function statField(label, id, stat, get, getMax, setFn) { - var f = el('div', { class: 'fg-field' }); f.appendChild(el('label', { text: label })); - f.appendChild(stepper(get, function (v) { setFn(id, v); if (API.locks.isStatFrozen(id, stat)) API.locks.freezeStat(id, stat, true); }, {}).el); - f.appendChild(lockBtn(API.locks.isStatFrozen(id, stat), function (on) { API.locks.freezeStat(id, stat, on); })); - return f; - } - return { onResize: vl.onResize, refresh: function () { vl.rebuild(); }, setQuery: vl.setQuery, count: function () { return API.ops.actors.list().length; } }; - }); - - // Party / Main - section('party', ICONS.party, 'Party', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - d.appendChild(el('div', { class: 'fg-field' }, [ - el('label', { text: 'Gold' }), - stepper(function () { return API.ops.gold.get(); }, function (v) { API.ops.gold.set(v); }, {}).el, - lockBtn(API.LOCK.gold != null, function (on) { API.locks.freezeGold(on); rebuild(); }) - ])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Steps' }), el('span', { text: API.ops.party.steps() })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Members' }), el('span', { text: API.ops.party.members().map(function (m) { return m.name; }).join(', ') || '(none)' })])); - d.appendChild(el('h2', { text: 'Quick actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Gold = Max', onclick: function () { API.ops.gold.set(API.ops.gold.max()); rebuild(); toast('Gold maxed', 'ok'); } }), - el('button', { class: 'fg-btn', text: 'Heal Party', onclick: function () { API.ops.party.members().forEach(function (m) { API.ops.actors.recover(m.id); }); toast('Party healed', 'ok'); } }) - ])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.party.members().length; } }; - }); - - // Map / Teleport - section('map', ICONS.map, 'Map', function (body) { - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var cur = API.ops.map.current(); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Current' }), el('span', { text: 'Map ' + cur.mapId + ' @ (' + cur.x + ',' + cur.y + ')' })])); - var sel = el('select', { class: 'fg-search', style: 'flex:1' }); - API.ops.map.list().forEach(function (m) { sel.appendChild(el('option', { value: m.id, text: m.id + ': ' + m.name })); }); - sel.value = cur.mapId; - var xIn = el('input', { class: 'fg-num', value: cur.x }), yIn = el('input', { class: 'fg-num', value: cur.y }); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Teleport to' }), sel])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'X / Y' }), xIn, yIn, - el('button', { class: 'fg-btn', text: 'Go', onclick: function () { API.ops.map.teleport(Number(sel.value), Number(xIn.value), Number(yIn.value), 0, 2); toast('Teleporting…', 'ok'); } })])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Noclip' }), - (function () { var t = el('button', { class: 'fg-toggle' + (API.ops.map.isNoclip() ? ' is-on' : '') }); t.addEventListener('click', function () { var on = !API.ops.map.isNoclip(); API.ops.map.noclip(on); t.classList.toggle('is-on', on); }); return t; })()])); - d.appendChild(el('div', { class: 'fg-field' }, [el('label', { text: 'Move speed' }), - stepper(function () { return (window.$gamePlayer && $gamePlayer._moveSpeed) || 4; }, function (v) { API.ops.map.speed(v); }, {}).el])); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.ops.map.list().length; } }; - }); - - // Common Events - section('commonev', ICONS.commonev, 'Common Ev.', listSection( - function () { return API.ops.commonev.list(); }, - function (row, it) { - row.className = 'fg-row'; row.innerHTML = ''; - row.appendChild(el('span', { class: 'fg-cell--id', text: it.id })); - row.appendChild(el('span', { class: 'fg-cell--name', text: it.name, title: it.name })); - row.appendChild(el('span', { class: 'fg-cell--val' }, el('button', { class: 'fg-btn', text: 'Run', onclick: function () { confirmBox('Run common event ' + it.id + ' (' + it.name + ')?', function () { API.ops.commonev.run(it.id); toast('Reserved CE ' + it.id, 'ok'); }); } }))); - } - )); - - // Data Lock (aggregated frozen targets) - section('locks', ICONS.locks, 'Data Lock', function (body, head) { - head.appendChild(el('button', { class: 'fg-btn fg-btn--danger', text: 'Unfreeze all', onclick: function () { API.locks.clearAll(); rebuild(); toast('All unfrozen'); } })); - var d = el('div', { class: 'fg-detail' }); - function rebuild() { - d.innerHTML = ''; - var s = API.locks.summary(); - if (!s.length) { d.appendChild(el('div', { class: 'fg-empty', text: 'No frozen values. Use the lock icon on any row to freeze it.' })); return; } - s.forEach(function (row) { - d.appendChild(el('div', { class: 'fg-field' }, [ - el('span', { style: 'flex:1;font-size:12px', text: row.label }), - el('span', { style: 'color:var(--fg-frozen);font-family:var(--font-mono);margin-right:8px', text: String(row.value) }), - el('button', { class: 'fg-btn fg-btn--ghost', text: 'Unfreeze', onclick: function () { unfreeze(row); rebuild(); } }) - ])); - }); - } - function unfreeze(row) { - if (row.type === 'var') API.locks.freezeVar(row.id, false); - else if (row.type === 'switch') API.locks.freezeSwitch(row.id, false); - else if (row.type === 'item') { var p = row.key.split(':'); API.LOCK.items.delete(row.key); } - else if (row.type === 'stat') { API.LOCK.stats.delete(row.key); } - else if (row.type === 'gold') API.locks.freezeGold(false); - else if (row.type === 'noclip') API.ops.map.noclip(false); - } - body.appendChild(d); rebuild(); - return { refresh: rebuild, count: function () { return API.locks.summary().length; } }; - }); - - // Battle cheats - section('battle', ICONS.battle, 'Cheats', function (body) { - var d = el('div', { class: 'fg-detail' }); - function tog(label, get, set) { - var t = el('button', { class: 'fg-toggle' + (get() ? ' is-on' : '') }); - t.addEventListener('click', function () { var v = !get(); set(v); t.classList.toggle('is-on', v); }); - return el('div', { class: 'fg-field' }, [el('label', { text: label }), t]); - } - d.appendChild(tog('God mode (blocks HP loss)', function () { return API.CHEAT.god; }, API.cheats.setGod)); - d.appendChild(tog('One-hit kill', function () { return API.CHEAT.ohko; }, API.cheats.setOhko)); - d.appendChild(tog('No random encounters', function () { return API.CHEAT.noEncounter; }, API.cheats.setNoEncounter)); - // ---- game speed (speedhack) ---- - d.appendChild(el('h2', { text: 'Game speed', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - var speedRow = el('div', { class: 'fg-field' }); - speedRow.appendChild(el('label', { text: 'Speed' })); - var seg = el('div', { class: 'fg-segmented', style: 'flex-wrap:wrap' }); - var presets = [['0.5×', 0.5], ['1×', 1], ['2×', 2], ['3×', 3], ['5×', 5], ['8×', 8]]; - function keyLabel(k) { return k === 'Control' ? 'Ctrl' : (k === ' ' ? 'Space' : k); } - // In KEY mode the highlight = the ARMED target (_speedBoost); in ALWAYS-ON mode = the live speed. - function targetSpeed() { return API._speedUseKey ? (API._speedBoost || 2) : (API.CHEAT.speed || 1); } - function syncSeg() { var t = targetSpeed(); Array.prototype.forEach.call(seg.children, function (b) { b.classList.toggle('is-active', Number(b.dataset.v) === t); }); if (typeof custom !== 'undefined' && custom) custom.value = t; } - // Picking a speed ARMS the target. It only changes the live game speed if key-mode is OFF, or if - // the speedhack is already active (then it live-updates). So buttons respect the key toggle. - function pick(v) { - API._speedBoost = v; store('speedBoost', v); - if (!API._speedUseKey || API.CHEAT.speed !== 1) { API.cheats.setSpeed(v); toast('Speed ' + v + '×', 'ok'); } - else { toast('Armed ' + v + '× — hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - syncSeg(); - } - presets.forEach(function (p) { - var b = el('button', { text: p[0] }); b.dataset.v = p[1]; - b.addEventListener('click', function () { pick(p[1]); }); - seg.appendChild(b); - }); - speedRow.appendChild(seg); - d.appendChild(speedRow); - var customRow = el('div', { class: 'fg-field' }); - customRow.appendChild(el('label', { text: 'Custom ×' })); - var custom = el('input', { class: 'fg-num', type: 'text', value: targetSpeed() }); - custom.addEventListener('keydown', function (e) { if (e.key === 'Enter') { pick(Number(custom.value) || 1); custom.blur(); } }); - custom.addEventListener('blur', function () { pick(Number(custom.value) || 1); }); - customRow.appendChild(custom); - d.appendChild(customRow); - - // ---- use-key toggle (off => speed is always on) ---- - var useKeyRow = el('div', { class: 'fg-field' }); - useKeyRow.appendChild(el('label', { text: 'Use hold key' })); - var ukTog = el('button', { class: 'fg-toggle' + (API._speedUseKey ? ' is-on' : '') }); - ukTog.addEventListener('click', function () { - speedHeld = false; // changing mode ends any active hold so a later key-release won't reset speed - var on = !API._speedUseKey; API._speedUseKey = on; store('speedUseKey', on); ukTog.classList.toggle('is-on', on); - keyRow.style.display = on ? '' : 'none'; - if (on) { API.cheats.setSpeed(1); toast('Speed: hold ' + keyLabel(API._speedKey) + ' to fast-forward', 'ok'); } - else { API.cheats.setSpeed(API._speedBoost || 2); toast('Speed: always on at ' + (API._speedBoost || 2) + '×', 'ok'); } - syncSeg(); - }); - useKeyRow.appendChild(ukTog); - d.appendChild(useKeyRow); - - // ---- rebindable key ---- - var keyRow = el('div', { class: 'fg-field' }); - keyRow.appendChild(el('label', { text: 'Hold key' })); - var keyBtn = el('button', { class: 'fg-btn', text: keyLabel(API._speedKey) }); - keyBtn.addEventListener('click', function () { - keyBtn.textContent = 'Press a key…'; API._capturingSpeedKey = true; - function cap(ev) { - ev.preventDefault(); ev.stopPropagation(); - window.removeEventListener('keydown', cap, true); API._capturingSpeedKey = false; - if (ev.key !== 'Escape') { API._speedKey = ev.key; store('speedKey', ev.key); } - keyBtn.textContent = keyLabel(API._speedKey); - } - window.addEventListener('keydown', cap, true); - }); - keyRow.appendChild(keyBtn); - keyRow.style.display = API._speedUseKey ? '' : 'none'; - d.appendChild(keyRow); - syncSeg(); - d.appendChild(el('h2', { text: 'In-battle actions', style: 'font-size:13px;margin:14px 0 6px;color:var(--fg-text-dim)' })); - d.appendChild(el('div', { style: 'display:flex;gap:8px;flex-wrap:wrap' }, [ - el('button', { class: 'fg-btn', text: 'Instant Win', onclick: function () { API.cheats.instantWin(); toast(API.ops.battle.inBattle() ? 'Enemies downed' : 'Not in battle', API.ops.battle.inBattle() ? 'ok' : 'warn'); } }), - el('button', { class: 'fg-btn', text: 'Flee / Abort', onclick: function () { API.cheats.flee(); } }) - ])); - body.appendChild(d); - return { refresh: function () {}, count: function () { return 0; } }; - }); - - // ---------- render / navigation ---------- - function escapeHtml(s) { return String(s).replace(/[&<>"]/g, function (c) { return { '&': '&', '<': '<', '>': '>', '"': '"' }[c]; }); } - function lockBtn(frozen, onToggle) { - var b = el('button', { class: 'fg-lock' + (frozen ? ' is-frozen' : ''), html: frozen ? ICONS.lock : ICONS.unlock, title: 'Freeze value' }); - b.addEventListener('click', function () { frozen = !frozen; b.className = 'fg-lock' + (frozen ? ' is-frozen' : ''); b.innerHTML = frozen ? ICONS.lock : ICONS.unlock; onToggle(frozen); }); - return b; - } - function refreshActive() { if (activeRenderer && activeRenderer.refresh) activeRenderer.refresh(); updateStatus(); } - - SECTIONS.forEach(function (s) { - var item = el('button', { class: 'fg-rail__item', title: s.title }, [el('span', { class: 'ic', html: s.icon }), el('span', { text: s.title.split(' ')[0] })]); - item.addEventListener('click', function () { selectSection(s.id); }); - s._rail = item; rail.appendChild(item); - }); - - function selectSection(id) { - currentSection = id; - SECTIONS.forEach(function (s) { s._rail.classList.toggle('is-active', s.id === id); }); - render(); - store('lastSection', id); - } - function render() { - var s = SECTIONS.filter(function (x) { return x.id === currentSection; })[0]; if (!s) return; - content.innerHTML = ''; - var head = el('div', { class: 'fg-subtoolbar' }); - var sectionHead = el('div', { class: 'fg-section-head' }, [el('h2', { text: s.title }), el('span', { class: 'fg-count', text: '' }), el('span', { class: 'fg-spacer' })]); - content.appendChild(sectionHead); - content.appendChild(head); - var body = el('div', { style: 'flex:1;display:flex;flex-direction:column;min-height:0' }); - content.appendChild(body); - activeRenderer = s.builder(body, head) || {}; - if (head.children.length === 0) head.remove(); - var cnt = activeRenderer.count ? activeRenderer.count() : 0; - sectionHead.querySelector('.fg-count').textContent = cnt + (cnt === 1 ? ' entry' : ' entries'); - // Search only applies to list sections (those expose setQuery); hide it on form sections. - var searchable = !!activeRenderer.setQuery; - // keep the search box's flex space (invisible, not removed) so the titlebar buttons stay anchored right - search.style.visibility = searchable ? 'visible' : 'hidden'; - if (searchable && search.value) activeRenderer.setQuery(search.value.trim()); - updateStatus(); - } - function updateStatus() { - var frozen = API.locks.summary().length; - statusbar.innerHTML = ''; - statusbar.appendChild(el('span', { text: API.env.IS_MZ ? 'RPG Maker MZ' : 'RPG Maker MV' })); - statusbar.appendChild(el('span', { class: 'fg-spacer', style: 'flex:1' })); - statusbar.appendChild(el('span', { text: (frozen ? frozen + ' frozen · ' : '') + 'F10 to toggle' })); - } - - search.addEventListener('input', debounce(function () { if (activeRenderer && activeRenderer.setQuery) activeRenderer.setQuery(search.value.trim()); }, 120)); - function debounce(fn, ms) { var t; return function () { clearTimeout(t); t = setTimeout(fn, ms); }; } - - // ---------- show / hide / hotkeys ---------- - var visible = false; - function show() { visible = true; try { document.body.appendChild(host); } catch (e) {} panel.style.display = 'flex'; launcher.style.display = 'none'; if (!currentSection) selectSection(load('lastSection', 'vars')); else render(); } - function hide() { visible = false; panel.style.display = 'none'; launcher.style.display = 'flex'; API.CHEAT.uiFocused = false; if (typeof Input !== 'undefined' && Input.clear) Input.clear(); } - function toggle() { if (visible) hide(); else show(); } - panel.style.display = 'none'; - - // Speed key = HOLD to fast-forward: while the key is held the game runs at the armed boost speed; - // on release it returns to 1x. Only active when the "use key" option is on. Gated to !uiFocused so - // holding a key while typing in the panel never fast-forwards. - var speedHeld = false; - function isSpeedKey(k) { var sk = API._speedKey || 'Control'; return k === sk || (sk === 'Control' && k === 'Ctrl'); } - function holdStart() { if (!speedHeld) { speedHeld = true; API.cheats.setSpeed(API._speedBoost || 2); toast('Fast-forward ' + API.CHEAT.speed + '×', 'ok'); } } - function holdEnd() { if (speedHeld) { speedHeld = false; API.cheats.setSpeed(1); } } - window.addEventListener('keydown', function (e) { - if (API._capturingSpeedKey) return; // a key-rebind is in progress - var key = e.key || ''; - if (key === (API._hotkey || 'F10')) { e.preventDefault(); toggle(); return; } - if (visible && (e.ctrlKey || e.metaKey) && key.toLowerCase() === 'k') { e.preventDefault(); search.focus(); search.select(); } - else if (visible && key === 'Escape') { if (shadow.activeElement && shadow.activeElement.tagName === 'INPUT') shadow.activeElement.blur(); else hide(); } - if (API._speedUseKey && isSpeedKey(key) && !API.CHEAT.uiFocused) holdStart(); // hold to fast-forward - }, true); - window.addEventListener('keyup', function (e) { - if (API._capturingSpeedKey) return; - if (isSpeedKey(e.key || '')) holdEnd(); - }, true); - window.addEventListener('blur', holdEnd); // alt-tab / focus loss -> stop fast-forward (no stuck key) - - // expose - return { - show: show, hide: hide, toggle: toggle, toast: toast, render: render, - isVisible: function () { return visible; }, root: rootEl, host: host, - select: selectSection, sections: SECTIONS.map(function (s) { return s.id; }) - }; - } - -})(typeof window !== 'undefined' ? window : (typeof globalThis !== 'undefined' ? globalThis : this)); - -/* ---- MZ scaffolding (registerCommand + start-open) ---- */ -(function () { - var P = (typeof PluginManager !== 'undefined' && PluginManager.parameters) ? PluginManager.parameters('Forge_MZ') : {}; - if (window.Forge) { - window.Forge._hotkey = (P.hotkey || 'F10').trim(); - window.Forge._itemMaxOverride = Number(P.itemMaxOverride) || 0; - try { if (!localStorage.getItem('forge:speedKey')) window.Forge._speedKey = (P.speedKey || 'Control').trim(); } catch (e) { window.Forge._speedKey = (P.speedKey || 'Control').trim(); } - } - if (typeof PluginManager !== 'undefined' && PluginManager.registerCommand) { - PluginManager.registerCommand('Forge_MZ', 'open', function () { if (window.Forge && window.Forge.ui) window.Forge.ui.toggle(); }); - } - if (String(P.startOpen) === 'true' && typeof Scene_Map !== 'undefined') { - var _s = Scene_Map.prototype.start; - Scene_Map.prototype.start = function () { _s.call(this); if (window.Forge && window.Forge.ui && !window.Forge.ui.isVisible()) window.Forge.ui.show(); }; - } -})(); - +(function(){var e=document.createElement(`style`);e.textContent=`@import "https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap";:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:#ff6568;--color-orange-400:#ff8b1a;--color-yellow-300:#ffe02a;--color-yellow-400:#fac800;--color-yellow-500:#edb200;--color-fuchsia-500:#e12afb;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5dc;--color-gray-400:#99a1af;--color-gray-500:#6a7282;--color-gray-600:#4a5565;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:#0b0c10;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}@supports (color:lab(0% 0 0)){:root,:host{--color-red-400:lab(63.7053% 60.745 31.3109);--color-orange-400:lab(70.0429% 42.5156 75.8207);--color-yellow-300:lab(89.7033% -.480294 84.4917);--color-yellow-400:lab(83.2664% 8.65132 106.895);--color-yellow-500:lab(76.3898% 14.5258 98.4589);--color-fuchsia-500:lab(56.4256% 83.132 -64.639);--color-gray-200:lab(91.6229% -.159115 -2.26791);--color-gray-300:lab(85.1236% -.612259 -3.7138);--color-gray-400:lab(65.9269% -.832707 -8.17473);--color-gray-500:lab(47.7841% -.393182 -10.0268);--color-gray-600:lab(35.6337% -1.58697 -10.8425)}}*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::-webkit-file-upload-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::-webkit-file-upload-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:transparent;border-radius:0}:where(select:-webkit-any([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:-webkit-any([multiple],[size])) optgroup option{padding-left:20px}:where(select:is([multiple],[size])) optgroup option{padding-left:20px}::-webkit-file-upload-button{margin-right:4px}::file-selector-button{margin-right:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button{-webkit-appearance:button;appearance:button}input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;appearance:button}::-webkit-file-upload-button{-webkit-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{top:0;bottom:0;left:0;right:0}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-\\[-0\\.5px\\]{top:-.5px}.top-\\[4px\\]{top:4px}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.left-4{left:calc(var(--spacing) * 4)}.left-\\[4px\\]{left:4px}.left-\\[24px\\]{left:24px}.z-2147482999{z-index:2147482999}.z-2147483000{z-index:2147483000}.z-2147483647{z-index:2147483647}.m-0{margin:0}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-4{margin-right:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-1\\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.min-h-0{min-height:0}.w-1\\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(140px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(160px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(260px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.grid-cols-\\[repeat\\(auto-fit\\,minmax\\(300px\\,1fr\\)\\)\\]{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{grid-gap:calc(var(--spacing) * 2);gap:calc(var(--spacing) * 2)}.gap-3{grid-gap:calc(var(--spacing) * 3);gap:calc(var(--spacing) * 3)}.gap-4{grid-gap:calc(var(--spacing) * 4);gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(var(--spacing) * var(--tw-space-y-reverse));margin-bottom:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-top:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-bottom:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(var(--spacing) * var(--tw-space-x-reverse));margin-right:calc(var(--spacing) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 1.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 2.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3\\.5>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 3.5) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 3.5) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-left:calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse));margin-right:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.divide-border\\/50>:not(:last-child)){border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){:where(.divide-border\\/50>:not(:last-child)){border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\\[\\#2a2d3a\\]{border-color:#2a2d3a}.border-accent{border-color:var(--color-accent)}.border-accent\\/30{border-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/30{border-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.border-accent\\/50{border-color:rgba(99,102,241,.5)}@supports (color:color-mix(in lab, red, red)){.border-accent\\/50{border-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.border-border{border-color:var(--color-border)}.border-border\\/50{border-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.border-border\\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-danger\\/30{border-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.border-danger\\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-fuchsia-500\\/30{border-color:rgba(225,42,251,.3)}@supports (color:color-mix(in lab, red, red)){.border-fuchsia-500\\/30{border-color:color-mix(in oklab, var(--color-fuchsia-500) 30%, transparent)}}.border-gray-500\\/30{border-color:rgba(106,114,130,.3)}@supports (color:color-mix(in lab, red, red)){.border-gray-500\\/30{border-color:color-mix(in oklab, var(--color-gray-500) 30%, transparent)}}.border-ok\\/30{border-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.border-ok\\/30{border-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.border-warn\\/30{border-color:rgba(251,146,60,.3)}@supports (color:color-mix(in lab, red, red)){.border-warn\\/30{border-color:color-mix(in oklab, var(--color-warn) 30%, transparent)}}.border-yellow-500\\/30{border-color:rgba(237,178,0,.3)}@supports (color:color-mix(in lab, red, red)){.border-yellow-500\\/30{border-color:color-mix(in oklab, var(--color-yellow-500) 30%, transparent)}}.border-l-frozen{border-left-color:var(--color-frozen)}.bg-\\[\\#1a1d24\\]{background-color:#1a1d24}.bg-\\[\\#3a3f4d\\]{background-color:#3a3f4d}.bg-\\[\\#7ba4ff\\]\\/10{background-color:rgba(123,164,255,.1);background-color:lab(67.3388% 4.90472 -50.2993/.1)}.bg-\\[\\#13151a\\]{background-color:#13151a}.bg-accent{background-color:var(--color-accent)}.bg-accent-weak{background-color:var(--color-accent-weak)}.bg-accent\\/5{background-color:rgba(99,102,241,.05)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/5{background-color:color-mix(in oklab, var(--color-accent) 5%, transparent)}}.bg-accent\\/10{background-color:rgba(99,102,241,.1)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/10{background-color:color-mix(in oklab, var(--color-accent) 10%, transparent)}}.bg-accent\\/20{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.bg-accent\\/20{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.bg-bg{background-color:var(--color-bg)}.bg-bg2{background-color:var(--color-bg2)}.bg-border{background-color:var(--color-border)}.bg-border\\/50{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.bg-border\\/50{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.bg-danger{background-color:var(--color-danger)}.bg-danger\\/10{background-color:rgba(239,68,68,.1)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/10{background-color:color-mix(in oklab, var(--color-danger) 10%, transparent)}}.bg-danger\\/20{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.bg-danger\\/20{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.bg-frozen\\/20{background-color:rgba(139,92,246,.2)}@supports (color:color-mix(in lab, red, red)){.bg-frozen\\/20{background-color:color-mix(in oklab, var(--color-frozen) 20%, transparent)}}.bg-fuchsia-500\\/10{background-color:rgba(225,42,251,.1)}@supports (color:color-mix(in lab, red, red)){.bg-fuchsia-500\\/10{background-color:color-mix(in oklab, var(--color-fuchsia-500) 10%, transparent)}}.bg-gray-500\\/10{background-color:rgba(106,114,130,.1)}@supports (color:color-mix(in lab, red, red)){.bg-gray-500\\/10{background-color:color-mix(in oklab, var(--color-gray-500) 10%, transparent)}}.bg-ok{background-color:var(--color-ok)}.bg-ok\\/10{background-color:rgba(16,185,129,.1)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/10{background-color:color-mix(in oklab, var(--color-ok) 10%, transparent)}}.bg-ok\\/20{background-color:rgba(16,185,129,.2)}@supports (color:color-mix(in lab, red, red)){.bg-ok\\/20{background-color:color-mix(in oklab, var(--color-ok) 20%, transparent)}}.bg-transparent{background-color:transparent}.bg-warn\\/10{background-color:rgba(251,146,60,.1)}@supports (color:color-mix(in lab, red, red)){.bg-warn\\/10{background-color:color-mix(in oklab, var(--color-warn) 10%, transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-500\\/10{background-color:rgba(237,178,0,.1)}@supports (color:color-mix(in lab, red, red)){.bg-yellow-500\\/10{background-color:color-mix(in oklab, var(--color-yellow-500) 10%, transparent)}}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-left:var(--spacing);padding-right:var(--spacing)}.px-1\\.5{padding-left:calc(var(--spacing) * 1.5);padding-right:calc(var(--spacing) * 1.5)}.px-2{padding-left:calc(var(--spacing) * 2);padding-right:calc(var(--spacing) * 2)}.px-2\\.5{padding-left:calc(var(--spacing) * 2.5);padding-right:calc(var(--spacing) * 2.5)}.px-3{padding-left:calc(var(--spacing) * 3);padding-right:calc(var(--spacing) * 3)}.px-3\\.5{padding-left:calc(var(--spacing) * 3.5);padding-right:calc(var(--spacing) * 3.5)}.px-4{padding-left:calc(var(--spacing) * 4);padding-right:calc(var(--spacing) * 4)}.py-0\\.5{padding-top:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * .5)}.py-1{padding-top:var(--spacing);padding-bottom:var(--spacing)}.py-1\\.5{padding-top:calc(var(--spacing) * 1.5);padding-bottom:calc(var(--spacing) * 1.5)}.py-2{padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 2)}.py-3{padding-top:calc(var(--spacing) * 3);padding-bottom:calc(var(--spacing) * 3)}.pt-1{padding-top:var(--spacing)}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1\\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\[9px\\]{font-size:9px}.text-\\[10px\\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\\[\\#7ba4ff\\]{color:#7ba4ff}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-frozen{color:var(--color-frozen)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-ok{color:var(--color-ok)}.text-orange-400{color:var(--color-orange-400)}.text-text{color:var(--color-text)}.text-text-dim{color:var(--color-text-dim)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,rgba(0,0,0,.25));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,rgba(0,0,0,.1)), 0 4px 6px -4px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,rgba(0,0,0,.1)), 0 1px 2px -1px var(--tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{user-select:none}.select-text{user-select:text}@media (hover:hover){.group-hover\\:text-accent:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\\:opacity-100:is(:where(.group):hover *){opacity:1}}.first-letter\\:text-\\[\\#7ba4ff\\]:first-letter{color:#7ba4ff}@media (hover:hover){.hover\\:bg-\\[\\#2a2d3a\\]:hover{background-color:#2a2d3a}.hover\\:bg-accent\\/20:hover{background-color:rgba(99,102,241,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/20:hover{background-color:color-mix(in oklab, var(--color-accent) 20%, transparent)}}.hover\\:bg-accent\\/30:hover{background-color:rgba(99,102,241,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\\:bg-accent\\/80:hover{background-color:rgba(99,102,241,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/80:hover{background-color:color-mix(in oklab, var(--color-accent) 80%, transparent)}}.hover\\:bg-accent\\/85:hover{background-color:rgba(99,102,241,.85)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-accent\\/85:hover{background-color:color-mix(in oklab, var(--color-accent) 85%, transparent)}}.hover\\:bg-border:hover{background-color:var(--color-border)}.hover\\:bg-border\\/30:hover{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/30:hover{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.hover\\:bg-border\\/50:hover{background-color:rgba(34,37,51,.5)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/50:hover{background-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.hover\\:bg-border\\/80:hover{background-color:rgba(34,37,51,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-border\\/80:hover{background-color:color-mix(in oklab, var(--color-border) 80%, transparent)}}.hover\\:bg-danger\\/20:hover{background-color:rgba(239,68,68,.2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/20:hover{background-color:color-mix(in oklab, var(--color-danger) 20%, transparent)}}.hover\\:bg-danger\\/30:hover{background-color:rgba(239,68,68,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/30:hover{background-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.hover\\:bg-danger\\/80:hover{background-color:rgba(239,68,68,.8)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-danger\\/80:hover{background-color:color-mix(in oklab, var(--color-danger) 80%, transparent)}}.hover\\:bg-frozen\\/30:hover{background-color:rgba(139,92,246,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-frozen\\/30:hover{background-color:color-mix(in oklab, var(--color-frozen) 30%, transparent)}}.hover\\:bg-ok\\/30:hover{background-color:rgba(16,185,129,.3)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-ok\\/30:hover{background-color:color-mix(in oklab, var(--color-ok) 30%, transparent)}}.hover\\:text-danger:hover{color:var(--color-danger)}.hover\\:text-gray-200:hover{color:var(--color-gray-200)}.hover\\:text-gray-300:hover{color:var(--color-gray-300)}.hover\\:text-gray-400:hover{color:var(--color-gray-400)}.hover\\:text-red-400:hover{color:var(--color-red-400)}.hover\\:text-white:hover{color:var(--color-white)}.hover\\:text-yellow-300:hover{color:var(--color-yellow-300)}.hover\\:opacity-100:hover{opacity:1}.hover\\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\\:border-accent:focus{border-color:var(--color-accent)}.focus\\:bg-border\\/30:focus{background-color:rgba(34,37,51,.3)}@supports (color:color-mix(in lab, red, red)){.focus\\:bg-border\\/30:focus{background-color:color-mix(in oklab, var(--color-border) 30%, transparent)}}.focus\\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\\:cursor-grabbing:active{cursor:grabbing}.disabled\\:opacity-50:disabled{opacity:.5}:host{--color-bg:#0b0c10;--color-bg-elev:#13151f;--color-bg-input:#1a1c29;--color-bg2:#13151f;--color-text:#f1f5f9;--color-text-dim:#9aa1b1;--color-text-faint:#646b7d;--color-accent:#6366f1;--color-accent-weak:#1e3a6e;--color-border:#222533;--color-danger:#ef4444;--color-ok:#10b981;--color-warn:#fb923c;--color-frozen:#8b5cf6}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#222533;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#6366f1}body,:host{color:#f1f5f9;font-family:Outfit,system-ui,-apple-system,sans-serif}*,:after,:before{--tw-border-style:solid}.cursor-grab{cursor:-webkit-grab;cursor:grab}.active\\:cursor-grabbing:active{cursor:-webkit-grabbing;cursor:grabbing}.space-x-1>:not([hidden])~:not([hidden]){margin-left:4px}.space-x-1\\.5>:not([hidden])~:not([hidden]){margin-left:6px}.space-x-2>:not([hidden])~:not([hidden]){margin-left:8px}.space-x-2\\.5>:not([hidden])~:not([hidden]){margin-left:10px}.space-x-3>:not([hidden])~:not([hidden]){margin-left:12px}.space-x-4>:not([hidden])~:not([hidden]){margin-left:16px}.space-y-0\\.5>:not([hidden])~:not([hidden]){margin-top:2px}.space-y-1>:not([hidden])~:not([hidden]){margin-top:4px}.space-y-2>:not([hidden])~:not([hidden]){margin-top:8px}.space-y-2\\.5>:not([hidden])~:not([hidden]){margin-top:10px}.space-y-3>:not([hidden])~:not([hidden]){margin-top:12px}.space-y-4>:not([hidden])~:not([hidden]){margin-top:16px}.space-y-6>:not([hidden])~:not([hidden]){margin-top:24px}.divide-y>:not([hidden])~:not([hidden]){border-top-width:1px;border-color:var(--color-border)}input,textarea,[contenteditable=true]{user-select:text!important}button,button:focus{outline:none!important}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 transparent}@property --tw-duration{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 transparent;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 transparent;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 transparent;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 transparent;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 transparent;--tw-duration:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}} +/*$vite$:1*/`,document.head.appendChild(e);var t=!1,n=Array.isArray,r=Array.prototype.indexOf,i=Array.prototype.includes,a=Array.from,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyDescriptors,l=Object.prototype,u=Array.prototype,d=Object.getPrototypeOf,f=Object.isExtensible;function p(e){return typeof e==`function`}var m=()=>{};function h(e){return e()}function g(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function v(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}function y(e){"@babel/helpers - typeof";return y=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},y(e)}function b(e,t){if(y(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(y(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function x(e){var t=b(e,`string`);return y(t)==`symbol`?t:t+``}function S(e,t,n){return(t=x(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ee,C=1<<24,w=1024,te=2048,ne=4096,re=8192,ie=16384,ae=32768,oe=1<<25,se=65536,ce=1<<19,le=1<<20,ue=1<<25,de=65536,fe=1<<21,pe=1<<22,me=1<<23,he=Symbol(`$state`),ge=Symbol(`legacy props`),_e=Symbol(``),ve=Symbol(`proxy path`),ye=Symbol(`attributes`),be=Symbol(`class`),xe=Symbol(`style`),Se=Symbol(`text`),Ce=Symbol(`form reset`),we=Symbol(`hmr anchor`),Te=new class extends Error{constructor(...e){super(...e),S(this,`name`,`StaleReactionError`),S(this,`message`,"The reaction that called `getAbortSignal()` was re-run or destroyed")}},Ee=!!((ee=globalThis.document)!=null&&ee.contentType)&&globalThis.document.contentType.includes(`xml`);function De(e){if(t){let t=Error(`invariant_violation\nAn invariant violation occurred, meaning Svelte's internal assumptions were flawed. This is a bug in Svelte, not your app — please open an issue at https://github.com/sveltejs/svelte, citing the following message: "${e}"\nhttps://svelte.dev/e/invariant_violation`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/invariant_violation`)}function Oe(e){if(t){let t=Error(`lifecycle_outside_component\n\`${e}(...)\` can only be used during component initialisation\nhttps://svelte.dev/e/lifecycle_outside_component`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function ke(){if(t){let e=Error("async_derived_orphan\nCannot create a `$derived(...)` with an `await` expression outside of an effect tree\nhttps://svelte.dev/e/async_derived_orphan");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ae(){if(t){let e=Error("bind_invalid_checkbox_value\nUsing `bind:value` together with a checkbox input is not allowed. Use `bind:checked` instead\nhttps://svelte.dev/e/bind_invalid_checkbox_value");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/bind_invalid_checkbox_value`)}function je(){if(t){let e=Error(`derived_references_self +A derived value cannot reference itself recursively +https://svelte.dev/e/derived_references_self`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/derived_references_self`)}function Me(e,n,r){if(t){let t=Error(`each_key_duplicate\n${r?`Keyed each block has duplicate key \`${r}\` at indexes ${e} and ${n}`:`Keyed each block has duplicate key at indexes ${e} and ${n}`}\nhttps://svelte.dev/e/each_key_duplicate`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Ne(e,n,r){if(t){let t=Error(`each_key_volatile\nKeyed each block has key that is not idempotent — the key for item at index ${e} was \`${n}\` but is now \`${r}\`. Keys must be the same each time for a given item\nhttps://svelte.dev/e/each_key_volatile`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/each_key_volatile`)}function Pe(e){if(t){let t=Error(`effect_in_teardown\n\`${e}\` cannot be used inside an effect cleanup function\nhttps://svelte.dev/e/effect_in_teardown`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Fe(){if(t){let e=Error(`effect_in_unowned_derived +Effect cannot be created inside a \`$derived\` value that was not itself created inside an effect +https://svelte.dev/e/effect_in_unowned_derived`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function Ie(e){if(t){let t=Error(`effect_orphan\n\`${e}\` can only be used inside an effect (e.g. during component initialisation)\nhttps://svelte.dev/e/effect_orphan`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/effect_orphan`)}function Le(){if(t){let e=Error(`effect_update_depth_exceeded +Maximum update depth exceeded. This typically indicates that an effect reads and writes the same piece of state +https://svelte.dev/e/effect_update_depth_exceeded`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Re(){if(t){let e=Error("invalid_snippet\nCould not `{@render}` snippet due to the expression being `null` or `undefined`. Consider using optional chaining `{@render snippet?.()}`\nhttps://svelte.dev/e/invalid_snippet");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/invalid_snippet`)}function ze(e){if(t){let t=Error(`props_invalid_value\nCannot do \`bind:${e}={undefined}\` when \`${e}\` has a fallback value\nhttps://svelte.dev/e/props_invalid_value`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_invalid_value`)}function Be(e){if(t){let t=Error(`props_rest_readonly\nRest element properties of \`$props()\` such as \`${e}\` are readonly\nhttps://svelte.dev/e/props_rest_readonly`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/props_rest_readonly`)}function Ve(e){if(t){let t=Error(`rune_outside_svelte\nThe \`${e}\` rune is only available inside \`.svelte\` and \`.svelte.js/ts\` files\nhttps://svelte.dev/e/rune_outside_svelte`);throw t.name=`Svelte error`,t}else throw Error(`https://svelte.dev/e/rune_outside_svelte`)}function He(){if(t){let e=Error("state_descriptors_fixed\nProperty descriptors defined on `$state` objects must contain `value` and always be `enumerable`, `configurable` and `writable`.\nhttps://svelte.dev/e/state_descriptors_fixed");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){if(t){let e=Error(`state_prototype_fixed +Cannot set prototype of \`$state\` object +https://svelte.dev/e/state_prototype_fixed`);throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){if(t){let e=Error("state_unsafe_mutation\nUpdating state inside `$derived(...)`, `$inspect(...)` or a template expression is forbidden. If the value should not be reactive, declare it without `$state`\nhttps://svelte.dev/e/state_unsafe_mutation");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){if(t){let e=Error("svelte_boundary_reset_onerror\nA `` `reset` function cannot be called while an error is still being handled\nhttps://svelte.dev/e/svelte_boundary_reset_onerror");throw e.name=`Svelte error`,e}else throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke={},qe=Symbol(`uninitialized`),Je=Symbol(`filename`),Ye=`http://www.w3.org/1999/xhtml`,Xe=`http://www.w3.org/2000/svg`,Ze=`font-weight: bold`,Qe=`font-weight: normal`;function $e(e){t?console.warn(`%c[svelte] await_reactivity_loss\n%cDetected reactivity loss when reading \`${e}\`. This happens when state is read in an async function after an earlier \`await\`\nhttps://svelte.dev/e/await_reactivity_loss`,Ze,Qe):console.warn(`https://svelte.dev/e/await_reactivity_loss`)}function et(e,n){t?console.warn(`%c[svelte] await_waterfall\n%cAn async derived, \`${e}\` (${n}) was not read immediately after it resolved. This often indicates an unnecessary waterfall, which can slow down your app\nhttps://svelte.dev/e/await_waterfall`,Ze,Qe):console.warn(`https://svelte.dev/e/await_waterfall`)}function tt(){t?console.warn(`%c[svelte] derived_inert +%cReading a derived belonging to a now-destroyed effect may result in stale values +https://svelte.dev/e/derived_inert`,Ze,Qe):console.warn(`https://svelte.dev/e/derived_inert`)}function nt(e,n,r){t?console.warn(`%c[svelte] hydration_attribute_changed\n%cThe \`${e}\` attribute on \`${n}\` changed its value between server and client renders. The client value, \`${r}\`, will be ignored in favour of the server value\nhttps://svelte.dev/e/hydration_attribute_changed`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_attribute_changed`)}function rt(e){t?console.warn(`%c[svelte] hydration_mismatch\n%c${e?`Hydration failed because the initial UI does not match what was rendered on the server. The error occurred near ${e}`:`Hydration failed because the initial UI does not match what was rendered on the server`}\nhttps://svelte.dev/e/hydration_mismatch`,Ze,Qe):console.warn(`https://svelte.dev/e/hydration_mismatch`)}function it(){t?console.warn("%c[svelte] select_multiple_invalid_value\n%cThe `value` property of a ` `);function fl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,0),r=Hs(t,`min`,19,()=>-1/0),i=Hs(t,`max`,3,1/0),a=P(I(String(n())));Mi(()=>{F(a,String(n()),!0)});let o=()=>{var e;let o=parseFloat(H(a));isNaN(o)&&(o=n()),o=Math.max(r(),Math.min(i(),o)),n(o),F(a,String(o),!0),(e=t.onchange)==null||e.call(t,n())},s=(e,o)=>{var s;o.shiftKey&&(e*=10);let c=n()+e;c=Math.max(r(),Math.min(i(),c)),n(c),F(a,String(c),!0),(s=t.onchange)==null||s.call(t,n())},c=e=>{e.stopPropagation(),e.key===`Enter`?(o(),e.target.blur()):e.key===`Escape`&&(F(a,String(n()),!0),e.target.blur())};var l=dl(),u=L(l),d=R(u,2);us(d);var f=R(d,2);D(l),U(`click`,u,e=>s(-1,e)),Ua(`blur`,d,o),U(`keydown`,d,c),Cs(d,()=>H(a),e=>F(a,e)),U(`click`,f,e=>s(1,e)),G(e,l),Nt()}Wa([`click`,`keydown`]);var pl=W(``);function ml(e,t){Mt(t,!0);let n=Hs(t,`locked`,3,!1);var r=pl(),i=L(r),a=e=>{uc(e,{size:14})},o=e=>{cc(e,{size:14})};mo(i,e=>{n()?e(a):e(o,-1)}),D(r),z(()=>{Jo(r,1,`flex h-6 w-6 shrink-0 items-center justify-center rounded transition-colors focus:outline-none ${n()?`bg-frozen/20 text-frozen hover:bg-frozen/30`:`hover:bg-border text-gray-500 hover:text-gray-300`}`),ps(r,`title`,n()?`Unfreeze`:`Freeze`),ps(r,`aria-label`,n()?`Unfreeze state`:`Freeze state`)}),U(`click`,r,()=>{var e;return(e=t.ontoggle)==null?void 0:e.call(t,!n())}),G(e,r),Nt()}Wa([`click`]);var hl=W(``),gl=W(``),_l=W(`
`),vl=W(`
`);function yl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetVarId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetVarId);e!==-1&&H(a).scrollToIndex(e),Q.targetVarId=null}});let o,s=P(!1),c=new Set,l=I({}),u=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||t.value!==void 0&&t.value!==null&&String(t.value).toLowerCase().includes(e));c=new Set(t.map(e=>e.id))}},d=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`variables`,e.id),r=Zc.isFavorite(`variables`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},f=()=>{F(n,q.vars.list(),!0),u(),d()},p=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(s)||(F(n,q.vars.list(),!0),d())},1e3);return()=>clearInterval(e)});let h=(e,t)=>{q.vars.set(e,t),Y.vars.has(e)&&X.freezeVar(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)};var g=vl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y);D(y),D(_);var x=R(_,2);Ps(ul(L(x),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{let r=Wn(()=>l[t().id]||typeof t().value);var i=_l(),a=L(i),o=L(a,!0);D(a);var c=R(a,2),u=L(c),f=L(u,!0);D(u),D(c);var p=R(c,2),g=L(p),_=L(g);{let e=Wn(()=>Zc.isFavorite(`variables`,t().id)?`fill-current`:``);bc(_,{size:16,get class(){return H(e)}})}D(g);var v=R(g,2),y=L(v,!0);D(v);var b=R(v,2),x=e=>{{let n=Wn(()=>Number(t().value)||0);fl(e,{get value(){return H(n)},onchange:e=>h(t().id,e)})}},S=e=>{var n=hl(),r=L(n);r.value=r.__value=`true`;var i=R(r);i.value=i.__value=`false`,D(n);var a;Qo(n),z(()=>{a!==(a=t().value?`true`:`false`)&&(n.value=n.__value=t().value?`true`:`false`,Zo(n,t().value?`true`:`false`))}),U(`change`,n,e=>h(t().id,e.currentTarget.value===`true`)),G(e,n)},ee=e=>{var n=gl();us(n),z(e=>ds(n,e),[()=>String(t().value===void 0||t().value===null?``:t().value)]),Ua(`blur`,n,e=>h(t().id,e.currentTarget.value)),U(`keydown`,n,e=>{e.stopPropagation(),e.key===`Enter`&&e.currentTarget.blur()}),G(e,n)};mo(b,e=>{H(r)===`number`?e(x):H(r)===`boolean`?e(S,1):e(ee,-1)});var C=R(b,2),w=L(C);{let e=Wn(()=>Y.vars.has(t().id));ml(w,{get locked(){return H(e)},ontoggle:e=>{X.freezeVar(t().id,e),F(n,[...H(n)],!0),d()}})}D(C),D(p),D(i),z((e,n,a)=>{Jo(i,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(o,n),ps(u,`title`,t().name),K(f,t().name),Jo(g,1,`mr-2 flex items-center justify-center transition-colors ${a==null?``:a}`),K(y,H(r)===`number`?`NUM`:H(r)===`string`?`STR`:`BOOL`)},[()=>Y.vars.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`variables`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,p,()=>F(s,!0)),U(`focusout`,p,()=>F(s,!1)),U(`click`,g,()=>{Zc.toggleFavorite(`variables`,t().id),d()}),U(`click`,v,()=>{(l[t().id]||typeof t().value)===`number`?l[t().id]=`string`:l[t().id]=`number`}),G(e,i)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(x),D(g),z(()=>{var e;ds(v,H(i)),K(b,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,p),G(e,g),Nt()}Wa([`input`,`focusin`,`focusout`,`click`,`change`,`keydown`]);var bl=W(``);function xl(e,t){Mt(t,!0);let n=Hs(t,`value`,15,!1),r=()=>{var e;n(!n()),(e=t.onchange)==null||e.call(t,n())};var i=bl(),a=L(i);D(i),z(()=>{Jo(i,1,`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors ${n()?`bg-ok`:`bg-[#3a3f4d]`}`),Jo(a,1,`absolute top-[4px] h-4 w-4 rounded-full bg-white shadow transition-all ${n()?`left-[24px]`:`left-[4px]`}`)}),U(`click`,i,r),G(e,i),Nt()}Wa([`click`]);var Sl=W(`
`),Cl=W(`
`);function wl(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetSwitchId!==null&&H(a)&&H(r).length>0){let e=H(r).findIndex(e=>e.id===Q.targetSwitchId);e!==-1&&H(a).scrollToIndex(e),Q.targetSwitchId=null}});let o,s=P(!1),c=new Set,l=()=>{if(!H(i).trim())c=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||(t.value?`true`:`false`).includes(e));c=new Set(t.map(e=>e.id))}},u=()=>{F(r,H(n).filter(e=>c.has(e.id)).sort((e,t)=>{let n=Zc.isFavorite(`switches`,e.id),r=Zc.isFavorite(`switches`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},d=()=>{F(n,q.switches.list(),!0),l(),u()},f=e=>{F(i,e.target.value,!0),clearTimeout(o),o=setTimeout(()=>{l(),u()},300)};Ws(()=>{d();let e=setInterval(()=>{H(s)||(F(n,q.switches.list(),!0),u())},1e3);return()=>clearInterval(e)});let p=(e,t)=>{q.switches.set(e,t),Y.switches.has(e)&&X.freezeSwitch(e,!0);let r=H(n).find(t=>t.id===e);r&&(r.value=t)},h=e=>{H(r).forEach(t=>p(t.id,e)),d(),zc.show(`All filtered switches turned ${e?`ON`:`OFF`}`,`success`)};var g=Cl(),_=L(g),v=L(_);us(v);var y=R(v,2),b=L(y),x=R(b,2),S=R(x,2),ee=L(S);D(S),D(y),D(_);var C=R(_,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:36,itemTemplate:(e,t=m)=>{var r=Sl(),i=L(r),a=L(i,!0);D(i);var o=R(i,2),c=L(o),l=L(c,!0);D(c),D(o);var d=R(o,2),f=L(d),h=L(f);{let e=Wn(()=>Zc.isFavorite(`switches`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(f);var g=R(f,2);xl(g,{get value(){return t().value},onchange:e=>p(t().id,e)});var _=R(g,2),v=L(_);{let e=Wn(()=>Y.switches.has(t().id));ml(v,{get locked(){return H(e)},ontoggle:e=>{X.freezeSwitch(t().id,e),F(n,[...H(n)],!0),u()}})}D(_),D(d),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),Jo(c,1,`truncate text-sm select-text cursor-text ${t().value?`text-white font-bold`:`text-gray-400`}`),K(l,t().name),Jo(f,1,`flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.switches.has(t().id)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`switches`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),Ua(`mouseenter`,d,()=>F(s,!0)),Ua(`mouseleave`,d,()=>F(s,!1)),U(`click`,f,()=>{Zc.toggleFavorite(`switches`,t().id),u()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(g),z(()=>{var e;ds(v,H(i)),K(ee,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,v,f),U(`click`,b,()=>h(!0)),U(`click`,x,()=>h(!1)),G(e,g),Nt()}Wa([`input`,`click`]);var Tl=W(`
`),El=W(`
`),Dl=W(`
`);function Ol(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(void 0);Mi(()=>{if(Q.targetItemKey!==null&&H(a)){let[e,t]=Q.targetItemKey.split(`:`);if(e===H(o)){if(H(r).length>0){let e=H(r).findIndex(e=>e.id===parseInt(t,10));e!==-1&&H(a).scrollToIndex(e),Q.targetItemKey=null}}else p(e)}});let o=P(I(Fc.Item)),s,c=P(!1),l=new Set,u=()=>{if(!H(i).trim())l=new Set(H(n).map(e=>e.id));else{let e=H(i).trim().toLowerCase(),t=H(n).filter(t=>String(t.id)===e||t.name.toLowerCase().includes(e)||String(t.count).includes(e)||t.description&&t.description.toLowerCase().includes(e));l=new Set(t.map(e=>e.id))}},d=()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;F(r,H(n).filter(e=>l.has(e.id)).sort((t,n)=>{let r=Zc.isFavorite(e,t.id),i=Zc.isFavorite(e,n.id);return r&&!i?-1:!r&&i?1:t.id-n.id}),!0)},f=()=>{F(n,q.inv.list(H(o)),!0),u(),d()},p=e=>{F(o,e,!0),f(),H(a)&&H(a).resetScroll()},h=e=>{F(i,e.target.value,!0),clearTimeout(s),s=setTimeout(()=>{u(),d()},300)};Ws(()=>{f();let e=setInterval(()=>{H(c)||(F(n,q.inv.list(H(o)),!0),d())},1e3);return()=>clearInterval(e)});let g=(e,t)=>{q.inv.setCount(H(o),e,t),Y.items.has(`${H(o)}:${e}`)&&X.freezeItem(H(o),e,!0)};var _=Dl(),v=L(_),y=L(v),b=L(y),x=R(b,2),S=R(x,2);D(y);var ee=R(y,2);us(ee),D(v);var C=R(v,2);Ps(ul(L(C),{get items(){return H(r)},itemHeight:48,itemTemplate:(e,t=m)=>{var r=El(),i=L(r),a=L(i,!0);D(i);var s=R(i,2),l=L(s),u=L(l,!0);D(l);var f=R(l,2),p=e=>{var n=Tl(),r=L(n,!0);D(n),z((e,t)=>{ps(n,`title`,e),K(r,t)},[()=>t().description.replace(/\n/g,` `),()=>t().description.replace(/\n/g,` `)]),G(e,n)};mo(f,e=>{t().description&&e(p)}),D(s);var h=R(s,2),_=L(h),v=L(_);{let e=Wn(()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`fill-current`:``);bc(v,{size:16,get class(){return H(e)}})}D(_);var y=R(_,2);{let e=Wn(()=>q.inv.maxStack(H(o),t().id));fl(y,{get value(){return t().count},min:0,get max(){return H(e)},onchange:e=>g(t().id,e)})}var b=R(y,2),x=L(b);{let e=Wn(()=>Y.items.has(`${H(o)}:${t().id}`));ml(x,{get locked(){return H(e)},ontoggle:e=>{X.freezeItem(H(o),t().id,e),F(n,[...H(n)],!0),d()}})}D(b),D(h),D(r),z((e,n,i)=>{Jo(r,1,`border-border/50 hover:bg-border/30 flex h-full items-center border-b px-4 transition-colors ${e==null?``:e}`),K(a,n),ps(l,`title`,t().name),K(u,t().name),Jo(_,1,`mr-1 flex items-center justify-center transition-colors ${i==null?``:i}`)},[()=>Y.items.has(`${H(o)}:${t().id}`)?`border-l-frozen border-l-4 pl-3`:``,()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`focusin`,h,()=>F(c,!0)),U(`focusout`,h,()=>F(c,!1)),U(`click`,_,()=>{let e=H(o)===Fc.Item?`items`:H(o)===Fc.Weapon?`weapons`:`armors`;Zc.toggleFavorite(e,t().id),d()}),G(e,r)},$$slots:{itemTemplate:!0}}),e=>F(a,e,!0),()=>H(a)),D(C),D(_),z(()=>{Jo(b,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Item?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(x,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Weapon?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),Jo(S,1,`rounded px-3 py-1.5 text-sm font-semibold transition-colors ${H(o)===Fc.Armor?`bg-accent text-white`:`bg-border hover:bg-border/80 text-gray-300`}`),ds(ee,H(i))}),U(`click`,b,()=>p(Fc.Item)),U(`click`,x,()=>p(Fc.Weapon)),U(`click`,S,()=>p(Fc.Armor)),U(`input`,ee,h),G(e,_),Nt()}Wa([`click`,`input`,`focusin`,`focusout`]);var kl=W(``),Al=W(``),jl=W(`
`),Ml=W(`
`),Nl=W(`
No skills in database.
`),Pl=W(``),Fl=W(`
`),Il=W(`No active states.`),Ll=W(``),Rl=W(`

Core Status

Level
EXP
HP
MP
TP

Parameters

Skills

States

`,1),zl=W(`
Start a game or select an actor to edit stats.
`),Bl=W(`
Actors
`);function Vl(e,t){Mt(t,!0);let n=P(I([])),r=P(null),i=P(null),a=P(null),o=P(``),s=P(``);Mi(()=>{Q.targetActorId!==null&&H(n).length>0&&(F(r,Q.targetActorId,!0),Q.targetActorId=null,Q.targetActorStat=null,c())});let c=()=>{F(n,J.list(),!0),H(r)===null&&H(n).length>0&&F(r,H(n)[0].id,!0),H(r)!==null&&F(i,J.get(H(r)),!0)};Ws(()=>{c();let e=setInterval(()=>{c()},1e3);return()=>clearInterval(e)});let l=e=>{F(r,e,!0),F(i,J.get(e),!0)},u=(e,t)=>{H(r)!==null&&(e===`hp`?J.setHp(H(r),t):e===`mp`?J.setMp(H(r),t):e===`tp`&&J.setTp(H(r),t),Y.stats.has(`${H(r)}:${e}`)&&X.freezeStat(H(r),e,!0),F(i,J.get(H(r)),!0))},d=(e,t)=>{H(r)!==null&&(J.setParam(H(r),e,t),F(i,J.get(H(r)),!0))},f=()=>{H(r)===null||!H(i)||(H(i).inParty?J.removeFromParty(H(r)):J.addToParty(H(r)),c())},p=(e,t)=>{H(r)!==null&&(t?J.forgetSkill(H(r),e):J.learnSkill(H(r),e),F(i,J.get(H(r)),!0))},m={[Lc.MHP]:`Max HP`,[Lc.MMP]:`Max MP`,[Lc.ATK]:`Attack`,[Lc.DEF]:`Defense`,[Lc.MAT]:`M. Attack`,[Lc.MDF]:`M. Defense`,[Lc.AGI]:`Agility`,[Lc.LUK]:`Luck`};var h=Bl(),g=L(h),_=R(L(g),2);yo(_,21,()=>H(n),ho,(e,t)=>{var n=Al(),i=L(n),a=L(i),o=e=>{G(e,kl())};mo(a,e=>{H(t).inParty&&e(o)});var s=R(a,2),c=L(s,!0);D(s),D(i);var u=R(i,2),d=L(u);D(u),D(n),z(()=>{var e;ps(n,`id`,`actor-btn-${H(t).id}`),Jo(n,1,`flex w-full items-center justify-between rounded px-2.5 py-2 text-left text-sm transition-colors ${H(r)===H(t).id?`bg-accent text-white font-semibold`:`hover:bg-border/50 text-gray-300`}`),K(c,H(t).name),K(d,`Lv.${(e=H(t).level)==null?``:e}`)}),U(`click`,n,()=>l(H(t).id)),G(e,n)}),D(_),D(g);var v=R(g,2),y=L(v),b=e=>{var t,n=Rl(),l=_i(n),h=L(l),g=L(h),_=L(g,!0);D(g);var v=R(g,2),y=L(v);D(v),D(h);var b=R(h,2),x=L(b),S=R(x,2),ee=L(S,!0);D(S),D(b),D(l);var C=R(l,2),w=L(C),te=R(L(w),2),ne=R(L(te),2),re=L(ne);fl(re,{get value(){return H(i).level},min:1,max:99,onchange:e=>{H(r)!==null&&(J.setLevel(H(r),e),Y.stats.has(`${H(r)}:level`)&&X.freezeStat(H(r),`level`,!0),F(i,J.get(H(r)),!0),c())}});var ie=R(re,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:level`));ml(ie,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`level`,e),F(i,J.get(H(r)),!0))}})}D(ne),D(te);var ae=R(te,2),oe=R(L(ae),2),se=L(oe);fl(se,{get value(){return H(i).exp},min:0,onchange:e=>{H(r)!==null&&(J.setExp(H(r),e),Y.stats.has(`${H(r)}:exp`)&&X.freezeStat(H(r),`exp`,!0),F(i,J.get(H(r)),!0),c())}});var ce=R(se,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:exp`));ml(ce,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`exp`,e),F(i,J.get(H(r)),!0))}})}D(oe),D(ae);var le=R(ae,2),ue=R(L(le),2),de=L(ue);fl(de,{get value(){return H(i).hp},min:0,get max(){return H(i).mhp},onchange:e=>u(`hp`,e)});var fe=R(de,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:hp`));ml(fe,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`hp`,e),F(i,J.get(H(r)),!0))}})}D(ue),D(le);var pe=R(le,2),me=R(L(pe),2),he=L(me);fl(he,{get value(){return H(i).mp},min:0,get max(){return H(i).mmp},onchange:e=>u(`mp`,e)});var ge=R(he,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:mp`));ml(ge,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`mp`,e),F(i,J.get(H(r)),!0))}})}D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve);fl(ye,{get value(){return H(i).tp},min:0,get max(){return H(i).mtp},onchange:e=>u(`tp`,e)});var be=R(ye,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:tp`));ml(be,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`tp`,e),F(i,J.get(H(r)),!0))}})}D(ve),D(_e),D(w);var xe=R(w,2);yo(R(L(xe),2),17,()=>H(i).params,e=>e.id,(e,t)=>{var n=jl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2),c=L(s);fl(c,{get value(){return H(t).value},min:1,onchange:e=>{d(H(t).id,e),Y.stats.has(`${H(r)}:param_${H(t).id}`)&&X.freezeStat(H(r),`param_${H(t).id}`,!0)}});var l=R(c,2);{let e=Wn(()=>Y.stats.has(`${H(r)}:param_${H(t).id}`));ml(l,{get locked(){return H(e)},ontoggle:e=>{H(r)!==null&&(X.freezeStat(H(r),`param_${H(t).id}`,e),F(i,J.get(H(r)),!0))}})}D(s),D(n),z(()=>{ps(n,`id`,`stat-param_${H(t).id}`),K(o,m[H(t).id]||`Stat`)}),G(e,n)}),D(xe),D(C);var Se=R(C,2),Ce=L(Se),we=R(L(Ce),2);us(we),D(Ce);var Te=R(Ce,2);yo(Te,21,()=>H(i).skills.filter(e=>!H(o).trim()||e.name.toLowerCase().includes(H(o).trim().toLowerCase())||e.id.toString().includes(H(o).trim())),e=>e.id,(e,t)=>{var n=Ml(),r=L(n),i=L(r);D(r);var a=R(r,2),o=L(a,!0);D(a),D(n),z(e=>{var n;K(i,`${e==null?``:e}: ${(n=H(t).name)==null?``:n}`),Jo(a,1,`rounded border px-3 py-1 text-xs font-semibold transition-colors ${H(t).learned?`border-danger/30 text-danger bg-danger/10 hover:bg-danger/20`:`border-accent/30 text-accent bg-accent/10 hover:bg-accent/20`}`),K(o,H(t).learned?`Forget`:`Learn`)},[()=>H(t).id.toString().padStart(3,`0`)]),U(`click`,a,()=>p(H(t).id,H(t).learned)),G(e,n)},e=>{G(e,Nl())}),D(Te),D(Se);var Ee=R(Se,2),De=L(Ee),Oe=R(L(De),2),ke=L(Oe);us(ke);var Ae=R(ke,2),je=e=>{var t=Pl();U(`click`,t,()=>{H(r)!==null&&(J.clearStates(H(r)),F(i,J.get(H(r)),!0))}),G(e,t)};mo(Ae,e=>{H(i).states.length>0&&e(je)}),D(Oe),D(De);var Me=R(De,2);yo(Me,21,()=>H(i).states,ho,(e,t)=>{var n=Fl(),a=L(n),o=L(a,!0);D(a);var s=R(a,2);D(n),z(()=>K(o,H(t).name)),U(`click`,s,()=>{H(r)!==null&&(J.removeState(H(r),H(t).id),F(i,J.get(H(r)),!0))}),G(e,n)},e=>{G(e,Il())}),D(Me);var Ne=R(Me,2),Pe=L(Ne),Fe=L(Pe);Fe.value=(t=Fe.__value=null)!=null&&t!==void 0?t:``,yo(R(Fe),17,()=>J.listStates().filter(e=>!H(s).trim()||e.name.toLowerCase().includes(H(s).trim().toLowerCase())||e.id.toString().includes(H(s).trim())),ho,(e,t)=>{var n=Ll(),r=L(n);D(n);var i={};z(e=>{var a;if(K(r,`${e==null?``:e}: ${(a=H(t).name)==null?``:a}`),i!==(i=H(t).id)){var o;n.value=(o=n.__value=H(t).id)==null?``:o}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,n)}),D(Pe);var Ie=R(Pe,2);D(Ne),D(Ee),z(()=>{var e;K(_,H(i).name),K(y,`Actor ID: ${(e=H(i).id)==null?``:e}`),Jo(S,1,`rounded border px-3 py-1.5 text-xs font-semibold transition-colors ${H(i).inParty?`border-danger/30 bg-danger/20 text-danger hover:bg-danger/30`:`border-ok/30 bg-ok/20 text-ok hover:bg-ok/30`}`),K(ee,H(i).inParty?`Remove Party`:`Add Party`),Ie.disabled=H(a)===null}),U(`click`,x,()=>{H(r)!==null&&(J.recover(H(r)),F(i,J.get(H(r)),!0))}),U(`click`,S,f),Cs(we,()=>H(o),e=>F(o,e)),Cs(ke,()=>H(s),e=>F(s,e)),$o(Pe,()=>H(a),e=>F(a,e)),U(`click`,Ie,()=>{H(r)!==null&&H(a)!==null&&(J.addState(H(r),H(a)),F(i,J.get(H(r)),!0),F(a,null))}),G(e,n)},x=e=>{G(e,zl())};mo(y,e=>{H(i)?e(b):e(x,-1)}),D(v),D(h),G(e,h),Nt()}Wa([`click`]);function Hl(e){let t=e-1;return t*t*t+1}function Ul(e,{from:t,to:n},r={}){var{delay:i=0,duration:a=e=>Math.sqrt(e)*120,easing:o=Hl}=r,s=getComputedStyle(e),c=s.transform===`none`?``:s.transform,[l,u]=s.transformOrigin.split(` `).map(parseFloat);l/=e.clientWidth,u/=e.clientHeight;var d=Wl(e),f=e.clientWidth/n.width/d,p=e.clientHeight/n.height/d,m=t.left+t.width*l,h=t.top+t.height*u,g=n.left+n.width*l,_=n.top+n.height*u,v=(m-g)*f,y=(h-_)*p,b=t.width/n.width,x=t.height/n.height;return{delay:i,duration:typeof a==`function`?a(Math.sqrt(v*v+y*y)):a,easing:o,css:(e,t)=>`transform: ${c} translate(${t*v}px, ${t*y}px) scale(${e+t*b}, ${e+t*x});`}}function Wl(e){if(`currentCSSZoom`in e)return e.currentCSSZoom;for(var t=e,n=1;t!==null;)n*=+getComputedStyle(t).zoom,t=t.parentElement;return n}var Gl=W(` `),Kl=W(``),ql=W(`

`),Jl=W(`
Configure the hold key in the Keys panel.
`),Yl=W(`
Warning: Game is permanently sped up. Turn this back on to require holding a key.
`),Xl=W(``),Zl=W(`
`),Ql=W(`

Active Enemies

`),$l=W(`LEAD`),eu=W(`
`),tu=W(`
No active party members found (start/load a game).
`),nu=W(`

Quick Actions

Party Resources

Gold
Steps
Playtime

Battle Settings

God Mode
One-Hit Kill
Disable Encounters

Movement

Noclip (Walk Through Walls)
Move Speed

Game Speed

Hold Key to Fast Forward
Speed Multiplier
`);function ru(e,t){Mt(t,!0);let n=P(0),r=P(0),i=P(0),a=P(4),o=P(!1),s=P(I([])),c=P(I([])),l=[{title:`System & Menus`,actions:[`quick_save`,`quick_load`,`open_save_scene`,`open_load_scene`,`goto_title`]},{title:`Battle Actions`,actions:[`force_victory`,`force_defeat`,`force_escape`,`trigger_encounter`]},{title:`Health Controls`,actions:[`party_recovery`,`party_wound`,`enemy_recovery`,`enemy_wound`]}],u=()=>{F(n,q.gold.get(),!0),F(r,q.party.steps(),!0),F(i,q.party.playtime(),!0),window.$gamePlayer&&F(a,window.$gamePlayer._moveSpeed||4,!0),F(o,!!(window.SceneManager&&window.SceneManager._scene&&window.SceneManager._scene.constructor.name===`Scene_Battle`)),H(o)&&window.$gameTroop?F(s,window.$gameTroop.members().map(e=>({ref:e,name:e.name(),hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(s,[],!0),window.$gameParty?F(c,window.$gameParty.members().map(e=>({ref:e,id:e.actorId(),name:e.name(),level:typeof e.level==`function`?e.level():e._level||1,hp:e.hp,mhp:e.mhp,mp:e.mp,mmp:e.mmp,tp:e.tp,maxTp:e.maxTp()})),!0):F(c,[],!0)};Ws(()=>{u();let e=setInterval(u,1e3);return()=>clearInterval(e)});let d=e=>{q.gold.set(e),Y.gold!==null&&X.freezeGold(!0),F(n,q.gold.get(),!0)},f=e=>{let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`},p=(e,t)=>{e.ref.setHp(t),u()},m=(e,t)=>{e.ref.setMp(t),u()},h=(e,t)=>{e.ref.setTp?e.ref.setTp(t):e.ref.tp=t,u()},g=P(null),_=(e,t)=>{e!==t&&window.$gameParty&&typeof window.$gameParty.swapOrder==`function`&&(window.$gameParty.swapOrder(e,t),u())};var v=nu(),y=L(v),b=R(L(y),2);yo(b,21,()=>l,ho,(e,t)=>{var n=ql(),r=L(n),i=L(r,!0);D(r);var a=R(r,2);yo(a,21,()=>H(t).actions,ho,(e,t)=>{let n=Wn(()=>nl.find(e=>e.id===H(t)));var r=eo(),i=_i(r),a=e=>{var t=Kl(),r=L(t),i=L(r,!0);D(r);var a=R(r,2),o=e=>{var t=Gl(),r=L(t,!0);D(t),z(e=>K(r,e),[()=>{var e;return Yc.fromString(((e=$.get(H(n).id))==null?void 0:e.keyStr)||``).asDisplayString()}]),G(e,t)},s=Wn(()=>{var e;return(e=$.get(H(n).id))==null?void 0:e.keyStr});mo(a,e=>{H(s)&&e(o)}),D(t),z(()=>K(i,H(n).name)),U(`click`,t,()=>{var e,t;(e=(t=H(n)).onEnter)==null||e.call(t),u()}),G(e,t)};mo(i,e=>{H(n)&&e(a)}),G(e,r)}),D(a),D(n),z(()=>K(i,H(t).title)),G(e,n)}),D(b),D(y);var x=R(y,2),S=L(x),ee=R(L(S),2),C=R(L(ee),2),w=L(C);fl(w,{get value(){return H(n)},min:0,max:99999999,onchange:d});var te=R(w,2);{let e=Wn(()=>Y.gold!==null);ml(te,{get locked(){return H(e)},ontoggle:e=>{X.freezeGold(e),u()}})}D(C),D(ee);var ne=R(ee,2),re=R(L(ne),2),ie=L(re,!0);D(re),D(ne);var ae=R(ne,2),oe=R(L(ae),2),se=L(oe,!0);D(oe),D(ae),D(S);var ce=R(S,2),le=R(L(ce),2),ue=L(le);xl(R(L(ue),2),{get value(){return Z.god},onchange:e=>Wc.setGod(e)}),D(ue);var de=R(ue,2);xl(R(L(de),2),{get value(){return Z.ohko},onchange:e=>Wc.setOhko(e)}),D(de);var fe=R(de,2);xl(R(L(fe),2),{get value(){return Z.noEncounter},onchange:e=>Wc.setNoEncounter(e)}),D(fe),D(le),D(ce),D(x);var pe=R(x,2),me=R(L(pe),2),he=L(me);xl(R(L(he),2),{get value(){return Y.noclip},onchange:e=>X.setNoclip(e)}),D(he);var ge=R(he,2);fl(R(L(ge),2),{get value(){return H(a)},min:1,max:8,onchange:e=>q.map.speed(e)}),D(ge),D(me),D(pe);var _e=R(pe,2),ve=R(L(_e),2),ye=L(ve),be=L(ye);xl(R(L(be),2),{get value(){return Z.speedUseKey},onchange:e=>{Wc.setSpeedUseKey(e),e?Wc.setSpeed(1):Wc.setSpeed(Z.speedBoost)}}),D(be);var xe=R(be,2),Se=e=>{G(e,Jl())},Ce=e=>{G(e,Yl())};mo(xe,e=>{Z.speedUseKey?e(Se):e(Ce,-1)}),D(ye);var we=R(ye,2),Te=R(L(we),2);yo(Te,20,()=>[.5,1,2,3,5,8],ho,(e,t)=>{var n=Xl(),r=L(n);D(n),z(()=>{Jo(n,1,`border-border h-7 w-9 rounded border text-xs transition-colors ${Z.speedBoost===t?`border-accent bg-accent text-white font-semibold`:`bg-bg hover:bg-border/50 text-gray-300`}`),K(r,`${t==null?``:t}x`)}),U(`click`,n,()=>{Wc.setSpeedBoost(t),Z.speedUseKey||Wc.setSpeed(t)}),G(e,n)}),D(Te),D(we),D(ve),D(_e);var Ee=R(_e,2),De=e=>{var t=Ql(),n=R(L(t),2);yo(n,21,()=>H(s),ho,(e,t)=>{var n=Zl(),r=L(n),i=L(r),a=L(i,!0);D(i),D(r);var o=R(r,2),s=L(o),c=L(s),l=L(c);D(c),fl(R(c,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(s);var u=R(s,2),d=L(u),f=L(d);D(d),fl(R(d,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(u);var g=R(u,2),_=L(g),v=L(_);D(_),fl(R(_,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(g),D(o),D(n),z(()=>{var e,n,r,i,o;K(a,H(t).name),K(l,`HP (${(e=H(t).hp)==null?``:e}/${(n=H(t).mhp)==null?``:n})`),K(f,`MP (${(r=H(t).mp)==null?``:r}/${(i=H(t).mmp)==null?``:i})`),K(v,`TP (${(o=H(t).tp)==null?``:o})`)}),G(e,n)}),D(n),D(t),G(e,t)};mo(Ee,e=>{H(o)&&H(s).length>0&&e(De)});var Oe=R(Ee,2),ke=R(L(Oe),2);yo(ke,31,()=>H(c),e=>e.id,(e,t,n)=>{var r=eu(),i=L(r),a=L(i),o=L(a),s=R(L(o),2),c=L(s),l=R(c),u=e=>{G(e,$l())};mo(l,e=>{H(n)===0&&e(u)}),D(s),D(o);var d=R(o,2),f=L(d);D(d),D(a);var v=R(a,2),y=L(v),b=L(y),x=L(b);D(b),fl(R(b,2),{get value(){return H(t).hp},min:0,get max(){return H(t).mhp},onchange:e=>p(H(t),e)}),D(y);var S=R(y,2),ee=L(S),C=L(ee);D(ee),fl(R(ee,2),{get value(){return H(t).mp},min:0,get max(){return H(t).mmp},onchange:e=>m(H(t),e)}),D(S);var w=R(S,2),te=L(w),ne=L(te);D(te),fl(R(te,2),{get value(){return H(t).tp},min:0,get max(){return H(t).maxTp},onchange:e=>h(H(t),e)}),D(w),D(v),D(i),D(r),z(()=>{var e,o,s,l,u,d,p;Jo(r,1,`rounded p-2.5 transition-all duration-200 ${H(g)===H(n)?`border border-dashed border-accent/50 bg-accent/5`:`border border-border bg-bg`}`),Jo(i,1,`space-y-2 ${H(g)===H(n)?`invisible`:``}`),Jo(a,1,`flex w-full items-center justify-between pb-2 text-xs font-bold text-white ${H(g)===null?`cursor-grab active:cursor-grabbing`:``}`),K(c,`${(e=H(t).name)==null?``:e} `),K(f,`Lv.${(o=H(t).level)==null?``:o}`),K(x,`HP (${(s=H(t).hp)==null?``:s}/${(l=H(t).mhp)==null?``:l})`),K(C,`MP (${(u=H(t).mp)==null?``:u}/${(d=H(t).mmp)==null?``:d})`),K(ne,`TP (${(p=H(t).tp)==null?``:p})`)}),Ua(`dragenter`,r,e=>e.preventDefault()),Ua(`dragover`,r,e=>{if(e.preventDefault(),H(g)!==null&&H(g)!==H(n)){let t=e.currentTarget.getBoundingClientRect(),r=t.top+t.height/2;if(H(g)H(n)&&e.clientY>r)return;_(H(g),H(n)),F(g,H(n),!0)}}),Ua(`dragstart`,a,e=>{if(e.dataTransfer){e.dataTransfer.effectAllowed=`move`;let t=e.currentTarget.closest(`[role="listitem"]`);t&&e.dataTransfer.setDragImage(t,20,20)}setTimeout(()=>{F(g,H(n),!0)},0)}),Ua(`dragend`,a,()=>{F(g,null)}),Io(r,()=>Ul,()=>({duration:250})),G(e,r)},e=>{G(e,tu())}),D(ke),D(Oe),D(v),z(e=>{K(ie,H(r)),K(se,e)},[()=>f(H(i))]),Ua(`dragenter`,Oe,e=>e.preventDefault()),Ua(`dragover`,Oe,e=>e.preventDefault()),Ua(`dragenter`,ke,e=>e.preventDefault()),Ua(`dragover`,ke,e=>e.preventDefault()),G(e,v),Nt()}Wa([`click`]);var iu=W(``),au=W(`
No saved locations yet.
`),ou=W(`
`),su=W(`

Teleport

Saved Locations

`);function cu(e,t){Mt(t,!0);let n=P(I({mapId:0,x:0,y:0,dir:0})),r=P(I([])),i=P(0),a=P(0),o=P(0),s=P(I([])),c=P(``),l=P(``),u=P(``);Mi(()=>{H(o)>0&&q.map.loadMapEvents(H(o)).then(e=>{F(s,e,!0),e.find(e=>e.id.toString()===H(c))||F(c,``)})});let d=P(I([])),f=P(``),p=()=>{let e=q.map.current();e&&(F(n,e,!0),F(o,H(o)||e.mapId,!0),F(i,e.x,!0),F(a,e.y,!0)),F(r,q.map.list(),!0);try{let e=localStorage.getItem(`forge:locations`);e&&F(d,JSON.parse(e),!0)}catch(e){}};Ws(()=>{p();let e=setInterval(()=>{let e=q.map.current();e&&(e.mapId!==H(n).mapId||e.x!==H(n).x||e.y!==H(n).y)&&F(n,e,!0)},1e3);return()=>clearInterval(e)});let m=()=>{q.map.teleport(H(o),H(i),H(a),0,0)},h=()=>{let e=q.map.current();if(!e)return;let t=H(r).find(t=>t.id===e.mapId);F(d,[...H(d),{id:Date.now().toString(),name:H(f)||`Saved Location`,mapId:e.mapId,mapName:t?t.name:`Map ${e.mapId}`,x:e.x,y:e.y}],!0),F(f,``),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},g=e=>{F(d,H(d).filter(t=>t.id!==e),!0),localStorage.setItem(`forge:locations`,JSON.stringify(H(d)))},_=e=>{q.map.teleport(e.mapId,e.x,e.y,0,0)};var v=su(),y=L(v),b=R(L(y),2),x=L(b);D(b);var S=R(b,2),ee=L(S),C=L(ee),w=R(L(C),2);us(w),D(C);var te=R(C,2);yo(te,21,()=>H(r).filter(e=>!H(l).trim()||e.name.toLowerCase().includes(H(l).trim().toLowerCase())||e.id.toString().includes(H(l).trim())),ho,(e,t)=>{var r=iu(),i=L(r);D(r);var a={};z(e=>{var o;if(K(i,`${H(t).id===H(n).mapId?`[CURRENT] `:``}${e==null?``:e}: ${(o=H(t).name)==null?``:o}`),a!==(a=H(t).id)){var s;r.value=(s=r.__value=H(t).id)==null?``:s}},[()=>H(t).id.toString().padStart(3,`0`)]),G(e,r)}),D(te),D(ee);var ne=R(ee,2),re=L(ne),ie=R(L(re),2);us(ie),D(re);var ae=R(re,2),oe=L(ae);oe.value=oe.__value=``,yo(R(oe),17,()=>H(s).filter(e=>!H(u).trim()||e.name.toLowerCase().includes(H(u).trim().toLowerCase())||e.id.toString().includes(H(u).trim())),ho,(e,t)=>{var n=iu(),r=L(n);D(n);var i={};z(()=>{var e,a,o;if(K(r,`${(e=H(t).name)==null?``:e} (X:${(a=H(t).x)==null?``:a}, Y:${(o=H(t).y)==null?``:o})`),i!==(i=H(t).id)){var s;n.value=(s=n.__value=H(t).id)==null?``:s}}),G(e,n)}),D(ae),D(ne);var se=R(ne,2),ce=L(se),le=R(L(ce),2);us(le),D(ce);var ue=R(ce,2),de=R(L(ue),2);us(de),D(ue),D(se);var fe=R(se,2);D(S),D(y);var pe=R(y,2),me=R(L(pe),2),he=L(me);us(he);var ge=R(he,2);D(me);var _e=R(me,2),ve=L(_e),ye=e=>{G(e,au())},be=e=>{var t=eo();yo(_i(t),17,()=>H(d),e=>e.id,(e,t)=>{var n=ou(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o);D(o),D(r);var c=R(r,2),l=L(c),u=R(l,2);Ec(L(u),{size:14}),D(u),D(c),D(n),z(()=>{var e,n,r,i;K(a,H(t).name),K(s,`${(e=H(t).mapName)==null?``:e} (Map ${(n=H(t).mapId)==null?``:n}) • X:${(r=H(t).x)==null?``:r} Y:${(i=H(t).y)==null?``:i}`)}),U(`click`,l,()=>_(H(t))),U(`click`,u,()=>g(H(t).id)),G(e,n)}),G(e,t)};mo(ve,e=>{H(d).length===0?e(ye):e(be,-1)}),D(_e),D(pe),D(v),z(()=>{var e,t,r;return K(x,`Current: Map ${(e=H(n).mapId)==null?``:e} (${(t=H(n).x)==null?``:t}, ${(r=H(n).y)==null?``:r})`)}),Cs(w,()=>H(l),e=>F(l,e)),$o(te,()=>H(o),e=>F(o,e)),Cs(ie,()=>H(u),e=>F(u,e)),U(`change`,ae,e=>{let t=parseInt(e.target.value);if(isNaN(t))return;let n=H(s).find(e=>e.id===t);n&&(F(i,n.x,!0),F(a,n.y,!0))}),$o(ae,()=>H(c),e=>F(c,e)),Cs(le,()=>H(i),e=>F(i,e)),Cs(de,()=>H(a),e=>F(a,e)),U(`click`,fe,m),U(`keydown`,he,e=>{e.stopPropagation(),e.key===`Enter`&&h()}),Cs(he,()=>H(f),e=>F(f,e)),U(`click`,ge,h),G(e,v),Nt()}Wa([`change`,`click`,`keydown`]);var lu=W(` `,1),uu=W(``),du=W(`
`),fu=W(`
`);function pu(e,t){Mt(t,!0);let n=P(I([])),r=P(I([])),i=P(``),a=P(null),o,s=()=>{let e=H(n);if(H(i).trim()){let t=H(i).trim().toLowerCase();e=H(n).filter(e=>String(e.id)===t||e.name.toLowerCase().includes(t))}F(r,e.sort((e,t)=>{let n=Zc.isFavorite(`commonEvents`,e.id),r=Zc.isFavorite(`commonEvents`,t.id);return n&&!r?-1:!n&&r?1:e.id-t.id}),!0)},c=()=>{F(n,q.commonev.list(),!0),s()},l=e=>{F(i,e.target.value,!0),s()};Ws(()=>{c()});let u=e=>{H(a)===e?(q.commonev.run(e),F(a,null),clearTimeout(o)):(F(a,e,!0),clearTimeout(o),o=setTimeout(()=>{H(a)===e&&F(a,null)},3e3))},d=()=>{F(a,null),clearTimeout(o)};var f=fu(),p=L(f),h=L(p);us(h);var g=R(h,2),_=L(g);D(g),D(p);var v=R(p,2);ul(L(v),{get items(){return H(r)},itemHeight:38,itemTemplate:(e,t=m)=>{var n=du(),r=L(n),i=L(r),o=L(i,!0);D(i);var c=R(i,2),l=L(c,!0);D(c),D(r);var f=R(r,2),p=L(f),h=L(p);{let e=Wn(()=>Zc.isFavorite(`commonEvents`,t().id)?`fill-current`:``);bc(h,{size:16,get class(){return H(e)}})}D(p);var g=R(p,2),_=L(g),v=e=>{var n=lu(),r=_i(n),i=R(r,2);U(`click`,r,()=>u(t().id)),U(`click`,i,d),G(e,n)},y=e=>{var n=uu();U(`click`,n,()=>u(t().id)),G(e,n)};mo(_,e=>{H(a)===t().id?e(v):e(y,-1)}),D(g),D(f),D(n),z((e,n)=>{K(o,e),ps(c,`title`,t().name),K(l,t().name),Jo(p,1,`mr-2 flex items-center justify-center transition-colors ${n==null?``:n}`)},[()=>t().id.toString().padStart(4,`0`),()=>Zc.isFavorite(`commonEvents`,t().id)?`text-yellow-400 hover:text-yellow-300`:`text-gray-600 hover:text-gray-400`]),U(`click`,p,()=>{Zc.toggleFavorite(`commonEvents`,t().id),s()}),G(e,n)},$$slots:{itemTemplate:!0}}),D(v),D(f),z(()=>{var e;ds(h,H(i)),K(_,`${(e=H(r).length)==null?``:e} items`)}),U(`input`,h,l),G(e,f),Nt()}Wa([`input`,`click`]);var mu=W(``),hu=W(`
`),gu=W(`
No active data locks. Use the lock icon on variables, switches, items, or stats to freeze their value.
`),_u=W(`
`);function vu(e,t){Mt(t,!0);let n=P(I([])),r=()=>{F(n,X.summary(),!0)};Ws(()=>{r();let e=setInterval(r,1e3);return()=>clearInterval(e)});let i=e=>{if(e.type===`var`)X.freezeVar(e.id,!1);else if(e.type===`switch`)X.freezeSwitch(e.id,!1);else if(e.type===`item`){let[t,n]=e.key.split(`:`);X.freezeItem(t,parseInt(n,10),!1)}else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);X.freezeStat(parseInt(t,10),n,!1)}else e.type===`gold`&&X.freezeGold(!1);r()},a=e=>{if(e.type===`var`)Q.targetVarId=e.id,Q.activeTab=Ic.Vars;else if(e.type===`switch`)Q.targetSwitchId=e.id,Q.activeTab=Ic.Switches;else if(e.type===`item`)Q.targetItemKey=e.key,Q.activeTab=Ic.Inv;else if(e.type===`gold`)Q.activeTab=Ic.General;else if(e.type===`stat`||e.type===`param`){let[t,n]=e.key.split(`:`);Q.targetActorId=parseInt(t,10),Q.targetActorStat=n,Q.activeTab=Ic.Actors}},o=()=>{X.clearAll(),r()},s=e=>e===`var`?`VAR`:e===`switch`?`SW`:e===`item`?`ITEM`:e===`stat`?`STAT`:e===`param`?`PARAM`:e===`gold`?`GOLD`:`LOCK`,c=e=>e===`var`?`border-accent/30 bg-accent/10 text-accent`:e===`switch`?`border-ok/30 bg-ok/10 text-ok`:e===`item`?`border-warn/30 bg-warn/10 text-warn`:e===`stat`?`border-danger/30 bg-danger/10 text-danger`:e===`param`?`border-fuchsia-500/30 bg-fuchsia-500/10 text-fuchsia-500`:e===`gold`?`border-yellow-500/30 bg-yellow-500/10 text-yellow-500`:`border-gray-500/30 bg-gray-500/10 text-gray-400`;var l=_u(),u=L(l),d=L(u),f=L(d);D(d);var p=R(d,2),m=e=>{var t=mu();U(`click`,t,o),G(e,t)};mo(p,e=>{H(n).length>0&&e(m)}),D(u);var h=R(u,2);yo(h,21,()=>H(n),ho,(e,t)=>{var n=hu(),r=L(n),o=L(r),l=L(o,!0);D(o);var u=R(o,2),d=L(u,!0);D(u),D(r);var f=R(r,2),p=L(f),m=L(p,!0);D(p);var h=R(p,2);D(f),D(n),z((e,n)=>{Jo(o,1,`rounded border px-1.5 py-0.5 text-[10px] font-bold font-mono tracking-wide ${e==null?``:e}`),K(l,n),ps(u,`title`,H(t).label),K(d,H(t).label),K(m,typeof H(t).value==`boolean`?H(t).value?`ON`:`OFF`:H(t).value)},[()=>c(H(t).type),()=>s(H(t).type)]),U(`keydown`,n,e=>e.key===`Enter`&&a(H(t))),U(`click`,n,()=>a(H(t))),U(`click`,h,e=>{e.stopPropagation(),i(H(t))}),G(e,n)},e=>{G(e,gu())}),D(h),D(l),z(()=>{var e;return K(f,`${(e=H(n).length)==null?``:e} active locks`)}),G(e,l),Nt()}Wa([`click`,`keydown`]);var yu=W(`
Press a key...
`),bu=W(``),xu=W(``),Su=W(`
`);function Cu(e,t){Mt(t,!0);let n=Hs(t,`value`,15,``),r=Hs(t,`required`,3,!1),i=Hs(t,`combiningKeyAlone`,3,!1),a=P(!1),o=()=>{F(a,!0);let e=e=>{var a;e.preventDefault(),e.stopPropagation();let o=Yc.fromEvent(e);o.isCombiningKey()&&!i()||(n(o.asString()),(a=t.onchange)==null||a.call(t,n()),r())},r=()=>{F(a,!1),window.removeEventListener(`keydown`,e,{capture:!0})};window.addEventListener(`keydown`,e,{capture:!0}),setTimeout(()=>{window.addEventListener(`click`,r,{capture:!0,once:!0})},100)},s=e=>{if(!e)return`None`;try{return Yc.fromString(e).asDisplayString()}catch(t){return e}};var c=Su(),l=L(c),u=e=>{G(e,yu())},d=e=>{var t=bu(),r=L(t,!0);D(t),z(e=>{Jo(t,1,`border-border bg-bg2 hover:bg-border/50 flex h-8 flex-1 items-center rounded border px-3 text-sm font-medium transition-colors ${n()?`text-white`:`text-gray-500`}`),K(r,e)},[()=>s(n())]),U(`click`,t,o),G(e,t)};mo(l,e=>{H(a)?e(u):e(d,-1)});var f=R(l,2),p=e=>{var r=xu();Mc(L(r),{size:14}),D(r),U(`click`,r,()=>{var e;n(``),(e=t.onchange)==null||e.call(t,n())}),G(e,r)};mo(f,e=>{!r()&&n()&&!H(a)&&e(p)}),D(c),G(e,c),Nt()}Wa([`click`]);var wu=W(`
`),Tu=W(`
`);function Eu(e,t){Mt(t,!0);let n=P(I([])),r=P(``),i=P(I([])),a=()=>{if(!H(r).trim())F(i,H(n),!0);else{let e=H(r).trim().toLowerCase();F(i,H(n).filter(t=>t.name.toLowerCase().includes(e)||t.desc.toLowerCase().includes(e)||t.keyStr.toLowerCase().includes(e)),!0)}},o=()=>{F(n,$.shortcuts.map(e=>({...e})),!0),a()};Ws(()=>{o()});let s=e=>{F(r,e.target.value,!0),a()},c=(e,t)=>{$.update(e,{keyStr:t}),o()},l=(e,t)=>{$.update(e,{enabled:t}),o()},u=()=>{localStorage.removeItem(`forge:shortcuts`),zc.show(`Defaults restored. Please reload the game.`,`success`)};var d=Tu(),f=L(d),p=L(f);us(p);var m=R(p,2);D(f);var h=R(f,2);yo(h,21,()=>H(i),e=>e.id,(e,t)=>{var n=wu(),r=L(n),i=L(r),a=L(i,!0);D(i);var o=R(i,2),s=L(o,!0);D(o),D(r);var u=R(r,2),d=L(u);{let e=Wn(()=>H(t).id===`speed_hold`||H(t).id===`skip_message`);Cu(d,{get value(){return H(t).keyStr},get required(){return H(t).required},get combiningKeyAlone(){return H(e)},onchange:e=>c(H(t).id,e)})}D(u);var f=R(u,2);xl(L(f),{get value(){return H(t).enabled},onchange:e=>l(H(t).id,e)}),D(f),D(n),z(()=>{Jo(i,1,`font-semibold text-sm ${H(t).enabled?`text-white`:`text-gray-500`}`),K(a,H(t).name),K(s,H(t).desc)}),G(e,n)}),D(h),D(d),z(()=>ds(p,H(r))),U(`input`,p,s),U(`click`,m,u),G(e,d),Nt()}Wa([`input`,`click`]),yt();var Du=Ls(()=>Xc),Ou=W(`

UI Preferences

Inactive Opacity
Controls how transparent the panel becomes when the mouse leaves.
Remember Window Position
Save the exact window dimensions and position between game boots.
Auto-Open on Boot
Automatically display the Forge panel when the game finishes loading.
Show Launcher Icon
Display a draggable icon to open the panel without a shortcut.

Gameplay

Quick Save / Load Slot
The save file slot used by the Quick Save and Quick Load shortcuts.

Data Management

Factory Reset
Wipes all Forge settings, locks, and saved layout data.
`);function ku(e,t){Mt(t,!1);let n=()=>Zc.save();Fs();var r=Ou(),i=L(r),a=R(L(i),2),o=R(L(a),2);fl(L(o),{get value(){return Du().inactiveOpacity},min:10,max:100,onchange:e=>{Du(Du().inactiveOpacity=e),n()}}),D(o),D(a);var s=R(a,2);xl(R(L(s),2),{onchange:()=>n(),get value(){return Du().rememberPosition},set value(e){Du(Du().rememberPosition=e)},$$legacy:!0}),D(s);var c=R(s,2);xl(R(L(c),2),{onchange:()=>n(),get value(){return Du().autoOpen},set value(e){Du(Du().autoOpen=e)},$$legacy:!0}),D(c);var l=R(c,2);xl(R(L(l),2),{onchange:()=>n(),get value(){return Du().showLauncher},set value(e){Du(Du().showLauncher=e)},$$legacy:!0}),D(l),D(i);var u=R(i,2),d=R(L(u),2),f=R(L(d),2);fl(L(f),{get value(){return Du().quickSaveSlot},min:1,max:20,onchange:e=>{Du(Du().quickSaveSlot=e),n()}}),D(f),D(d),D(u);var p=R(u,2),m=R(L(p),2),h=R(L(m),2);D(m),D(p),D(r),U(`click`,h,()=>Zc.resetAll()),G(e,r),Nt()}Wa([`click`]);var Au=W(`
No logs recorded yet.
`),ju=W(` `),Mu=W(`Narrator / Unknown`),Nu=W(`
`),Pu=W(`

Game Dialogue Logs

`);function Fu(e,t){Mt(t,!0);let n=P(void 0),r=e=>{let t=new Date(e);return`${t.getHours().toString().padStart(2,`0`)}:${t.getMinutes().toString().padStart(2,`0`)}:${t.getSeconds().toString().padStart(2,`0`)}`};Mi(()=>{Qc.entries.length&&setTimeout(()=>{var e,t;H(n)&&((e=(t=H(n)).scrollToBottom)==null||e.call(t))},10)});var i=Pu(),a=L(i),o=L(a),s=R(L(o),2);wc(L(s),{size:14}),ut(2),D(s),D(o);var c=R(o,2),l=L(c),u=e=>{var t=Au();mc(L(t),{size:32,class:`opacity-50`}),ut(2),D(t),G(e,t)},d=e=>{Ps(ul(e,{get items(){return Qc.entries},itemHeight:80,containerHeight:400,itemTemplate:(e,t=m)=>{var n=Nu(),i=L(n),a=L(i),o=e=>{var n=ju(),r=L(n,!0);D(n),z(()=>K(r,t().speaker)),G(e,n)},s=e=>{G(e,Mu())};mo(a,e=>{t().speaker?e(o):e(s,-1)});var c=R(a,2),l=L(c,!0);D(c),D(i);var u=R(i,2),d=L(u,!0);D(u),D(n),z(e=>{K(l,e),K(d,t().text)},[()=>r(t().timestamp)]),G(e,n)},$$slots:{itemTemplate:!0}}),e=>F(n,e,!0),()=>H(n))};mo(l,e=>{Qc.entries.length===0?e(u):e(d,-1)}),D(c),D(a),D(i),U(`click`,s,()=>tl.clear()),G(e,i),Nt()}Wa([`click`]);var Iu=W(``),Lu=W(``),Ru=W(`
`),zu=W(`
`,1);function Bu(e,t){Mt(t,!0),Mi(()=>{let e=document.getElementById(`forge-mvmz-host`);if(!e)return;let t=!1,n=()=>{t=!1},r=[`mousedown`,`mousemove`,`mouseup`,`click`,`dblclick`,`pointerdown`,`pointermove`,`pointerup`,`contextmenu`,`wheel`,`touchstart`,`touchmove`,`touchend`,`keydown`,`keyup`],i=e=>{(e.type===`mousedown`||e.type===`pointerdown`||e.type===`touchstart`)&&(t=!0);let n=e.type===`mousemove`||e.type===`pointermove`||e.type===`touchmove`,r=e.type===`mouseup`||e.type===`pointerup`||e.type===`touchend`;if(n){let n=!1;if(`buttons`in e?n=e.buttons>0:`touches`in e&&(n=e.touches.length>0),n&&!t)return}r&&!t||e.stopPropagation()};if(window.addEventListener(`mouseup`,n,{capture:!0}),window.addEventListener(`pointerup`,n,{capture:!0}),window.addEventListener(`touchend`,n,{capture:!0}),Q.visible)for(let t of r)e.addEventListener(t,i,!1);else for(let t of r)e.removeEventListener(t,i,!1);return()=>{window.removeEventListener(`mouseup`,n,{capture:!0}),window.removeEventListener(`pointerup`,n,{capture:!0}),window.removeEventListener(`touchend`,n,{capture:!0});for(let t of r)e.removeEventListener(t,i,!1)}});let n=[{id:Ic.General,label:`General`},{id:Ic.Vars,label:`Variables`},{id:Ic.Switches,label:`Switches`},{id:Ic.Inv,label:`Inventory`},{id:Ic.Actors,label:`Actors`},{id:Ic.Map,label:`Map`},{id:Ic.CommonEv,label:`Events`},{id:Ic.Locks,label:`Locks`},{id:Ic.Logs,label:`Logs`},{id:Ic.Shortcuts,label:`Keys`},{id:Ic.Settings,label:`Settings`}],r=P(0),i=P(0),a=P(840),o=P(520),s=P(!1);Ws(()=>{Zc.load(),X.install(),Wc.install(),tl.install(),$.init(nl);try{let e=JSON.parse(localStorage.getItem(`forge:panel`)||`null`);e&&Xc.rememberPosition?(F(r,e.x,!0),F(i,e.y,!0),F(a,e.w,!0),F(o,e.h,!0)):typeof window<`u`&&(F(r,0),F(i,0),F(a,Math.min(840,window.innerWidth||840),!0),F(o,Math.min(520,window.innerHeight||520),!0));let t=localStorage.getItem(`forge:lastTab`);t&&Object.values(Ic).includes(t)&&(Q.activeTab=t)}catch(e){}Xc.autoOpen&&!Q.visible&&(Q.visible=!0)});let c=()=>{Xc.rememberPosition&&localStorage.setItem(`forge:panel`,JSON.stringify({x:H(r),y:H(i),w:H(a),h:H(o)})),localStorage.setItem(`forge:lastTab`,Q.activeTab)},l=P(!1),u=P(0),d=P(0),f=P(0),p=P(0),m=e=>{H(l)&&(F(r,Math.max(0,Math.min(window.innerWidth-H(a),H(f)+e.clientX-H(u))),!0),F(i,Math.max(0,Math.min(window.innerHeight-H(o),H(p)+e.clientY-H(d))),!0))},h=()=>{F(l,!1),window.removeEventListener(`mousemove`,m,!0),window.removeEventListener(`mouseup`,h,!0),c()},g=e=>{e.target.closest(`button, input, select`)||(F(l,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(f,H(r),!0),F(p,H(i),!0),window.addEventListener(`mousemove`,m,!0),window.addEventListener(`mouseup`,h,!0))},_=P(!1),v=P(0),y=P(0),b=e=>{H(_)&&(F(a,Math.max(560,Math.min(window.innerWidth-H(r),H(v)+e.clientX-H(u))),!0),F(o,Math.max(360,Math.min(window.innerHeight-H(i),H(y)+e.clientY-H(d))),!0))},x=()=>{F(_,!1),window.removeEventListener(`mousemove`,b,!0),window.removeEventListener(`mouseup`,x,!0),c()},S=e=>{F(_,!0),F(u,e.clientX,!0),F(d,e.clientY,!0),F(v,H(a),!0),F(y,H(o),!0),window.addEventListener(`mousemove`,b,!0),window.addEventListener(`mouseup`,x,!0),e.stopPropagation()};var ee=zu(),C=_i(ee),w=e=>{var t=Lu(),u=L(t),d=L(u),f=R(d,2);yo(f,21,()=>n,ho,(e,t)=>{var n=Iu(),r=L(n),i=e=>{Ac(e,{size:14})},a=e=>{ic(e,{size:14})},o=e=>{Sc(e,{size:14})},s=e=>{gc(e,{size:14})},l=e=>{Oc(e,{size:14})},u=e=>{fc(e,{size:14})},d=e=>{Pc(e,{size:14})},f=e=>{uc(e,{size:14})},p=e=>{mc(e,{size:14})},m=e=>{oc(e,{size:14})},h=e=>{vc(e,{size:14})};mo(r,e=>{H(t).id===`general`?e(i):H(t).id===`vars`?e(a,1):H(t).id===`switches`?e(o,2):H(t).id===`inv`?e(s,3):H(t).id===`actors`?e(l,4):H(t).id===`map`?e(u,5):H(t).id===`commonev`?e(d,6):H(t).id===`locks`?e(f,7):H(t).id===`logs`?e(p,8):H(t).id===`shortcuts`?e(m,9):H(t).id===`settings`&&e(h,10)});var g=R(r,2),_=L(g,!0);D(g),D(n),z(()=>{Jo(n,1,`w-full text-left rounded px-3 py-2 text-xs font-semibold transition-all flex items-center space-x-2.5 focus:outline-none ${Q.activeTab===H(t).id?`bg-[#7ba4ff]/10 text-[#7ba4ff] shadow-sm`:`text-gray-400 hover:bg-[#2a2d3a] hover:text-gray-200`}`),K(_,H(t).label)}),U(`click`,n,()=>{var e;Q.activeTab=H(t).id,(e=window.getSelection())==null||e.removeAllRanges(),c()}),G(e,n)}),D(f);var p=R(f,2),m=L(p);ps(m,`title`,`1.0.0`),m.textContent=`1.0.0`,D(p),D(u);var h=R(u,2),v=L(h),y=L(v),b=L(y,!0);D(y);var x=R(y,2);Mc(L(x),{size:14}),D(x),D(v);var ee=R(v,2),C=L(ee),w=e=>{yl(e,{})},te=e=>{wl(e,{})},ne=e=>{Ol(e,{})},re=e=>{Vl(e,{})},ie=e=>{ru(e,{})},ae=e=>{cu(e,{})},oe=e=>{pu(e,{})},se=e=>{vu(e,{})},ce=e=>{Fu(e,{})},le=e=>{Eu(e,{})},ue=e=>{ku(e,{})};mo(C,e=>{Q.activeTab===Ic.Vars?e(w):Q.activeTab===Ic.Switches?e(te,1):Q.activeTab===Ic.Inv?e(ne,2):Q.activeTab===Ic.Actors?e(re,3):Q.activeTab===Ic.General?e(ie,4):Q.activeTab===Ic.Map?e(ae,5):Q.activeTab===Ic.CommonEv?e(oe,6):Q.activeTab===Ic.Locks?e(se,7):Q.activeTab===Ic.Logs?e(ce,8):Q.activeTab===Ic.Shortcuts?e(le,9):Q.activeTab===Ic.Settings&&e(ue,10)}),D(ee),D(h),il(R(h,2),{onmousedown:S}),D(t),z(e=>{var n,c,u,d;Xo(t,`opacity: ${H(l)||H(_)||H(s)?1:Xc.inactiveOpacity/100}; left: ${(n=H(r))==null?``:n}px; top: ${(c=H(i))==null?``:c}px; width: ${(u=H(a))==null?``:u}px; height: ${(d=H(o))==null?``:d}px; background: #13151a; color: #d4d8e3;`),K(b,e)},[()=>{var e;return((e=n.find(e=>e.id===Q.activeTab))==null?void 0:e.label)||``}]),Ua(`mouseenter`,t,()=>F(s,!0)),Ua(`mouseleave`,t,()=>F(s,!1)),U(`mousedown`,d,g),U(`mousedown`,v,g),U(`click`,x,()=>Q.visible=!1),G(e,t)};mo(C,e=>{Q.visible&&e(w)});var te=R(C,2);yo(te,21,()=>zc.toasts,e=>e.id,(e,t)=>{var n=Ru(),r=L(n),i=R(r,2),a=L(i,!0);D(i),D(n),z(()=>{Xo(n,`background: #1a1d24; border-color: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`}; opacity: 0.95; min-width: 160px; max-width: 320px;`),Xo(r,`background: ${H(t).type===`success`?`#10b981`:H(t).type===`warn`?`#fb923c`:H(t).type===`error`?`#ef4444`:`#6366f1`};`),K(a,H(t).message)}),G(e,n)}),D(te),ol(R(te,2),{}),G(e,ee),Nt()}Wa([`mousedown`,`click`]);var Vu=`forge-mvmz-host`,Hu=document.getElementById(Vu);Hu||(Hu=document.createElement(`div`),Hu.id=Vu,Hu.style.position=`fixed`,Hu.style.top=`0`,Hu.style.left=`0`,Hu.style.width=`100vw`,Hu.style.height=`100vh`,Hu.style.pointerEvents=`none`,Hu.style.zIndex=`2147483647`,document.body.appendChild(Hu));var Uu=document.createElement(`style`);Uu.textContent=`#${Vu} { z-index: 2147483647 !important; }`,document.head.appendChild(Uu);var Wu=null,Gu;typeof Hu.attachShadow==`function`?(Wu=Hu.attachShadow({mode:`open`}),Gu=Wu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,Wu.appendChild(e)}}},0)):(Gu=Hu,setTimeout(()=>{for(let e of document.head.querySelectorAll(`style`)){let t=e.textContent||``;if(t.includes(`tailwind`)||t.includes(`--color-bg`)){let e=document.createElement(`style`);e.textContent=t,document.head.appendChild(e)}}},0));var Ku=document.createElement(`div`);Ku.style.pointerEvents=`none`,Ku.style.width=`100%`,Ku.style.height=`100%`,Gu.appendChild(Ku);try{to(Bu,{target:Ku})}catch(e){console.error(`[FORGE] Error mounting Svelte App:`,e)}if(window.Input!==void 0&&window.Input._onKeyDown){let e=window.Input._onKeyDown;window.Input._onKeyDown=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}if(window.Input!==void 0&&window.Input._onKeyUp){let e=window.Input._onKeyUp;window.Input._onKeyUp=function(t){let n=t.composedPath&&t.composedPath()[0]||t.target;Hu.contains(n)||e.call(this,t)}}})(); \ No newline at end of file