/*============================================================================ * ## Plugin Info *---------------------------------------------------------------------------- * # Plugin Name * DoubleX RMMV Reverse Input *---------------------------------------------------------------------------- * # Terms Of Use * You shall keep this plugin's Plugin Info part's contents intact * You shalln't claim that this plugin's written by anyone other than * DoubleX or his aliases * None of the above applies to DoubleX or his aliases *---------------------------------------------------------------------------- * # Prerequisites * Abilities: * 1. Some Javascript coding proficiency to fully utilize this plugin *---------------------------------------------------------------------------- * # Links * This plugin: * 1. [url]http://pastebin.com/FLyVjEcJ[/url] * Mentioned Patreon Supporters: * [url]https://www.patreon.com/posts/71738797[/url] *---------------------------------------------------------------------------- * # Author * DoubleX *---------------------------------------------------------------------------- * # Changelog * v1.00c(GMT 1200 30-1-2016): * 1. Fixed reading meta from null equip bug * 2. Fixed only reading state notetags bug * 3. Changed from using klass to using prototypes * v1.00b(GMT 1300 24-1-2016): * 1. Fixed undefined lines in DataManager.loadReverseInputNotes bug * v1.00a(GMT 1300 30-12-2015): * 1. 1st version of this plugin finished *============================================================================*/ /*: * @plugindesc Lets users set some actors reversing the assigned window inputs * @author DoubleX * * @help *============================================================================ * ## Notetag Info *---------------------------------------------------------------------------- * # Actor/Class/Equip/State Notetags: * State notetags take the highest priority, followed by weapon, armor, * class and actor * 1. <reverse input: proto, downUp, rightLeft, pagedownPageup, okCancel> * - This notetag only works for windows assigned to 1 actor at a time * The below prototypes in default RMMV setting meet the condition: * Window_SkillType.prototype * Window_SkillList.prototype * Window_EquipSlot.prototype * Window_EquipItem.prototype * Window_Status.prototype * Window_ActorCommand.prototype * - This notetag will work for windows belonging to proto or having * proto in its prototype chain * Both the Window_ and .prototype part doesn't need to be included * in proto * For example: Status stands for Window_Status.prototype * proto only accepts prototypes starting with Window_ * - The inputs corresponding to down and up selection commands will * be reversed if downUp is t * - The inputs corresponding to right and left selection commands * will be reversed if rightLeft is t * - The inputs corresponding to pagedown and pageup selection * commands will be reversed if pagedownPageup is t * - The inputs corresponding to ok and cancel selection commands will * be reversed if okCancel is t * - Only the working notetag with the highest priority will be used *============================================================================ * ## Plugin Call Info *---------------------------------------------------------------------------- * # Actor/Class/Equip/State manipulations * 1. meta.reverseInput * - Returns the reverse input flags in the form of { * proto: proto, * downUp: b, * rightLeft: b, * pagedownPageup: b, * okCancel: b * } with proto and b being the window prototype and booleans * 2. meta.reverseInput = { * proto: proto, * downUp: b, * rightLeft: b, * pagedownPageup: b, * okCancel: b * } * - Sets the reverse input flags in the form of { * proto: proto, * downUp: b, * rightLeft: b, * pagedownPageup: b, * okCancel: b * } with proto and b being the window prototype and booleans * - All meta.reverseInput changes can be saved if * DoubleX RMMV Dynamic Data is used *============================================================================ */ "use strict"; var DoubleX_RMMV = DoubleX_RMMV || {}; DoubleX_RMMV["Reverse Input"] = "v1.00c"; /*============================================================================ * ## Plugin Implementations * You need not edit this part as it's about how this plugin works *---------------------------------------------------------------------------- * # Plugin Support Info: * 1. Prerequisites * - Some Javascript coding proficiency to fully comprehend this * plugin * 2. Function documentation * - The 1st part describes why this function's rewritten/extended for * rewritten/extended functions or what the function does for new * functions * - The 2nd part describes what the arguments of the function are * - The 3rd part informs which version rewritten, extended or created * this function * - The 4th part informs whether the function's rewritten or new * - The 5th part informs whether the function's a real or potential * hotspot * - The 6th part describes how this function works for new functions * only, and describes the parts added, removed or rewritten for * rewritten or extended functions only * Example: * /*---------------------------------------------------------------------- * * Why rewrite/extended/What this function does * *----------------------------------------------------------------------*/ /* // arguments: What these arguments are * functionName = function(arguments) { // Version X+; New/Rewrite; Hotspot * // Added/Removed/Rewritten to do something/How this function works * functionContents * // * } // functionName *----------------------------------------------------------------------------*/ DataManager.isDatabaseLoadedReverseInput = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function() { // Rewritten if (!this.isDatabaseLoadedReverseInput.apply(this, arguments)) { return false; } this.loadAllReverseInputNotes(); return true; // }; // DataManager.isDatabaseLoaded DataManager.loadAllReverseInputNotes = function() { // New var ts = [$dataActors, $dataClasses, $dataWeapons, $dataArmors, $dataStates]; ts.forEach(function(type) { type.forEach(function(data) { if (data) { this.loadReverseInputNotes(data); } }, this); }, this); }; // DataManager.loadAllReverseInputNotes // data: The data to have its notetags read DataManager.loadReverseInputNotes = function(data) { // New data.meta.reverseInput = {}; var rI = data.meta.reverseInput; var regex = /< *reverse +input *: *(\w+) *, *(\w+) *, *(\w+) *, *(\w+) *, *(\w+) *>/i; data.note.split(/[\r\n]+/).forEach(function(line) { if (!line.match(regex)) { return; } rI.proto = "Window_" + RegExp.$1 + ".prototype"; rI.downUp = RegExp.$2 === "t"; rI.rightLeft = RegExp.$3 === "t"; rI.pagedownPageup = RegExp.$4 === "t"; rI.okCancel = RegExp.$5 === "t"; }); }; // DataManager.loadReverseInputNotes /* window: The window used by the actor to check if the input's reversed * command: The command to check if the correseponding input's reversed */ Game_Actor.prototype.isReverseInput = function(window, command) { // New; Potential Hotspot var equips = this.equips().filter(function(equip) { return equip; }), proto; var types = [this.states(), equips, [this.currentClass()], [this.actor()]]; for (var index = 0, length = types.length; index < length; index++) { for (var data = types[index], i = 0, l = data.length; i < l; i++) { proto = eval(data[i].meta.reverseInput.proto); if (!proto || !proto.isPrototypeOf(window)) { continue; } return data[i].meta.reverseInput[command]; } } return false; }; // Game_Actor.prototype.isReverseInput Window_Selectable.prototype.cursorDownReverseInput = Window_Selectable.prototype.cursorDown; Window_Selectable.prototype.cursorUpReverseInput = Window_Selectable.prototype.cursorUp; Window_Selectable.prototype.cursorRightReverseInput = Window_Selectable.prototype.cursorRight; Window_Selectable.prototype.cursorLeftReverseInput = Window_Selectable.prototype.cursorLeft; Window_Selectable.prototype.cursorPagedownReverseInput = Window_Selectable.prototype.cursorPagedown; Window_Selectable.prototype.cursorPageupReverseInput = Window_Selectable.prototype.cursorPageup; Window_Selectable.prototype.processPagedownReverseInput = Window_Selectable.prototype.processPagedown; Window_Selectable.prototype.processPageupReverseInput = Window_Selectable.prototype.processPageup; Window_Selectable.prototype.processOkReverseInput = Window_Selectable.prototype.processOk; Window_Selectable.prototype.processCancelReverseInput = Window_Selectable.prototype.processCancel; Window_Selectable.prototype.cursorDown = function(wrap) { // Potential Hotspot // Added if (this._actor && this._actor.isReverseInput(this, "downUp")) { return this.cursorUpReverseInput(wrap); } // return this.cursorDownReverseInput(wrap); }; // Window_Selectable.prototype.cursorDown Window_Selectable.prototype.cursorUp = function(wrap) { // Potential Hotspot // Added if (this._actor && this._actor.isReverseInput(this, "downUp")) { return this.cursorDownReverseInput(wrap); } // return this.cursorUpReverseInput(wrap); }; // Window_Selectable.prototype.cursorUp Window_Selectable.prototype.cursorRight = function(wrap) { // Potential Hotspot // Added if (this._actor && this._actor.isReverseInput(this, "rightLeft")) { return this.cursorLeftReverseInput(wrap); } // return this.cursorRightReverseInput(wrap); }; // Window_Selectable.prototype.cursorRight Window_Selectable.prototype.cursorLeft = function(wrap) { // Potential Hotspot // Added if (this._actor && this._actor.isReverseInput(this, "rightLeft")) { return this.cursorRightReverseInput(wrap); } // return this.cursorLeftReverseInput(wrap); }; // Window_Selectable.prototype.cursorLeft Window_Selectable.prototype.cursorPagedown = function() { // Added if (this._actor && this._actor.isReverseInput(this, "pagedownPageup")) { return this.cursorPageupReverseInput(); } // return this.cursorPagedownReverseInput(); }; // Window_Selectable.prototype.cursorPagedown Window_Selectable.prototype.cursorPageup = function() { // Added if (this._actor && this._actor.isReverseInput(this, "pagedownPageup")) { return this.cursorPagedownReverseInput(); } // return this.cursorPageupReverseInput(); }; // Window_Selectable.prototype.cursorPageup Window_Selectable.prototype.processPageup = function() { // Added if (this._actor && this._actor.isReverseInput(this, "pagedownPageup")) { return this.processPagedownReverseInput(); } // return this.processPageupReverseInput(); }; // Window_Selectable.prototype.processPageup Window_Selectable.prototype.processPagedown = function() { // Added if (this._actor && this._actor.isReverseInput(this, "pagedownPageup")) { return this.processPageupReverseInput(); } // return this.processPagedownReverseInput(); }; // Window_Selectable.prototype.processPagedown Window_Selectable.prototype.processOk = function() { // Added if (this._actor && this._actor.isReverseInput(this, "okCancel")) { return this.processCancelReverseInput(); } // return this.processOkReverseInput(); }; // Window_Selectable.prototype.processOk Window_Selectable.prototype.processCancel = function() { // Added if (this._actor && this._actor.isReverseInput(this, "okCancel")) { return this.processOkReverseInput(); } // return this.processCancelReverseInput(); }; // Window_Selectable.prototype.processCancel /*============================================================================*/