Files
2019-11-05 20:14:51 +01:00

585 lines
19 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Buffs & States Extension - Visual State Effects
// YEP_X_VisualStateFX.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_VisualStateFX = true;
var Yanfly = Yanfly || {};
Yanfly.VSFX = Yanfly.VSFX || {};
Yanfly.VSFX.version = 1.03;
//=============================================================================
/*:
* @plugindesc v1.02 (Req YEP_BattleEngineCore & YEP_BuffsStatesCore) Adds
* visual effects to your states.
* @author Yanfly Engine Plugins
*
* @param ---Actors---
* @default
*
* @param Actor State Overlay
* @parent ---Actors---
* @type boolean
* @on YES
* @off NO
* @desc Show state overlay over the head of actors?
* YES - true NO - false Default: true
* @default true
*
* @param Actor State Icons
* @parent ---Actors---
* @type boolean
* @on YES
* @off NO
* @desc Show state icons over the head of actors?
* YES - true NO - false Default: false
* @default true
*
* @param Actor State Animation
* @parent ---Actors---
* @type boolean
* @on YES
* @off NO
* @desc Show state animations on the actors?
* YES - true NO - false
* @default true
*
* @param ---Enemies---
* @default
*
* @param Enemy State Overlay
* @parent ---Enemies---
* @type boolean
* @on YES
* @off NO
* @desc Show state overlay over the head of enemies?
* YES - true NO - false Default: false
* @default true
*
* @param Enemy State Icons
* @parent ---Enemies---
* @type boolean
* @on YES
* @off NO
* @desc Show state icons over the head of enemies?
* YES - true NO - false Default: true
* @default true
*
* @param Enemy State Animation
* @parent ---Enemies---
* @type boolean
* @on YES
* @off NO
* @desc Show state animations on the enemies?
* YES - true NO - false
* @default true
*
* @param ---Animation Settings---
* @default
*
* @param Allow Target Flash
* @parent ---Animation Settings---
* @type boolean
* @on YES
* @off NO
* @desc Allow state animations to use target flash effects?
* YES - true NO - false
* @default true
*
* @param Allow Screen Flash
* @parent ---Animation Settings---
* @type boolean
* @on YES
* @off NO
* @desc Allow state animations to use screen flash effects?
* YES - true NO - false
* @default false
*
* @param Allow Hide Target
* @parent ---Animation Settings---
* @type boolean
* @on YES
* @off NO
* @desc Allow state animations to use hide target effects?
* YES - true NO - false
* @default false
*
* @param Allow Sound
* @parent ---Animation Settings---
* @type boolean
* @on YES
* @off NO
* @desc Allow state animations to use sound effects?
* YES - true NO - false
* @default false
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin requires YEP_BattleEngineCore and YEP_BuffsStatesCore.
* Make sure this plugin is located under both plugins in the plugin list.
*
* If you are running YEP_X_AnimatedSVEnemies, place this plugin under
* YEP_X_AnimatedSVEnemies on the plugin list for extra compatibility.
*
* States are amongst one of the most important aspects of the battle system.
* Therefore, relaying proper information to the player is extremely important.
* RPG Maker MV does relay information to the player about the various states
* and effects, but it is far from perfect. This plugin allows you to add more
* detail and visual effects regarding states to relay proper data.
*
* ============================================================================
* Notetags
* ============================================================================
*
* You can use the following notetags to give different various visual effects
* for your states.
*
* State Notetags:
*
* <State Motion: Walk>
* <State Motion: Wait>
* <State Motion: Chant>
* <State Motion: Guard>
* <State Motion: Damage>
* <State Motion: Evade>
* <State Motion: Thrust>
* <State Motion: Swing>
* <State Motion: Missile>
* <State Motion: Skill>
* <State Motion: Spell>
* <State Motion: Item>
* <State Motion: Escape>
* <State Motion: Victory>
* <State Motion: Dying>
* <State Motion: Abnormal>
* <State Motion: Sleep>
* <State Motion: Dead>
* - This allows you to set a custom motion when the battler is affected by
* this state. If a battler has multiple states with custom motions, then
* priority will go to the state with the highest priority number (in the
* database) with this state motion notetag.
*
* <State Animation: x>
* - If a battler is affected by a state with this notetag, then a repeating
* animation x will play on the battler while in battle. If a battler is
* affected by multiple states with this notetag, then priority will go to
* the state with the highest priority number (in the database) with this
* state animation notetag.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.03:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.02:
* - Fixed a bug where enemy icon settings would match actor icon settings
* regardless of the settings made in the plugin parameters.
*
* Version 1.01:
* - State animations are now adjusted to fit the opacity of the battler.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
if (Imported.YEP_BattleEngineCore && Imported.YEP_BuffsStatesCore) {
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_X_VisualStateFX');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.VSFXActorOver = String(Yanfly.Parameters['Actor State Overlay']);
Yanfly.Param.VSFXActorOver = eval(Yanfly.Param.VSFXActorOver);
Yanfly.Param.VSFXActorIcons = String(Yanfly.Parameters['Actor State Icons']);
Yanfly.Param.VSFXActorIcons = eval(Yanfly.Param.VSFXActorIcons);
Yanfly.Param.VSFXActorAni = String(Yanfly.Parameters['Actor State Animation']);
Yanfly.Param.VSFXActorAni = eval(Yanfly.Param.VSFXActorAni);
Yanfly.Param.VSFXEnemyOver = String(Yanfly.Parameters['Enemy State Overlay']);
Yanfly.Param.VSFXEnemyOver = eval(Yanfly.Param.VSFXEnemyOver);
Yanfly.Param.VSFXEnemyIcons = String(Yanfly.Parameters['Enemy State Icons']);
Yanfly.Param.VSFXEnemyIcons = eval(Yanfly.Param.VSFXEnemyIcons);
Yanfly.Param.VSFXEnemyAni = String(Yanfly.Parameters['Enemy State Animation']);
Yanfly.Param.VSFXEnemyAni = eval(Yanfly.Param.VSFXEnemyAni);
Yanfly.Param.VSFXAniTarget = String(Yanfly.Parameters['Allow Target Flash']);
Yanfly.Param.VSFXAniTarget = eval(Yanfly.Param.VSFXAniTarget);
Yanfly.Param.VSFXAniScreen = String(Yanfly.Parameters['Allow Screen Flash']);
Yanfly.Param.VSFXAniScreen = eval(Yanfly.Param.VSFXAniScreen);
Yanfly.Param.VSFXAniHide = String(Yanfly.Parameters['Allow Hide Target']);
Yanfly.Param.VSFXAniHide = eval(Yanfly.Param.VSFXAniHide);
Yanfly.Param.VSFXAniSound = String(Yanfly.Parameters['Allow Sound']);
Yanfly.Param.VSFXAniSound = eval(Yanfly.Param.VSFXAniSound);
//=============================================================================
// DataManager
//=============================================================================
Yanfly.VSFX.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.VSFX.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_X_VisualStateFX) {
this.processVSFXNotetags1($dataStates);
Yanfly._loaded_YEP_X_VisualStateFX = true;
}
return true;
};
DataManager.processVSFXNotetags1 = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.stateMotion = undefined;
obj.stateAnimationId = 0;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:CUSTOM MOTION|STATE MOTION):[ ](.*)>/i)) {
obj.motion = 4;
obj.stateMotion = String(RegExp.$1).toLowerCase().trim();
if (obj.stateMotion === 'idle') obj.stateMotion = 'walk';
} else if (line.match(/<(?:STATE ANIMATION|STATE ANI):[ ](\d+)>/i)) {
obj.stateAnimationId = parseInt(RegExp.$1);
}
}
}
};
//=============================================================================
// Game_Battler
//=============================================================================
Game_BattlerBase.prototype.stateMotionIndex = function() {
var states = this.states();
var length = states.length;
for (var i = 0; i < length; ++i) {
var state = states[i];
if (state && state.motion) return state.motion;
}
return 0;
};
Game_BattlerBase.prototype.stateOverlayIndex = function() {
var states = this.states();
var length = states.length;
for (var i = 0; i < length; ++i) {
var state = states[i];
if (state && state.overlay) return state.overlay;
}
return 0;
};
//=============================================================================
// Game_Battler
//=============================================================================
Yanfly.VSFX.Game_Battler_refresh = Game_Battler.prototype.refresh;
Game_Battler.prototype.refresh = function() {
Yanfly.VSFX.Game_Battler_refresh.call(this);
this.refreshStateAnimation();
};
Yanfly.VSFX.Game_Battler_addState = Game_Battler.prototype.addState;
Game_Battler.prototype.addState = function(stateId) {
var index = this.stateMotionIndex();
var motion = this.customStateMotion();
Yanfly.VSFX.Game_Battler_addState.call(this, stateId);
this.refreshStateMotion(index, motion);
};
Yanfly.VSFX.Game_Battler_removeState = Game_Battler.prototype.removeState;
Game_Battler.prototype.removeState = function(stateId) {
var index = this.stateMotionIndex();
var motion = this.customStateMotion();
Yanfly.VSFX.Game_Battler_removeState.call(this, stateId);
this.refreshStateMotion(index, motion);
};
Game_Battler.prototype.customStateMotion = function() {
var states = this.states();
var length = states.length;
for (var i = 0; i < length; ++i) {
var state = states[i];
if (state && state.stateMotion) return state.stateMotion;
}
return 'walk';
};
Game_Battler.prototype.stateAnimationId = function() {
var states = this.states();
var length = states.length;
for (var i = 0; i < length; ++i) {
var state = states[i];
if (state && state.stateAnimationId) return state.stateAnimationId;
}
return 0;
};
Game_Battler.prototype.refreshStateAnimation = function() {
if (!this.battler()) return;
if (!$gameParty.inBattle()) return;
this.battler().startStateAnimation(this.stateAnimationId());
};
Game_Battler.prototype.refreshStateMotion = function(index, motion) {
if (!this.battler()) return;
if (index !== this.stateMotionIndex()) {
this.battler().refreshMotion();
} else if (motion !== this.customStateMotion()) {
this.battler().refreshMotion();
}
};
//=============================================================================
// Sprite_Battler
//=============================================================================
Sprite_Battler.prototype.initChildStateSprites = function(overlay, icon) {
if (this._stateSprite) {
this.removeChild(this._stateSprite);
}
if (this._stateIconSprite) {
this.removeChild(this._stateIconSprite);
}
if (overlay) {
if (!this._stateSprite) {
this._stateSprite = new Sprite_StateOverlay();
}
if (this._mainSprite) {
var index = this.getChildIndex(this._mainSprite);
this.addChildAt(this._stateSprite, index + 1);
} else {
this.addChild(this._stateSprite);
}
}
if (icon) {
if (!this._stateIconSprite) {
this._stateIconSprite = new Sprite_StateIcon();
}
if (this._mainSprite) {
var index = this.getChildIndex(this._mainSprite);
this.addChildAt(this._stateIconSprite, index + 1);
} else {
this.addChild(this._stateIconSprite);
}
}
};
Sprite_Battler.prototype.initStateAnimationSprite = function() {
if (this._stateAniSprite) return;
this._stateAniSprite = new Sprite_StateAnimation();
this.parent.addChild(this._stateAniSprite);
};
Sprite_Battler.prototype.setStateSpriteBattler = function(battler) {
if (this._stateSprite) this._stateSprite.setup(battler);
if (this._stateIconSprite) this._stateIconSprite.setup(battler);
};
Sprite_Battler.prototype.startStateAnimation = function(animationId) {
if (!this._stateAniSprite) {
if (this._allowSpriteAni) {
this.initStateAnimationSprite();
} else {
return;
}
}
if (animationId === this._currentStateAni) return;
var animation = $dataAnimations[animationId];
this._currentStateAni = animationId;
this._stateAniSprite.setBattler(this._battler);
this._stateAniSprite.setup(this.stateEffectTarget(), animation, false, 0);
};
Sprite_Battler.prototype.stateEffectTarget = function() {
return this._effectTarget;
};
//=============================================================================
// Sprite_Actor
//=============================================================================
Yanfly.VSFX.Sprite_Actor_initMembers = Sprite_Actor.prototype.initMembers;
Sprite_Actor.prototype.initMembers = function() {
Yanfly.VSFX.Sprite_Actor_initMembers.call(this);
var showOverlay = Yanfly.Param.VSFXActorOver;
var showIcon = Yanfly.Param.VSFXActorIcons;
this._allowSpriteAni = Yanfly.Param.VSFXActorAni;
this.initChildStateSprites(showOverlay, showIcon);
};
Yanfly.VSFX.Sprite_Actor_setBattler = Sprite_Actor.prototype.setBattler;
Sprite_Actor.prototype.setBattler = function(battler) {
var changed = (battler !== this._actor);
Yanfly.VSFX.Sprite_Actor_setBattler.call(this, battler);
if (changed) {
this.setStateSpriteBattler(battler);
}
};
Yanfly.VSFX.Sprite_Actor_refreshMotion = Sprite_Actor.prototype.refreshMotion;
Sprite_Actor.prototype.refreshMotion = function() {
var actor = this._actor;
if (!actor) return;
var motionGuard = Sprite_Actor.MOTIONS['guard'];
if (this._motion === motionGuard && !BattleManager.isInputting()) return;
var stateMotion = actor.stateMotionIndex();
if (actor.isInputting() || actor.isActing()) {
this.startMotion(actor.idleMotion());
} else if (stateMotion >= 4) {
this.startMotion(actor.customStateMotion());
} else {
Yanfly.VSFX.Sprite_Actor_refreshMotion.call(this);
}
};
//=============================================================================
// Sprite_Enemy
//=============================================================================
Yanfly.VSFX.Sprite_Enemy_initMembers = Sprite_Enemy.prototype.initMembers;
Sprite_Enemy.prototype.initMembers = function() {
Yanfly.VSFX.Sprite_Enemy_initMembers.call(this);
var showOverlay = Yanfly.Param.VSFXEnemyOver;
var showIcon = Yanfly.Param.VSFXEnemyIcons;
this._allowSpriteAni = Yanfly.Param.VSFXEnemyAni;
this.initChildStateSprites(showOverlay, showIcon);
};
Yanfly.VSFX.Sprite_Enemy_setBattler = Sprite_Enemy.prototype.setBattler;
Sprite_Enemy.prototype.setBattler = function(battler) {
var changed = (battler !== this._battler);
Yanfly.VSFX.Sprite_Enemy_setBattler.call(this, battler);
if (changed) {
this.setStateSpriteBattler(battler);
}
};
if (Imported.YEP_X_AnimatedSVEnemies) {
Yanfly.VSFX.Sprite_Enemy_refreshMotion = Sprite_Enemy.prototype.refreshMotion;
Sprite_Enemy.prototype.refreshMotion = function() {
if (!this._svBattlerEnabled) return;
var enemy = this._enemy;
if (!enemy) return;
var motionGuard = Sprite_Actor.MOTIONS['guard'];
if (this._motion === motionGuard && !BattleManager.isInputting()) return;
var stateMotion = enemy.stateMotionIndex();
if (enemy.isInputting() || enemy.isActing()) {
} else if (stateMotion >= 4) {
this.startMotion(enemy.customStateMotion());
} else {
Yanfly.VSFX.Sprite_Enemy_refreshMotion.call(this);
}
};
}; // Imported.YEP_X_AnimatedSVEnemies
Sprite_Enemy.prototype.stateEffectTarget = function() {
if (this._svBattlerEnabled) {
this._effectTarget = this._mainSprite;
} else {
this._effectTarget = this;
}
return this._effectTarget;
};
//=============================================================================
// Sprite_StateAnimation
//=============================================================================
function Sprite_StateAnimation() {
this.initialize.apply(this, arguments);
}
Sprite_StateAnimation.prototype = Object.create(Sprite_Animation.prototype);
Sprite_StateAnimation.prototype.constructor = Sprite_StateAnimation;
Sprite_StateAnimation.prototype.initialize = function() {
Sprite_Animation.prototype.initialize.call(this);
};
Sprite_StateAnimation.prototype.update = function() {
Sprite_Animation.prototype.update.call(this);
if (this._animation) {
this.updateLoop();
} else {
this.opacity = 0;
}
};
Sprite_StateAnimation.prototype.setup = function(target, ani, mirror, delay) {
this.clearCellSprites();
if (ani) {
Sprite_Animation.prototype.setup.call(this, target, ani, mirror, delay);
} else {
this._animation = null;
this._duration = 0;
}
};
Sprite_StateAnimation.prototype.setBattler = function(battler) {
this._battler = battler;
};
Sprite_StateAnimation.prototype.clearCellSprites = function() {
if (!this._cellSprites) return;
for (var i = 0; i < 16; i++) {
var sprite = this._cellSprites[i];
this.removeChild(sprite);
}
};
Sprite_StateAnimation.prototype.remove = function() {
};
Sprite_StateAnimation.prototype.updateLoop = function() {
if (this.isPlaying()) return;
this.opacity = this._battler.battler().opacity;
this.setupDuration();
};
Sprite_StateAnimation.prototype.processTimingData = function(timing) {
var duration = timing.flashDuration * this._rate;
switch (timing.flashScope) {
case 1:
if (Yanfly.Param.VSFXAniTarget) {
this.startFlash(timing.flashColor, duration);
}
break;
case 2:
if (Yanfly.Param.VSFXAniScreen) {
this.startScreenFlash(timing.flashColor, duration);
}
break;
case 3:
if (Yanfly.Param.VSFXAniHide) {
this.startHiding(duration);
}
break;
}
if (!this._duplicated && timing.se) {
if (Yanfly.Param.VSFXAniSound) {
AudioManager.playSe(timing.se);
}
}
};
//=============================================================================
// End of File
//=============================================================================
}; // Imported.YEP_BattleEngineCore && Imported.YEP_BuffsStatesCore