/* * ============================================================================== * ** Victor Engine MV - Basic Module * ------------------------------------------------------------------------------ * VE_BasicModule.js * ============================================================================== */ var Imported = Imported || {}; Imported["VE - Basic Module"] = "1.23"; var VictorEngine = VictorEngine || {}; VictorEngine.BasicModule = VictorEngine.BasicModule || {}; (function () { VictorEngine.BasicModule.loadDatabase = DataManager.loadDatabase; DataManager.loadDatabase = function () { VictorEngine.BasicModule.loadDatabase.call(this); PluginManager.requiredPlugin.call(PluginManager, "VE - Basic Module"); }; PluginManager.requiredPlugin = function (name, required, version) { VictorEngine.BasicModule.checkPlugins(name, required, version); }; })(); /*: * ============================================================================== * @plugindesc v1.23 - Plugin with base code required for all Victor Engine plugins. * @author Victor Sant * * @param == Trait Names == * * @param Hit Rate Name * @desc 'Hit Rate' Ex-Parameter name shown on windows. * @default Hit * * @param Evasion Rate Name * @desc 'Evasion Rate' Ex-Parameter name shown on windows. * @default Evasion * * @param Critical Rate Name * @desc 'Critical Rate' Ex-Parameter name shown on windows. * @default Critical * * @param Critical Evasion Name * @desc 'Critical Evasion' Ex-Parameter name shown on windows. * @default C. Evasion * * @param Magic Evasion Name * @desc 'Magic Evasion' Ex-Parameter name shown on windows. * @default M. Evasion * * @param Magic Reflection Name * @desc 'Magic Reflection' Ex-Parameter name shown on windows. * @default M. Reflection * * @param Counter Attack Name * @desc 'Counter Attack' Ex-Parameter name shown on windows. * @default Counter * * @param HP Regeneration Name * @desc 'HP Regeneration' Ex-Parameter name shown on windows. * @default HP Regen * * @param MP Regeneration Name * @desc 'MP Regeneration' Ex-Parameter name shown on windows. * @default MP Regen * * @param TP Regeneration Name * @desc 'TP Regeneration' Ex-Parameter name shown on windows. * @default TP Regen * * @param Target Rate Name * @desc 'Target Rate' Sp-Parameter name shown on windows. * @default Target Rate * * @param Guard Rate Name * @desc 'Guard Rate' Sp-Parameter name shown on windows. * @default Guard Rate * * @param Recovery Effect Name * @desc 'Recovery Effect' Sp-Parameter name shown on windows. * @default Recovery * * @param Pharmacology Name * @desc 'Pharmacology' Sp-Parameter name shown on windows. * @default Pharmacology * * @param MP Cost Rate Name * @desc 'MP Cost Rate' Sp-Parameter name shown on windows. * @default MP Cost * * @param TP Charge Rate Name * @desc 'TP Charge Rate' Sp-Parameter name shown on windows. * @default TP Charge * * @param Physical Damage Name * @desc 'Physical Damage' Sp-Parameter name shown on windows. * @default Physical Damage * * @param Magical Damage Name * @desc 'Magical Damage' Sp-Parameter name shown on windows. * @default Magical Damage * * @param Floor Damage Name * @desc 'Floor Damage' Sp-Parameter name shown on windows. * @default Floor Damage * * @param Experience Rate Name * @desc 'Experience Rate' Sp-Parameter name shown on windows. * @default Exp. Rate * * ============================================================================== * @help * ============================================================================== * Install this plugin above any other Victor Engine plugin. * ============================================================================== * * ============================================================================== * Version History: * ------------------------------------------------------------------------------ * v 1.00 - 2015.11.26 > First release. * v 1.01 - 2015.11.29 > Added function to get database objects. * v 1.02 - 2015.12.07 > Added function to get multiples elements. * > Added check for plugin correct order. * v 1.03 - 2015.12.13 > Added function to get page comments. * v 1.04 - 2015.12.21 > Added function to check only relevant objects. * v 1.05 - 2015.12.25 > Added check to wait bitmap loading. * v 1.06 - 2015.12.31 > Added rgb to hex and hex to rgb functions. * > Added function to get plugins parameters. * v 1.07 - 2016.01.07 > Fixed issue with plugin order checks. * v 1.08 - 2016.01.17 > Added function to get BattleLog method index. * > Added function to insert methods on BattleLog. * v 1.09 - 2016.01.24 > Added function to set wait for animations. * v 1.10 - 2016.02.05 > Added function to get values from regex. * v 1.11 - 2016.02.10 > Added function to capitalize texts. * > Added Plugin Parameter to set trait display names. * v 1.12 - 2016.02.18 > Added function to get parameter names. * v 1.13 - 2016.02.26 > Added functions to setup battler direction. * v 1.14 - 2016.03.15 > Added functions to check opponents. * v 1.15 - 2016.03.18 > Added function for compatibility with YEP. * v 1.16 - 2016.03.23 > Added function to replace mathods. * Added functions for dynamic motions. * v 1.17 - 2016.04.01 > Fixed issue with battler sprite check. * v 1.18 - 2016.04.21 > Fixed issue with damage popup on action user. * v 1.19 - 2016.04.30 > Added function to get evaluated font color. * v 1.20 - 2016.05.12 > Added function to get width of text with escape codes. * v 1.21 - 2016.05.31 > Improved method stack for dynamic motions. * > Added functions for compatibility with Battle Motions. * v 1.22 - 2016.06.26 > Added functions for escape command. * v 1.23 - 2017.05.25 > Added functions for damage formula. * =============================================================================== */ (function () { //============================================================================= // Parameters //============================================================================= VictorEngine.getPluginParameters = function () { var script = document.currentScript || (function () { var scripts = document.getElementsByTagName("script"); return scripts[scripts.length - 1]; })(); var start = script.src.lastIndexOf("/") + 1; var end = script.src.indexOf(".js"); return PluginManager.parameters(script.src.substring(start, end)); }; var parameters = VictorEngine.getPluginParameters(); VictorEngine.Parameters = VictorEngine.Parameters || {}; VictorEngine.Parameters.BasicModule = {}; VictorEngine.Parameters.BasicModule.hit = String( parameters["Hit Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.eva = String( parameters["Evasion Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.cri = String( parameters["Critical Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.cev = String( parameters["Critical Evasion Name"] ).trim(); VictorEngine.Parameters.BasicModule.hev = String( parameters["Magic Evasion Name"] ).trim(); VictorEngine.Parameters.BasicModule.mrf = String( parameters["Magic Reflection Name"] ).trim(); VictorEngine.Parameters.BasicModule.cnt = String( parameters["Counter Attack Name"] ).trim(); VictorEngine.Parameters.BasicModule.hrg = String( parameters["HP Regeneration Name"] ).trim(); VictorEngine.Parameters.BasicModule.mrg = String( parameters["MP Regeneration Name"] ).trim(); VictorEngine.Parameters.BasicModule.trg = String( parameters["TP Regeneration Name"] ).trim(); VictorEngine.Parameters.BasicModule.tgr = String( parameters["Target Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.grd = String( parameters["Guard Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.rec = String( parameters["Recovery Effect Name"] ).trim(); VictorEngine.Parameters.BasicModule.pha = String( parameters["Pharmacology Name"] ).trim(); VictorEngine.Parameters.BasicModule.mcr = String( parameters["MP Cost Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.tcr = String( parameters["TP Charge Rate Name"] ).trim(); VictorEngine.Parameters.BasicModule.pdr = String( parameters["Physical Damage Name"] ).trim(); VictorEngine.Parameters.BasicModule.mdr = String( parameters["Magical Damage Name"] ).trim(); VictorEngine.Parameters.BasicModule.fdr = String( parameters["Floor Damage"] ).trim(); VictorEngine.Parameters.BasicModule.ext = String( parameters["Experience"] ).trim(); //============================================================================= // DataManager //============================================================================= VictorEngine.BasicModule.isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function () { if (!VictorEngine.BasicModule.isDatabaseLoaded.call(this)) return false; VictorEngine.loadParameters(); VictorEngine.loadNotetags(); return ImageManager.isReady(); }; //============================================================================= // VictorEngine //============================================================================= VictorEngine.BasicModule.checkPlugins = function (name, req, ver) { var msg = ""; this.loadedPlugins = this.loadedPlugins || {}; if (ver && req && (!Imported[req] || Number(Imported[req]) < Number(ver))) { msg += "The plugin " + name + " requires the plugin " + req; msg += " v" + ver + " or higher installed to work properly"; if (Number(Imported[req]) < Number(ver)) { msg += ". Your current version is v" + Imported[req]; } msg += ". Go to http://victorenginescripts.wordpress.com/"; msg += " to download the updated plugin."; throw msg; } else if (!ver && req && this.loadedPlugins[req] === true) { msg += "The plugin " + name + " requires the plugin " + req; msg += " to be placed bellow it. Open the Plugin Manager and place"; msg += " the plugins in the correct order."; throw msg; } else if ( req && Imported["VE - Basic Module"] && !this.loadedPlugins["VE - Basic Module"] ) { msg += "The plugin " + name + " must be placed bellow the plugin " + req; msg += ". Open the Plugin Manager and place"; msg += " the plugins in the correct order."; throw msg; } else { this.loadedPlugins[name] = true; } }; VictorEngine.loadNotetags = function () { if (VictorEngine.BasicModule.loaded) return; VictorEngine.BasicModule.loaded = true; var list = [ $dataActors, $dataClasses, $dataSkills, $dataItems, $dataWeapons, $dataArmors, $dataEnemies, $dataStates, ]; list.forEach(function (objects, index) { this.processNotetags(objects, index); }, this); }; VictorEngine.processNotetags = function (objects, index) { objects.forEach(function (data) { if (data) { this.loadNotetagsValues(data, index); } }, this); }; VictorEngine.objectSelection = function (index, list) { var objects = [ "actor", "class", "skill", "item", "weapon", "armor", "enemy", "state", ]; return list.contains(objects[index]); }; VictorEngine.loadNotetagsValues = function (data, index) {}; VictorEngine.loadParameters = function () {}; VictorEngine.getNotesValues = function (value1, value2) { value2 = value2 || value1; return new RegExp("<" + value1 + ">([\\s\\S]*?)<\\/" + value2 + ">", "gi"); }; VictorEngine.getPageNotes = function (event) { var result = event instanceof Game_CommonEvent || event.page(); if (!result || !event.list()) { return ""; } return event.list().reduce(function (r, cmd) { var valid = cmd.code === 108 || cmd.code === 408; var comment = valid ? cmd.parameters[0] + "\r\n" : ""; return r + comment; }, ""); }; VictorEngine.getAllElements = function (subject, action) { if (action.item().damage.elementId < 0) { return subject.attackElements(); } else { return [action.item().damage.elementId]; } }; VictorEngine.getAllStates = function (subject, item) { var result; return item.effects.reduce(function (r, effect) { if (effect.code === 21) { if (effect.dataId === 0) { result = subject.attackStates(); } else { result = [effect.dataId]; } } else { result = []; } return r.concat(result); }, []); }; VictorEngine.getDamageFormula = function (action) { return action.item().damage.formula; }; VictorEngine.getNumberValue = function (match, type, base) { var regex = new RegExp(type + "[ ]*:[ ]*([+-.\\d]+)", "gi"); var value = regex.exec(match); return value ? Number(value[1]) : base; }; VictorEngine.getStringValue = function (match, type, base) { var regex = new RegExp(type + "[ ]*:[ ]*([\\w ]+)", "gi"); var value = regex.exec(match); return value ? value[1].trim() : base; }; VictorEngine.getAnyValue = function (match, type, base) { var regex = new RegExp(type + "[ ]*:[ ]*('[^']+'|\"[^\"]+\")", "gi"); var value = regex.exec(match); return value ? value[1].slice(1, -1) : base; }; VictorEngine.getNumberValues = function (match, type) { var regex = new RegExp(type + "[ ]*:[ ]*((?:[+-.\\d]+[ ]*,?[ ]*)+)", "gi"); var value = regex.exec(match); var result = value ? value[1].match(/\d+/gi) : []; return result.map(function (id) { return Number(id); }); }; VictorEngine.getStringValues = function (match, type) { var regex = new RegExp(type + "[ ]*:[ ]*((?:[\\w ]+[ ]*,?[ ]*)+)", "gi"); var value = regex.exec(match); var result = value ? value[1].match(/\d+/gi) : []; return result.map(function (id) { return value[1].trim(); }); }; VictorEngine.captalizeText = function (text) { return text.replace(/(?:^|\s)\S/g, function (a) { return a.toUpperCase(); }); }; VictorEngine.replaceZeros = function (text, value) { value = value || ""; return text.replace(/\b(0(?!\b))+/g, function (a) { return a.replace(/0/g, value); }); }; VictorEngine.rgbToHex = function (r, g, b) { r = Math.floor(r).toString(16).padZero(2); g = Math.floor(g).toString(16).padZero(2); b = Math.floor(b).toString(16).padZero(2); return "#" + r + g + b; }; VictorEngine.hexToRgb = function (hex) { var r = parseInt(hex[1] + hex[2], 16); var g = parseInt(hex[3] + hex[4], 16); var b = parseInt(hex[5] + hex[6], 16); return [r, g, b]; }; VictorEngine.methodIndex = function (methods, name) { for (var i = 0; i < methods.length; i++) { if (methods[i] && methods[i].name === name) { return i; } } return null; }; VictorEngine.removeMethod = function (methods, name) { var index = this.methodIndex(methods, name); if (index || index === 0) { methods.splice(index, 1); } }; VictorEngine.insertMethod = function (methods, index, name, params) { if (index || index === 0) { methods.splice(index, 0, { name: name, params: params, }); } }; VictorEngine.replaceMethod = function (methods, index, name, params) { if (index || index === 0) { methods.splice(index, 1, { name: name, params: params, }); } }; VictorEngine.waitAnimation = function (animationId) { var animation = $dataAnimations[animationId]; return animation ? animation.frames.length * 4 + 1 : 0; }; VictorEngine.params = function () { return ["hp", "mp", "atk", "def", "mat", "mdf", "agi", "luk"]; }; VictorEngine.xparams = function () { return [ "hit", "eva", "cri", "cev", "mev", "mrf", "cnt", "hrg", "mrg", "trg", ]; }; VictorEngine.sparams = function () { return [ "tgr", "grd", "rec", "pha", "mcr", "tcr", "prd", "mrd", "frd", "exr", ]; }; VictorEngine.allParams = function () { return this.params().concat(this.xparams(), this.sparams()); }; VictorEngine.paramName = function (paramId) { return this.params()[paramId]; }; VictorEngine.xparamName = function (xparamId) { return this.xparams()[xparamId]; }; VictorEngine.sparamName = function (sparamId) { return this.sparams()[sparamId]; }; VictorEngine.paramId = function (paramName) { return this.params().indexOf(paramName.toLowerCase()); }; VictorEngine.paramText = function (name) { switch (name.toLowerCase()) { case "hit": case "eva": case "cri": case "cev": case "mev": case "mrf": case "cnt": case "hrg": case "mrg": case "trg": case "tgr": case "grd": case "rec": case "pha": case "mcr": case "tcr": case "pdr": case "mdr": case "fdr": case "ext": return this.Parameters.BasicModule[name.toLowerCase()]; case "hp": case "atk": case "def": case "agi": case "mp": case "mat": case "mdf": case "luk": var paramId = this.params().indexOf(name.toLowerCase()); return TextManager.param(paramId); default: return this.captalizeText(name.toLowerCase()); } }; VictorEngine.battlerIndex = function (battler) { if ( battler && battler.isActor() && $gameParty.members().contains(battler) ) { return 1 + $gameParty.members().indexOf(battler); } else if ( battler && battler.isEnemy() && $gameTroop.members().contains(battler) ) { return ( 1 + $gameParty.maxBattleMembers() + $gameTroop.members().indexOf(battler) ); } else { return 0; } }; VictorEngine.battleSprites = function (spriteId) { return this._battleSprites[spriteId]; }; VictorEngine.addBattleSprite = function (spriteId, sprite) { this._battleSprites = this._battleSprites || {}; this._battleSprites[spriteId] = sprite; }; //============================================================================= // BattleManager //============================================================================= BattleManager.updateStackAction = function (index, subject, target) { this._logWindow.saveMethodsStack(index); this.clearTargets(target); this.invokeAction(subject, target); this._logWindow.restoreMethodsStack(index); }; BattleManager.clearTargets = function (target) { for (var i = 0; i < this._targets.length; i++) { if (this._targets[i] === target) { this._targets.splice(i, 1); i--; } } }; BattleManager.clearActionTargets = function () { this._targets = []; }; BattleManager.prepareAction = function (subject, action, targets, skip) { this._phase = "action"; this._subject = subject; this._action = action; this._targets = targets; if (skip) { subject.useItem(action.item()); } this._action.applyGlobal(); this.refreshStatus(); }; BattleManager.startCounterAction = function ( subject, target, targets, action ) { if (targets.length > 0) { this._isCounterAttack = true; this._counterSubject = subject; this._counterTarget = target; this.prepareAction(subject, action, targets); this._logWindow.startCounterAction(subject, action, targets); } }; BattleManager.averageTargetsPositions = function (targets) { var x = targets.reduce(function (r, member) { return r + member.screenX(); }, 0) / targets.length; var y = targets.reduce(function (r, member) { return r + member.screenX(); }, 0) / targets.length; return { x: x, y: y, }; }; BattleManager.isSurprise = function () { return this._surprise; }; BattleManager.isPreemptive = function () { return this._preemptive; }; //============================================================================= // SceneManager //============================================================================= SceneManager.sceneSpriteset = function () { return this._scene ? this._scene._spriteset : null; }; //============================================================================= // Window_Base //============================================================================= Window_Base.prototype.getFontColor = function (color) { if (color.match(/^\#[abcdef\d]{6}/i)) { return '"' + color + '"'; } else { return color; } }; //============================================================================= // Game_Action //============================================================================= Game_Action.prototype.setEscape = function () { var action = { name: TextManager.escape, speed: 9999, escape: true, }; this._escapeAction = action; }; Game_Action.prototype.isEscape = function () { return !!this._escapeAction; }; //============================================================================= // Game_Unit //============================================================================= Game_Unit.prototype.averageX = function () { return ( this.aliveMembers().reduce(function (r, member) { return r + member.screenX(); }, 0) / this.aliveMembers().length ); }; Game_Unit.prototype.averageY = function () { return ( this.aliveMembers().reduce(function (r, member) { return r + member.screenY(); }, 0) / this.aliveMembers().length ); }; //============================================================================= // Game_Player //============================================================================= Game_Player.prototype.follower = function (index) { return index === 0 ? this : this.followers().follower(index - 1); }; //============================================================================= // Game_BattlerBase //============================================================================= Game_BattlerBase.prototype.screenX = function () { return this.spriteScreenX() || this._screenX || 0; }; Game_BattlerBase.prototype.screenY = function () { return this.spriteScreenY() || this._screenY || 0; }; Game_BattlerBase.prototype.homeX = function () { return this.battleSprite() ? this.battleSprite().homeX() : 0; }; Game_BattlerBase.prototype.homeY = function () { return this.battleSprite() ? this.battleSprite().homeY() : 0; }; Game_BattlerBase.prototype.spriteScreenX = function () { return this.battleSprite() ? this.battleSprite().screenX() : 0; }; Game_BattlerBase.prototype.spriteScreenY = function () { return this.battleSprite() ? this.battleSprite().screenY() : 0; }; Game_BattlerBase.prototype.mainSprite = function () { return this.battleSprite() ? this.battleSprite().mainSprite() : null; }; Game_BattlerBase.prototype.friends = function () { return this.isActor() ? $gameParty : $gameTroop; }; Game_BattlerBase.prototype.opponents = function () { return this.isEnemy() ? $gameParty : $gameTroop; }; Game_BattlerBase.prototype.isOpponent = function (battler) { return this.isEnemy() === !battler.isEnemy(); }; Game_BattlerBase.prototype.idleMotions = function () { return [ "wait", "idle", "dying", "abnormal", "guard", "chant", "sleep", "victory", "dead", ]; }; Game_BattlerBase.prototype.isIdleMotion = function (motionType) { return this.idleMotions().contains(motionType); }; Game_BattlerBase.prototype.isFacingDown = function () { return this.battlerDirection() === "down"; }; Game_BattlerBase.prototype.isFacingLeft = function () { return this.battlerDirection() === "left"; }; Game_BattlerBase.prototype.isFacingRight = function () { return this.battlerDirection() === "right"; }; Game_BattlerBase.prototype.isFacingUp = function () { return this.battlerDirection() === "up"; }; Game_BattlerBase.prototype.isFacingHorizontal = function () { return this.isFacingLeft() || this.isFacingRight(); }; Game_BattlerBase.prototype.isFacingVertical = function () { return this.isFacingDown() || this.isFacingUp(); }; Game_BattlerBase.prototype.turnDown = function () { this._battlerDirection = "down"; }; Game_BattlerBase.prototype.turnLeft = function () { this._battlerDirection = "left"; }; Game_BattlerBase.prototype.turnRight = function () { this._battlerDirection = "right"; }; Game_BattlerBase.prototype.turnUp = function () { this._battlerDirection = "up"; }; Game_BattlerBase.prototype.turnBack = function () { if (this.isFacingLeft()) { this.turnRight(); } else if (this.isFacingRight()) { this.turnLeft(); } }; Game_BattlerBase.prototype.turnTowardCenter = function () { this.turnTowardPosition(Graphics.boxWidth / 2, Graphics.boxHeight / 2); }; Game_BattlerBase.prototype.turnAwayFromCenter = function () { this.turnAwayFromPosition(Graphics.boxWidth / 2, Graphics.boxHeight / 2); }; Game_BattlerBase.prototype.turnTowardOpponents = function () { this.turnTowardPosition( this.opponents().averageX(), this.opponents().averageY() ); }; Game_BattlerBase.prototype.turnAwayFromOpponents = function () { this.turnAwayFromPosition( this.opponents().averageX(), this.opponents().averageY ); }; Game_BattlerBase.prototype.turnTowardTargets = function (targets) { var position = BattleManager.averageTargetsPositions(targets); this.turnTowardPosition(position.x, position.y); }; Game_BattlerBase.prototype.turnAwayFromTargets = function (targets) { var position = BattleManager.averageTargetsPositions(targets); this.turnAwayFromPosition(position.x, position); }; Game_BattlerBase.prototype.turnTowardPosition = function ( positionX, positionY ) { if (this.screenX() < positionX) { this.turnRight(); } else if (this.screenX() > positionX) { this.turnLeft(); } }; Game_BattlerBase.prototype.turnAwayFromPosition = function ( positionX, positionY ) { if (this.screenX() < positionX) { this.turnLeft(); } else if (this.screenX() > positionX) { this.turnRight(); } }; Game_BattlerBase.prototype.isBehind = function (target) { return ( (target.isFacingRight() && this.screenX() < target.screenX()) || (target.isFacingLeft() && this.screenX() > target.screenX()) ); }; Game_BattlerBase.prototype.isSpriteEffecting = function () { return this.battleSprite() && this.battleSprite().isEffecting(); }; Game_BattlerBase.prototype.isSpriteMoving = function () { return this.battleSprite() && this.battleSprite().isMoving(); }; Game_BattlerBase.prototype.isSpriteAnimation = function () { return this.battleSprite() && this.battleSprite().isAnimationPlaying(); }; Game_BattlerBase.prototype.isAnimatedBattler = function () { return this.battleSprite() && this.battleSprite().isAnimatedBattler(); }; Game_BattlerBase.prototype.isStaticBattler = function () { return this.battleSprite() && this.battleSprite().isStaticBattler(); }; Game_BattlerBase.prototype.inHomePosition = function () { return this.battleSprite() && this.battleSprite().inHomePosition(); }; Game_BattlerBase.prototype.notIinHomePosition = function () { return !this.inHomePosition(); }; Game_BattlerBase.prototype.isCounterAttack = function () { return this._counterAttack; }; Game_BattlerBase.prototype.startCounterAttack = function () { this._counterAttack = true; }; Game_BattlerBase.prototype.endCounterAttack = function () { this._counterAttack = false; }; Game_BattlerBase.prototype.battleSprite = function () { return VictorEngine.battleSprites(this.spriteId()); }; Game_BattlerBase.prototype.setBattleSprite = function (sprite) { VictorEngine.addBattleSprite(this.spriteId(), sprite); }; Game_BattlerBase.prototype.clearBattleSprite = function () { VictorEngine.addBattleSprite(this.spriteId(), null); }; Game_BattlerBase.prototype.addNewAction = function (action) { this._actions.unshift(action); }; Game_BattlerBase.prototype.startEscapeCommand = function () { this._isEscapeCommand = true; }; Game_BattlerBase.prototype.endEscapeCommand = function () { this._isEscapeCommand = false; }; Game_BattlerBase.prototype.isEscapeCommand = function () { return this._isEscapeCommand; }; //============================================================================= // Game_Battler //============================================================================= VictorEngine.BasicModule.onBattleEnd = Game_Battler.prototype.onBattleEnd; Game_Battler.prototype.onBattleEnd = function () { VictorEngine.BasicModule.onBattleEnd.call(this); this.clearBattleSprite(); }; //============================================================================= // Game_Actor //============================================================================= Game_Actor.prototype.battlerDirection = function () { return this._battlerDirection || "left"; }; Game_Actor.prototype.spriteId = function () { return "actor " + String(this.actorId()); }; //============================================================================= // Game_Enemy //============================================================================= Game_Enemy.prototype.battlerDirection = function () { return ( this._battlerDirection || ($gameSystem.isSideView() ? "right" : "left") ); }; Game_Enemy.prototype.attackAnimationId1 = function () { return 0; }; Game_Enemy.prototype.attackAnimationId2 = function () { return 0; }; Game_Enemy.prototype.spriteId = function () { return "enemy " + String(this.index()); }; //============================================================================= // Sprite_Battler //============================================================================= Object.defineProperties(Sprite_Battler.prototype, { z: { get: function () { return 3; }, configurable: true, }, h: { get: function () { return this.spriteZ(); }, configurable: true, }, }); Sprite_Battler.prototype.isEnemy = function () { return this._battler && this._battler.isEnemy(); }; Sprite_Battler.prototype.isVisible = function () { return this.visible && this.opacity > 0; }; Sprite_Battler.prototype.isDamagePopup = function () { return this._damages.length > 0; }; Sprite_Battler.prototype.isDisabledMotion = function () { var motion = Sprite_Actor.MOTIONS; return this._motion === motion["dead"] || this._motion === motion["sleep"]; }; Sprite_Battler.prototype.isAnimatedBattler = function () { return false; }; Sprite_Battler.prototype.isStaticBattler = function () { return false; }; Sprite_Battler.prototype.spriteZ = function () { return this.screenY(); }; Sprite_Battler.prototype.screenX = function () { return this._homeX + this._offsetX; }; Sprite_Battler.prototype.screenY = function () { return this._homeY + this._offsetY; }; Sprite_Battler.prototype.homeX = function () { return this._homeX; }; Sprite_Battler.prototype.homeY = function () { return this._homeY; }; Sprite_Battler.prototype.mainSprite = function () { return this._mainSprite; }; Sprite_Battler.prototype.noEntryMove = function () { return this._battler && !this._battler.canMove(); }; Sprite_Battler.prototype.center = function () { var sprite = this._mainSprite ? this._mainSprite : this; var x = sprite._frame.width / 2 || 0; var y = sprite._frame.height / 2 || 0; return { x: x, y: y, }; }; //============================================================================= // Sprite_Actor //============================================================================= Sprite_Actor.prototype.updateBattlerDirection = function () { if (this._battler && !this.isDisabledMotion()) { if ( (this._battler.isFacingLeft() && this.scale.x < 0) || (this._battler.isFacingRight() && this.scale.x > 0) ) { this.scale.x *= -1; } } }; //============================================================================= // Sprite_Enemy //============================================================================= Sprite_Enemy.prototype.updateBattlerDirection = function () { if (this._battler && !this.isDisabledMotion()) { if ( (this._battler.isFacingLeft() && this.scale.x > 0) || (this._battler.isFacingRight() && this.scale.x < 0) ) { this.scale.x *= -1; } } }; Sprite_Enemy.prototype.isStaticBattler = function () { return true; }; //============================================================================= // Sprite_Damage //============================================================================= Object.defineProperties(Sprite_Damage.prototype, { z: { get: function () { return 10; }, configurable: true, }, }); //============================================================================= // Spriteset_Battle //============================================================================= VictorEngine.BasicModule.setBattler = Sprite_Battler.prototype.setBattler; Sprite_Battler.prototype.setBattler = function (battler) { VictorEngine.BasicModule.setBattler.call(this, battler); if (battler) { battler.setBattleSprite(this); } }; Spriteset_Battle.prototype.sortBattleSprites = function () { if (this._sortChildrenFrame !== Graphics.frameCount) { this._battleField.children.sort(this.compareBattleSprites.bind(this)); this._sortChildrenFrame = Graphics.frameCount; } }; Spriteset_Battle.prototype.compareBattleSprites = function (a, b) { if ((a.z || 0) !== (b.z || 0)) { return (a.z || 0) - (b.z || 0); } else if ((a.h || 0) !== (b.h || 0)) { return (a.h || 0) - (b.h || 0); } else if ((a.y || 0) !== (b.y || 0)) { return (a.y || 0) - (b.y || 0); } else { return a.spriteId - b.spriteId; } }; //============================================================================= // Window_Base //============================================================================= Window_Base.prototype.textWidthEx = function (text) { if (text) { var state = { index: 0, x: 0, }; state.text = this.convertEscapeCharacters(text); while (state.index < state.text.length) { this.processCharacter(state); } return state.x; } else { return 0; } }; //============================================================================= // Window_BattleLog //============================================================================= Window_BattleLog.prototype.waitForBattleAnimation = function ( animationId, speed ) { var speed = Math.max(speed, 1) || 1; this.waitForTime(VictorEngine.waitAnimation(animationId) / speed); }; Window_BattleLog.prototype.startCounterAction = function ( subject, action, targets ) { this.push("addText", TextManager.counterAttack.format(subject.name())); this.startAction(subject, action, targets); }; Window_BattleLog.prototype.waitForTime = function (time) { this._waitCount = time; }; Window_BattleLog.prototype.setupStartAction = function ( subject, action, targets ) { if (this._setupStartActionFrame !== Graphics.frameCount) { VictorEngine.removeMethod(this._methods, "showAnimation"); VictorEngine.removeMethod(this._methods, "waitForBattleAnimation"); this.push("prepareAction", subject, action, targets); this._setupStartActionFrame = Graphics.frameCount; } }; Window_BattleLog.prototype.initializeMethodsStack = function () { this._stackWaitCount = []; this._stackWaitMode = []; this._methodsStack = []; this._stackIndex = 0; }; Window_BattleLog.prototype.prepareAction = function ( subject, action, targets ) { this.uniqueTargets(targets).forEach(function (unique) { this._stackIndex = VictorEngine.battlerIndex(unique.target); this.prepareUniqueAction(subject, action, unique.target, unique.repeat); }, this); this._stackIndex = 0; }; Window_BattleLog.prototype.prepareUniqueAction = function ( subject, action, target, repeat ) { this.prepareUniqueActionStep1(subject, action, target, repeat); this.prepareUniqueActionStep2(subject, action, target, repeat); this.prepareUniqueActionStep3(subject, action, target, repeat); }; Window_BattleLog.prototype.prepareUniqueActionStep1 = function ( subject, action, target, repeat ) { var item = action.item(); this.push("showAnimation", subject, [target], item.animationId); }; Window_BattleLog.prototype.prepareUniqueActionStep2 = function ( subject, action, target, repeat ) { var item = action.item(); var animId = this.uniqueActionAnimationId(subject, item); this.push("waitForBattleAnimation", animId); }; Window_BattleLog.prototype.prepareUniqueActionStep3 = function ( subject, action, target, repeat ) { for (var i = 0; i < repeat; i++) { if (i > 0) { this.push("waitForTime", 1); } this.push("updateStackAction", this._stackIndex, subject, target); } }; Window_BattleLog.prototype.uniqueActionAnimationId = function ( subject, item ) { if (item.animationId < 0) { return subject.attackAnimationId1(); } else { return item.animationId; } }; Window_BattleLog.prototype.uniqueTargets = function (targets) { var repeats = []; targets.forEach(function (target, i) { var index = targets.indexOf(target); if (index === i) { repeats[index] = { target: target, repeat: 1, }; } else { repeats[index].repeat++; } }); return repeats.filter(function (repeat) { return !!repeat; }); }; Window_BattleLog.prototype.updateMethodsStack = function () { var methods = this._methodsStack; for (var i = 0; i < methods.length; i++) { if (methods[i] && methods[i].length > 0) { while (methods[i].length > 0 && !this.updateStackWait(i)) { this.callNextStackMethod(i); } } } if (this.isStackEmpty()) { this._methodsStack = []; } }; Window_BattleLog.prototype.isStackEmpty = function () { return this._methodsStack.every(function (methods) { return !methods || methods.length === 0; }); }; Window_BattleLog.prototype.stackBattler = function (index) { if (index > 0) { var max = $gameParty.maxBattleMembers(); if (index > max) { return $gameTroop.members()[index - max - 1]; } else { return $gameParty.members()[index - 1]; } } else { return null; } }; Window_BattleLog.prototype.callNextStackMethod = function (index) { var method = this._methodsStack[index].shift(); if (method.name && this[method.name]) { this[method.name].apply(this, method.params); } else { throw new Error("Method not found: " + method.name); } }; Window_BattleLog.prototype.saveMethodsStack = function (index) { this._saveStackIndex = this._stackIndex; this._saveMethodsStack = this._methodsStack[index].clone(); this._stackIndex = index; this._methodsStack[index] = []; }; Window_BattleLog.prototype.restoreMethodsStack = function (index) { this._methodsStack[index] = this._methodsStack[index].concat( this._saveMethodsStack ); this._stackIndex = this._saveStackIndex; }; Window_BattleLog.prototype.methodStackActive = function () { return this._methodsStack.length > 0; }; Window_BattleLog.prototype.updateStackAction = function ( index, subject, target ) { BattleManager.updateStackAction(index, subject, target); }; Window_BattleLog.prototype.pushMethodsStack = function (methodName) { var index = this._stackIndex || 0; var methodArgs = Array.prototype.slice.call(arguments, 1); if (methodName === "wait") { methodName = "stackWait"; methodArgs.unshift(index); } else if (methodName === "waitForTime") { methodName = "stackWaitForTime"; methodArgs.unshift(index); } else if (methodName === "waitForBattleAnimation") { methodName = "stackWaitFoAnimation"; methodArgs.unshift(index); } else if (methodName === "updateWaitMode") { methodName = "updateStackWaitMode"; methodArgs.unshift(index); } else if (methodName === "setWaitMode") { methodName = "setStackWaitMode"; methodArgs.unshift(index); } this._methodsStack[index] = this._methodsStack[index] || []; this._methodsStack[index].push({ name: methodName, params: methodArgs, }); }; Window_BattleLog.prototype.updateStackWait = function (index) { return this.updateStackWaitCount(index) || this.updateStackWaitMode(index); }; Window_BattleLog.prototype.updateStackWaitCount = function (index) { if (this._stackWaitCount[index] && this._stackWaitCount[index] > 0) { this._stackWaitCount[index]--; return true; } return false; }; Window_BattleLog.prototype.stackWait = function (index) { this.stackWaitForTime(index, this.messageSpeed()); }; Window_BattleLog.prototype.stackWaitFoAnimation = function ( index, animationId, speed ) { var speed = Math.max(speed, 1) || 1; this.stackWaitForTime( index, VictorEngine.waitAnimation(animationId) / speed ); }; Window_BattleLog.prototype.stackWaitForTime = function (index, time) { this._stackWaitCount[index] = time; }; Window_BattleLog.prototype.updateStackWaitMode = function (index) { var battler = this.stackBattler(index); var waitMode = this._stackWaitMode[index] || []; if (waitMode.contains("effect")) { var waiting = battler ? battler.isSpriteEffecting() : this._spriteset.isEffecting(); if (waiting) { return true; } else { this.removeWaitMode(index, "effect"); } } if (waitMode.contains("movement")) { var waiting = battler ? battler.isSpriteMoving() : this._spriteset.isAnyoneMoving(); if (waiting) { return true; } else { this.removeWaitMode(index, "movement"); } } this._stackWaitMode[index] = []; return false; }; Window_BattleLog.prototype.setStackWaitMode = function (index, waitMode) { this._stackWaitMode[index] = this._stackWaitMode[index] || []; if (!this._stackWaitMode[index].contains(waitMode)) { this._stackWaitMode[index].push(waitMode); } }; Window_BattleLog.prototype.removeWaitMode = function (index, waitMode) { this._stackWaitMode[index] = this._stackWaitMode[index] || []; var waitIndex = this._stackWaitMode[index].indexOf(waitMode); this._stackWaitMode[index].splice(waitIndex, 1); }; Window_BattleLog.prototype.startEscape = function (subject, action) { subject._isEscapeCommand = true; }; Window_BattleLog.prototype.performEscape = function (subject) { $gameParty._skipClear = true; BattleManager.processEscape(); $gameParty._skipClear = false; }; Window_BattleLog.prototype.setupCurrentAction = function ( subject, action, targets ) {}; })();