//============================================================================= // Yanfly Engine Plugins - Base Parameter Extension - Class Base Parameters // YEP_X_ClassBaseParam.js //============================================================================= var Imported = Imported || {}; Imported.YEP_X_ClassBaseParam = true; var Yanfly = Yanfly || {}; Yanfly.CBP = Yanfly.CBP || {}; Yanfly.CBP.version = 1.05; //============================================================================= /*: * @plugindesc v1.05 (Requires YEP_BaseParamControl) Allow you to use * formulas for class parameter growth. * @author Yanfly Engine Plugins * * @help * ============================================================================ * Introduction * ============================================================================ * * This plugin requires YEP_BaseParamControl. Make sure this plugin is located * under YEP_BaseParamControl in the plugin list. * * For those who don't like the way base parameters are determined by the * editor, you can use your own formulas to determine the parameter growth for * each class using this plugin. This plugin also allows you to adjust the exp * needed for each level per class. * * ============================================================================ * Lunatic Mode - Custom Class Parameters * ============================================================================ * * If your formulas are short and simple, you can use this notetag to cover the * entire formula list for all of the base parameters: * * Class Notetag: * * * maxhp = level * 30 + 300; * maxmp = level * 20 + 150; * atk = level * 15 + 15; * def = level * 11 + 16; * mat = level * 12 + 14; * mdf = level * 10 + 13; * agi = level * 14 + 15; * luk = level * 13 + 12; * exp = level * 100; * * The 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf', 'agi', 'luk', and 'exp'. * variables each refer to their own individual stats. The 'level' variable * refers to the actor's current level. The formula can be made any way you * like as long as it returns a legal number. * * Note: The 'exp' stat here refers to the amount of exp needed to reach * the next level. * * ============================================================================ * Lunatic Mode - Detailed Custom Parameter Formulas * ============================================================================ * * For those who wish to put a bit more detail in calculating the formula for * each stat, you can use the following notetag setup: * * Class Notetags: * * * if (this.name() === 'Harold') { * value = level * 30 + 300; * } else { * value = level * 25 + 250; * } * * Replace 'Param' with 'maxhp', 'maxmp', 'atk', 'def', 'mat', 'mdf', 'agi', * 'luk', or 'exp'. The 'value' variable is the final result that's returned * to count as the base class parameter. The 'level' variable refers to the * actor's current level. The formula can be made any way you like as long as * it returns a legal number. * * Note: The 'exp' stat here refers to the amount of exp needed to reach * the next level. * * ============================================================================ * Changelog * ============================================================================ * * Version 1.05: * - 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.04: * - Updated for RPG Maker MV version 1.5.0. * * Version 1.03: * - Lunatic Mode fail safes added. * * Version 1.02: * - Fixed a bug that caused the notetag to not work. * * Version 1.01: * - Fixed a bug that caused errors on loading up a game with the EXP formula. * * Version 1.00: * - Finished Plugin! */ //============================================================================= if (Imported.YEP_BaseParamControl) { //============================================================================= // DataManager //============================================================================= Yanfly.CBP.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { if (!Yanfly.CBP.DataManager_isDatabaseLoaded.call(this)) return false; if (!Yanfly._loaded_YEP_X_ClassBaseParam) { this.processCBPNotetags1($dataClasses); Yanfly._loaded_YEP_X_ClassBaseParam = true; } return true; }; DataManager.processCBPNotetags1 = function(group) { for (var n = 1; n < group.length; n++) { var obj = group[n]; var notedata = obj.note.split(/[\r\n]+/); obj.baseParamFormula = [ '', '', '', '', '', '', '', '', '' ]; var evalMode = 'none'; var paramId = 0; for (var i = 0; i < notedata.length; i++) { var line = notedata[i]; if (line.match(//i)) { var param = String(RegExp.$1).toUpperCase().trim(); if (['MHP', 'MAX HP', 'MAXHP', 'HP'].contains(param)) { paramId = 0; } else if (['MMP', 'MAX MP', 'MAXMP', 'MP'].contains(param)) { paramId = 1; } else if (['ATK', 'STR'].contains(param)) { paramId = 2; } else if (['DEF'].contains(param)) { paramId = 3; } else if (['MAT', 'INT', 'SPI'].contains(param)) { paramId = 4; } else if (['MDF', 'RES'].contains(param)) { paramId = 5; } else if (['AGI', 'SPD'].contains(param)) { paramId = 6; } else if (['LUK'].contains(param)) { paramId = 7; } else if (['EXP'].contains(param)) { paramId = 8; } else { continue; } evalMode = 'custom class param formula'; } else if (line.match(/<\/CUSTOM[ ](.*)[ ]FORMULA>/i)) { paramId = 0; evalMode = 'none' } else if (evalMode === 'custom class param formula') { obj.baseParamFormula[paramId] += line + '\n'; } else if (line.match(//i)) { evalMode = 'custom class parameters'; } else if (line.match(/<\/CUSTOM CLASS PARAMETERS>/i)) { evalMode = 'none'; } else if (evalMode === 'custom class parameters') { if (line.match(/(?:MHP|MAX HP|MAXHP|HP)[ ]=[ ](.*)/i)) { var code = 'mhp = ' + String(RegExp.$1).trim(); paramId = 0; } else if (line.match(/(?:MMP|MAX MP|MAXMP|MP)[ ]=[ ](.*)/i)) { var code = 'mmp = ' + String(RegExp.$1).trim(); paramId = 1; } else if (line.match(/(?:MSP|MAX SP|MAXSP|SP)[ ]=[ ](.*)/i)) { var code = 'mmp = ' + String(RegExp.$1).trim(); paramId = 1; } else if (line.match(/(?:ATK|STR)[ ]=[ ](.*)/i)) { var code = 'atk = ' + String(RegExp.$1).trim(); paramId = 2; } else if (line.match(/(?:DEF)[ ]=[ ](.*)/i)) { var code = 'def = ' + String(RegExp.$1).trim(); paramId = 3; } else if (line.match(/(?:MAT|INT|SPI)[ ]=[ ](.*)/i)) { var code = 'mat = ' + String(RegExp.$1).trim(); paramId = 4; } else if (line.match(/(?:MDF|RES)[ ]=[ ](.*)/i)) { var code = 'mdf = ' + String(RegExp.$1).trim(); paramId = 5; } else if (line.match(/(?:AGI|SPD)[ ]=[ ](.*)/i)) { var code = 'agi = ' + String(RegExp.$1).trim(); paramId = 6; } else if (line.match(/(?:LUK)[ ]=[ ](.*)/i)) { var code = 'luk = ' + String(RegExp.$1).trim(); paramId = 7; } else if (line.match(/(?:EXP)[ ]=[ ](.*)/i)) { var code = 'exp = ' + String(RegExp.$1).trim(); paramId = 8; } else { continue; } obj.baseParamFormula[paramId] += code + '\n'; } } } }; //============================================================================= // MainCode //============================================================================= Yanfly.CBP.Game_Actor_paramBase = Game_Actor.prototype.paramBase; Game_Actor.prototype.paramBase = function(paramId) { if (this.currentClass().baseParamFormula[paramId] !== '') { var formula = this.currentClass().baseParamFormula[paramId]; return this.classBaseParamFormula(formula, paramId); } return Yanfly.CBP.Game_Actor_paramBase.call(this, paramId); }; Game_Actor.prototype.classBaseParamFormula = function(formula, paramId, level) { var value = 0; var hp = 0; var mp = 0; level = level || this.level; var maxhp = 0; var mhp = 0; var maxmp = 0; var mmp = 0; var sp = 0; var maxsp = 0; var msp = 0; var atk = 0; var str = 0; var def = 0; var mat = 0; var int = 0; var spi = 0; var mdf = 0; var res = 0; var agi = 0; var spd = 0; var luk = 0; var exp = 0; var a = this; var b = this; var user = this; var subject = this; var s = $gameSwitches._data; var v = $gameVariables._data; var code = formula; try { eval(code); } catch (e) { Yanfly.Util.displayError(e, code, 'CLASS BASE PARAM FORMULA ERROR'); } switch (paramId) { case 0: value += hp + maxhp + mhp; break; case 1: value += mp + maxmp + mmp + sp + maxsp + msp; break; case 2: value += atk + str; break; case 3: value += def; break; case 4: value += mat + int + spi; break; case 5: value += mdf + res; break; case 6: value += agi + spd; break; case 7: value += luk; break; case 8: value += exp; break; } return value; }; Yanfly.CBP.Game_Actor_expForLevel = Game_Actor.prototype.expForLevel; Game_Actor.prototype.expForLevel = function(level) { if (this.currentClass().baseParamFormula[8] !== '' && level > 1) { var formula = this.currentClass().baseParamFormula[8]; value = Math.round(this.classBaseParamFormula(formula, 8, level - 1)); return Math.max(value, 1); } return Yanfly.CBP.Game_Actor_expForLevel.call(this, level); }; //============================================================================= // Utilities //============================================================================= Yanfly.Util = Yanfly.Util || {}; 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 //============================================================================= }; // Imported.YEP_BaseParamControl