ultimate-angel-zerachiel/www/js/plugins/DiffuseEffect.js
2024-01-17 11:38:37 -06:00

579 lines
17 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.

//=============================================================================
// DiffuseEffect.js
//=============================================================================
// [Update History]
// 2017.Feb.12 Ver0.0.0 Closed Version
// 2019.Jun.27 Ver1.0.0 First Release
/*:
* @plugindesc Display light diffusion effect on map 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
*
* @help
* At first you have to do:
* This plugin requires 3 image files to run.
* Put RE_001, RE_002, RE_003 at img/system.
*
* Plugin commands:
* at map scene, use plugin command to set.
* DiffuseEffect start [param]
* - [param] is number that represents the sort of light behaviour.
* 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
* ex:
* DiffuseEffect start 1 # start effect "diffuse from center"
*
* DiffuseEffect end # effects disappear immidiately
* DiffuseEffect fade # effects fade out and then disappear
*
* Copyright: This plugin is based on Rokan's RGSS3 script material.
* see "Kaisou Ryouiki" http://kaisou-ryouiki.sakura.ne.jp/
* Thanks to Rokan.
*
* License:
* this plugin is released under MIT license.
* http://opensource.org/licenses/mit-license.php
*/
/*:ja
* @plugindesc マップ画面とタイトル画面に拡散する光を表示します
* @author 神無月サスケ (原案:ろかん)
*
* @param Title Effect Type
* @desc タイトル画面での光拡散の表示 0:しない 1以上:する(プラグインコマンドの引数と同じ)
* @default 0
*
* @requiredAssets img/system/RE_001
* @requiredAssets img/system/RE_002
* @requiredAssets img/system/RE_003
*
* @help
* 最初にすべきこと:
* このプラグインの実行には、添付の画像ファイルが必要です。
* img/system フォルダに、RE_001, RE_002, RE_003を置いて下さい。
*
* プラグイン概要:
* マップ画面で表示する場合は、プラグインコマンドを呼びだしてください。
* プラグインコマンド:
* DiffuseEffect start [param]
* - [param] エフェクトの種類
* 1 : 中心から発散
* 2 : 中心へ収束
* 3 : 中央上部から下へ
* 4 : 上部全体から下へ
* 5 : 右上から左下へ
* 21 : 不規則な螺旋を描いて上昇
* 22 : ゆらゆらと上昇
* 23 : 規則正しい螺旋を描いて上昇
* 31 : 雪
* 0 : 消去
* ex:
* DiffuseEffect start 1 # "中心から発散" エフェクトを開始
*
* DiffuseEffect end # エフェクトの終了(即時)
* DiffuseEffect fade # フェードアウトしながらエフェクトを終了
*
* 著作権表記:
* このプラグインは、ろかん氏のRGSS3素材をベースに作成しました。
* Webサイト回想領域 http://kaisou-ryouiki.sakura.ne.jp/
* ろかん氏に謝意を示します。
*
* ライセンス表記:
* このプラグインは MIT ライセンスで配布されます。
* ご自由にお使いください。
* http://opensource.org/licenses/mit-license.php
*/
(function () {
//
// process parameters
//
var parameters = PluginManager.parameters("DiffuseEffect");
var titleType = Number(parameters["Title Effect Type"] || 0);
//
// process plugin command
//
var _Game_Interpreter_pluginCommand =
Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function (command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === "DiffuseEffect") {
switch (args[0]) {
case "start":
$gameScreen.startREffect(Number(args[1]) || 0);
break;
case "end":
$gameScreen.endREffect();
break;
case "fade":
$gameScreen.fadeREffect();
break;
}
}
};
//
// Game_Screen
//
var _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
//
var _Game_Temp_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function () {
_Game_Temp_initialize.call(this);
this.rEffects = new REffects();
};
//
// Spriteset_Map
//
var _Spriteset_Base_createScreenSprites =
Spriteset_Base.prototype.createScreenSprites;
Spriteset_Base.prototype.createScreenSprites = function () {
this.addChild($gameTemp.rEffects);
_Spriteset_Base_createScreenSprites.call(this);
};
// ------------------------------------------------------
//
// 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 = Graphics.BLEND_ADD;
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 () {
var sprite;
while (this.sprites.length > 0) {
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 () {
var 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 () {
var 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());
}
};
})();