//============================================================================= // TRP_ParticleMZ_Group.js //============================================================================= /*: * @target MZ * @plugindesc グループ再生機能の有効化 * @author Thirop * @base TRP_ParticleMZ * @orderAfter TRP_ParticleMZ * * @help * 【更新履歴】 * 1.25 2022/07/31 set直後にアップデートするように仕様変更 * 1.24 2022/06/24 displayObjectの内部登録が削除されない不具合修正 * 1.21 2022/05/02 制御文字が反映されない不具合の修正 * 1.19 2022/02/14 ロード時のエラー修正 * 1.13 2021/11/04 隠しコマンド(flash/shake/se)に対応 * 1.09 2021/07/19 設定名の「/h」を自動補完 * 座標調整が正しく反映されない不具合修正 * 1.05 2021/04/22 設定名に「_auto:~」使用可能に修正 * 1.00 2021/04/10 初版 * * * @command set * @text set/表示 * @desc グループ再生開始 * * @arg id * @text 管理ID * @desc 他と被らない管理ID。(末尾に-EIDをつけるとEIDがイベントIDに置き換わる。) * @default def * * @arg target * @text ターゲット * @desc thisでこのイベント。「event:イベントID」「player」「weather」など * @default this * * @arg name * @text データ名 * @desc データ名。defとすると管理IDをデータ名として使用。(重み同じデータ名を複数表示するときは管理IDを分ける) * @default def * * @arg tag * @text 管理タグ * @desc 管理用のタグ名。省略で「group:グループ管理ID」 * * @arg edit * @text Editモード * @desc ONにするとエディタを呼び出し(テストプレイ時のみ有効) * @default false * @type boolean * * @arg delay * @text _ディレイ * @desc 1以上とすると、指定フレーム後にコマンドを実効 * @default 0 * @type number * @min 0 * * * @command clear * @text clear/クリア * @desc グループの再生停止。(setコマンドで再生中のパーティクルを消すにはparticle clear tag:group:グループ管理ID) * * @arg id * @text 対象グループ管理ID * @desc 対象グループ管理ID * * @arg quit * @text 中断 * @desc on/trueとすると再生完了を待たずに中断 * @type boolean * @default false * * @arg delay * @text _ディレイ * @desc 1以上とすると、指定フレーム後にコマンドを実効 * @default 0 * @type number * @min 0 */ //============================================================================= //PRAGMA_END: groupHeader //PRAGMA: englishHeader //PRAGMA_END: englishHeader var $dataTrpParticleGroupsPreset = $dataTrpParticleGroupsPreset || null; var $dataTrpParticleGroups = null; //PRAGMA: defParticleGroup function ParticleGroup() { this.initialize.apply(this, arguments); } //PRAGMA_END: defParticleGroup (function () { "use strict"; //PRAGMA: groupPluginSetting var pluginName = "TRP_ParticleMZ_Group"; Game_Particle.GROUP_DATA_FIILE_PATH = "../dataEx/TrpParticleGroups.json"; var baseParameters = PluginManager.parameters("TRP_ParticleMZ"); //PRAGMA_END: groupPluginSetting var LC = TRP_Localize.localize.bind(TRP_Localize, "parGr"); var NLC = TRP_Localize.noLocalize; var errorLog = baseParameters.errorLog === "true"; DataManager._databaseFiles.push({ name: "$dataTrpParticleGroups", src: Game_Particle.GROUP_DATA_FIILE_PATH, }); var _DataManager_loadDataFile = DataManager.loadDataFile; DataManager.loadDataFile = function (name, src) { if (src.contains("Test_") && src.contains("TrpParticleGroups")) { src = Game_Particle.GROUP_DATA_FIILE_PATH; } _DataManager_loadDataFile.call(this, name, src); }; function supplement(defaultValue, optionArg) { if (optionArg === undefined) { return defaultValue; } return optionArg; } function supplementNum(defaultValue, optionArg) { return Number(supplement(defaultValue, optionArg)); } var _supplementDefWords = ["default", "def", "d"]; function supplementDef(defaultValue, optionArg, otherWords) { var value = supplement(defaultValue, optionArg); var defTargetWords = otherWords || []; if (defTargetWords) { defTargetWords = defTargetWords.concat(_supplementDefWords); } else { defTargetWords = _supplementDefWords; } var length = defTargetWords.length; for (var i = 0; i < length; i = (i + 1) | 0) { var target = defTargetWords[i]; if (value === target) { value = defaultValue; break; } } return value; } function supplementDefNum(defaultValue, optionArg, otherWords) { var value = supplementDef(defaultValue, optionArg, otherWords); return Number(value); } //PRAGMA: groupCommandRegister //============================================================================= // Plugin Command //============================================================================= (() => { const commands = ["set", "clear"]; for (const command of commands) { PluginManager.registerCommand(pluginName, command, function (args) { //this > interpreter var argsArr = Object.values(args); var delay = Number(argsArr.pop()) || 0; var pCommand = command; if (command === "set") { var editFlag = argsArr.pop() === "true"; if (editFlag) { pCommand = "edit"; } var tag = argsArr.pop(); if (tag) { if (!tag.contains("tag:")) { tag = "tag:" + tag; } argsArr.push(tag); } } argsArr.unshift(pCommand); argsArr.unshift("group"); var eventId = this.eventId(); if (delay > 0) { $gameScreen._particle.reservePluginCommand( delay, this, argsArr, eventId ); } else { $gameScreen._particle.pluginCommand(this, argsArr, eventId); } }); } /* TRP_ParticleList ===================================*/ function _listCommand(command, args) { //this > interpreter var id; if (!args.id || args.id === "def" || args.id === "d") { args.id = args.name; } if (id === "-EID") { id = args.name + "-EID"; } else { id = supplementDef(args.name, args.id); } var command = args.edit === "true" ? "edit" : "set"; var delay = Number(args.delay) || 0; var argsArr = ["group", command, id, args.target, args.name]; if (args.tag) { argsArr.push("tag:" + args.tag); } var eventId = this.eventId(); if (delay > 0) { $gameScreen._particle.reservePluginCommand( delay, this, argsArr, eventId ); } else { $gameScreen._particle.pluginCommand(this, argsArr, eventId); } } var categoryNames = Game_Particle.CATEGORY_NAMES; var categoryLength = categoryNames.length; var listPlugin = "TRP_ParticleMZ_List"; var presetPlugin = "TRP_ParticleMZ_Preset"; for (var j = 0; j < categoryLength; j = (j + 1) | 0) { var category = categoryNames[j]; var command = "group_" + category; PluginManager.registerCommand(listPlugin, command, function (args) { _listCommand.call(this, command, args); }); PluginManager.registerCommand(presetPlugin, command, function (args) { _listCommand.call(this, command, args); }); } })(); //PRAGMA_END: groupCommandRegister //============================================================================= // Game_Particle //============================================================================= Game_Particle.groupData = function (data) { return this.groupDataWithName(data.name); }; Game_Particle.groupDataWithName = function (name) { var config = $dataTrpParticleGroups[name]; if (config) { return config; } config = $dataTrpParticleGroupsPreset[name]; if (config) { return config; } if (name.indexOf("/h") !== name.length - 2) { return this.groupDataWithName(name + "/h"); } return null; }; var _Game_Particle_initialize = Game_Particle.prototype.initialize; Game_Particle.prototype.initialize = function () { _Game_Particle_initialize.call(this); this._groups = {}; this._groupKeys = []; }; var _Game_Particle_pluginCommand = Game_Particle.prototype.pluginCommand; Game_Particle.prototype.pluginCommand = function ( interpreter, args, eventId ) { var sub = args[0].toLowerCase(); if (sub === "group") { this.processGroupCommand(interpreter, args, eventId); } else { _Game_Particle_pluginCommand.call(this, interpreter, args, eventId); } }; Game_Particle.prototype.processGroupCommand = function ( interpreter, args, eventId ) { this.convertEscapeCharacters(args); var main = args.shift(); var sub = args.shift().toLowerCase(); //process eid if (!isNaN(eventId)) { this.processArgsEventId(args, eventId); } var tag; if (sub === "set" || sub === "play" || sub === "edit") { tag = this.extractTagRegister(args); args.splice(-1 + Game_Particle.GROUP_COMMAND_ARGS_INDEX_TAG, 0, tag); var targetId = ""; if (sub === "set" || sub === "play") { args.unshift(eventId); var group = Game_Particle.prototype.particleGroupSet.apply(this, args); if (group) { var suffix = this._suffix; this._suffix = ""; group.update(this); this._suffix = suffix; } targetId = args[1]; } else if (sub === "edit") { args.unshift(eventId); if ( Game_Particle.prototype.particleGroupEdit.apply(this, args) && interpreter ) { interpreter.wait(1); } targetId = args[2]; } } else if (sub === "clear") { Game_Particle.prototype.particleGroupClear.apply(this, args); } }; Game_Particle.GROUP_COMMAND_ARGS_INDEX_TAG = 3; Game_Particle.prototype.particleGroupEdit = function () {}; Game_Particle.prototype.particleGroupSet = function ( eventId, id, target, tag, name, x, y ) { name = supplementDef(id, name) || id; id = this.idWithSuffix(id); if (!!this._groups[id]) { return; } x = Number(x) || 0; y = Number(y) || 0; if (!Game_Particle.groupDataWithName(name)) { if (errorLog) { throw new Error( LC("設定名:%1のグループ設定データが存在しません。", 0).format(name) ); } return; } if (errorLog && target === undefined) { throw new Error( LC("パーティクル表示コマンドの対象が設定されてません。", 2) + "(ID:" + id + ")" ); } //make data var group = new ParticleGroup(eventId, id, target, tag, name, x, y); this._groups[id] = group; this._groupKeys.push(id); return group; }; Game_Particle.prototype.particleGroupClear = function (id, quit) { if (quit === "false" || quit === "f") { quit = false; } else if (quit === "true" || quit === "t") { quit = true; } else { quit = supplementDef(false, quit); } var data = this._groups[id]; if (data) { data.repeat = -1; if (quit) { this.deleteGroup(id); } } }; Game_Particle.prototype.deleteGroup = function (id) { var index = this._groupKeys.indexOf(id); if (index >= 0) { this._groupKeys.splice(index, 1); } delete this._groups[id]; delete Game_Particle.displayObjects[id]; }; var _Game_Particle_update = Game_Particle.prototype.update; Game_Particle.prototype.update = function () { _Game_Particle_update.call(this); var keys = this._groupKeys; var length = keys.length; var destroyed = false; for (var i = length - 1; i >= 0; i = (i - 1) | 0) { var key = keys[i]; var group = this._groups[key]; if (group && !group.destroy) { group.update(this); } if (!group || group.destroy) { this.deleteGroup(key); } } }; /* auto remove ===================================*/ var _Game_Particle_removeCharacterTargetParticles = Game_Particle.prototype.removeCharacterTargetParticles; Game_Particle.prototype.removeCharacterTargetParticles = function () { this._removeCharacterTargetParticles(this._groupKeys, this._groups); _Game_Particle_removeCharacterTargetParticles.call(this); }; var _Game_Particle_removePartyTargetParticles = Game_Particle.prototype.removePartyTargetParticles; Game_Particle.prototype.removePartyTargetParticles = function () { this._removePartyTargetParticles(this._groupKeys, this._groups); _Game_Particle_removePartyTargetParticles.call(this); }; var _Game_Particle_removeParticlesWithTargetTypes = Game_Particle.prototype.removeParticlesWithTargetTypes; Game_Particle.prototype.removeParticlesWithTargetTypes = function (types) { this._removeParticlesWithTargetTypes(types, this._groupKeys, this._groups); _Game_Particle_removeParticlesWithTargetTypes.call(this, types); }; var _Game_Particle_clearTargetsParticles = Game_Particle.prototype.clearTargetsParticles; Game_Particle.prototype.clearTargetsParticles = function ( targetTypes, targetId, keys, allData ) { _Game_Particle_clearTargetsParticles.call( this, targetTypes, targetId, this._groupKeys, this._groups ); _Game_Particle_clearTargetsParticles.call( this, targetTypes, targetId, keys, allData ); }; //============================================================================= // ParticleGroup //============================================================================= Game_Particle.ParticleGroup = ParticleGroup; ParticleGroup.prototype.initialize = function ( eventId, id, target, tag, name, x, y ) { var particleData = $gameScreen._particle.particleData( eventId, id, target, name, undefined, undefined, undefined, undefined, true ); this.id = id; this.eventId = eventId; this.target = target; this.targetType = particleData.targetType; this.targetId = particleData.targetId; this.name = name; this.replacedName = name.replace("/h", ""); this.tag = tag || "group:" + id; this.x = x; this.y = y; this.params = {}; this._stop = false; this._clear = false; this.quit = false; this.interval = 0; this.exceed = null; this.list = null; this.repeat = 0; this.destroy = false; this._index = -1; this._wait = 0; this.applyData(); }; ParticleGroup.prototype.applyData = function () { var data = this.data(); this.repeat = data.repeat; if (data.list.length === 0) { data.list = [""]; } this.list = data.list; }; ParticleGroup.prototype.data = function () { return Game_Particle.groupData(this); }; ParticleGroup.idSuffix = function (id) { return "/GROUP:" + id; }; Object.defineProperty(ParticleGroup.prototype, "clear", { get: function () { return this._clear; }, set: function (value) { this._clear = value; if (value) { this.repeat = -1; if (this.stop) { this.processQuit(); } } }, configurable: true, }); Object.defineProperty(ParticleGroup.prototype, "stop", { get: function () { return this._stop; }, set: function (value) { this._stop = value; if (value) { if (this.clear) { this.processQuit(); } } }, configurable: true, }); ParticleGroup.prototype.processQuit = function ( particle = $gameScreen._particle ) { particle.deleteGroup(this.id); }; function activeInterpreter() { var interpreter; if ($gameTroop.inBattle() && $gameTroop.isEventRunning()) { interpreter = $gameTroop._interpreter; } else if ($gameMap.isEventRunning()) { interpreter = $gameMap._interpreter; } else { return null; } while (interpreter._childInterpreter) { interpreter = interpreter._childInterpreter; } return interpreter; } ParticleGroup.processParticleSubCommand = function (args) { if (baseParameters.commandNames.contains(args[0])) { args.shift(); } return args[0]; }; ParticleGroup.prototype.update = function (particle = $gameScreen._particle) { if (this._wait > 0) { this._wait -= 1; return; } var list = this.data().list; var length = list.length; var suffix = ParticleGroup.idSuffix(this.id); $gameScreen._particle.addAutoIdSuffix(suffix); var interpreter = activeInterpreter(); while (this._index < length - 1 && this._wait <= 0) { this._index = (this._index + 1) | 0; var command = list[this._index]; var args = command.split(" "); var isPlayCommands = false; ParticleGroup.processParticleSubCommand(args); if (!this.isCommandValid(command, this.id, this.replacedName, args)) { break; } switch (args[0].toLowerCase()) { case "wait": this._wait = Number(args[1]); break; case "edit": case "set": case "play": isPlayCommands = true; var tag = particle.extractTagRegister(args); tag = tag || this.tag; if (tag) { if (!tag.contains("tag:")) { tag = "tag:" + tag; } args.push(tag); } if (args[2] === "target") { if (this.target === "displayObject") { args[2] = Game_Particle.displayObjects[this.id]; } else { args[2] = this.target; } } if (/^_auto:[0-9]+$/.test(args[1])) { args[1] += ":" + this.replacedName + "/h"; } if (args[3] && /^_auto:[0-9]+$/.test(args[3])) { args[3] += ":" + this.replacedName + "/h"; } break; case "repeat": case "on": case "off": case "clear": case "update": case "animate": case "move": case "exceed": case "screenLoop": case "loop": case "filter": case "attract": case "max": if (/^_auto:[0-9]+$/.test(args[1])) { args[1] += ":" + this.replacedName + "/h"; } if (args[0] === "attract" && args[2] === "target") { if (this.target === "displayObject") { args[2] = Game_Particle.displayObjects[this.id]; } else { args[2] = this.target; } } break; case "sub": if (/_auto:[0-9]+$/.test(args[2])) { args[2] += ":" + this.replacedName + "/h"; } if (/_sub:[0-9]+$/.test(args[3])) { args[3] += ":" + this.replacedName + "/h"; } break; } if (this._wait > 0) { break; } particle.pluginCommand(interpreter, args, this.eventId); if (isPlayCommands) { if (this.x || this.y) { particle.particleUpdate([args[1], "pos", this.x || 0, this.y || 0]); } } } $gameScreen._particle.removeAutoIdSuffix(suffix); if (this._wait <= 0 && this._index >= length - 1) { if (this.repeat >= 0) { this._wait = this.repeat; this._index = -1; } else { this.destroy = true; } } }; //============================================================================= // command validation //============================================================================= ParticleGroup.prototype.isCommandValid = function (command, id, name, args) { return ParticleGroup.isCommandValid(command, id, name, args); }; ParticleGroup.isCommandValid = function ( command, id, groupName, args = null ) { if (!command) return false; args = args || command.split(" "); var sub = ParticleGroup.processParticleSubCommand(args); if (!sub) { return false; } sub = sub.toLowerCase(); //check sub commands switch (sub) { case "wait": return !isNaN(args[1]) && Number(args[1]) >= 0; case "set": case "play": case "edit": return this._isPlayCommandValid(id, groupName, sub, args); case "repeat": case "on": case "off": case "clear": case "update": case "animate": case "move": case "exceed": case "screenLoop": case "loop": case "filter": case "attract": case "max": if (!this.isCommandTargetIdValid(id, groupName, args[1])) { return false; } break; case "sub": if (/_auto:[0-9]+$/.test(args[2])) { args[2] += ":" + groupName + "/h"; } if (args[1] !== "edit") { var name = args[3]; if (/^_sub:[0-9]+$/.test(name)) { name += ":" + groupName + "/h"; } if (!$dataTrpParticles[name] && !$dataTrpParticlePreset[name]) { return false; } } if (!this.isCommandTargetIdValid(id, groupName, args[2])) { return false; } break; case "flash": case "shake": case "se": return true; case "group": return false; default: return false; } return true; }; ParticleGroup.isCommandTargetIdValid = function (groupId, groupName, id) { if (id === undefined) { return false; } if (id === "" || id === " ") { return false; } if (/_auto:[0-9]+$/.test(id)) { id += ":" + groupName + "/h"; } if ( !id.contains("/GROUP:") && id !== "all" && id.indexOf("all:") !== 0 && id.indexOf("tag:") !== 0 ) { id += ParticleGroup.idSuffix(groupId); if (!$gameScreen._particle._data[id]) { return false; } } return true; }; ParticleGroup._isPlayCommandValid = function ( groupId, groupName, command, args ) { if (args.length <= 2 || args[2] === "" || args[2] === " ") { return false; } //remove tag arg var length = args.length; for (var i = 0; i < length; i = (i + 1) | 0) { var arg = args[i]; if (arg.indexOf("tag:") === 0) { args = args.concat(); args.splice(i, 1); break; } } var id = args[1]; var target = args[2]; var name = args[3]; if (/^_auto:[0-9]+$/.test(id)) { id += ":" + groupName + "/h"; } if (/^_auto:[0-9]+$/.test(name)) { name += ":" + groupName + "/h"; } name = supplementDef(id, name) || id; // var eventId = this._data.eventId; // var data = $gameScreen._particle.particleData(eventId,id,target,name) // if(!data)return false; //check id if (id === "" || id === " ") { return false; } //check name exists if (command !== "edit") { if (!$dataTrpParticles[name] && !$dataTrpParticlePreset[name]) { return false; } } return true; }; })();