treasure/js/plugins/DiffuseEffectMZ.js
2025-10-01 19:10:49 -05:00

669 lines
20 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.

//=============================================================================
// DiffuseEffectMZ.js
//=============================================================================
// [Update History]
// DiffuseEffect.js for RMMV
// 2017.Feb.12 Ver0.0.0 Closed Version
// 2019.Jun.27 Ver1.0.0 First Release
// DiffuseEffectMZ.js
// 2021.Apr.19 Ver1.0.0 First Release
// 2022.Feb.15 Ver1.1.0 Fix Bug: Error when back from the menu
// this work is helped by こま(Koma, @koma_neko)
/*:
* @target MZ
* @plugindesc [Ver1.1.0]Display light diffusion effect on map/battle and title scene
* @author Sasuke KANNAZUKI (thx to Rokan)
*
* @param Title Effect Type
* @desc 0:none >=1: display the same effect as plugin parameter at title
* @default 0
*
* @requiredAssets img/system/RE_001
* @requiredAssets img/system/RE_002
* @requiredAssets img/system/RE_003
*
* @command start
* @text Start ScreenEffect
* @desc See help to the effect of number
*
* @arg effect
* @text Screen Effect
* @desc Screen Effect to Apply
* @option 1:diffuse from center
* @value 1
* @option 2:converge to center
* @value 2
* @option 3:from top to the bottom of center
* @value 3
* @option 4:same as 3 but all horizontal position
* @value 4
* @option 5:from right up to left down
* @value 5
* @option 21:go up with drawing irregular spiral
* @value 21
* @option 22:go up with waving
* @value 22
* @option 23:go up with drawing regular spiral
* @value 23
* @option 31:go down like the snow falling down
* @value 31
* @option 0:no effect
* @value 0
* @type select
* @default 0
*
* @command end
* @text End ScreenEffect
* @desc Finish Screen Effect
*
* @arg fade
* @text vanish with fade?
* @desc fade or erase immiaiately?
* @on Yes. With Fade.
* @off No. Erase All Now.
* @type boolean
* @default true
*
* @help
* This plugin runs under RPG Maker MZ.
* This plugin enables to display light diffusion effect on map and battle.
*
* At first you have to do:
* This plugin requires 3 image files to run.
* Put RE_001, RE_002, RE_003 at img/system.
*
* Magic Number and Effect:
* When set option or call plugin command, set the following numer.
* 1 : diffuse from center
* 2 : converge to center
* 3 : from top to the bottom of center
* 4 : from top to the bottom of all horizontal position
* 5 : from right up to left down
* 21 : go up with drawing irregular spiral
* 22 : go up with waving
* 23 : go up with drawing regular spiral
* 31 : go down like the snow falling down
* 0 : disappear
*
* Copyright: This plugin is based on Rokan's RGSS3 script material.
* see "Kaisou Ryouiki" http://kaisou-ryouiki.sakura.ne.jp/
* Thanks to Rokan.
*
* こま(Koma, @koma_neko) fixed bug at ver1.0.0.
* Thanks to Koma
*
* License:
* this plugin is released under MIT license.
* http://opensource.org/licenses/mit-license.php
*/
/*:ja
* @target MZ
* @plugindesc [Ver1.1.0]マップ画面とタイトル画面に拡散する光を表示します
* @author 神無月サスケ (原案:ろかん)
*
* @param Title Effect Type
* @text タイトル画面での効果
* @desc タイトル画面での光拡散の表示 0:しない 1以上:する(プラグインコマンドの引数と同じ)
* @default 0
*
* @requiredAssets img/system/RE_001
* @requiredAssets img/system/RE_002
* @requiredAssets img/system/RE_003
*
*
* @command start
* @text 画面エフェクト開始
* @desc 画面エフェクトの対応する数値はヘルプ本文を参照してください
*
* @arg effect
* @text 画面効果
* @desc 適用する画面効果
* @option 1:中心から発散
* @value 1
* @option 2:中心へ収束
* @value 2
* @option 3:中央上部から下へ
* @value 3
* @option 4:上部全体から下へ
* @value 4
* @option 5:右上から左下へ
* @value 5
* @option 21:不規則な螺旋を描き上昇
* @value 21
* @option 22:ゆらゆらと上昇
* @value 22
* @option 23:規則的な螺旋を描き上昇
* @value 23
* @option 31:雪
* @value 31
* @option 0:効果なし
* @value 0
* @type select
* @default 0
*
* @command end
* @text 画面エフェクト終了
* @desc 画面エフェクトを終了します。
*
* @arg fade
* @text フェードしながら終了?
* @desc いいえの場合、即消去します。
* @on フェードあり
* @off 即消去
* @type boolean
* @default true
*
* @help
* このプラグインは、RPGツクールMZに対応しています。
* このプラグインは、マップ上に拡散する球状のアニメを表示可能にします。
* この効果は、戦闘中も有効です。
*
* 最初にすべきこと:
* このプラグインの実行には、添付の画像ファイルが必要です。
* img/system フォルダに、RE_001, RE_002, RE_003を置いて下さい。
*
* 画面効果の数値:
* タイトルのオプションや、プラグインコマンドでの設定の場合、
* 以下の数値が、画面効果に対応します。
* 1 : 中心から発散
* 2 : 中心へ収束
* 3 : 中央上部から下へ
* 4 : 上部全体から下へ
* 5 : 右上から左下へ
* 21 : 不規則な螺旋を描いて上昇
* 22 : ゆらゆらと上昇
* 23 : 規則正しい螺旋を描いて上昇
* 31 : 雪
* 0 : 消去
*
* 著作権表記:
* このプラグインは、ろかん氏のRGSS3素材をベースに作成しました。
* Webサイト回想領域 http://kaisou-ryouiki.sakura.ne.jp/
* ろかん氏に謝意を示します。
*
* Ver1.0.0におけるバグを、こま(Koma, @koma_neko)様から修正して戴きました。
* こま様には大変感謝しています。
*
* ライセンス表記:
* このプラグインは MIT ライセンスで配布されます。
* ご自由にお使いください。
* http://opensource.org/licenses/mit-license.php
*/
(function() {
const pluginName = 'DiffuseEffectMZ';
//
// process parameters
//
const parameters = PluginManager.parameters(pluginName);
const titleType = Number(parameters['Title Effect Type'] || 0);
//
// process plugin commands
//
PluginManager.registerCommand(pluginName, 'start', args => {
$gameScreen.startREffect(+args.effect);
});
PluginManager.registerCommand(pluginName, 'end', args => {
if (args.fade === 'true') {
$gameScreen.fadeREffect();
} else {
$gameScreen.endREffect();
}
});
//
// Game_Screen
//
const _Game_Screen_initialize = Game_Screen.prototype.initialize;
Game_Screen.prototype.initialize = function() {
_Game_Screen_initialize.call(this);
this.rEffectType = 0;
this.requestResetREffect = false;
};
Game_Screen.prototype.startREffect = function(type) {
this.rEffectType = type;
};
Game_Screen.prototype.endREffect = function() {
this.requestResetREffect = true;
this.rEffectType = 0;
};
Game_Screen.prototype.fadeREffect = function() {
this.rEffectType = 0;
};
//
// Game_Temp
//
const _Game_Temp_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function() {
_Game_Temp_initialize.call(this);
this.rEffects = new REffects();
};
//
// Spriteset_Map
//
const _Spriteset_Base_createUpperLayer =
Spriteset_Base.prototype.createUpperLayer;
Spriteset_Base.prototype.createUpperLayer = function() {
this.addChild($gameTemp.rEffects);
_Spriteset_Base_createUpperLayer.call(this);
};
const _Scene_Map_terminate = Scene_Map.prototype.terminate;
Scene_Map.prototype.terminate = function() {
_Scene_Map_terminate.call(this);
this._spriteset.removeChild($gameTemp.rEffects);
};
const _Scene_Battle_terminate = Scene_Battle.prototype.terminate;
Scene_Battle.prototype.terminate = function() {
_Scene_Battle_terminate.call(this);
this._spriteset.removeChild($gameTemp.rEffects);
};
// ------------------------------------------------------
//
// Sprite_REffect : an element of the light
//
function Sprite_REffect() {
this.initialize.apply(this, arguments);
}
Sprite_REffect.prototype = Object.create(Sprite.prototype);
Sprite_REffect.prototype.constructor = Sprite_REffect;
Sprite_REffect.span = false;
Sprite_REffect.prototype.initialize = function(type) {
Sprite.prototype.initialize.call(this);
this.reset();
this.effectType = type || 0;
if (type) {
this.setup(type);
}
};
Sprite_REffect.prototype.reset = function() {
this.effectType = 0;
this.initialPos = new Point(0, 0);
this.moveAngle = new Point(0.0, 0.0); // radian
this.radius = 0.0;
this.blendMode = 1;
this.bitmap = null;
Sprite_REffect.span = !Sprite_REffect.span;
return this;
};
Sprite_REffect.prototype.setZoom = function(value) {
this.scale.set(value, value);
};
Sprite_REffect.prototype.setGraphic = function(filename) {
this.bitmap = ImageManager.loadSystem(filename);
this.anchor.x = 0.5;
this.anchor.y = 0.5;
};
Sprite_REffect.prototype.setStartPos = function(typeX, typeY) {
switch (typeX) {
case 0: // random
this.initialPos.x = Math.randomInt(Graphics.width + 150) - 75;
break;
case 1: // out of screen (left)
this.initialPos.x = -45;
break;
case 2: // center
this.initialPos.x = Graphics.width / 2;
break;
case 3: // out of screen (right)
this.initialPos.x = Graphics.width + 45;
break;
}
switch (typeY) {
case 0: // random
this.initialPos.y = Math.randomInt(Graphics.height + 75) - 36;
break;
case 1: // out of screen (upper)
this.initialPos.y = -45;
break;
case 2: // center
this.initialPos.y = Graphics.height / 2;
break;
case 3: // out of screen (down)
this.initialPos.y = Graphics.height + 45;
break;
}
this.x = this.initialPos.x;
this.y = this.initialPos.y;
};
Sprite_REffect.prototype.setMoveAngle = function(ax, ay) {
this.moveAngle.x = Math.cos(ax * 0.01);
this.moveAngle.y = Math.sin((ay || ax) * 0.01);
};
Sprite_REffect.prototype.getX = function() {
return this.initialPos.x + this.radius * this.moveAngle.x;
};
Sprite_REffect.prototype.getY = function() {
return this.initialPos.y + this.radius * this.moveAngle.y;
};
Sprite_REffect.prototype.getZoom = function() {
return (this.radius * this.moveAngle.y / Graphics.width / 1.5 + 0.8) * (this.opacity / 200.0);
};
Sprite_REffect.prototype.setup = function(type) {
this.effectType = type;
switch (Math.floor(this.effectType / 10)) {
case 0:
this.setupDiffusion();
break;
case 2:
this.setupSpiral();
break;
case 3:
this.setupSnow();
break;
}
return this;
};
Sprite_REffect.prototype.setupDiffusion = function() {
switch (this.effectType) {
case 1:
this.radius = Math.randomInt(Graphics.width / 3) + 1.0;
this.moveSpeed = (Math.randomInt(75) + 1) * 0.01 + 0.75;
this.duration = Math.randomInt(100) + 80;
this.setStartPos(2, 2);
this.setMoveAngle(Math.randomInt(2 * Math.PI * 100));
this.setGraphic('RE_001');
break;
case 2:
this.radius = Math.randomInt(Graphics.width / 3) + 45.0;
this.moveSpeed = (Math.randomInt(75) + 1) * -0.01 - 0.75;
this.duration = Math.randomInt(100) + 90;
this.setStartPos(2, 2);
this.setMoveAngle(Math.randomInt(2 * Math.PI * 100));
this.setGraphic('RE_001');
break;
case 3:
this.radius = Math.randomInt(Graphics.width / 2) + 1.0;
this.moveSpeed = (Math.randomInt(75) + 1) * 0.01 + 0.75;
this.duration = Math.randomInt(100) + 80;
this.setStartPos(2, 1);
this.setMoveAngle(Math.randomInt(2 * Math.PI * 100),
Math.randomInt(Math.PI * 100));
this.setGraphic('RE_001');
break;
case 4:
this.radius = Math.randomInt(Graphics.width / 2) + 1.0;
this.moveSpeed = (Math.randomInt(75) + 1) * 0.01 + 0.75;
this.duration = Math.randomInt(100) + 80;
this.setStartPos(0, 1);
this.setMoveAngle(Math.randomInt(2 * Math.PI * 100),
Math.randomInt(Math.PI * 100));
this.setGraphic('RE_001');
break;
case 5:
this.radius = Math.randomInt(Graphics.width / 2) + 1.0;
this.moveSpeed = (Math.randomInt(75) + 1) * 0.01 + 0.75;
this.duration = Math.randomInt(100) + 120;
this.setStartPos(3, 1);
this.setMoveAngle(Math.randomInt(Math.PI * 100) + 90,
Math.randomInt(Math.PI * 100));
this.setGraphic('RE_001');
break;
}
this.maxOpacity = Math.randomInt(160) + 40;
this.opacity = 1;
};
Sprite_REffect.prototype.setupSpiral = function() {
switch (this.effectType) {
case 21:
this.radius = Math.randomInt(300) + 1.0;
this.moveSpeed = 7.5 - this.radius / 50.0;
this.nextAngle = Math.randomInt(360) * 1.0;
this.collapseSpeed = 1;
this.setStartPos(2, 3);
this.setGraphic('RE_002');
break;
case 22:
this.radius = Math.randomInt(60) + 1.0;
this.moveSpeed = (Math.randomInt(150) + 1.0) * 0.01 + 1.0;
this.nextAngle = Math.randomInt(360) * 1.0;
this.collapseSpeed = Math.randomInt(3) === 0 ? 2 : 1;
this.setStartPos(0, 3);
this.setGraphic('RE_002');
break;
case 23:
this.radius = 270;
this.moveSpeed = 2.55;
this.nextAngle = Sprite_REffect.span ? 0.0 : 180.0;
this.collapseSpeed = 0;
this.setStartPos(2, 3);
this.setGraphic('RE_002');
break;
}
this.opacity = 255;
this.floatY = this.y * 1.0;
};
Sprite_REffect.prototype.setupSnow = function() {
this.setStartPos(0, 1);
this.setGraphic('RE_003');
var z = Math.randomInt(100);
if (z <= 49) {
this.setZoom((3 + Math.randomInt(2)) / 10.0);
} else if (z <= 89) {
this.setZoom((6 + Math.randomInt(2)) / 10.0);
} else {
this.setZoom((9 + Math.randomInt(2)) / 10.0);
}
this.moveSpeed = this.scale.x * 2.4;
this.floatY = this.y * 1.0;
this.radius = Math.randomInt(15) + 1.0;
this.nextAngle = Math.randomInt(360);
this.duration = 1500;
this.opacity = 255;
};
Sprite_REffect.prototype.update = function() {
Sprite.prototype.update.call(this);
switch (Math.floor(this.effectType / 10)) {
case 0:
this.updateDiffusion();
break;
case 2:
this.updateSpiral();
break;
case 3:
this.updateSnow();
break;
}
};
Sprite_REffect.prototype.updateDiffusion = function() {
this.duration--;
this.radius = Math.max(this.radius + this.moveSpeed, 0.0);
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.setZoom(this.getZoom());
this.opacity = Math.min(this.opacity + (this.duration > 0 ? 1 : -1), this.maxOpacity);
};
Sprite_REffect.prototype.updateSpiral = function() {
this.nextAngle += Math.min(this.moveSpeed / 1.5, 2);
if (this.nextAngle >= 360) {
this.nextAngle = 0;
}
this.setMoveAngle(this.nextAngle * 1.74533);
this.x = this.getX();
this.y = Math.round(this.floatY -= this.moveSpeed);
this.setZoom(this.getZoom());
this.opacity -= this.collapseSpeed;
};
Sprite_REffect.prototype.updateSnow = function() {
this.duration -= 3;
this.nextAngle += Math.min(this.moveSpeed / 1.5, 2);
if (this.nextAngle >= 360) {
this.nextAngle = 0;
}
this.setMoveAngle(this.nextAngle * 1.74533);
this.x = this.getX();
this.y = Math.round(this.floatY += this.moveSpeed);
this.opacity = this.duration;
};
Sprite_REffect.prototype.needDispose = function() {
switch (Math.floor(this.effectType / 10)) {
case 0:
return this.opacity === 0;
case 2:
return this.y <= -(this.height * this.anchor.y) || this.opacity === 0;
case 3:
return this.y > Graphics.height || this.opacity === 0;
default:
return true;
}
};
// ------------------------------------------------------
//
// REffects : manage Sprite_REffect objects
//
function REffects() {
this.initialize.apply(this, arguments);
}
REffects.prototype = Object.create(Sprite.prototype);
REffects.prototype.constructor = REffects;
REffects.prototype.initialize = function() {
Sprite.prototype.initialize.call(this);
this.reset();
};
REffects.prototype.reset = function() {
if (this.sprites) {
while (this.sprites.length > 0) {
this.removeChild(this.sprites.shift());
}
}
this.sprites = [];
this.spriteFactory = [];
this.effectType = 0;
this.waitCount = 0;
};
REffects.prototype.restoreSprites = function() {
while (this.sprites.length > 0) {
const sprite = this.sprites.shift();
this.removeChild(sprite);
this.spriteFactory.push(sprite.reset());
}
this.waitCount = 0;
};
REffects.prototype.newSprite = function() {
if (this.spriteFactory.length > 0){
return this.spriteFactory.shift().setup(this.effectType);
} else {
return new Sprite_REffect(this.effectType);
}
};
REffects.prototype.setNewSprite = function() {
const sprite = this.newSprite();
this.addChild(sprite);
this.sprites.push(sprite);
return sprite;
};
REffects.prototype.update = function() {
this.updateReset();
this.updateChangeType();
this.updateWaitCount();
Sprite.prototype.update.call(this);
this.updateRestoreSprites();
};
REffects.prototype.updateReset = function() {
if ($gameScreen.requestResetREffect) {
this.restoreSprites();
$gameScreen.requestResetREffect = false;
}
};
REffects.prototype.updateChangeType = function() {
$gameScreen.rEffectType = $gameScreen.rEffectType || 0;
if (this.effectType != $gameScreen.rEffectType) {
this.effectType = $gameScreen.rEffectType;
}
};
REffects.prototype.updateWaitCount = function() {
if (this.effectType) {
if (this.waitCount === 0){
this.setNewSprite();
this.waitCount = this.effectType > 30 ? 20 : 10;
}
this.waitCount--;
}
};
REffects.prototype.updateRestoreSprites = function() {
const rEffects = this;
this.sprites = this.sprites.filter(function(sprite) {
if (sprite.needDispose()) {
rEffects.removeChild(sprite);
rEffects.spriteFactory.push(sprite.reset());
return false;
}
return true;
});
};
// ------------------------------------------------------
//
// REffectsTitle : REffect for Title.
//
function REffectsTitle() {
this.initialize.apply(this, arguments);
}
REffectsTitle.prototype = Object.create(REffects.prototype);
REffectsTitle.prototype.constructor = REffectsTitle;
REffectsTitle.prototype.initialize = function() {
REffects.prototype.initialize.call(this);
this.effectType = titleType;
};
REffectsTitle.prototype.updateReset = function() {
};
REffectsTitle.prototype.updateChangeType = function() {
};
var _Scene_Title_createForeground = Scene_Title.prototype.createForeground;
Scene_Title.prototype.createForeground = function() {
_Scene_Title_createForeground.call(this);
if (titleType) {
this.addChild(new REffectsTitle());
}
};
})();