124 lines
4.9 KiB
JavaScript
124 lines
4.9 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc v1.4 複数ピクチャを一括で移動・色調変更(イージング対応) @author IvI
|
||
*
|
||
* @command MovePictures
|
||
* @text ピクチャ移動
|
||
* @desc 指定ピクチャをまとめて移動
|
||
*
|
||
* @arg ids @type string @text ピクチャIDリスト @desc 例: 1-3,5,\V[30]
|
||
* @arg dx @type string @text X移動量 @default 0
|
||
* @arg dy @type string @text Y移動量 @default 0
|
||
* @arg duration @type string @text フレーム数 @default 60
|
||
* @arg easing
|
||
* @type select
|
||
* @text イージング
|
||
* @option Linear @value 0
|
||
* @option EaseIn @value 1
|
||
* @option EaseOut @value 2
|
||
* @option EaseInOut @value 3
|
||
* @default 0
|
||
* @arg wait @type boolean @text 完了までウェイト @default false
|
||
*
|
||
* @command TintPictures
|
||
* @text ピクチャ色調変更
|
||
* @desc 指定ピクチャをまとめて色調変更
|
||
*
|
||
* @arg ids @type string @text ピクチャIDリスト @desc 例: 1-3,5,\V[30]
|
||
* @arg tone @type string @text 色調(R,G,B,Gray) @default 0,0,0,0
|
||
* @arg duration @type string @text フレーム数 @default 60
|
||
*
|
||
* @help
|
||
* ■概要
|
||
* カンマ・ハイフン区切りで指定した複数 ID のピクチャを
|
||
* 一括で「移動」または「色調変更」します。
|
||
* - \V[n] 置換+四則演算に対応
|
||
* - 移動はイージング(Linear / EaseIn / EaseOut / EaseInOut)指定可
|
||
* - 「完了までウェイト」ON でイベントを待機
|
||
*
|
||
* ■利用方法
|
||
* 1. 本ファイルを js/plugins に配置しプラグイン管理で ON
|
||
* 2. イベント → プラグインコマンドから設定
|
||
*
|
||
* MIT ライセンス(表記任意・改変/商用利用可)
|
||
*/
|
||
|
||
(() => {
|
||
"use strict";
|
||
const PLUGIN_NAME = "ShiftMultiPictures"; // ←ファイル名と合わせる
|
||
|
||
// -------------------------------------------------- 共通
|
||
function evalNumber(str){
|
||
const s = String(str).replace(/\\V\[(\d+)\]/gi, (_, n) => $gameVariables.value(+n));
|
||
try { return Math.floor(eval(s)); } catch { return 0; }
|
||
}
|
||
function parseIdList(text = ""){
|
||
return text.split(",").flatMap(t => {
|
||
t = t.trim(); if(!t) return [];
|
||
if(t.includes("-")){
|
||
const [a, b] = t.split("-").map(evalNumber);
|
||
const start = Math.min(a, b), end = Math.max(a, b);
|
||
return Array.from({length: end - start + 1}, (_, i) => start + i);
|
||
}
|
||
return [evalNumber(t)];
|
||
}).filter(n => Number.isInteger(n) && n > 0);
|
||
}
|
||
|
||
// -------------------------------------------------- MovePictures
|
||
PluginManager.registerCommand(PLUGIN_NAME, "MovePictures", function(args){
|
||
const ids = parseIdList(args.ids);
|
||
const dx = evalNumber(args.dx), dy = evalNumber(args.dy);
|
||
const dur = Math.max(1, evalNumber(args.duration));
|
||
const easing = Number(args.easing || 0); // 0-3
|
||
const wait = args.wait === "true" && ids.length;
|
||
|
||
ids.forEach(id => {
|
||
const p = $gameScreen.picture(id);
|
||
if(p){
|
||
const origin = p.origin();
|
||
const blendMode = p.blendMode();
|
||
const tx = p.x() + dx, ty = p.y() + dy;
|
||
p.move(origin, tx, ty, p.scaleX(), p.scaleY(), p.opacity(), blendMode, dur, easing);
|
||
}
|
||
});
|
||
|
||
if(wait){ this.setWaitMode("picture"); this._smpIds = ids; }
|
||
});
|
||
const _updateWait = Game_Interpreter.prototype.updateWaitMode;
|
||
Game_Interpreter.prototype.updateWaitMode = function(){
|
||
if(this._waitMode === "picture"){
|
||
const busy = this._smpIds.some(id => {
|
||
const p = $gameScreen.picture(id);
|
||
return p && p.isMoving(); // ← isMoving() は後述ポリフィルで補完
|
||
});
|
||
if(!busy){ this._waitMode = ""; this._smpIds = null; }
|
||
return busy;
|
||
}
|
||
return _updateWait.call(this);
|
||
};
|
||
|
||
// -------------------------------------------------- TintPictures
|
||
PluginManager.registerCommand(PLUGIN_NAME, "TintPictures", function(args){
|
||
const ids = parseIdList(args.ids);
|
||
const tone = args.tone.split(",").map(s => evalNumber(s.trim())).slice(0, 4);
|
||
while(tone.length < 4) tone.push(0);
|
||
const dur = Math.max(1, evalNumber(args.duration));
|
||
|
||
ids.forEach(id => { const p = $gameScreen.picture(id); if(p) p.tint(tone, dur); });
|
||
});
|
||
|
||
// -------------------------------------------------- MZ 互換ポリフィル (MV→MZ)
|
||
if(!Game_Picture.prototype.isMoving){
|
||
/**
|
||
* Game_Picture.prototype.isMoving
|
||
* MZ には存在しないため互換実装を追加。
|
||
* ・移動フレーム _duration
|
||
* ・色調変更フレーム _toneDuration
|
||
* が残っていれば「移動中」と判定する。
|
||
*/
|
||
Game_Picture.prototype.isMoving = function(){
|
||
return (this._duration || 0) > 0 || (this._toneDuration || 0) > 0;
|
||
};
|
||
}
|
||
|
||
})(); // End of IIFE
|