/*: * @target MZ * @plugindesc Adds game-context information to error output for easier debugging. * @author DazedTranslations * @help Place near the top of the plugin list (after PluginCommonBase). * When an unhandled error occurs, the console will show: * - Current map ID and name * - Active event ID and name * - Map battle state (_knPlayer, _knEnemy) */ (() => { 'use strict'; const _catchNormalError = SceneManager.catchNormalError.bind(SceneManager); SceneManager.catchNormalError = function(e) { try { let interp = $gameMap?._interpreter; while (interp?._childInterpreter) interp = interp._childInterpreter; const mapId = $gameMap?.mapId?.(); const mapName = $dataMapInfos?.[mapId]?.name ?? '?'; const eventId = interp?.eventId?.() ?? '?'; const eventName = $dataMap?.events?.[eventId]?.name ?? '?'; console.error( `[KN_ErrorHandler] Error in Map ${mapId} (${mapName}), ` + `Event ${eventId} ("${eventName}")` ); console.error( `[KN_ErrorHandler] Battle state — ` + `_knPlayer: ${$gameMap?._knPlayer ? 'OK' : 'UNDEFINED'}, ` + `_knEnemy: ${$gameMap?._knEnemy ? $gameMap._knEnemy.name() : 'UNDEFINED'}` ); } catch (_) { /* never let the error handler itself throw */ } _catchNormalError(e); }; const _onError = SceneManager.onError.bind(SceneManager); SceneManager.onError = function(event) { try { let interp = $gameMap?._interpreter; while (interp?._childInterpreter) interp = interp._childInterpreter; const mapId = $gameMap?.mapId?.(); const mapName = $dataMapInfos?.[mapId]?.name ?? '?'; const eventId = interp?.eventId?.() ?? '?'; const eventName = $dataMap?.events?.[eventId]?.name ?? '?'; console.error( `[KN_ErrorHandler] Uncaught error in Map ${mapId} (${mapName}), ` + `Event ${eventId} ("${eventName}")` ); } catch (_) { /* ignore */ } _onError(event); }; })();