//============================================================================= // TDS Active Chain Skills // Version: 1.0 //============================================================================= // Add to Imported List var Imported = Imported || {} ; Imported.TDS_ActiveChainSkills = true; // Initialize Alias Object var _TDS_ = _TDS_ || {} ; _TDS_.ActiveChainSkills = _TDS_.ActiveChainSkills || {}; //============================================================================= /*: * @author TDS * @plugindesc * This script allows you to chain skills in a combo. * * @param Minimun Time * @desc How many frames minimum for chain allowance. * @default 120 * @param Title Text * @desc Text displayed above the active chain skills as a title. * @default Active Chain Skills * @param Title Font Size * @desc Font size of the title text of active chain skills. * @default 20 * @param Active Skill Sound * @desc Sound effect played whenever an active chain skill has been selected. * @default {"name": "Skill2", "pan": 0, "pitch": 100, "volume": 80} * ****************************************************************************** * @param * Chain Input Text * ****************************************************************************** * @param (↑) Up Skill ON * @desc * @default \C[17]↑\C[0]Chain: * * @param (↑) Up Skill OFF * @desc * @default \C[7]↑Chain: * * @param (↑) Up Skill ACT * @desc * @default \C[17]↑Chain: * ****************************************************************************** * * @param (↓) Down Skill ON * @desc * @default \C[17]↓\C[0]Chain: * * @param (↓) Down Skill OFF * @desc * @default \C[7]↓Chain: * * @param (↓) Down Skill ACT * @desc * @default \C[17]↓Chain: * ****************************************************************************** * * @param (←) Left Skill ON * @desc * @default \C[17]←\C[0]Attack: * * @param (←) Left Skill OFF * @desc * @default \C[7]←Attack: * * @param (←) Left Skill ACT * @desc * @default \C[17]←Attack: * ****************************************************************************** * * @param (→) Right Skill ON * @desc * @default \C[17]→\C[0]Strike: * * @param (→) Right Skill OFF * @desc * @default \C[7]→Strike: * * @param (→) Right Skill ACT * @desc * @default \C[17]→Strike: * ****************************************************************************** * @help *----------------------------------------------------------------------------- * * Skill Notetags - These notetags go in the skill notebox in the database. *----------------------------------------------------------------------------- * * ^ This note tag allows you to set which skills can be chained to the one * that has this note tag. Order in the notes reflects order of choice. * ^ SkillId: Id of the skill that can be chained into. * ^ Input: Name of the Input. (up, down, left, right, ok, cancel, control, tab, etc..) * * Examples: * * * * * * (Case Sensitive.) * ^ This makes the skill only usable only in chains. (Does not affect enemies.) */ //============================================================================= // Get Plugin Parameters var parameters = PluginManager.parameters('Active Chain Skills'); // Initialize Parameters _TDS_.ActiveChainSkills.params = {}; // Get Chain Title _TDS_.ActiveChainSkills.params.chainTitle = String(parameters['Title Text'] || 'Active Chain Skills'); // Get Chain Title Font Size _TDS_.ActiveChainSkills.params.titleFontSize = Number(parameters['Title Font Size'] ||20); // Get Minimun Input time (In Frames) _TDS_.ActiveChainSkills.params.minimunInputTime = Number(parameters['Minimun Time'] || 120); // Get Active Skill Sound _TDS_.ActiveChainSkills.params.activeSkillSound = JsonEx.parse(parameters['Active Skill Sound'] || '{"name": "Skill2", "pan": 0, "pitch": 100, "volume": 80}' ); // Initialize Input Data _TDS_.ActiveChainSkills.params.inputData = {up: {}, down: {}, left: {}, right: {}}; // Up Data _TDS_.ActiveChainSkills.params.inputData.up.on = String(parameters['(↑) Up Skill ON'] || '\\C[17]↑\\C[0]Chain: '); _TDS_.ActiveChainSkills.params.inputData.up.off = String(parameters['(↑) Up Skill OFF'] || '\\C[7]↑Chain: '); _TDS_.ActiveChainSkills.params.inputData.up.act = String(parameters['(↑) Up Skill ACT'] || '\\C[17]↑Chain: '); // Down Data _TDS_.ActiveChainSkills.params.inputData.down.on = String(parameters['(↓) Down Skill ON'] || '\\C[17]↓\\C[0]Chain: '); _TDS_.ActiveChainSkills.params.inputData.down.off = String(parameters['(↓) Down Skill OFF'] || '\\C[7]↓Chain: '); _TDS_.ActiveChainSkills.params.inputData.down.act = String(parameters['(↓) Down Skill ACT'] || '\\C[17]↓Chain: '); // Left Data _TDS_.ActiveChainSkills.params.inputData.left.on = String(parameters['(←) Left Skill ON'] || '\\C[17]←\\C[0]Chain: '); _TDS_.ActiveChainSkills.params.inputData.left.off = String(parameters['(←) Left Skill OFF'] || '\\C[7]←Chain: '); _TDS_.ActiveChainSkills.params.inputData.left.act = String(parameters['(←) Left Skill ACT'] || '\\C[17]←Chain: '); // Right Data _TDS_.ActiveChainSkills.params.inputData.right.on = String(parameters['(→) Right Skill ON'] || '\\C[17]→\\C[0]Chain: '); _TDS_.ActiveChainSkills.params.inputData.right.off = String(parameters['(→) Right Skill OFF'] || '\\C[7]→Chain: '); _TDS_.ActiveChainSkills.params.inputData.right.act = String(parameters['(→) Right Skill ACT'] || '\\C[17]→Chain: '); //============================================================================= // ** DataManager //----------------------------------------------------------------------------- // The static class that manages the database and game objects. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.DataManager_onLoad = DataManager.onLoad; //============================================================================= // * On Load Processing //============================================================================= DataManager.onLoad = function(object) { // Run Original Function _TDS_.ActiveChainSkills.DataManager_onLoad.call(this, object); // Set Array & Type var array = object, type = null; // Object Switch switch (object) { case $dataSkills: type = 'SKILL' ;break; } // If Type is not null if (type !== null) { // If Array is an array if (Array.isArray(array)) { // Go Through Array for (var i = 0; i < array.length; i++) { // Get Data var data = array[i]; // Extract MetaData if (data) { this.extractActiveChainSkillMetaData(data, type); } } } } }; //============================================================================= // * Extract Active Chain Skill Meta Data //============================================================================= DataManager.extractActiveChainSkillMetaData = function(data, type) { // If Data has no notes return if (data.note.length <= 0) { return; } // If Type is skill if (type === 'SKILL') { // Initialize Chain Skill List data.meta.chainSkillList = {}; // Get Regular Expression var regExp = //ig; var str = data.note, arr; while ((arr = regExp.exec(str)) !== null) { // Set Parameter Swap Values data.meta.chainSkillList[arr[2].trim()] = Number(arr[1]); } } }; //============================================================================= // ** DataManager //----------------------------------------------------------------------------- // The static class that manages the database and game objects. //============================================================================= // * Set Active Chain Skill Window //============================================================================= BattleManager.setActiveChainSkillWindow = function(chainWindow) { this._activeChainSkillWindow = chainWindow; }; //============================================================================= // ** Game_BattlerBase //----------------------------------------------------------------------------- // The superclass of Game_Battler. It mainly contains parameters calculation. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.Game_BattlerBase_meetsSkillConditions = Game_BattlerBase.prototype.meetsSkillConditions; //============================================================================= // * Determine if Skill Meets Use Conditions //============================================================================= Game_BattlerBase.prototype.meetsSkillConditions = function(skill) { // Return false if Chain skill is restricted if (this.isChainSkillRestrict(skill)) { return false; } // Return Original Function return _TDS_.ActiveChainSkills.Game_BattlerBase_meetsSkillConditions.call(this, skill); }; //============================================================================= // * Determine if Chain Skill is restricted //============================================================================= Game_BattlerBase.prototype.isChainSkillRestrict = function(skill) { if (!this.isActor()) { return false;} if (!$gameParty.inBattle()) { return false; } if (!skill.meta.ChainOnly) { return false; } return !this._activeChainEnabled; }; //============================================================================= // ** Game_Battler //----------------------------------------------------------------------------- // The superclass of Game_Actor and Game_Enemy. It contains methods for sprites // and actions. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.Game_Battler_onBattleStart = Game_Battler.prototype.onBattleStart; _TDS_.ActiveChainSkills.Game_Battler_onBattleEnd = Game_Battler.prototype.onBattleEnd; //============================================================================= // * On Battle Start Processing //============================================================================= Game_Battler.prototype.onBattleStart = function() { // Run Original Function _TDS_.ActiveChainSkills.Game_Battler_onBattleStart.call(this); // Set Active Chain Enabled Flag to false this._activeChainEnabled = false; }; //============================================================================= // * On Battle End Processing //============================================================================= Game_Battler.prototype.onBattleEnd = function() { // Run Original Function _TDS_.ActiveChainSkills.Game_Battler_onBattleEnd.call(this); // Set Active Chain Enabled Flag to false this._activeChainEnabled = false; }; //============================================================================= // * Enable or Disable Active Chain //============================================================================= Game_Battler.prototype.enableActiveChain = function() { if (this.isActor()) { this._activeChainEnabled = true; } }; Game_Battler.prototype.disableActiveChain = function() { if (this.isActor()) { this._activeChainEnabled = false; } }; //============================================================================= // * Add Active Skill Chain //============================================================================= Game_Battler.prototype.addActiveSkillChain = function(skillId) { // Create Action var action = new Game_Action(this); // Set Action Active Chain Skill action.setActiveChainSkill(skillId); // Add Action to Actions list this._actions.splice(1, 0, action); }; //============================================================================= // ** Game_Action //----------------------------------------------------------------------------- // The game object class for a battle action. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.Game_Action_isValid = Game_Action.prototype.isValid; //============================================================================= // * Set Active Chain Skill //============================================================================= Game_Action.prototype.setActiveChainSkill = function(skillId) { // Set Skill this.setSkill(skillId); // Set Target // this.subject().currentAction._targetIndex this.setTarget(this.subject()._lastTargetIndex); // Set Active Chain Skill this._activeChainSkill = true; }; //============================================================================= // * Determine if action is valid //============================================================================= Game_Action.prototype.isValid = function() { // Enable Active Chain if (this._activeChainSkill) { this.subject().enableActiveChain(); } // Get Original Result var result = _TDS_.ActiveChainSkills.Game_Action_isValid.call(this); // Disable Active Chain if (this._activeChainSkill) { this.subject().disableActiveChain(); } // Return Result return result; }; //============================================================================= // ** Scene_Battle //----------------------------------------------------------------------------- // The scene class of the battle screen. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.Scene_Battle_CreateAllWindows = Scene_Battle.prototype.createAllWindows; //============================================================================= // * Create All Windows //============================================================================= Scene_Battle.prototype.createAllWindows = function() { // Run Original Function _TDS_.ActiveChainSkills.Scene_Battle_CreateAllWindows.call(this); // Create Chain Skill Window this.createChainSkillWindow(); }; //============================================================================= // * Create Chain Skill Window //============================================================================= Scene_Battle.prototype.createChainSkillWindow = function() { // Create Active Chain Skill Window this._activeChainSkillWindow = new Window_ChainSkillList(); // Add Child this.addChild(this._activeChainSkillWindow); // Set Battle Manager Active Chain Skill Window BattleManager.setActiveChainSkillWindow(this._activeChainSkillWindow); }; //============================================================================= // ** Window_BattleLog //----------------------------------------------------------------------------- // The window for displaying battle progress. No frame is displayed, but it is // handled as a window for convenience. //============================================================================= // Alias Listing //============================================================================= _TDS_.ActiveChainSkills.Window_BattleLog_initialize = Window_BattleLog.prototype.initialize; _TDS_.ActiveChainSkills.Window_BattleLog_startAction = Window_BattleLog.prototype.startAction; _TDS_.ActiveChainSkills.Window_BattleLog_update = Window_BattleLog.prototype.update; _TDS_.ActiveChainSkills.Window_BattleLog_updateWaitMode = Window_BattleLog.prototype.updateWaitMode; _TDS_.ActiveChainSkills.Window_BattleLog_displayAction = Window_BattleLog.prototype.displayAction; _TDS_.ActiveChainSkills.Window_BattleLog_displayActionResults = Window_BattleLog.prototype.displayActionResults; //============================================================================= // * Initialize Object //============================================================================= Window_BattleLog.prototype.initialize = function() { // Run Original Function _TDS_.ActiveChainSkills.Window_BattleLog_initialize.call(this); // Set Active Chain Skill Input Couner to 0 this._activeChainSkillInputCounter = 0; // Set Active Chain Skill to 0 this._activeChainSkill = 0; }; //============================================================================= // * Process Custom Code //============================================================================= Window_BattleLog.prototype.processCustomCode = function(code) { code(); }; //============================================================================= // * Start Action //============================================================================= //Window_BattleLog.prototype.startAction = function(subject, action, targets) { // Enable Active Chain // this.push('processCustomCode', function() { subject.enableActiveChain();}); // Get Item // var item = action.item(); // Show Chain List // this.push('showChainSkillList', subject, item); // Process Custom Code // this.push('processCustomCode', _TDS_.ActiveChainSkills.Window_BattleLog_startAction.bind(this, subject, action, targets)); // Start Skill Chain Wait // this.push('startChainSkillInputWait'); //}; //============================================================================= // * Start Action //============================================================================= Window_BattleLog.prototype.startAction = function(subject, action, targets) { // Enable Active Chain this.push('processCustomCode', function() { subject.enableActiveChain();}); // Get Item var item = action.item(); // Show Chain List this.push('showChainSkillList', subject, item); // Process Custom Code this.push('processCustomCode', _TDS_.ActiveChainSkills.Window_BattleLog_startAction.bind(this, subject, action, targets)); // Clear Text this.push('clear'); // Start Skill Chain Wait this.push('startChainSkillInputWait'); }; //============================================================================= // * Display Action Results //============================================================================= Window_BattleLog.prototype.displayActionResults = function(subject, target) { // Run Original Function _TDS_.ActiveChainSkills.Window_BattleLog_displayActionResults.call(this, subject, target); // If Subject is an actor if (subject.isActor()) { // Get Chain Window var chainWindow = BattleManager._activeChainSkillWindow; // If Chain Window is visible if (chainWindow.visible) { // Set Wait mode to chain skill input this.push('setWaitMode', 'chainSkillInput'); // Hide Chain List this.push('hideChainSkillList'); } // Enable Active Chain this.push('processCustomCode', function() { subject.disableActiveChain();}); } }; //============================================================================= // * Show Chain Skill List //============================================================================= Window_BattleLog.prototype.showChainSkillList = function(subject, skill) { if (subject === undefined) { return; } if (!subject.isActor()) { return; } if (!DataManager.isSkill(skill)) { return; } // Set Active Chain Skill to 0 // Get Chain Window var chainWindow = BattleManager._activeChainSkillWindow; this._activeChainSkill = 0; // Setup Chain Window chainWindow.setup(subject, skill); // If Chain Window is more than 0 if (chainWindow._chainSkills.length > 0) { chainWindow.show(); } }; //============================================================================= // * Show Chain Skill List //============================================================================= Window_BattleLog.prototype.hideChainSkillList = function() { // Set Active Chain Skill to 0 this._activeChainSkill = 0; // Hide Active Chain Skill Window BattleManager._activeChainSkillWindow.hide(); }; //============================================================================= // * Start Chain Skill Input Wait //============================================================================= Window_BattleLog.prototype.startChainSkillInputWait = function() { // Set Active chain Skill Input Counter this._activeChainSkillInputCounter = _TDS_.ActiveChainSkills.params.minimunInputTime ; }; //============================================================================= // * Frame Update //============================================================================= Window_BattleLog.prototype.update = function() { // Get Chain Window var chainWindow = BattleManager._activeChainSkillWindow; // If Chain Window Exists and its visible if (chainWindow && chainWindow.visible) { this.updateChainkSkillInput(); } // Call Original Function _TDS_.ActiveChainSkills.Window_BattleLog_update.call(this); }; //============================================================================= // * Update Chain Skill Input //============================================================================= Window_BattleLog.prototype.updateChainkSkillInput = function() { // Get Chain Window var chainWindow = BattleManager._activeChainSkillWindow; // Get Chain Window Skill var chainSkills = chainWindow._chainSkills; // If Active Chain Skill is 0 if (this._activeChainSkill === 0) { // Go Through Chain Skills for (var i = 0; i < chainSkills.length; i++) { // Get Input var input = chainSkills[i][0]; // Get Skill var skill = chainSkills[i][1]; // If Input is triggered if (Input.isTriggered(input)) { // Get Subject var subject = chainWindow._battler; if (!subject.canUse(skill)) { continue; } if (!subject.isLearnedSkill(skill.id)) { continue; } // Play Sound Effect AudioManager.playSe(_TDS_.ActiveChainSkills.params.activeSkillSound); // Set Chain Window Input chainWindow.chainInput = input; // Set Active Chain Skill Input Count to 12 this._activeChainSkillInputCounter = 12; // Set Active Chain Skill Id this._activeChainSkill = skill.id; // Add Active Skill Chain to subject subject.addActiveSkillChain(skill.id); // Refresh Chain Window // Break Loop break; } } } // If Active Chain Skill Input counter is more than 0 if (this._activeChainSkillInputCounter > 0) { // Decrease Active Chain Skill Input counter this._activeChainSkillInputCounter--; // Return True return true; } }; //============================================================================= // * Update Wait Mode //============================================================================= Window_BattleLog.prototype.updateWaitMode = function() { // If Wait mode is for chain skill input if (this._waitMode === 'chainSkillInput') { // If Active Chain Skill Input counter is more than 0 if (this._activeChainSkillInputCounter > 0) { return true; } } // Return Original Function return _TDS_.ActiveChainSkills.Window_BattleLog_updateWaitMode.call(this); }; //============================================================================= // ** Window_ChainSkillList //----------------------------------------------------------------------------- // The window for displaying battle progress. No frame is displayed, but it is // handled as a window for convenience. //============================================================================= function Window_ChainSkillList() { this.initialize.apply(this, arguments);} Window_ChainSkillList.prototype = Object.create(Window_Base.prototype); Window_ChainSkillList.prototype.constructor = Window_ChainSkillList; //============================================================================= // * Initialize Object //============================================================================= Window_ChainSkillList.prototype.initialize = function() { // Get Width var dw = Math.max(Math.round(Graphics.boxWidth / 2), 450); // Super Call Window_Base.prototype.initialize.call(this, -this.standardPadding(), 0, dw, this.fittingHeight(6)); // Set Opacity to 0; this.opacity = 0; // Hide this.hide(); }; //============================================================================= // * Setup //============================================================================= Window_ChainSkillList.prototype.setup = function(battler, skill) { // Set Battler this._battler = battler; // Set Skill this._skill = skill; // Initialize Chain Skills Array this._chainSkills = []; // If Skill has a chain skill list if (skill.meta.chainSkillList) { // Get Inputs var inputs = Object.keys(skill.meta.chainSkillList); // Go Through Inputs for (var i = 0; i < inputs.length; i++) { // Get Input var input = inputs[i]; // Get Chain Skill var chainSkill = skill.meta.chainSkillList[input]; // If Battler does not have skill if (!battler.isLearnedSkill(chainSkill)) { continue; } // Add Skill to Chain Skills array this._chainSkills.push([input, $dataSkills[chainSkill]]); } } // Set Y Coordinates this.y = Graphics.boxHeight - this.fittingHeight(4); this.y -= this.fittingHeight(this._chainSkills.length + 1); // Set Enabled Flag to true; this._enabled = true; // Refresh Contents this.refresh(); }; //============================================================================= // * Show Window //============================================================================= Window_ChainSkillList.prototype.show = function() { // Activate Window this.activate(); // Super Call Window_Base.prototype.show.call(this); }; //============================================================================= // * Chain Input //============================================================================= Object.defineProperty(Window_ChainSkillList.prototype, 'chainInput', { get: function() { return this._chainInput; }, set: function(value) { // Set Chain Input this._chainInput = value; // Set Enabled Flag this._enabled = false; // Refresh if value is not null if (value !== null) { this.refresh(); } }, configurable: true }); //============================================================================= // * Refresh //============================================================================= Window_ChainSkillList.prototype.refresh = function() { // Set Chain Input to null if enabled if (this._enabled) { this._chainInput = null; } // Clear Contents this.contents.clear(); // Draw Background Color this.drawBackgroundColor(); // Draw Chain Skill Title this.drawChainSkillTitle(); // If Skill Exists if (this._skill) { // Draw Chain Skills this.drawChainSkills(); } }; //============================================================================= // * Draw Background Color //============================================================================= Window_ChainSkillList.prototype.drawBackgroundColor = function() { // Get Height var dh = this.lineHeight() * (this._chainSkills.length + 1); this.contents.gradientFillRect(0, 0, this.contents.width, dh, 'rgba(0, 0, 0, 192)', 'rgba(0, 0, 0, 0)'); this.contents.paintOpacity = 78; this.contents.fillRect(0, this.lineHeight() - 4, this.contents.width, 2, this.normalColor()); this.contents.paintOpacity = 255; }; //============================================================================= // * Draw Chain Skills //============================================================================= Window_ChainSkillList.prototype.drawChainSkillTitle = function() { // Reset Font Settings this.resetFontSettings(); this.contents.fontSize = _TDS_.ActiveChainSkills.params.titleFontSize; this.contents.fontItalic = true; // Draw Title this.drawText(_TDS_.ActiveChainSkills.params.chainTitle, 12, 0, this.contents.width - 24); // Reset Font Settings this.resetFontSettings(); }; //============================================================================= // * Draw Chain Skills //============================================================================= Window_ChainSkillList.prototype.drawChainSkills = function() { // Set Starting X & Y var sx = 24, sy = this.lineHeight(); // If Skill has a chain skill list if (this._skill.meta.chainSkillList) { // Get Inputs var inputs = Object.keys(this._skill.meta.chainSkillList); // Go Through Inputs for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; var skill = $dataSkills[this._skill.meta.chainSkillList[input]]; // If Skill has not been learned if (!this._battler.isLearnedSkill(skill.id)) { continue; } // Set Text var text = ''; // Add Input Text Settings text = text + this.inputTextSettings(input, skill); // Add Format to Text text = text + '\\i[%1]%2'.format(skill.iconIndex, skill.name); // Draw Text this.drawTextEx(text, sx, sy); // Increase Starting Y sy += this.lineHeight(); } } }; //============================================================================= // * Input Text Settings //============================================================================= Window_ChainSkillList.prototype.inputTextSettings = function(input, skill) { // Set Active Flag var active = (input === this._chainInput); // Initialize Text var text = ''; // Get Input Data var inputData = _TDS_.ActiveChainSkills.params.inputData; // Get Input DAta if (inputData[input]) { // If Enabled and Battler can use skill if (this._enabled && this._battler.canUse(skill)) { // Set Text text = inputData[input].on; } else if (!this._enabled && active) { // Set Text text = inputData[input].act; } else { // Set Text text = inputData[input].off; } } // Return Text return text; };