//============================================================================= // 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()); } }; })();