slave-thistle/www/js/plugins/TMAnimeLight.js
2025-05-26 09:44:24 -05:00

345 lines
12 KiB
JavaScript

//=============================================================================
// TMPlugin - アニメ付き明かり
// バージョン: 2.0.1
// 最終更新日: 2016/12/02
// 配布元 : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc イベントにアニメーション付きの明かりを表示します。
*
* @author tomoaky (http://hikimoki.sakura.ne.jp/)
*
* @param range
* @desc アニメーションの大きさ。
* 初期値: 0.1 ( 0.1 でプラスマイナス 10% の拡大縮小アニメ)
* @default 0.1
*
* @param defaultZ
* @desc アニメーションのZ座標。
* 初期値: 4
* @default 4
*
* @param frames
* @desc アニメーションにかけるフレーム数。
* 初期値: 30
* @default 30
*
* @help
* 準備:
*
* プラグインと一緒に配布している明かり画像を img/system フォルダに
* 保存してください。ファイル名は自由に変更可能です。
* 使用する画像はどんなものでもかまいません、イベントごとに違う画像を
* 表示することもできます。
*
*
* 使い方:
*
* イベントのメモ欄に <animeLight:ファイル名> というタグを書き込めば、
* 明かりが表示されるようになります。
*
* 明かりの位置もタグを使って調整することができます。
*
* このプラグインは RPGツクールMV Version 1.3.4 で動作確認をしています。
*
*
* メモ欄(イベント)タグ:
*
* <animeLight:TMAnimeLight1 192 24 -44 4>
* 画像 TMAnimeLight1.png を不透明度 192 で、イベントの足元から右に 24、
* 上に 44 ドットずらした位置にZ座標 4 で表示します。
* 不透明度の最大値は 255 です。
*
* イベントのメモ欄以外に、実行内容の一番上にある注釈コマンド内でも
* 同様のタグで名前を設定することができます。
* メモ欄と注釈の両方にタグがある場合は注釈が優先されます。
*
*
* プラグインコマンド:
*
* animeLight 1 TMAnimeLight1 255 0 -44 4
* イベント 1 番に明かりを適用します。
* イベント番号、ファイル名、不透明度、X座標補正、Y座標補正、Z座標
* の順に設定してください。
* Z座標を省略した場合はプラグインパラメータ animeLightZ の値を
* 使用します。
*
* animeLight 1
* イベント 1 番の明かりを削除します。
*
* イベント番号(ひとつ目の数値)は以下の規則にしたがって対象を指定します。
* -1 … プレイヤーを対象にする
* 0 … コマンドを実行しているイベントを対象にする
* 1 以上 … その番号のイベントを対象にする
*
*
* おまけ機能:
*
* メモ欄タグ、注釈、プラグインコマンドすべてに共通で、Z座標のあとに
* 1 という数値を付与することでアニメーションのない画像を表示できます。
* 例: <animeLight:TMAnimeLight1 192 0 0 4 1>
* この場合Z座標を省略することはできません。
*
*
* プラグインパラメータ補足:
*
* defaultZ
* 明かりの描画順を設定します、これによりイベントよりも下に表示するか
* 上に表示するかが決まります。
* 0 … プライオリティ『通常キャラの下』より下
* 2 … プライオリティ『通常キャラと同じ』より下
* 4 … プライオリティ『通常キャラと同じ』より上
* 6 … プライオリティ『通常キャラの上』より上
*/
var Imported = Imported || {};
Imported.TMAnimeLight = true;
var TMPlugin = TMPlugin || {};
TMPlugin.AnimeLight = {};
TMPlugin.AnimeLight.Parameters = PluginManager.parameters('TMAnimeLight');
TMPlugin.AnimeLight.Range = +(TMPlugin.AnimeLight.Parameters['range'] || 0.1);
TMPlugin.AnimeLight.DefaultZ = +(TMPlugin.AnimeLight.Parameters['defaultZ'] || 4);
TMPlugin.AnimeLight.Frames = +(TMPlugin.AnimeLight.Parameters['frames'] || 30);
if (!TMPlugin.EventBase) {
TMPlugin.EventBase = true;
(function() {
var _Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
_Game_Event_setupPage.call(this);
if (this._pageIndex >= 0) this.loadCommentParams();
};
Game_Event.prototype.loadCommentParams = function() {
this._commentParams = {};
var re = /<([^<>:]+)(:?)([^>]*)>/g;
var list = this.list();
for (var i = 0; i < list.length; i++) {
var command = list[i];
if (command && command.code == 108 || command.code == 408) {
for (;;) {
var match = re.exec(command.parameters[0]);
if (match) {
this._commentParams[match[1]] = match[2] === ':' ? match[3] : true;
} else {
break;
}
}
} else {
break;
}
}
};
Game_Event.prototype.loadTagParam = function(paramName) {
return this._commentParams[paramName] || this.event().meta[paramName];
};
})();
} // TMPlugin.EventBase
if (!TMPlugin.InterpreterBase) {
TMPlugin.InterpreterBase = true;
(function() {
Game_Interpreter.prototype.convertEscapeCharactersTM = function(text) {
text = text.replace(/\\/g, '\x1b');
text = text.replace(/\x1b\x1b/g, '\\');
text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
return $gameVariables.value(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
return $gameVariables.value(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bN\[(\d+)\]/gi, function() {
return this.actorNameTM(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bP\[(\d+)\]/gi, function() {
return this.partyMemberNameTM(parseInt(arguments[1]));
}.bind(this));
text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
return text;
};
Game_Interpreter.prototype.actorNameTM = function(n) {
var actor = n >= 1 ? $gameActors.actor(n) : null;
return actor ? actor.name() : '';
};
Game_Interpreter.prototype.partyMemberNameTM = function(n) {
var actor = n >= 1 ? $gameParty.members()[n - 1] : null;
return actor ? actor.name() : '';
};
})();
} // TMPlugin.InterpreterBase
(function() {
//-----------------------------------------------------------------------------
// Game_Temp
//
var _Game_Temp_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function() {
_Game_Temp_initialize.call(this);
this.createAnimeLightSinTable();
};
Game_Temp.prototype.createAnimeLightSinTable = function() {
this._animeLightSinTable = [];
for (var i = 0; i < TMPlugin.AnimeLight.Frames; i++) {
this._animeLightSinTable[i] = Math.sin(Math.PI * i / (TMPlugin.AnimeLight.Frames / 2)) *
TMPlugin.AnimeLight.Range + 1;
}
};
Game_Temp.prototype.animeLightSin = function(index) {
return this._animeLightSinTable[index];
};
//-----------------------------------------------------------------------------
// Game_CharacterBase
//
Game_CharacterBase.prototype.requestAnimeLight = function() {
this._requestAnimeLight = true;
};
Game_CharacterBase.prototype.onChangeAnimeLight = function() {
this._requestAnimeLight = false;
};
Game_CharacterBase.prototype.isAnimeLightRequested = function() {
return this._requestAnimeLight;
};
//-----------------------------------------------------------------------------
// Game_Event
//
var _Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
_Game_Event_setupPage.call(this);
if (this._pageIndex >= 0) {
var animeLight = this.loadTagParam('animeLight');
if (animeLight) {
var arr = animeLight.split(' ');
this._animeLight = arr[0];
this._animeLightOpacity = arr[1] || 255;
this._animeLightShiftX = arr[2] || 0;
this._animeLightShiftY = arr[3] || 0;
this._animeLightZ = arr[4] || TMPlugin.AnimeLight.DefaultZ;
this._animeLightNone = arr[5] === '1';
}
} else {
this._animeLight = '';
this._animeLightOpacity = 255;
this._animeLightShiftX = 0;
this._animeLightShiftY = 0;
this._animeLightZ = TMPlugin.AnimeLight.DefaultZ;
this._animeLightNone = false;
}
this.requestAnimeLight();
};
//-----------------------------------------------------------------------------
// Game_Interpreter
//
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === 'animeLight') {
var arr = args.map(this.convertEscapeCharactersTM, this);
var character = this.character(+arr[0]);
if (character) {
character._animeLight = arr[1];
character._animeLightOpacity = arr[2] || 255;
character._animeLightShiftX = arr[3] || 0;
character._animeLightShiftY = arr[4] || 0;
character._animeLightZ = arr[5] || TMPlugin.AnimeLight.DefaultZ;
character._animeLightNone = arr[6] === '1';
character.requestAnimeLight();
}
}
};
//-----------------------------------------------------------------------------
// Sprite_Character
//
var _Sprite_Character_update = Sprite_Character.prototype.update;
Sprite_Character.prototype.update = function() {
_Sprite_Character_update.call(this);
this.updateAnimeLight();
};
Sprite_Character.prototype.updateAnimeLight = function() {
if (this._character.isAnimeLightRequested() ||
this._animeLight !== this._character._animeLight) {
this._character.onChangeAnimeLight();
this._animeLight = this._character._animeLight;
if (this._animeLight) {
if (!this._animeLightSprite) {
this._animeLightSprite = new Sprite_AnimeLight(this);
this.parent.addChild(this._animeLightSprite);
}
this._animeLightSprite.refresh(this._animeLight);
} else {
this.parent.removeChild(this._animeLightSprite);
this._animeLightSprite = null;
}
}
};
//-----------------------------------------------------------------------------
// Sprite_AnimeLight
//
function Sprite_AnimeLight() {
this.initialize.apply(this, arguments);
}
Sprite_AnimeLight.prototype = Object.create(Sprite.prototype);
Sprite_AnimeLight.prototype.constructor = Sprite_AnimeLight;
Sprite_AnimeLight.prototype.initialize = function(characterSprite) {
Sprite.prototype.initialize.call(this);
this._characterSprite = characterSprite;
this.anchor.x = 0.5;
this.anchor.y = 0.5;
this.blendMode = 1;
this._animeCount = 0;
};
Sprite_AnimeLight.prototype.update = function() {
Sprite.prototype.update.call(this);
this.x = this._characterSprite.x + this._shiftX;
this.y = this._characterSprite.y + this._shiftY;
if (!this._characterSprite._character._animeLightNone) {
this._animeCount++;
if (this._animeCount === TMPlugin.AnimeLight.Frames) this._animeCount = 0;
var n = $gameTemp.animeLightSin(this._animeCount);
this.scale.set(n, n);
}
};
Sprite_AnimeLight.prototype.refresh = function(fileName) {
this.bitmap = ImageManager.loadSystem(fileName);
this.opacity = +this._characterSprite._character._animeLightOpacity;
this._shiftX = +this._characterSprite._character._animeLightShiftX;
this._shiftY = +this._characterSprite._character._animeLightShiftY;
this.x = this._characterSprite.x + this._shiftX;
this.y = this._characterSprite.y + this._shiftY;
this.z = +this._characterSprite._character._animeLightZ;
};
})();