pastime/js/plugins/MPP_DeleteSelfSwitch.js
2026-03-15 16:45:22 -05:00

272 lines
9.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// MPP_DeleteSelfSwitch.js
//=============================================================================
// Copyright (c) 2022 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @target MV MZ
* @plugindesc When you move to another place, turn off the specified self-switch.
* @author Mokusei Penguin
* @url
*
* @help [version 2.1.0]
* This plugin is for RPG Maker MV and MZ.
*
* ▼ Plugin command details
* - In MV, the variable N is referred to by writing v [N] in the item for
* inputting a numerical value.
* - In MZ, in the item to enter a numerical value, select the text and
* write v [N] to refer to the variable N.
*
* MV / MZ
*
* DeleteSelfSwitch mapIds sw / delete
* mapIds : Range can be specified
* sw : Self switch to turn off
* - Turns off all self-switches on the specified map.
* - When specifying the range, do not put a space between them. (MV only)
* - Do not put a space between the self-switch specifications.
* Example DeleteSelfSwitch 1 A
* => Change self-switch A of map ID 1 to OFF
* DeleteSelfSwitch v[13] BCD
* => Change the self-switch B, C, D of the map ID of
* variable 13 to OFF
* DeleteSelfSwitch 1-5,8 BC
* => Change the self-switches B and C of map IDs 1 to 5 and
* 8 to OFF
*
* ▼ About range specification
* - When setting numbers in an array, you can specify numbers from N to M by
* writing N-M.
* Example: 1-4,8,10-12
*
* ================================
* Mail : wood_penguinyahoo.co.jp ( is half-width)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command delete
* @desc
* @arg mapIds
* @desc Range can be specified
* @default 0
* @arg switchs
* @desc
* @default ABCD
*
*
* @param Map IDs
* @desc Map ID that turns off the self-switch when moving to another location
* (All maps if empty / Range can be specified)
* @default
*
* @param Self Switches
* @desc Self switch to turn off
* @default ABCD
*
* @param Self Variables
* @desc Self variable to be 0
* (Only when MPP_SelfVariable is installed / Range can be specified)
* @default
*
*/
/*:ja
* @target MV MZ
* @plugindesc 場所移動した際に、指定したセルフスイッチをOFFにします。
* @author 木星ペンギン
* @url
*
* @help [version 2.1.0]
* このプラグインはRPGツクールMVおよびMZ用です。
*
* ▼ プラグインコマンド
* - MVでは数値を入力する項目で v[N] と記述することで変数N番を参照します。
* - MZでは数値を入力する項目で、テキストを選択して v[N] と記述することで
* 変数N番を参照します。
*
* MV / MZ
*
* DeleteSelfSwitch mapIds sw / セルフスイッチ削除
* mapIds : マップID (範囲指定可)
* sw : OFFにするセルフスイッチ
* - 指定したマップのセルフスイッチを全てOFFにします。
* - 範囲指定する場合は間にスペースを入れないでください。(MVのみ)
* - セルフスイッチの指定は間にスペースを入れないでください。
* 例: DeleteSelfSwitch 1 A
* => マップID 1 番のセルフスイッチ A をOFFに変更
* DeleteSelfSwitch v[13] BCD
* => 変数13番のマップIDのセルフスイッチ B,C,D をOFFに変更
* DeleteSelfSwitch 1-5,8 BC
* => マップID 15と8 のセルフスイッチ B,C をOFFに変更
*
* ▼ 範囲指定について
* - 数値を配列で設定する際、n-m と表記することでnからmまでの数値を指定できます。
* 例: 1-4,8,10-12
*
* ================================
* Mail : wood_penguinyahoo.co.jp (@は半角)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command delete
* @text 削除
* @desc
* @arg mapIds
* @text マップID
* @desc 範囲指定可
* @default 0
* @arg switchs
* @text スイッチ
* @desc
* @default ABCD
*
*
* @param Map IDs
* @text マップID
* @desc 場所移動でセルフスイッチをOFFにするマップIDの配列
* (空の場合はすべてのマップ / 範囲指定可)
* @default
*
* @param Self Switches
* @text セルフスイッチ
* @desc OFFにするセルフスイッチ
* @default ABCD
*
* @param Self Variables
* @text セルフ変数
* @desc 0にするセルフ変数
* (MPP_SelfVariable導入時のみ / 範囲指定可)
* @default
*
*/
(() => {
'use strict';
const pluginName = 'MPP_DeleteSelfSwitch';
// Plugin Parameters
const parameters = PluginManager.parameters(pluginName);
const range = function*(start, end) {
for (let i = start; i < end; i++) {
yield i;
}
};
const convertToArray = (param) => {
return param.split(',').reduce((r, item) => {
if (item) {
const match = /(\d+)-(\d+)/.exec(item);
if (match) {
r.push(...range(+match[1], +match[2] + 1));
} else {
r.push(+item);
}
}
return r;
}, []);
};
const params_MapIDs = convertToArray(parameters['Map IDs']);
const params_SelfSwitches = parameters['Self Switches'];
const params_SelfVariables = convertToArray(parameters['Self Variables']);
// Dealing with other plugins
const _importedPlugin = (...names) => {
return names.some(name => PluginManager._scripts.includes(name));
};
//-------------------------------------------------------------------------
// Game_SelfSwitches
Game_SelfSwitches.prototype.delete = function(mapId, switchs) {
const regexp = new RegExp(`${mapId},\\d+,[${switchs}]`);
for (const key of Object.keys(this._data)) {
if (regexp.test(key)) {
delete this._data[key];
}
}
this.onChange();
};
//-------------------------------------------------------------------------
// Game_Map
const _Game_Map_setup = Game_Map.prototype.setup;
Game_Map.prototype.setup = function(mapId) {
if (
this._mapId !== mapId &&
(params_MapIDs.length === 0 || params_MapIDs.includes(this._mapId))
) {
$gameSelfSwitches.delete(this._mapId, params_SelfSwitches);
if (_importedPlugin('MPP_SelfVariable')) {
$gameVariables.deleteSelfValues(this._mapId, [], params_SelfVariables);
}
}
_Game_Map_setup.apply(this, arguments);
};
//-----------------------------------------------------------------------------
// Game_Interpreter
const _mzCommands = {
DeleteSelfSwitch: { name:'delete', keys:['mapIds', 'switchs'] }
};
Object.assign(_mzCommands, {
'セルフスイッチ削除': _mzCommands.DeleteSelfSwitch
});
const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);
const mzCommand = _mzCommands[command];
if (mzCommand) {
const args2 = Object.assign(
{},
...mzCommand.keys.map((k, i) => ({ [k]: args[i] }))
);
PluginManager.callCommandMV(this, pluginName, mzCommand.name, args2);
}
};
//-------------------------------------------------------------------------
// PluginManager
if (!PluginManager.registerCommand) {
PluginManager._commandsMV = PluginManager._commandsMV || {};
PluginManager.registerCommandMV = function(pluginName, commandName, func) {
const key = pluginName + ':' + commandName;
this._commandsMV[key] = func;
};
PluginManager.callCommandMV = function(self, pluginName, commandName, args) {
const key = pluginName + ':' + commandName;
const func = this._commandsMV[key];
if (typeof func === 'function') {
func.bind(self)(args);
}
};
}
{
const _registerCommand = PluginManager.registerCommand || PluginManager.registerCommandMV;
_registerCommand.call(PluginManager, pluginName, 'delete', function(args) {
const switchs = args.switchs.toUpperCase();
for (const mapId of PluginManager.mppConvertRange(args.mapIds)) {
$gameSelfSwitches.delete(mapId || this._mapId, switchs);
}
});
}
PluginManager.mppConvertRange = function(text) {
return convertToArray(text.replace(
/V\[(\d+)\]/gi, (_, p1) => $gameVariables.value(parseInt(p1))
));
};
})();