Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
Small change. Moved where the QPlus.update was called from
| //============================================================================= | |
| // QPlus | |
| //============================================================================= | |
| var Imported = Imported || {}; | |
| Imported.QPlus = '1.7.1'; | |
| //============================================================================= | |
| /*: | |
| * @plugindesc <QPlus> (Should go above all Q Plugins) | |
| * Some small changes to MV for easier plugin development. | |
| * @version 1.7.1 | |
| * @author Quxios | Version 1.7.1 | |
| * @site https://quxios.github.io/ | |
| * @updateurl https://quxios.github.io/data/pluginsMin.json | |
| * | |
| * @param Quick Test | |
| * @desc When true, game will skip title screen and start a new game | |
| * @type Boolean | |
| * @default true | |
| * | |
| * @param Default Enabled Switches | |
| * @desc Turns on a list of switches on new game | |
| * @type switch[] | |
| * @default [] | |
| * | |
| * @param Ignore Mouse when inactive | |
| * @desc When true, the game window will ignore mouse input when the game | |
| * isn't focused / active | |
| * @type Boolean | |
| * @default false | |
| * | |
| * @help | |
| * ============================================================================ | |
| * ## About | |
| * ============================================================================ | |
| * This plugin is the core for most of the QPlugins. It also adds a few new | |
| * functionality to RPG Maker MV to improve it. | |
| * | |
| * ============================================================================ | |
| * ## Notetags / Comments | |
| * ============================================================================ | |
| * **Event retain direction** | |
| * ---------------------------------------------------------------------------- | |
| * Adding the following to the notes or in a comment will make that event retain | |
| * its direction when changing pages. | |
| * ~~~ | |
| * <retainDir> | |
| * ~~~ | |
| * This will be ignored if the next page has direction fix enabled | |
| * | |
| * ---------------------------------------------------------------------------- | |
| * **No tilemap** | |
| * ---------------------------------------------------------------------------- | |
| * You can disable the tile map by adding this note to a map | |
| * ~~~ | |
| * <noTilemap> | |
| * ~~~ | |
| * This will replace the tilemap with a simple light weight sprite container. | |
| * Using this may increase performance. So if you have a map that doesn't use | |
| * any tiles and is all parallax, then you should considering using this. | |
| * | |
| * *Note, there's a chance this may break some plugins if they call functions in | |
| * the original tilemap class.* | |
| * | |
| * ============================================================================ | |
| * ## Format Plugin Commands | |
| * ============================================================================ | |
| * These formating options are only applied to QPlugins! | |
| * | |
| * ---------------------------------------------------------------------------- | |
| * **Spaces in arg** | |
| * ---------------------------------------------------------------------------- | |
| * Each arg is separated with a space. But sometimes you may need a space, for | |
| * example when passing a file name. To do this you just need to wrap it in quotes | |
| * and it'll be passed as a single arg, ex: | |
| * ~~~ | |
| * qPlugin cmd arg1 "arg2 with a space" arg3 | |
| * ~~~ | |
| * | |
| * ---------------------------------------------------------------------------- | |
| * **Variables** | |
| * ---------------------------------------------------------------------------- | |
| * If you want to use a value of a variable in a plugin command you can do so | |
| * with the following format: | |
| * ~~~ | |
| * {vID} | |
| * ~~~ | |
| * - ID: The id of the variable to use | |
| * | |
| * Example: | |
| * ~~~ | |
| * qPlugin cmd arg1 chara{v1} | |
| * ~~~ | |
| * When the plugin command runs the {v1} will get replaced with the value of | |
| * variable 1. If the value of variable 1 is 10, , then your plugin command will | |
| * format to: `qPlugin cmd arg1 chara10` | |
| * ---------------------------------------------------------------------------- | |
| * **Switches** | |
| * ---------------------------------------------------------------------------- | |
| * If you want to use a value of a switch in a plugin command you can do so | |
| * with the following format: | |
| * ~~~ | |
| * {sID} | |
| * ~~~ | |
| * - ID: The id of the switch to use | |
| * | |
| * Example: | |
| * ~~~ | |
| * qPlugin cmd arg1 {s1} | |
| * ~~~ | |
| * When the plugin command runs the {s1} will get replaced with the value of | |
| * switch 1. If the value of switch 1 is true, then your plugin command will | |
| * format to: `qPlugin cmd arg1 true` | |
| * | |
| * ============================================================================ | |
| * ## Plugin Commands | |
| * ============================================================================ | |
| * **Random wait between X Y** | |
| * ---------------------------------------------------------------------------- | |
| * This plugin command will insert a random wait between x and y frames. | |
| * ~~~ | |
| * wait X Y | |
| * ~~~ | |
| * If Y is left empty, it will make a random wait between 0 - X | |
| * | |
| * ---------------------------------------------------------------------------- | |
| * **Global Lock** | |
| * ---------------------------------------------------------------------------- | |
| * This plugin command will 'lock' all characters or certain characters. By | |
| * locking I mean you can lock their movement, or movement and character | |
| * animation. | |
| * ~~~ | |
| * globalLock LEVEL [CHARACTERS] [options] | |
| * ~~~ | |
| * - LEVEL: The level of global lock | |
| * * 0: clears the global lock | |
| * * 1: locks the characters movement | |
| * * 2: locks the characters movement and animation | |
| * - [CHARACTERS] - optional, list of `Character Ids` to apply to or ignore. Seperated by a space. | |
| * * CHARAID: The character identifier. | |
| * - For player: 0, p, or player | |
| * - For events: EVENTID, eEVENTID, eventEVENTID or this for the event that called this | |
| * (replace EVENTID with a number) | |
| * | |
| * Possible options: | |
| * - only: Will only apply to the characters listed | |
| * | |
| * ---------------------------------------------------------------------------- | |
| * **Global lock Examples** | |
| * ---------------------------------------------------------------------------- | |
| * ~~~ | |
| * globalLock 2 | |
| * ~~~ | |
| * Will lock all characters movement and animations. | |
| * | |
| * ~~~ | |
| * globalLock 1 0 1 4 | |
| * globalLock 1 p e1 e4 | |
| * globalLock 1 player event1 event4 | |
| * ~~~ | |
| * (Note: All 3 are the same, just using a different character id method) | |
| * | |
| * Will Lock the movements for all characters except: | |
| * Player, event 1 and event 4 | |
| * | |
| * ~~~ | |
| * globalLock 1 0 1 4 only | |
| * globalLock 1 p e1 e4 only | |
| * globalLock 1 player event1 event4 only | |
| * ~~~ | |
| * Will Lock the movements for only these characters: | |
| * Player, event 1 and event 4 | |
| * | |
| * ============================================================================ | |
| * ## Links | |
| * ============================================================================ | |
| * Formated Help: | |
| * | |
| * https://quxios.github.io/#/plugins/QPlus | |
| * | |
| * RPGMakerWebs: | |
| * | |
| * http://forums.rpgmakerweb.com/index.php?threads/qplugins.73023/ | |
| * | |
| * Terms of use: | |
| * | |
| * https://github.com/quxios/QMV-Master-Demo/blob/master/readme.md | |
| * | |
| * Like my plugins? Support me on Patreon! | |
| * | |
| * https://www.patreon.com/quxios | |
| * | |
| * @tags core, character | |
| */ | |
| //============================================================================= | |
| //============================================================================= | |
| // QPlus Static Class | |
| function QPlus() { | |
| throw new Error('This is a static class'); | |
| } | |
| (function() { | |
| QPlus._regex = { | |
| isBoolean: /^(true|false)$/i, | |
| isString: /^"(.*?)"$/, | |
| isNumber: /^-?\d+$/, | |
| isFloat: /^-?\d+\.?\d*$/, | |
| isPoint: /^\((-?\d+\.?\d*),\s*(-?\d+\.?\d*)\)$/, | |
| isArray: /^\[(.*?)\]$/, | |
| isObj: /^\{(.*?)\}$/ | |
| } | |
| QPlus.getParams = function(id, convert) { | |
| var plugin = $plugins.filter(function(p) { | |
| return p.description.contains(id) && p.status | |
| }); | |
| var hasDefaults = typeof convert === 'object'; | |
| if (!plugin[0]) { | |
| return hasDefaults ? convert : {}; | |
| } | |
| var params = Object.assign( | |
| hasDefaults ? convert : {}, | |
| plugin[0].parameters | |
| ); | |
| if (convert) { | |
| for (var param in params) { | |
| params[param] = this.stringToType(String(params[param])); | |
| if (hasDefaults && convert[param] !== undefined) { | |
| if (convert[param].constructor !== params[param].constructor) { | |
| var err = 'Plugin Parameter value error. ' + id + ', Parameter: ' + param; | |
| err += '\nDefault value will be used.' | |
| console.warn(err); | |
| params[param] = convert[param]; | |
| } | |
| } | |
| } | |
| } | |
| return params; | |
| }; | |
| QPlus.versionCheck = function(version, targetVersion) { | |
| version = version.split('.').map(Number); | |
| targetVersion = targetVersion.split('.').map(Number); | |
| if (version[0] < targetVersion[0]) { | |
| return false; | |
| } else if (version[0] === targetVersion[0] && version[1] < targetVersion[1]) { | |
| return false; | |
| } else if (version[1] === targetVersion[1] && version[2] < targetVersion[2]) { | |
| return false; | |
| } | |
| return true; | |
| }; | |
| /** | |
| * @static QPlus.makeArgs | |
| * Splits a string every space. If words are wrapped in ""s or ''s they | |
| * are kept grouped. | |
| * @param {String} string | |
| * @return {Array} | |
| */ | |
| QPlus.makeArgs = function(string) { | |
| if (string.constructor === Array) { | |
| string = string.join(' '); | |
| } | |
| var args = []; | |
| var regex = /("?|'?)(.+?)\1(?:\s|$)/g; | |
| while (true) { | |
| var match = regex.exec(string); | |
| if (match) { | |
| args.push(match[2]); | |
| } else { | |
| break; | |
| } | |
| } | |
| return this.formatArgs(args); | |
| }; | |
| QPlus.formatArgs = function(args) { | |
| for (var i = 0; i < args.length; i++) { | |
| var arg = args[i].trim(); | |
| var match = /\{(.*?)\}/.exec(arg); | |
| if (match) { | |
| var val = match[1]; | |
| var cmd = match[1][0].toLowerCase(); | |
| switch (cmd) { | |
| case 'v': { | |
| var id = Number(match[1].slice(1)); | |
| val = $gameVariables.value(id); | |
| break; | |
| } | |
| case 's': { | |
| var id = Number(match[1].slice(1)); | |
| val = $gameSwitches.value(id); | |
| break; | |
| } | |
| } | |
| args[i] = args[i].replace(/\{(.*?)\}/, val); | |
| } | |
| } | |
| return args; | |
| }; | |
| QPlus.getArg = function(args, regex) { | |
| var arg = null; | |
| for (var i = 0; i < args.length; i++) { | |
| var match = regex.exec(args[i]); | |
| if (match) { | |
| if (match.length === 1) { | |
| arg = true; | |
| } else { | |
| arg = match[match.length - 1]; | |
| } | |
| break; | |
| } | |
| } | |
| return arg; | |
| }; | |
| QPlus.getMeta = function(string) { | |
| var meta = {}; | |
| var inlineRegex = /<([^<>:\/]+)(?::?)([^>]*)>/g; | |
| var blockRegex = /<([^<>:\/]+)>([\s\S]*?)<\/\1>/g; | |
| for (; ;) { | |
| var match = inlineRegex.exec(string); | |
| if (match) { | |
| if (match[2] === '') { | |
| meta[match[1]] = true; | |
| } else { | |
| meta[match[1]] = match[2]; | |
| } | |
| } else { | |
| break; | |
| } | |
| } | |
| for (; ;) { | |
| var match = blockRegex.exec(string); | |
| if (match) { | |
| meta[match[1]] = match[2]; | |
| } else { | |
| break; | |
| } | |
| } | |
| return meta; | |
| }; | |
| QPlus.getCharacter = function(string) { | |
| string = String(string).toLowerCase(); | |
| if (/^[0-9]+$/.test(string)) { | |
| var id = Number(string); | |
| return id === 0 ? $gamePlayer : $gameMap.event(id); | |
| } else if (/^(player|p)$/.test(string)) { | |
| return $gamePlayer; | |
| } else { | |
| var isEvent = /^(event|e)([0-9]+)$/.exec(string); | |
| if (isEvent) { | |
| var eventId = Number(isEvent[2]); | |
| return eventId > 0 ? $gameMap.event(eventId) : null; | |
| } | |
| return null; | |
| } | |
| }; | |
| QPlus.charaIdToId = function(string) { | |
| string = String(string).toLowerCase(); | |
| if (/^[0-9]+$/.test(string)) { | |
| return Number(string); | |
| } else if (/^(player|p)$/.test(string)) { | |
| return 0; | |
| } else { | |
| var isEvent = /^(event|e)([0-9]+)$/.exec(string); | |
| if (isEvent) { | |
| return Number(isEvent[2]); | |
| } | |
| return null; | |
| } | |
| }; | |
| QPlus.compareCharaId = function(a, b) { | |
| if (a === b) return true; | |
| return this.charaIdToId(a) === this.charaIdToId(b); | |
| }; | |
| /** | |
| * @static QPlus.request | |
| * Creates an XHR request | |
| * @param {String} filePath | |
| * path to the file to load | |
| * @param {Function} callback | |
| * callback on load, response value is passed as 1st argument | |
| * @param {Function} err | |
| * callback on error | |
| * @return {XMLHttpRequest} | |
| */ | |
| QPlus.request = function(filePath, callback, err) { | |
| var xhr = new XMLHttpRequest(); | |
| xhr.url = filePath; | |
| xhr.open('GET', filePath, true); | |
| var type = filePath.split('.').pop().toLowerCase(); | |
| if (type === 'txt') { | |
| xhr.overrideMimeType('text/plain'); | |
| } else if (type === 'json') { | |
| xhr.overrideMimeType('application/json'); | |
| } | |
| xhr.onload = function() { | |
| if (this.status < 400) { | |
| var val = this.responseText; | |
| if (type === 'json') val = JSON.parse(val); | |
| this._onSuccess(val); | |
| } | |
| } | |
| xhr.onError = function(func) { | |
| this.onerror = func; | |
| return this; | |
| } | |
| xhr.onSuccess = function(func) { | |
| this._onSuccess = func; | |
| return this; | |
| } | |
| xhr._onSuccess = callback || function() { }; | |
| xhr.onerror = err || function() { | |
| console.error('Error:' + this.url + ' not found'); | |
| } | |
| xhr.send(); | |
| return xhr; | |
| }; | |
| QPlus._waitListeners = []; | |
| /** | |
| * @static QPlus.wait | |
| * Calls callback once duration reachs 0 | |
| * @param {Number} duration | |
| * duration in frames to wait | |
| * @param {Function} callback | |
| * callback to call after wait is complete | |
| * @return {Waiter} | |
| * Wait object that was created. Used to remove from listeners. | |
| * Can also be used to use the .then function to add a callback | |
| * instead of passing the callback in the parameter | |
| */ | |
| QPlus.wait = function(duration, callback) { | |
| var waiter = { | |
| duration: duration || 0, | |
| callback: callback, | |
| then: function(callback) { | |
| this.callback = callback; | |
| return this; | |
| } | |
| } | |
| this._waitListeners.push(waiter); | |
| return waiter; | |
| }; | |
| QPlus.removeWaitListener = function(waiter) { | |
| var i = this._waitListeners.indexOf(waiter); | |
| if (i === -1) return; | |
| this._waitListeners.splice(i, 1); | |
| }; | |
| QPlus.clearWaitListeners = function() { | |
| this._waitListeners = []; | |
| }; | |
| QPlus.mixin = function(to, what) { | |
| Object.getOwnPropertyNames(what).forEach(function(prop) { | |
| if (prop !== 'constructor') { | |
| Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(what, prop)); | |
| } | |
| }) | |
| }; | |
| QPlus.mixinWait = function(into) { | |
| this.mixin(into, { | |
| wait: this.wait, | |
| removeWaitListener: this.removeWaitListener, | |
| clearWaitListeners: this.clearWaitListeners, | |
| updateWaiters: this.updateWaiters | |
| }) | |
| if (into.update) { | |
| into.update_BEFOREWAIT = into.update; | |
| into.update = function() { | |
| this.update_BEFOREWAIT.apply(this, arguments); | |
| this.updateWaiters(); | |
| } | |
| } | |
| }; | |
| /** | |
| * @static QPlus.stringToObj | |
| * Converts a string into an object | |
| * @param {String} string | |
| * string in the format: | |
| * key: value | |
| * key2: value2 | |
| * @return {Object} | |
| */ | |
| QPlus.stringToObj = function(string) { | |
| var lines = string.split('\n'); | |
| var obj = {}; | |
| lines.forEach(function(value) { | |
| var match = /^(.*):(.*)/.exec(value); | |
| if (match) { | |
| var key, newKey = match[1].trim(); | |
| if (obj.hasOwnProperty(key)) { | |
| var i = 1; | |
| while (obj.hasOwnProperty(newKey)) { | |
| newKey = key + String(i); | |
| i++; | |
| } | |
| } | |
| var arr = QPlus.stringToAry(match[2].trim()); | |
| if (arr.length === 1) arr = arr[0]; | |
| obj[newKey] = arr || ''; | |
| } | |
| }) | |
| return obj; | |
| }; | |
| /** | |
| * @static QPlus.stringToAry | |
| * Converts a string into an array. And auto converts to | |
| * Number, Point, true, false or null | |
| * @param {String} string | |
| * Separate values with a comma | |
| * @return {Array} | |
| */ | |
| QPlus.stringToAry = function(string) { | |
| // couldn't get this to work with split so went with regex | |
| var regex = /\s*(\(.*?\))|([^,]+)/g; | |
| var arr = []; | |
| while (true) { | |
| var match = regex.exec(string); | |
| if (match) { | |
| arr.push(match[0]); | |
| } else { | |
| break; | |
| } | |
| } | |
| return arr.map(this.stringToType); | |
| }; | |
| QPlus.stringToType = function(string) { | |
| string = string.trim(); | |
| var rx = QPlus._regex; | |
| if (rx.isString.test(string)) { | |
| string = string.slice(1, -1); | |
| } | |
| if (rx.isBoolean.test(string)) { | |
| return string.toLowerCase() === 'true'; | |
| } | |
| if (rx.isFloat.test(string)) { | |
| return Number(string); | |
| } | |
| var isPoint = rx.isPoint.exec(string); | |
| if (isPoint) { | |
| return new Point(Number(isPoint[1]), Number(isPoint[2])); | |
| } | |
| if (rx.isArray.test(string)) { | |
| try { | |
| return JSON.parse(string).map(QPlus.stringToType); | |
| } catch (e) { | |
| return string; | |
| } | |
| } | |
| if (rx.isObj.test(string)) { | |
| try { | |
| var obj = JSON.parse(string); | |
| for (var key in obj) { | |
| obj[key] = QPlus.stringToType(obj[key]); | |
| } | |
| return obj; | |
| } catch (e) { | |
| return string; | |
| } | |
| } | |
| return string; | |
| }; | |
| /** | |
| * @static QPlus.pointToIndex | |
| * Converts a point to an index | |
| * @param {Point} point | |
| * @param {Int} maxCols | |
| * @param {Int} maxRows | |
| * @return {Int} index value | |
| */ | |
| QPlus.pointToIndex = function(point, maxCols, maxRows) { | |
| if (point.x >= maxCols) return -1; | |
| if (maxRows && point.y >= maxRows) return -1; | |
| return point.x + point.y * (maxCols) | |
| }; | |
| /** | |
| * @static QPlus.indexToPoint | |
| * Converts an index to a Point | |
| * @param {Int} index | |
| * @param {Int} maxCols | |
| * @param {Int} maxRows | |
| * @return {Point} | |
| */ | |
| QPlus.indexToPoint = function(index, maxCols, maxRows) { | |
| if (index < 0) return new Point(-1, -1); | |
| var x = index % maxCols; | |
| var y = Math.floor(index / maxCols); | |
| return new Point(x, y); | |
| }; | |
| /** | |
| * @static QPlus.adjustRadian | |
| * Keeps the radian between 0 and MAth.PI * 2 | |
| * @param {Int} radian | |
| * @return {Int} | |
| */ | |
| QPlus.adjustRadian = function(radian) { | |
| while (radian < 0) { | |
| radian += Math.PI * 2; | |
| } | |
| while (radian > Math.PI * 2) { | |
| radian -= Math.PI * 2; | |
| } | |
| return radian; | |
| }; | |
| QPlus.update = function() { | |
| this.updateWaiters(); | |
| }; | |
| QPlus.updateWaiters = function() { | |
| var waiters = this._waitListeners; | |
| for (var i = waiters.length - 1; i >= 0; i--) { | |
| if (!waiters[i]) { | |
| waiters.splice(i, 1); | |
| continue; | |
| } | |
| if (waiters[i].duration <= 0) { | |
| if (typeof waiters[i].callback === 'function') { | |
| try { | |
| waiters[i].callback(); | |
| } catch (e) { | |
| console.error(e); | |
| } | |
| } | |
| waiters.splice(i, 1); | |
| } else { | |
| waiters[i].duration--; | |
| } | |
| } | |
| }; | |
| })(); | |
| //----------------------------------------------------------------------------- | |
| // SimpleTilemap | |
| function SimpleTilemap() { | |
| this.initialize.apply(this, arguments); | |
| } | |
| //============================================================================= | |
| // QPlus edits to existing classes | |
| (function() { | |
| //----------------------------------------------------------------------------- | |
| // Get QPlus params | |
| var _PARAMS = QPlus.getParams('<QPlus>', { | |
| 'Quick Test': false, | |
| 'Default Enabled Switches': [], | |
| 'Ignore Mouse when inactive': false | |
| }); | |
| //----------------------------------------------------------------------------- | |
| // Window | |
| if (_PARAMS['Ignore Mouse when inactive']) { | |
| var isFocused = true; | |
| var focusWaiter; | |
| window.addEventListener('focus', function(e) { | |
| if (focusWaiter) { | |
| QPlus.removeWaitListener(focusWaiter); | |
| } | |
| focusWaiter = QPlus.wait(1) | |
| .then(function() { | |
| TouchInput.stopPropagation(); | |
| isFocused = true; | |
| focusWaiter = null; | |
| }) | |
| }) | |
| window.addEventListener('blur', function(e) { | |
| if (focusWaiter) { | |
| QPlus.removeWaitListener(focusWaiter); | |
| focusWaiter = null; | |
| } | |
| isFocused = false; | |
| }) | |
| var Alias_TouchInput_update = TouchInput.update; | |
| TouchInput.update = function() { | |
| if (!isFocused) { | |
| this.clear(); | |
| return; | |
| } | |
| Alias_TouchInput_update.call(this); | |
| } | |
| } | |
| //----------------------------------------------------------------------------- | |
| // Document body | |
| document.body.ondrop = function(e) { | |
| e.preventDefault(); | |
| return false; | |
| }; | |
| document.body.ondragover = function(e) { | |
| e.preventDefault(); | |
| return false; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Math | |
| Math.randomIntBetween = function(min, max) { | |
| min = Math.ceil(min); | |
| max = Math.floor(max); | |
| return Math.floor(Math.random() * (max - min + 1)) + min; | |
| }; | |
| Math.randomBetween = function(min, max) { | |
| return Math.random() * (max - min) + min; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Graphics | |
| var Alias_Graphics__makeErrorHtml = Graphics._makeErrorHtml; | |
| Graphics._makeErrorHtml = function(name, message) { | |
| var msg = Alias_Graphics__makeErrorHtml.call(this, name, message); | |
| var extraMsg = ''; | |
| if (Utils.isNwjs()) { | |
| var consoleKey = 'F8'; | |
| if (Imported.QInput) { | |
| consoleKey = QInput.remapped.console[0].toUpperCase(); | |
| } | |
| extraMsg = `<br /><font color="white">For more information, push ${consoleKey}</font>`; | |
| } | |
| return msg + extraMsg; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Input | |
| Input.stopPropagation = function() { | |
| var key = this._latestButton; | |
| this._currentState[key] = false; | |
| this._latestButton = null; | |
| for (var i = 0; i < this._gamepadStates.length; i++) { | |
| if (!this._gamepadStates[i]) continue; | |
| for (var j = 0; j < this._gamepadStates[i].length; j++) { | |
| var button = Imported.QInput ? this.gamepadKeys[j] : this.gamepadMapper[j]; | |
| if (button === key) { | |
| this._gamepadStates[i][j] = false; | |
| break; | |
| } | |
| } | |
| } | |
| if (Imported.QInput) { | |
| this._ranPress = false; | |
| this._lastPressed = null; | |
| this._lastTriggered = null; | |
| this._lastGamepadTriggered = null; | |
| } | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // TouchInput | |
| TouchInput._onMouseMove = function(event) { | |
| var x = Graphics.pageToCanvasX(event.pageX); | |
| var y = Graphics.pageToCanvasY(event.pageY); | |
| this._onMove(x, y); | |
| }; | |
| TouchInput.stopPropagation = function() { | |
| this._screenPressed = false; | |
| this._triggered = false; | |
| this._cancelled = false; | |
| this._released = false; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // SceneManager | |
| var Alias_SceneManager_updateManagers = SceneManager.updateManagers; | |
| SceneManager.updateManagers = function() { | |
| Alias_SceneManager_updateManagers.call(this); | |
| QPlus.update(); | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // DataManager | |
| var Alias_DataManager_setupNewGame = DataManager.setupNewGame; | |
| DataManager.setupNewGame = function() { | |
| Alias_DataManager_setupNewGame.call(this); | |
| for (var i = 0; i < _PARAMS['Default Enabled Switches'].length; i++) { | |
| $gameSwitches.setValue(_PARAMS['Default Enabled Switches'][i], true); | |
| } | |
| }; | |
| var reading = null; | |
| var Alias_DataManager_onLoad = DataManager.onLoad; | |
| DataManager.onLoad = function(object) { | |
| reading = object; | |
| Alias_DataManager_onLoad.call(this, object); | |
| reading = null; | |
| }; | |
| var Alias_DataManager_extractMetadata = DataManager.extractMetadata; | |
| DataManager.extractMetadata = function(data) { | |
| Alias_DataManager_extractMetadata.call(this, data); | |
| var blockRegex = /<([^<>:\/]+)>([\s\S]*?)<\/\1>/g; | |
| data.qmeta = Object.assign({}, data.meta); | |
| while (true) { | |
| var match = blockRegex.exec(data.note); | |
| if (match) { | |
| data.qmeta[match[1]] = match[2]; | |
| } else { | |
| break; | |
| } | |
| } | |
| this.extractQData(data, reading); | |
| }; | |
| DataManager.extractQData = function(data, object) { | |
| // to be aliased by plugins | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Scene_Base | |
| var Alias_Scene_Base_initialize = Scene_Base.prototype.initialize; | |
| Scene_Base.prototype.initialize = function() { | |
| Alias_Scene_Base_initialize.call(this); | |
| this._waitListeners = []; | |
| if (this.mixinWait()) { | |
| QPlus.mixinWait(this); | |
| } | |
| }; | |
| Scene_Base.prototype.mixinWait = function() { | |
| // In your own scene, have this return true to be able to | |
| // use the .wait(duration, callback) function | |
| return false; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Scene_Boot | |
| var Alias_Scene_Boot_start = Scene_Boot.prototype.start; | |
| Scene_Boot.prototype.start = function() { | |
| if (DataManager.isBattleTest() || DataManager.isEventTest()) { | |
| Alias_Scene_Boot_start.call(this); | |
| } else if (_PARAMS['Quick Test'] && Utils.isOptionValid('test')) { | |
| Scene_Base.prototype.start.call(this); | |
| SoundManager.preloadImportantSounds(); | |
| this.checkPlayerLocation(); | |
| DataManager.setupNewGame(); | |
| SceneManager.goto(Scene_Map); | |
| this.updateDocumentTitle(); | |
| } else { | |
| Alias_Scene_Boot_start.call(this); | |
| } | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Scene_Map | |
| var Alias_Scene_Map_update = Scene_Map.prototype.update; | |
| Scene_Map.prototype.update = function() { | |
| if (TouchInput.isMoved()) this.updateMouseInsideWindow(); | |
| Alias_Scene_Map_update.call(this); | |
| }; | |
| Scene_Map.prototype.updateMouseInsideWindow = function() { | |
| var inside = false; | |
| var windows = this._windowLayer.children; | |
| for (var i = 0; i < windows.length; i++) { | |
| if (windows[i].visible && windows[i].isOpen() && windows[i].isMouseInside()) { | |
| inside = true; | |
| break; | |
| } | |
| } | |
| TouchInput.insideWindow = inside; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_Temp | |
| var Alias_Game_Temp_isDestinationValid = Game_Temp.prototype.isDestinationValid; | |
| Game_Temp.prototype.isDestinationValid = function() { | |
| var valid = Alias_Game_Temp_isDestinationValid.call(this); | |
| return !TouchInput.insideWindow && valid; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_Interpreter | |
| var Alias_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; | |
| Game_Interpreter.prototype.pluginCommand = function(command, args) { | |
| if (this.qPlusCommand(command, QPlus.makeArgs(args))) { | |
| return; | |
| } | |
| Alias_Game_Interpreter_pluginCommand.call(this, command, args); | |
| }; | |
| Game_Interpreter.prototype.qPlusCommand = function(command, args) { | |
| if (command.toLowerCase() === 'wait') { | |
| var min = Number(args[0]); | |
| var max = Number(args[1]); | |
| if (!max) { | |
| max = min; | |
| min = 0; | |
| } | |
| var wait = Math.randomIntBetween(min, max); | |
| this.wait(wait); | |
| return true; | |
| } | |
| if (command.toLowerCase() === 'globallock') { | |
| var level = Number(args[0]); | |
| var args2 = args.slice(1); | |
| var only = args2.indexOf('only'); | |
| if (only !== -1) args2.splice(only, 1); | |
| var charas = args2.map(QPlus.getCharacter); | |
| var mode = only !== -1 ? 1 : 0; | |
| $gameMap.globalLock(charas, mode, level); | |
| return true; | |
| } | |
| return false; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_Map | |
| /** | |
| * @param {arr} charas | |
| * array of characters | |
| * @param {int} mode | |
| * 0 - ignore characters in charas arr | |
| * 1 - only apply to charas in charas arr | |
| * @param {int} level | |
| * 0 - clear lock | |
| * 1 - lock movement | |
| * 2 - lock movement and character animation | |
| */ | |
| Game_Map.prototype.globalLock = function(charas, mode, level) { | |
| charas = charas || []; | |
| mode = mode === undefined ? 0 : mode; | |
| level = level === undefined ? 1 : level; | |
| if (mode === 0) { | |
| $gamePlayer._globalLocked = !charas.contains($gamePlayer) ? level : 0; | |
| var events = this.events(); | |
| for (var i = 0; i < events.length; i++) { | |
| if (charas.contains(events[i])) continue; | |
| events[i]._globalLocked = level; | |
| } | |
| } else { | |
| for (var i = 0; i < charas.length; i++) { | |
| if (charas[i]) { | |
| charas[i]._globalLocked = level; | |
| } | |
| } | |
| } | |
| }; | |
| // kept for backwars compatibility | |
| Game_Map.prototype.globalUnlock = function(charas) { | |
| this.globalLock(charas, 0, 0); | |
| }; | |
| Game_Map.prototype.noTilemap = function() { | |
| return !!$dataMap.meta.noTilemap; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_CharacterBase | |
| var Alias_Game_CharacterBase_initMembers = Game_CharacterBase.prototype.initMembers; | |
| Game_CharacterBase.prototype.initMembers = function() { | |
| Alias_Game_CharacterBase_initMembers.call(this); | |
| this._globalLocked = 0; | |
| this._comments = ''; | |
| this._waitListeners = []; | |
| QPlus.mixinWait(this); | |
| }; | |
| Game_CharacterBase.prototype.charaId = function() { | |
| return -1; | |
| }; | |
| Game_CharacterBase.prototype.notes = function() { | |
| return ''; | |
| }; | |
| Game_CharacterBase.prototype.canMove = function() { | |
| return this._globalLocked === 0; | |
| }; | |
| /** | |
| * east is 0, north is 270, west is 180 and south is 90 | |
| */ | |
| Game_CharacterBase.prototype.directionToRadian = function(dir) { | |
| dir = dir || this._direction; | |
| if (dir === 2) return Math.PI / 2; | |
| if (dir === 4) return Math.PI; | |
| if (dir === 6) return 0; | |
| if (dir === 8) return Math.PI * 3 / 2; | |
| if (dir === 1) return Math.PI * 3 / 4; | |
| if (dir === 3) return Math.PI / 4; | |
| if (dir === 7) return Math.PI * 5 / 4; | |
| if (dir === 9) return Math.PI * 7 / 4; | |
| return 0; | |
| }; | |
| Game_CharacterBase.prototype.radianToDirection = function(radian, useDiag) { | |
| radian = QPlus.adjustRadian(radian); | |
| if (useDiag) { | |
| // use degrees for diagonals | |
| // since I don't know clean PI numbers for these degrees | |
| var deg = radian * 180 / Math.PI; | |
| if (deg >= 22.5 && deg <= 67.5) { | |
| return 3; | |
| } else if (deg >= 112.5 && deg <= 157.5) { | |
| return 1; | |
| } else if (deg >= 202.5 && deg <= 247.5) { | |
| return 7; | |
| } else if (deg >= 292.5 && deg <= 337.5) { | |
| return 9; | |
| } | |
| } | |
| if (radian >= 0 && radian < Math.PI / 4) { | |
| return 6; | |
| } else if (radian >= Math.PI / 4 && radian < 3 * Math.PI / 4) { | |
| return 2; | |
| } else if (radian >= Math.PI * 3 / 4 && radian < Math.PI * 5 / 4) { | |
| return 4; | |
| } else if (radian >= Math.PI * 5 / 4 && radian < Math.PI * 7 / 4) { | |
| return 8; | |
| } else if (radian >= Math.PI * 7 / 4) { | |
| return 6; | |
| } | |
| }; | |
| Game_CharacterBase.prototype.setSelfSwitch = function() { | |
| return; | |
| }; | |
| var Alias_Game_CharacterBase_updateAnimation = Game_CharacterBase.prototype.updateAnimation; | |
| Game_CharacterBase.prototype.updateAnimation = function() { | |
| if (this._globalLocked >= 2) { | |
| return; | |
| } | |
| Alias_Game_CharacterBase_updateAnimation.call(this); | |
| }; | |
| var Alias_Game_CharacterBase_updateMove = Game_CharacterBase.prototype.updateMove; | |
| Game_CharacterBase.prototype.updateMove = function() { | |
| if (this._globalLocked >= 1) { | |
| return; | |
| } | |
| Alias_Game_CharacterBase_updateMove.call(this); | |
| }; | |
| var Alias_Game_Character_updateRoutineMove = Game_Character.prototype.updateRoutineMove; | |
| Game_Character.prototype.updateRoutineMove = function() { | |
| if (this._globalLocked >= 1) { | |
| return; | |
| } | |
| Alias_Game_Character_updateRoutineMove.call(this); | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_Player | |
| var Alias_Game_Player_canMove = Game_Player.prototype.canMove; | |
| Game_Player.prototype.canMove = function() { | |
| return Alias_Game_Player_canMove.call(this) && | |
| Game_Character.prototype.canMove.call(this); | |
| }; | |
| Game_Player.prototype.canClick = function() { | |
| return !TouchInput.insideWindow; | |
| }; | |
| Game_Player.prototype.charaId = function() { | |
| return 0; | |
| }; | |
| Game_Player.prototype.actor = function() { | |
| return $gameParty.leader(); | |
| }; | |
| Game_Player.prototype.notes = function() { | |
| return this.actor() ? this.actor().actor().note : ''; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Game_Event | |
| var Alias_Game_Event_initMembers = Game_Event.prototype.initMembers; | |
| Game_Event.prototype.initMembers = function() { | |
| Alias_Game_Event_initMembers.call(this); | |
| this._comments = null; | |
| this._prevDir = null; | |
| }; | |
| Game_Event.prototype.charaId = function() { | |
| return this.eventId(); | |
| }; | |
| Game_Event.prototype.notes = function(withComments) { | |
| var notes = this.event() ? this.event().note : ''; | |
| return notes + (withComments ? this.comments() : ''); | |
| }; | |
| Game_Event.prototype.comments = function(withNotes) { | |
| var notes = ''; | |
| if (this.event()) { | |
| notes = this.event().note; | |
| } | |
| return this._comments + (withNotes ? notes : ''); | |
| }; | |
| Game_Event.prototype.setupComments = function() { | |
| this._comments = ''; | |
| if (this.page() && this.list()) { | |
| this._comments = this.list().filter(function(list) { | |
| return list.code === 108 || list.code === 408; | |
| }).map(function(list) { | |
| return list.parameters; | |
| }).join('\n') | |
| } | |
| }; | |
| var Alias_Game_Event_setupPage = Game_Event.prototype.setupPage; | |
| Game_Event.prototype.setupPage = function() { | |
| var firstTime = this._prevDir === null; | |
| this._prevDir = this.direction(); | |
| Alias_Game_Event_setupPage.call(this); | |
| var retainDir = /<retainDir>/i.test(this.comments(true)); | |
| if (!firstTime && retainDir) { | |
| this.setDirection(this._prevDir); | |
| } | |
| }; | |
| var Alias_Game_Event_clearPageSettings = Game_Event.prototype.clearPageSettings; | |
| Game_Event.prototype.clearPageSettings = function() { | |
| Alias_Game_Event_clearPageSettings.call(this); | |
| this._comments = ''; | |
| }; | |
| var Alias_Game_Event_setupPageSettings = Game_Event.prototype.setupPageSettings; | |
| Game_Event.prototype.setupPageSettings = function() { | |
| Alias_Game_Event_setupPageSettings.call(this); | |
| this.setupComments(); | |
| }; | |
| Game_Event.prototype.setSelfSwitch = function(selfSwitch, bool) { | |
| var mapId = this._mapId; | |
| var eventId = this._eventId; | |
| if (!mapId || !eventId) return; | |
| var key = [mapId, eventId, selfSwitch]; | |
| $gameSelfSwitches.setValue(key, bool); | |
| }; | |
| var Alias_Game_Event_updateSelfMovement = Game_Event.prototype.updateSelfMovement; | |
| Game_Event.prototype.updateSelfMovement = function() { | |
| if (!this.canMove()) return; | |
| Alias_Game_Event_updateSelfMovement.call(this); | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Window_Base | |
| Window_Base.prototype.isMouseInside = function() { | |
| var x = TouchInput.x - this.x; | |
| var y = TouchInput.y - this.y; | |
| return x >= 0 && y >= 0 && x < this.width && y < this.height; | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Sprite_Character | |
| var Alias_Sprite_Character_updatePosition = Sprite_Character.prototype.updatePosition; | |
| Sprite_Character.prototype.updatePosition = function() { | |
| var prevY = this.y; | |
| var prevZ = this.z; | |
| Alias_Sprite_Character_updatePosition.call(this); | |
| if (this.y !== prevY || this.z !== prevZ) { | |
| if ($gameMap.noTilemap && this.parent && this.parent.requestSort) { | |
| this.parent.requestSort(); | |
| } | |
| } | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // Spriteset_Map | |
| var Alias_Spriteset_Map_createTilemap = Spriteset_Map.prototype.createTilemap; | |
| Spriteset_Map.prototype.createTilemap = function() { | |
| if ($gameMap.noTilemap()) { | |
| this._tilemap = new SimpleTilemap(); | |
| this._baseSprite.addChild(this._tilemap); | |
| } else { | |
| Alias_Spriteset_Map_createTilemap.call(this); | |
| } | |
| }; | |
| var Alias_Spriteset_Map_loadTileset = Spriteset_Map.prototype.loadTileset; | |
| Spriteset_Map.prototype.loadTileset = function() { | |
| if (!$gameMap.noTilemap()) { | |
| Alias_Spriteset_Map_loadTileset.call(this); | |
| } | |
| }; | |
| var Alias_Spriteset_Map_updateTilemap = Spriteset_Map.prototype.updateTilemap; | |
| Spriteset_Map.prototype.updateTilemap = function() { | |
| if (!$gameMap.noTilemap()) { | |
| Alias_Spriteset_Map_updateTilemap.call(this); | |
| } | |
| }; | |
| //----------------------------------------------------------------------------- | |
| // SimpleTilemap | |
| SimpleTilemap.prototype = Object.create(Sprite.prototype); | |
| SimpleTilemap.prototype.constructor = SimpleTilemap; | |
| SimpleTilemap.prototype.initialize = function() { | |
| Sprite.prototype.initialize.call(this); | |
| this._requestSort = false; | |
| }; | |
| SimpleTilemap.prototype.requestSort = function() { | |
| this._requestSort = true; | |
| }; | |
| SimpleTilemap.prototype.update = function() { | |
| Sprite.prototype.update.call(this); | |
| if (this._requestSort) { | |
| this._sortChildren(); | |
| } | |
| }; | |
| SimpleTilemap.prototype._sortChildren = function() { | |
| this.children.sort(this._compareChildOrder.bind(this)); | |
| }; | |
| SimpleTilemap.prototype._compareChildOrder = function(a, b) { | |
| if (a.z !== b.z) { | |
| return a.z - b.z; | |
| } else if (a.y !== b.y) { | |
| return a.y - b.y; | |
| } else { | |
| return (a.spriteId - b.spriteId) || 0; | |
| } | |
| }; | |
| })() |