/*============================================================================ * ## Plugin Info *---------------------------------------------------------------------------- * # Plugin Name * DoubleX RMMV Item Cooldown *---------------------------------------------------------------------------- * # Introduction * Suppose a battler has n action slots(that battler can input n actions * in a single turn), and suppose that battler has inputted n actions, * each needing xi turns to be cooled down, where 1 <= i <= n, then that * battler will behave as follows: * 1. At turn y, that battler has inputted the aforementioned n actions * 2. At turn y, that battler will execute the 1st inputted action * 3. At turn y + x1, that battler will execute the 2nd inputted action * 4. At turn y + x1 + x2, that battler will execute the 3rd inputted * action * 5. At turn y + x1 + x2 + x3, that battler will execute the 4th * inputted action * 6. At turn y + x1 + x2 + x3 + ... + xi, where 1 <= i <= n, that * battler will execute the (i + 1)th inputted action * 7. At turn y + x1 + x2 + x3 + ... + x(n - 1), that battler will * execute the nth inputted action * 8. At turn y + x1 + x2 + x3 + ... + xn, that battler will become able * to input actions again * If the ith action that's not executed yet is the 1st one needing * cooling down, the battler speed will only take the first ith actions' * speeds into account * Forced actions themselves don't cause their users to cooldown *---------------------------------------------------------------------------- * # Terms Of Use * 1. Commercial use's always allowed and crediting me's always optional. * 2. You shall keep this plugin's Plugin Info part's contents intact. * 3. You shalln't claim that this plugin's written by anyone other than * DoubleX or my aliases. I always reserve the right to deny you from * using any of my plugins anymore if you've violated this. * 4. CC BY 4.0, except those conflicting with any of the above, applies * to this plugin, unless you've my permissions not needing follow so. * 5. I always reserve the right to deny you from using this plugin * anymore if you've violated any of the above. *---------------------------------------------------------------------------- * # Prerequisites * Abilities: * 1. Nothing special for most ordinary use cases * 2. Little RMMV plugin development proficiency to fully utilize this *---------------------------------------------------------------------------- * # Links * This plugin: * 1. [url]http://pastebin.com/Pvn5Vpfe[/url] * Video: * 1. [url]https://www.youtube.com/watch?v=t7LSw2qfkcs[/url] * Mentioned Patreon Supporters: * [url]https://www.patreon.com/posts/71738797[/url] *---------------------------------------------------------------------------- * # Author * DoubleX *---------------------------------------------------------------------------- * # Changelog * v1.00a(GMT 1400 28-8-2016): * 1. 1st version of this plugin finished *============================================================================*/ /*: * @plugindesc Lets you set skills/items causing users to cooldown after using * @author DoubleX * * @param isEnabled * @desc Sets whether this plugin will be enabled * It'll be stored as a boolean, and will be regarded as true if and only * if it's true * Don't change this during the same battle unless you really know what * you're truly foing * E.g.: Setting isEnabled as false will disable this plugin * @default true * * @param textColor * @desc Sets the text color of the text showing the number of turns needed to * cooldown the skill/item user on the skill/item window * It'll be stored as a Number * Don't change this when it's shown to ensure proper text displays * E.g.: Setting textColor as 26 will set the text color of the text * showing the number of turns needed to cooldown the skill/item * user on the skill/item window as 26 * @default 19 * * @help * The skill/item window cooldown turn display can be problematic if the * number of turn's 1000 or above * The default plugin file name is DoubleX RMMV Item Cooldown v100a * If you want to change that, you must edit the value of * DoubleX_RMMV.Item_Cooldown_File, which must be done via opening this plugin * js file directly *============================================================================ * ## Notetag Info *---------------------------------------------------------------------------- * # Skill/Item Notetags: * 1. <item cooldown: turns> * - Sets the number of turns needed to cooldown the skill/item user * after using it as turns * - E.g.: * <item cooldown: 1> will set the number of turns needed to * cooldown the skill/item user after using it as 1 * - Only the 1st notetag will be used *============================================================================ * ## Plugin Call Info *---------------------------------------------------------------------------- * # Configuration manipulations * 1. $gameSystem.itemCooldown.param * - Returns the stored value of param listed in the plugin manager * - E.g.: * $gameSystem.itemCooldown.textColor will return the stored value * of parameter textColor shown on the plugin manager * 2. $gameSystem.itemCooldown.param = val * - Sets the stored value of param listed in plugin manager as val * - E.g.: * $gameSystem.itemCooldown.isEnabled = false will set the stored * value of parameter isEnabled shown on the plugin manager as false * - All $gameSystem.itemCooldown.param changes will be saved * # Skill/Item notetag manipulations * 1. meta.itemCooldown * - Returns the <item cooldown: turns> notetag value turns as a * Number * - E.g.: * $dataSkills[1].meta.itemCooldown will return the * <item cooldown: turns> notetag value of skill with id 1 * 2. meta.itemCooldown = turns * - Sets the <item cooldown: turns> notetag value turns as a Number * - E.g.: * $dataItems[2].meta.itemCooldown = 0 will set the * <item cooldown: turns> notetag value of item with id 2 as 0 * - All meta.itemCooldown changes can be saved if * DoubleX RMMV Dynamic Data is used *============================================================================ */ var DoubleX_RMMV = DoubleX_RMMV || {}; DoubleX_RMMV['Item Cooldown'] = 'v1.00a'; // The plugin file name must be the same as DoubleX_RMMV.Item_Cooldown_File DoubleX_RMMV.Item_Cooldown_File = 'DoubleX RMMV Item Cooldown v100a'; /*============================================================================ * ## Plugin Implementations * You need not edit this part as it's about how this plugin works *---------------------------------------------------------------------------- * # Plugin Support Info: * 1. Prerequisites * - Basic knowledge on the default RMMV battle flow implementations * - Some RMMV plugin development proficiency to fully comprehend this *----------------------------------------------------------------------------*/ DoubleX_RMMV.Is_Item_Cooldown_Notes_Loaded = false; // v1.00a - v1.00a DoubleX_RMMV.Item_Cooldown_Params = { // v1.00a - v1.00a isEnabled: 'Boolean', // Marks that isEnabled is a Boolean textColor: 'Number', // Marks that textColor is a Number Boolean: function(param) { return param === 'true'; }, // Boolean Number: function(param) { return +param; } // Number }; // DoubleX_RMMV.Item_Cooldown_Params (function(IC) { 'use strict'; IC.DataManager = {}; var DM = IC.DataManager; DM.isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { // Extended; v1.00a - v1.00a // Rewritten to read all notetags of this plugin as well return DM.isDatabaseLoaded.apply(this, arguments) && DM.loadAllNotes(); // }; // DataManager.isDatabaseLoaded /* Reads all notetags of this plugin from the database * Return: True * Functional cohesion/Message coupling/Idempotent */ DM.loadAllNotes = function() { // New; v1.00a - v1.00a // Ensures the notetags will only be read exactly once upon game start if (DoubleX_RMMV.Is_Item_Cooldown_Notes_Loaded) return true; [$dataSkills, $dataItems].forEach(function(type) { type.forEach(function(data) { if (data) DM.loadNotes(data); }); }); DoubleX_RMMV.Is_Item_Cooldown_Notes_Loaded = true; // return true; }; // DM.loadAllNotes /* Reads all notetags of this plugin from a dataum of the database * (Object)datum: The datum to have its notetags of this plugin read * Functional cohesion/Data coupling/Idempotent */ DM.loadNotes = function(datum) { // New; v1.00a - v1.00a var regExp = /< *item +cooldown *: *(\d+) *>/i; var lines = datum.note.split(/[\r\n]+/); for (var index = 0, length = lines.length; index < length; index++) { if (!lines[index].match(regExp)) continue; return datum.meta.itemCooldown = +RegExp.$1; } datum.meta.itemCooldown = 0; // The default's not needing charging }; // DM.loadNotes IC.BattleManager = {}; var BM = IC.BattleManager; BM.makeActionOrders = BattleManager.makeActionOrders; BattleManager.makeActionOrders = function() { // Rewritten; v1.00a - v1.00a var battlers = []; // Rewritten to exclude battlers still cooling down if (!this._surprise) { battlers = battlers.concat(GU.nonItemCooldownMems.call($gameParty)); } if (!this._preemptive) { battlers = battlers.concat(GU.nonItemCooldownMems.call($gameTroop)); } // battlers.forEach(function(battler) { battler.makeSpeed(); }); battlers.sort(function(a, b) { return b.speed() - a.speed(); }); this._actionBattlers = battlers; }; // BattleManager.makeActionOrders BM.startTurn = BattleManager.startTurn; BattleManager.startTurn = function() { // Extended; v1.00a - v1.00a BM.updateItemCooldown(); // Added BM.startTurn.apply(this, arguments); }; // BattleManager.startTurn BM.endAction = BattleManager.endAction; BattleManager.endAction = function() { // Extended; v1.00a - v1.00a BM.endAction.apply(this, arguments); // Added to mark the number of turns for the battler to cooldown if (!$gameSystem.itemCooldown.isEnabled) return; this._subject.itemCooldown = this._action.item().meta.itemCooldown; // }; // BattleManager.endAction /* Updates the remaining cooldown turns of all battlers * Functional cohesion/Message coupling */ BM.updateItemCooldown = function() { // New; v1.00a - v1.00a GU.updateItemCooldown.call($gameParty); GU.updateItemCooldown.call($gameTroop); }; // BM.updateItemCooldown IC.Game_System = {}; var GS = IC.Game_System; /*------------------------------------------------------------------------ * New public instance variable *------------------------------------------------------------------------*/ // itemCooldown: The container of all parameters shown on the plugin manger GS.initialize = Game_System.prototype.initialize; Game_System.prototype.initialize = function() { // Extended; v1.00a - v1.00a GS.initialize.apply(this, arguments); GS.initializeItemCooldown.call(this); // Added }; // Game_System.prototype.initialize /* Initializes all parameters of this plugin shown on the plugin manager * Functional cohesion/Message coupling/Idempotent */ GS.initializeItemCooldown = function() { // New; v1.00a - v1.00a this.itemCooldown = {}; var params = PluginManager.parameters(DoubleX_RMMV.Item_Cooldown_File); var ICP = DoubleX_RMMV.Item_Cooldown_Params; Object.keys(params).forEach(function(param) { this.itemCooldown[param] = ICP[ICP[param]](params[param]); }, this); }; // GS.initializeItemCooldown IC.Game_Battler = {}; var GB = IC.Game_Battler; /*------------------------------------------------------------------------ * New public instance variable *------------------------------------------------------------------------*/ // itemCooldown: The number of turns for this battler to be cooled down GB.initMembers = Game_Battler.prototype.initMembers; Game_Battler.prototype.initMembers = function() { // Extended; v1.00a - v1.00a GB.initMembers.apply(this, arguments); this.itemCooldown = 0; // Added }; // Game_Battler.prototype.initMembers GB.makeSpeed = Game_Battler.prototype.makeSpeed; Game_Battler.prototype.makeSpeed = function() { // Extended; v1.00a - v1.00a // Rewritten if (!$gameSystem.itemCooldown.isEnabled) { return GB.makeSpeed.apply(this, arguments); } this._speed = Math.min.apply(null, GB.makeItemCooldownSpeed.call(this)); this._speed = this._speed || 0; // }; // Game_Battler.prototype.makeSpeed /* Collects speed from 1st act to the 1st one needing cooldown * Return: An array of Numbers each being the speed of a collected action * Functional cohesion/Message coupling */ GB.makeItemCooldownSpeed = function() { // New; v1.00a - v1.00a var act, item, length = this._actions.length, speeds = []; for (var index = 0; index < length; index++) { act = this._actions[index]; if (!act) continue; speeds.push(act.speed()); item = act.item(); if (item && item.meta.itemCooldown > 0) return speeds; } return speeds; }; // GB.makeItemCooldownSpeed IC.Game_Actor = {}; var GActor = IC.Game_Actor; GActor.makeActions = Game_Actor.prototype.makeActions; Game_Actor.prototype.makeActions = function() { // Extended; v1.00a - 1.00a // Added to stop making new actions when there are still charging ones if ($gameSystem.itemCooldown.isEnabled && this.itemCooldown > 0) return; // GActor.makeActions.apply(this, arguments); }; // Game_Actor.prototype.makeActions /* Checks whether this actor isn't also charging skills/items * Functional cohesion/Message coupling/Referentially transparent */ Game_Actor.prototype.canInput = function() { // New; v1.00a - v1.00a // Ensures this plugin works with those having state changes in canInput if (!Game_BattlerBase.prototype.canInput.call(this)) return false; return !$gameSystem.itemCooldown.isEnabled || this.itemCooldown <= 0; // }; // Game_Actor.prototype.canInput IC.Game_Enemy = {}; var GE = IC.Game_Enemy; GE.makeActions = Game_Enemy.prototype.makeActions; Game_Enemy.prototype.makeActions = function() { // Extended; v1.00a - 1.00a // Added to stop making new actions when there are still charging ones if ($gameSystem.itemCooldown.isEnabled && this.itemCooldown > 0) return; // GE.makeActions.apply(this, arguments); }; // Game_Enemy.prototype.makeActions IC.Game_Unit = {}; var GU = IC.Game_Unit; /* Gets all alive members not cooling down * Return: An array of alive members not cooling down * Functional cohesion/Message coupling/Referentially Transparent */ GU.nonItemCooldownMems = function() { // New; v1.00a - v1.00a return this.aliveMembers().filter(function(mem) { return mem.itemCooldown <= 0; }); }; // GU.nonItemCooldownMems /* Updates the remaining cooldown turn of all alive members * Functional cohesion/Message coupling */ GU.updateItemCooldown = function() { // New; v1.00a - v1.00a this.aliveMembers().forEach(function(mem) { if (mem.itemCooldown > 0) mem.itemCooldown -= 1; }); }; // GU.updateItemCooldown IC.Window_ItemList = {}; var WIL = IC.Window_ItemList; WIL.drawItem = Window_ItemList.prototype.drawItem; Window_ItemList.prototype.drawItem = function(index) { // Extended; v1.00a - v1.00a WIL.drawItem.apply(this, arguments); // Added to draw the turns need to cooldown the item as well if (!$gameSystem.itemCooldown.isEnabled) return; var item = this._data[index]; if (!item || item.meta.itemCooldown <= 0) return; var rect = this.itemRect(index); rect.x -= WSL.costWidth.apply(this, arguments); rect.width -= this.textPadding(); var turns = item.meta.itemCooldown; WIL.drawItemCooldown.call(this, turns, rect.x, rect.y, rect.width); // }; // Window_ItemList.prototype.drawItem WIL.numberWidth = Window_ItemList.prototype.numberWidth; Window_ItemList.prototype.numberWidth = function() { // Rewritten; v1.00a - v1.00a // Added if ($gameSystem.itemCooldown.isEnabled) { return WIL.numberWidth.apply(this, arguments) * 2; } // return WIL.numberWidth.apply(this, arguments); }; // Window_ItemList.prototype.numberWidth /* Draws the number of turns needed to cooldown the item on the item window * (Number)turns: The number of turns needed to cooldown the item * (Number)x; The x position of the text drawn * (Number)y; The y position of the text drawn * (Number)width: The max width of the text drawn * Functional cohesion/Data coupling/Idempotent */ WIL.drawItemCooldown = function(turns, x, y, width) { // New; v1.00a - v1.00a var textColor = $gameSystem.itemCooldown.textColor; this.changeTextColor(this.textColor(textColor)); this.drawText(turns, x, y, width, 'right'); this.resetTextColor(); }; // WIL.drawItemCooldown IC.Window_SkillList = {}; var WSL = IC.Window_SkillList; WSL.drawItem = Window_SkillList.prototype.drawItem; Window_SkillList.prototype.drawItem = function(index) { // Extended; v1.00a - v1.00a WSL.drawItem.apply(this, arguments); // Added to draw the number of turns to cooldown the skill user as well if (!$gameSystem.itemCooldown.isEnabled) return; var skill = this._data[index]; if (!skill || skill.meta.itemCooldown <= 0) return; var rect = this.itemRect(index); rect.x -= WSL.costWidth.apply(this, arguments); rect.width -= this.textPadding(); var turns = skill.meta.itemCooldown; WSL.drawItemCooldown.call(this, turns, rect.x, rect.y, rect.width); // }; // Window_SkillList.prototype.drawItem WSL.costWidth = Window_SkillList.prototype.costWidth; Window_SkillList.prototype.costWidth = function() { // Rewritten; v1.00a - v1.00a // Added if ($gameSystem.itemCooldown.isEnabled) { return WSL.costWidth.apply(this, arguments) + this.textWidth('000'); } // return WSL.costWidth.apply(this, arguments); }; // Window_SkillList.prototype.costWidth /* Draws number of turns needed to cooldown skill user on skill window * (Number)turns: The number of turns needed to cooldown the item * (Number)x; The x position of the text drawn * (Number)y; The y position of the text drawn * (Number)width: The max width of the text drawn * Functional cohesion/Data coupling/Idempotent */ WSL.drawItemCooldown = function(turns, x, y, width) { // New; v1.00a - v1.00a var textColor = $gameSystem.itemCooldown.textColor; this.changeTextColor(this.textColor(textColor)); this.drawText(turns, x, y, width, 'right'); }; // WSL.drawItemCooldown })(DoubleX_RMMV.Item_Cooldown = {}); /*============================================================================*/