nyacronomicon/js/plugins/KN_ErrorHandler.js

59 lines
2.2 KiB
JavaScript

/*:
* @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);
};
})();