//============================================================================= // Yanfly Engine Plugins - Job Points // YEP_JobPoints.js //============================================================================= var Imported = Imported || {}; Imported.YEP_JobPoints = true; var Yanfly = Yanfly || {}; Yanfly.JP = Yanfly.JP || {}; Yanfly.JP.version = 1.1; //============================================================================= /*: * @plugindesc v1.10 This plugin by itself doesn't do much, but it enables * actors to acquire JP (job points) used for other plugins. * @author Yanfly Engine Plugins * * @param ---General--- * @default * * @param JP Text * @parent ---General--- * @desc This changes how you want JP to appear in the game. * @default JP * * @param JP Icon * @parent ---General--- * @type number * @min 0 * @desc This is the icon used for JP. * Use 0 if you wish to use no icon. * @default 188 * * @param Max JP * @parent ---General--- * @type number * @min 0 * @desc This is the maximum JP an actor can have per class. * Use 0 if you wish to have no limit. * @default 0 * * @param JP Per Action * @parent ---General--- * @desc This is the amount of JP an actor gains for his/her * current class whenever he/she performs an action. * @default 10 + Math.randomInt(10) * * @param JP Per Level * @parent ---General--- * @desc This is the amount of JP an actor gains per level up. * @default 100 + Math.randomInt(100) * * @param JP Per Enemy * @parent ---General--- * @desc This is the amount of JP given per defeated enemy. * @default 50 + Math.randomInt(10) * * @param Show Results * @parent ---General--- * @type boolean * @on Show * @off Hide * @desc Upon winning, show how much JP is earned for default? * NO - false YES - true * @default true * * @param JP Gained in Battle * @parent ---General--- * @desc Adjusts how the gained JP text is shown after battle. * %1 - Actor %2 Value %3 JP * @default %1 gains %2%3! * * @param Alive Actors * @parent ---General--- * @type boolean * @on Alive Requirement * @off No Requirement * @desc Actors must be alive to receive JP earned from enemies. * NO - false YES - true * @default true * * @param ---Menu--- * @default * * @param Show In Menu * @parent ---Menu--- * @type boolean * @on Show * @off Hide * @desc Display JP in the main menu? * NO - false YES - true * @default true * * @param Menu Format * @parent ---Menu--- * @desc How the JP text format in the menu appears. * %1 - Value %2 - Amount %3 - Icon * @default %1\c[4]%2\c[0]%3 * * @param ---Victory Aftermath--- * @default * * @param Enable Aftermath * @parent ---Victory Aftermath--- * @type boolean * @on Enable * @off Disable * @desc Enables Victory Aftermath windows. * NO - false YES - true * @default true * * @param Aftermath Text * @parent ---Victory Aftermath--- * @desc Text used to describe how much JP is earned. * @default JP Earned * * @param Aftermath Format * @parent ---Victory Aftermath--- * @desc How the JP text format in the aftermath appears. * %1 - Value %2 - Amount %3 - Icon * @default +%1\c[4]%2\c[0]%3 * * @param Aftermath JP Earned * @parent ---Victory Aftermath--- * @desc Describes how much JP is earned per actor. * @default JP Earned in Battle * * @help * ============================================================================ * Introduction * ============================================================================ * * This plugin by itself will not change any major game functions, but instead, * it works in combination with other plugins that make use of this plugin's * functions should you decide to incorporate Job Points into your game. * * When Job Points are earned, they are given to the actor's current class. If * the actor were to switch classes, then the Job Points will be changed to * that class's Job Points until reverted back. * * ============================================================================ * Victory Aftermath Compatibility * ============================================================================ * * If you have the YEP_VictoryAftermath plugin installed and wish to make use * of the JP windows, position this plugin lower than YEP_VictoryAftermath in * the Plugin Manager. * * After that, if you wish to define the timing of the JP window to appear at * a certain point instead of the plugin doing it automatically, insert "JP" in * the "Victory Order" parameter within Victory Aftermath where you want the * JP window to appear. * * ============================================================================ * Notetags * ============================================================================ * * Here are some notetags related to Job Points. * * Actor Notetags * * Sets the actor's starting JP value to be x for the actor's initial class. * * * Sets the actor's starting JP value for class x to be y. * * * This changes the rate of JP gained by x%. By default, all objects have a * default rate of 100%. Increasing this to 200% will increase JP gained by * twice as much while 50% will halve the amount of JP gained. * * Skill and Item Notetags * * This makes it so that the actor using this skill or item will gain x * amount of JP instead of the default amount of JP found in the parameters. * * * This makes it so that the target actor affected by this skill or item will * gain x amount of JP. * * Class, Weapon, Armor, and State Notetag * * This changes the rate of JP gained by x%. By default, all objects have a * default rate of 100%. Increasing this to 200% will increase JP gained by * twice as much while 50% will halve the amount of JP gained. * * Enemy Notetag * * When the enemy is defeated, the party members present will gain x JP each. * * ============================================================================ * Plugin Commands * ============================================================================ * * For those wondering how to manually give, remove, or set JP for an actor, * you can use the following Plugin Commands. * * Plugin Commands: * * gainJp actorId jp * gainJp actorId jp classId * Replace 'actorId' with the ID of the actor you wish to change the JP of. * Replace 'jp' with the amount of JP you wish to alter. If you are using * 'classId', replace it with the ID of the actor's class you wish to alter. * This command will let the actor gain JP. * * loseJp actorId jp * loseJp actorId jp classId * Replace 'actorId' with the ID of the actor you wish to change the JP of. * Replace 'jp' with the amount of JP you wish to alter. If you are using * 'classId', replace it with the ID of the actor's class you wish to alter. * This command will cause the actor to lose JP. * * setJp actorId jp * setJp actorId jp classId * Replace 'actorId' with the ID of the actor you wish to change the JP of. * Replace 'jp' with the amount of JP you wish to alter. If you are using * 'classId', replace it with the ID of the actor's class you wish to alter. * This command will set the actor's JP to a particular value. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.10: * - Bypass the isDevToolsOpen() error when bad code is inserted into a script * call or custom Lunatic Mode code segment due to updating to MV 1.6.1. * * Version 1.09: * - Updated for RPG Maker MV version 1.5.0. * * Version 1.08: * - Lunatic Mode fail safes added. * * Version 1.07: * - Updated for RPG Maker MV version 1.1.0. * * Version 1.06: * - Added 'Alive Actors' plugin parameter to prevent dead actors from gaining * JP from enemies. Any JP that currently dead actors earned in battle from * actions will still be 'earned' at the end of battle. * * Version 1.05: * - Updated compatibility for Subclasses gaining JP. * * Version 1.04a: * - Added failsafes to prevent JP from turning into NaN midbattle. * - Added failsafes to prevent no-target scopes from crashing the game. * * Version 1.03: * - Added 'Show Results' parameter to show/hide JP earned after battle for * those who aren't using the Victory Aftermath plugin. * * Version 1.02: * - Fixed a bug that would gain JP for changing classes of a higher level. * * Version 1.01: * - Added failsafes to prevent JP from turning into NaN. * * Version 1.00: * - Finished Plugin! */ //============================================================================= //============================================================================= // Parameter Variables //============================================================================= Yanfly.Parameters = PluginManager.parameters("YEP_JobPoints"); Yanfly.Param = Yanfly.Param || {}; Yanfly.Icon = Yanfly.Icon || {}; Yanfly.Param.Jp = String(Yanfly.Parameters["JP Text"]); Yanfly.Icon.Jp = Number(Yanfly.Parameters["JP Icon"]); Yanfly.Param.JpMax = Number(Yanfly.Parameters["Max JP"]); Yanfly.Param.JpPerAction = String(Yanfly.Parameters["JP Per Action"]); Yanfly.Param.JpPerEnemy = String(Yanfly.Parameters["JP Per Enemy"]); Yanfly.Param.JpShowResults = eval(String(Yanfly.Parameters["Show Results"])); Yanfly.Param.JpTextFormat = String(Yanfly.Parameters["JP Gained in Battle"]); Yanfly.Param.JpAliveActors = eval(String(Yanfly.Parameters["Alive Actors"])); Yanfly.Param.JpShowMenu = String(Yanfly.Parameters["Show In Menu"]); Yanfly.Param.JpShowMenu = eval(Yanfly.Param.JpShowMenu); Yanfly.Param.JpMenuFormat = String(Yanfly.Parameters["Menu Format"]); Yanfly.Param.JpPerLevel = String(Yanfly.Parameters["JP Per Level"]); Yanfly.Param.JpEnableAftermath = String(Yanfly.Parameters["Enable Aftermath"]); Yanfly.Param.JpAftermathText = String(Yanfly.Parameters["Aftermath Text"]); Yanfly.Param.JpAftermathFmt = String(Yanfly.Parameters["Aftermath Format"]); Yanfly.Param.JpAftermathEarn = String(Yanfly.Parameters["Aftermath JP Earned"]); //============================================================================= // DataManager //============================================================================= Yanfly.JP.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function () { if (!Yanfly.JP.DataManager_isDatabaseLoaded.call(this)) return false; if (!Yanfly._loaded_YEP_JobPoints) { this.processJPNotetags1($dataActors); this.processJPNotetags2($dataSkills); this.processJPNotetags2($dataItems); this.processJPNotetags3($dataEnemies); this.processJPNotetags4($dataClasses); this.processJPNotetags4($dataWeapons); this.processJPNotetags4($dataArmors); this.processJPNotetags4($dataStates); Yanfly._loaded_YEP_JobPoints = true; } return true; }; DataManager.processJPNotetags1 = function (group) { var note1 = /<(?:STARTING JP):[ ](\d+)>/i; var note2 = /<(?:CLASS)[ ](\d+)[ ](?:STARTING JP):[ ](\d+)>/i; var note3 = /<(?:JP RATE):[ ](\d+)([%%])>/i; for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.startingJp = {}; obj.jpRate = 1.0; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1)) { obj.startingJp[obj.classId] = parseInt(RegExp.$1); } else if (line.match(note2)) { obj.startingJp[parseInt(RegExp.$1)] = parseInt(RegExp.$2); } else if (line.match(note3)) { obj.jpRate = parseFloat(RegExp.$1 * 0.01); } } } }; DataManager.processJPNotetags2 = function (group) { var note1 = /<(?:GAIN JP|JP GAIN):[ ](\d+)>/i; var note2 = /<(?:TARGET GAIN JP|TARGET JP GAIN):[ ](\d+)>/i; for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.gainJp = Yanfly.Param.JpPerAction; obj.targetGainJp = 0; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1)) { obj.gainJp = parseInt(RegExp.$1); } else if (line.match(note2)) { obj.targetGainJp = parseInt(RegExp.$1); } } } }; DataManager.processJPNotetags3 = function (group) { var note1 = /<(?:JP):[ ](\d+)>/i; for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.jp = Yanfly.Param.JpPerEnemy; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1)) { obj.jp = parseInt(RegExp.$1); } } } }; DataManager.processJPNotetags4 = function (group) { var note1 = /<(?:JP RATE):[ ](\d+)([%%])>/i; for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.jpRate = 1.0; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(note1)) { obj.jpRate = parseFloat(RegExp.$1 * 0.01); } } } }; //============================================================================= // BattleManager //============================================================================= Yanfly.JP.BattleManager_makeRewards = BattleManager.makeRewards; BattleManager.makeRewards = function () { Yanfly.JP.BattleManager_makeRewards.call(this); this._rewards.jp = $gameTroop.jpTotal(); this.gainJp(); }; BattleManager.gainJp = function () { var jp = $gameTroop.jpTotal(); $gameMessage.newPage(); if (Yanfly.Param.JpAliveActors) { var members = $gameParty.aliveMembers(); } else { var members = $gameParty.members(); } members.forEach(function (actor) { actor.gainJp(jp); }); }; Yanfly.JP.BattleManager_displayRewards = BattleManager.displayRewards; BattleManager.displayRewards = function () { Yanfly.JP.BattleManager_displayRewards.call(this); this.displayJpGain(); }; BattleManager.displayJpGain = function () { if (!Yanfly.Param.JpShowResults) return; var jp = $gameTroop.jpTotal(); $gameMessage.newPage(); $gameParty.members().forEach(function (actor) { var fmt = Yanfly.Param.JpTextFormat; var text = fmt.format( actor.name(), Yanfly.Util.toGroup(actor.battleJp()), Yanfly.Param.Jp ); $gameMessage.add("\\." + text); }); }; //============================================================================= // Game_Battler //============================================================================= Yanfly.JP.Game_Battler_useItem = Game_Battler.prototype.useItem; Game_Battler.prototype.useItem = function (item) { Yanfly.JP.Game_Battler_useItem.call(this, item); if (!$gameParty.inBattle()) return; if (this.isActor()) this.gainJp(eval(item.gainJp), this.currentClass().id); }; Yanfly.JP.Game_Battler_onBattleStart = Game_Battler.prototype.onBattleStart; Game_Battler.prototype.onBattleStart = function () { Yanfly.JP.Game_Battler_onBattleStart.call(this); this._battleJp = 0; }; Yanfly.JP.Game_Battler_onBattleEnd = Game_Battler.prototype.onBattleEnd; Game_Battler.prototype.onBattleEnd = function () { Yanfly.JP.Game_Battler_onBattleEnd.call(this); this._battleJp = 0; }; //============================================================================= // Game_Actor //============================================================================= Yanfly.JP.Game_Actor_setup = Game_Actor.prototype.setup; Game_Actor.prototype.setup = function (actorId) { Yanfly.JP.Game_Actor_setup.call(this, actorId); this.initJp(); }; Game_Actor.prototype.jp = function (classId) { if (!this._jp) this.initJp(); if (!this._jp) return 0; if (classId === undefined) classId = this.currentClass().id; if (!this._jp[classId]) this._jp[classId] = 0; return this._jp[classId]; }; Game_Actor.prototype.initJp = function () { var actor = this.actor(); for (var i = 0; i < $dataClasses.length; i++) { if (actor.startingJp) { var jp = actor.startingJp[i] || 0; this.setJp(jp, i); } } }; Game_Actor.prototype.setJp = function (value, classId) { value = parseInt(value); if (value === NaN) value = 0; classId = classId || this.currentClass().id; if (!this._jp) this._jp = {}; if (!this._jp[classId]) this._jp[classId] = 0; this._jp[classId] = Math.max(0, value); if (Yanfly.Param.JpMax > 0) { this._jp[classId] = Math.min(Yanfly.Param.JpMax, value); } }; Game_Actor.prototype.jpRate = function () { var rate = 1.0; rate *= this.actor().jpRate; rate *= this.currentClass().jpRate; var equips = this.equips(); for (var i = 0; i < equips.length; i++) { var item = equips[i]; if (item) rate *= item.jpRate; } var states = this.states(); for (var i = 0; i < states.length; i++) { var state = states[i]; if (state) rate *= state.jpRate; } return rate; }; Game_Actor.prototype.gainJp = function (value, classId) { value = parseInt(value); if (value === NaN) value = 0; classId = classId || this.currentClass().id; value = Math.floor(value * this.jpRate()); if ($gameParty.inBattle()) { this._battleJp = this._battleJp || 0; this._battleJp += value; } this.setJp(this.jp(classId) + value, classId); if (classId === this.currentClass().id && this.isSublcassEarnJp()) { this.gainJpSubclass(value); } }; Game_Actor.prototype.isSublcassEarnJp = function () { if (!Imported.YEP_X_Subclass) return false; if (!this.subclass()) return false; return Yanfly.Param.SubclassJp; }; Game_Actor.prototype.gainJpSubclass = function (value) { var classId = this.subclass().id; value = Math.round(value * Yanfly.Param.SubclassJp); this.setJp(this.jp(classId) + value, classId); }; Game_Actor.prototype.loseJp = function (value, classId) { classId = classId || this.currentClass().id; this.setJp(this.jp(classId) - value, classId); }; Game_Actor.prototype.battleJp = function () { this._battleJp = this._battleJp || 0; return this._battleJp; }; Yanfly.JP.Game_Actor_changeClass = Game_Actor.prototype.changeClass; Game_Actor.prototype.changeClass = function (classId, keepExp) { this._preventJpLevelUpGain = true; Yanfly.JP.Game_Actor_changeClass.call(this, classId, keepExp); this._preventJpLevelUpGain = false; }; Yanfly.JP.Game_Actor_levelUp = Game_Actor.prototype.levelUp; Game_Actor.prototype.levelUp = function () { Yanfly.JP.Game_Actor_levelUp.call(this); if (this._preventJpLevelUpGain) return; var user = this; var target = this; var a = this; var b = this; var level = this.level; var code = Yanfly.Param.JpPerLevel; try { var value = eval(code); } catch (e) { var value = 0; Yanfly.Util.displayError(e, code, "LEVEL UP JP FORMULA ERROR"); } this.gainJp(value, this.currentClass().id); }; //============================================================================= // Game_Enemy //============================================================================= Game_Enemy.prototype.jp = function () { var user = this; var target = this; var a = this; var b = this; var code = this.enemy().jp; try { return eval(code); } catch (e) { Yanfly.Util.displayError(e, code, "ENEMY JP FORMULA ERROR"); return 0; } }; //============================================================================= // Game_Action //============================================================================= Yanfly.JP.Game_Action_applyItemUserEffect = Game_Action.prototype.applyItemUserEffect; Game_Action.prototype.applyItemUserEffect = function (target) { Yanfly.JP.Game_Action_applyItemUserEffect.call(this, target); if (target) this.applyItemJpEffect(target); }; Game_Action.prototype.applyItemJpEffect = function (target) { var item = this.item(); if (!item) return; if (target.isActor()) target.gainJp(item.targetGainJp); }; Yanfly.JP.Game_Action_hasItemAnyValidEffects = Game_Action.prototype.hasItemAnyValidEffects; Game_Action.prototype.hasItemAnyValidEffects = function (target) { var item = this.item(); if (!item) return; if (target.isActor() && item.targetGainJp !== 0) return true; return Yanfly.JP.Game_Action_hasItemAnyValidEffects.call(this, target); }; //============================================================================= // Game_Troop //============================================================================= Game_Troop.prototype.jpTotal = function () { return this.deadMembers().reduce(function (r, enemy) { return r + enemy.jp(); }, 0); }; //============================================================================= // Game_Interpreter //============================================================================= Yanfly.JP.Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function (command, args) { Yanfly.JP.Game_Interpreter_pluginCommand.call(this, command, args); if (command === "gainJp") this.modifyJp("gain", args); if (command === "loseJp") this.modifyJp("lose", args); if (command === "setJp") this.modifyJp("set", args); }; Game_Interpreter.prototype.modifyJp = function (type, args) { if (!args) return; var actorId = parseInt(args[0]); var actor = $gameActors.actor(actorId); var jpValue = args[1] || 0; jpValue = parseInt(jpValue); var classId = args[2] || 0; classId = parseInt(classId); if (jpValue <= 0) return; if (classId <= 0) classId = actor.currentClass().id; if (type === "gain") { actor.gainJp(jpValue, classId); } else if (type === "lose") { actor.loseJp(jpValue, classId); } else if (type === "set") { actor.setJp(jpValue, classId); } }; //============================================================================= // Window_Base //============================================================================= Yanfly.JP.Window_Base_dASS = Window_Base.prototype.drawActorSimpleStatus; Window_Base.prototype.drawActorSimpleStatus = function (actor, wx, wy, ww) { this._drawMenuJP = Yanfly.Param.JpShowMenu; Yanfly.JP.Window_Base_dASS.call(this, actor, wx, wy, ww); this._drawMenuJP = undefined; }; Yanfly.JP.Window_Base_drawActorClass = Window_Base.prototype.drawActorClass; Window_Base.prototype.drawActorClass = function (actor, wx, wy, ww) { ww = ww || 168; Yanfly.JP.Window_Base_drawActorClass.call(this, actor, wx, wy, ww); if (!this._drawMenuJP) return; var classId = actor.currentClass().id; this.drawActorJp(actor, classId, wx, wy, ww, "Center"); }; Window_Base.prototype.drawActorJp = function (actor, id, wx, wy, ww, align) { var jp = actor.jp(id); var icon = "\\i[" + Yanfly.Icon.Jp + "]"; var fmt = Yanfly.Param.JpMenuFormat; var text = fmt.format(Yanfly.Util.toGroup(jp), Yanfly.Param.Jp, icon); if (align === "Light") { wx = 200; } else if (align === "Light") { wx += (ww - this.textWidthEx(text)) / 2; } else { wx += ww - this.textWidthEx(text); } this.drawTextEx(text, wx, wy); }; Window_Base.prototype.textWidthEx = function (text) { return this.drawTextEx(text, 0, this.contents.height); }; //============================================================================= // Window_VictoryJp //============================================================================= if (Imported.YEP_VictoryAftermath && Yanfly.Param.JpEnableAftermath) { function Window_VictoryJp() { this.initialize.apply(this, arguments); } Window_VictoryJp.prototype = Object.create(Window_VictoryExp.prototype); Window_VictoryJp.prototype.constructor = Window_VictoryJp; Window_VictoryJp.prototype.drawActorGauge = function (actor, index) { this.clearGaugeRect(index); var rect = this.gaugeRect(index); this.changeTextColor(this.normalColor()); this.drawActorName(actor, rect.x + 2, rect.y); this.drawLevel(actor, rect); this.drawJpGained(actor, rect); }; Window_VictoryJp.prototype.drawJpGained = function (actor, rect) { var wy = rect.y + this.lineHeight() * 1; this.changeTextColor(this.systemColor()); this.drawText( Yanfly.Param.JpAftermathEarn, rect.x + 2, wy, rect.width - 4, "left" ); var bonusJp = (1.0 * actor.battleJp() * this._tick) / Yanfly.Param.VAGaugeTicks; var value = Yanfly.Util.toGroup(parseInt(bonusJp)); var fmt = Yanfly.Param.JpAftermathFmt; var icon = "\\i[" + Yanfly.Icon.Jp + "]"; var JpText = fmt.format(value, Yanfly.Param.Jp, icon); this.changeTextColor(this.normalColor()); wx = rect.x + rect.width - this.textWidthEx(JpText); this.drawTextEx(JpText, wx, wy); }; //============================================================================= // Scene_Battle //============================================================================= Yanfly.JP.Scene_Battle_addCustomVictorySteps = Scene_Battle.prototype.addCustomVictorySteps; Scene_Battle.prototype.addCustomVictorySteps = function (array) { array = Yanfly.JP.Scene_Battle_addCustomVictorySteps.call(this, array); if (!array.contains("JP")) array.push("JP"); return array; }; Yanfly.JP.Scene_Battle_updateVictorySteps = Scene_Battle.prototype.updateVictorySteps; Scene_Battle.prototype.updateVictorySteps = function () { Yanfly.JP.Scene_Battle_updateVictorySteps.call(this); if (this.isVictoryStep("JP")) this.updateVictoryJp(); }; Scene_Battle.prototype.updateVictoryJp = function () { if (!this._victoryJpWindow) { this.createVictoryJp(); } else if (this._victoryJpWindow.isReady()) { if (this.victoryTriggerContinue()) this.finishVictoryJp(); } }; Scene_Battle.prototype.createVictoryJp = function () { this._victoryTitleWindow.refresh(Yanfly.Param.JpAftermathText); this._victoryJpWindow = new Window_VictoryJp(); this.addWindow(this._victoryJpWindow); this._victoryJpWindow.open(); }; Scene_Battle.prototype.finishVictoryJp = function () { SoundManager.playOk(); this._victoryJpWindow.close(); this.processNextVictoryStep(); }; } // Imported.YEP_VictoryAftermath //============================================================================= // Utilities //============================================================================= Yanfly.Util = Yanfly.Util || {}; if (!Yanfly.Util.toGroup) { Yanfly.Util.toGroup = function (inVal) { return inVal; }; } Yanfly.Util.displayError = function (e, code, message) { console.log(message); console.log(code || "NON-EXISTENT"); console.error(e); if (Utils.RPGMAKER_VERSION && Utils.RPGMAKER_VERSION >= "1.6.0") return; if (Utils.isNwjs() && Utils.isOptionValid("test")) { if (!require("nw.gui").Window.get().isDevToolsOpen()) { require("nw.gui").Window.get().showDevTools(); } } }; //============================================================================= // End of File //=============================================================================