229 lines
7.2 KiB
JavaScript
229 lines
7.2 KiB
JavaScript
//=============================================================================
|
||
// MPP_StatePopup.js
|
||
//=============================================================================
|
||
// Copyright (c) 2019 Mokusei Penguin
|
||
// Released under the MIT license
|
||
// http://opensource.org/licenses/mit-license.php
|
||
//=============================================================================
|
||
|
||
/*:
|
||
* @plugindesc 【ver.1.1】ダメージをポップアップする際、頭上に解除or付加されたステートを表示します。
|
||
* @author 木星ペンギン
|
||
*
|
||
* @help ●【アクティブタイムバトル ATステート(MPP_ActiveTimeBattle_OP1.js)】と
|
||
* 併用する場合、こちらのプラグインが下になるように導入してください。
|
||
*
|
||
* ●ツクール側の仕様対策で、モバイル端末では若干エフェクトが変化します。
|
||
*
|
||
* ================================
|
||
* 制作 : 木星ペンギン
|
||
* URL : http://woodpenguin.blog.fc2.com/
|
||
*
|
||
* @param Popup Time
|
||
* @type number
|
||
* @desc エフェクトを除くポップアップの時間
|
||
* @default 30
|
||
*
|
||
* @param Popup Delay
|
||
* @type number
|
||
* @desc 複数のステートを表示する際の表示間隔
|
||
* @default 30
|
||
*
|
||
* @param Popup Actor?
|
||
* @type boolean
|
||
* @desc アクターのステート表示を行うかどうか?
|
||
* @default true
|
||
*
|
||
* @param Popup Enemy?
|
||
* @type boolean
|
||
* @desc エネミーのステート表示を行うかどうか?
|
||
* @default false
|
||
*
|
||
*/
|
||
|
||
(function() {
|
||
|
||
var parameters = PluginManager.parameters('MPP_StatePopup');
|
||
var MPPlugin = {
|
||
ATBOP1_Plugin:$plugins.some(function(plugin) {
|
||
return (plugin.name === 'MPP_ATB_OP1' && plugin.status);
|
||
}),
|
||
|
||
popupTime:Math.max(Number(parameters['Popup Time'] || 30), 1),
|
||
popupDelay:Math.max(Number(parameters['Popup Delay'] || 30), 1),
|
||
popupActor:eval(parameters['Popup Actor?']) === true,
|
||
popupEnemy:eval(parameters['Popup Enemy?']) === true
|
||
};
|
||
|
||
var Alias = {};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Sprite_Battler
|
||
|
||
//19
|
||
Alias.SpBa_initMembers = Sprite_Battler.prototype.initMembers;
|
||
Sprite_Battler.prototype.initMembers = function() {
|
||
Alias.SpBa_initMembers.call(this);
|
||
this._states = [];
|
||
};
|
||
|
||
//99
|
||
Alias.SpBa_updateDamagePopup = Sprite_Battler.prototype.updateDamagePopup;
|
||
Sprite_Battler.prototype.updateDamagePopup = function() {
|
||
Alias.SpBa_updateDamagePopup.call(this);
|
||
if (this._states.length > 0) {
|
||
if (!this._states[0].isPlaying()) {
|
||
this.parent.removeChild(this._states[0]);
|
||
this._states.shift();
|
||
}
|
||
}
|
||
};
|
||
|
||
//141
|
||
Alias.SpBa_setupDamagePopup = Sprite_Battler.prototype.setupDamagePopup;
|
||
Sprite_Battler.prototype.setupDamagePopup = function() {
|
||
if (this.isPopupState()) {
|
||
if (this._battler.isDamagePopupRequested()) {
|
||
this.setupStatePopup(this._battler.result());
|
||
}
|
||
if (MPPlugin.ATBOP1_Plugin && this._battler._atbDamagePopup) {
|
||
this.setupStatePopup(this._battler._atbResult);
|
||
}
|
||
}
|
||
Alias.SpBa_setupDamagePopup.call(this);
|
||
};
|
||
|
||
Sprite_Battler.prototype.setupStatePopup = function(result) {
|
||
var delay = 8;
|
||
var nextDelay = MPPlugin.popupDelay;
|
||
var addedStates = result.addedStateObjects();
|
||
for (var i = 0; i < addedStates.length; i++) {
|
||
var iconIndex = addedStates[i].iconIndex;
|
||
this.startStatePopup(iconIndex, 0, delay);
|
||
delay += nextDelay;
|
||
}
|
||
for (var i = 0; i < 8; i++) {
|
||
if (result.isBuffAdded(i)) {
|
||
var iconIndex = this._battler.buffIconIndex(1, i);
|
||
this.startStatePopup(iconIndex, 0, delay);
|
||
delay += nextDelay;
|
||
}
|
||
}
|
||
for (var i = 0; i < 8; i++) {
|
||
if (result.isDebuffAdded(i)) {
|
||
var iconIndex = this._battler.buffIconIndex(-1, i);
|
||
this.startStatePopup(iconIndex, 0, delay);
|
||
delay += nextDelay;
|
||
}
|
||
}
|
||
var removedStates = result.removedStateObjects();
|
||
for (var i = 0; i < removedStates.length; i++) {
|
||
var iconIndex = removedStates[i].iconIndex;
|
||
this.startStatePopup(iconIndex, 1, delay);
|
||
delay += nextDelay;
|
||
}
|
||
};
|
||
|
||
Sprite_Battler.prototype.startStatePopup = function(iconIndex, type, delay) {
|
||
var sprite = new Sprite_StatePopup();
|
||
sprite.x = this.x;
|
||
sprite.y = this.y - this.stateOffsetY();
|
||
if (sprite.y < 20) sprite.y = 20;
|
||
sprite.setup(iconIndex, type, delay);
|
||
this._states.push(sprite);
|
||
this.parent.addChild(sprite);
|
||
};
|
||
|
||
Sprite_Battler.prototype.stateOffsetY = function() {
|
||
return this._effectTarget.height;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Sprite_Actor
|
||
|
||
Sprite_Actor.prototype.isPopupState = function() {
|
||
return this._actor.isSpriteVisible() && MPPlugin.popupActor;
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Sprite_Enemy
|
||
|
||
Sprite_Enemy.prototype.isPopupState = function() {
|
||
return MPPlugin.popupEnemy;
|
||
};
|
||
|
||
Sprite_Enemy.prototype.stateOffsetY = function() {
|
||
return Math.round((this.bitmap.height + 40) * 0.9);
|
||
};
|
||
|
||
//-----------------------------------------------------------------------------
|
||
// Sprite_StatePopup
|
||
|
||
function Sprite_StatePopup() {
|
||
this.initialize.apply(this, arguments);
|
||
}
|
||
|
||
Sprite_StatePopup.prototype = Object.create(Sprite.prototype);
|
||
Sprite_StatePopup.prototype.constructor = Sprite_StatePopup;
|
||
|
||
Sprite_StatePopup.prototype.initialize = function() {
|
||
Sprite.prototype.initialize.call(this);
|
||
this.bitmap = ImageManager.loadSystem('IconSet');
|
||
this.setFrame(0, 0, 0, 0);
|
||
this.anchor.x = 0.5;
|
||
this.anchor.y = 0.5;
|
||
this._duration = 15 + MPPlugin.popupTime;
|
||
this._popupType = 0;
|
||
this._delay = 0;
|
||
this._flashColor = [255, 255, 255, 255];
|
||
};
|
||
|
||
Sprite_StatePopup.prototype.setup = function(iconIndex, type, delay) {
|
||
var pw = Sprite_StateIcon._iconWidth;
|
||
var ph = Sprite_StateIcon._iconHeight;
|
||
var sx = iconIndex % 16 * pw;
|
||
var sy = Math.floor(iconIndex / 16) * ph;
|
||
this.setFrame(sx, sy, pw, ph);
|
||
this._popupType = type;
|
||
this._delay = delay;
|
||
this.visible = false;
|
||
};
|
||
|
||
Sprite_StatePopup.prototype.update = function() {
|
||
Sprite.prototype.update.call(this);
|
||
if (this._delay > 0) {
|
||
this._delay--;
|
||
} else if (this._duration > 0) {
|
||
var d = this._duration--;
|
||
if (this._popupType === 0) {
|
||
var base = MPPlugin.popupTime;
|
||
if (d > base) {
|
||
var radian = (d - base) * Math.PI / 30;
|
||
this.scale.x = Math.cos(radian);
|
||
this.anchor.y = Math.cos(radian) / 2;
|
||
} else {
|
||
this.scale.x = 1;
|
||
this.anchor.y = 0.5;
|
||
}
|
||
if (!Utils.isMobileDevice()) {
|
||
this._flashColor[3] = Math.max(this._flashColor[3] - 10, 0);
|
||
this.setBlendColor(this._flashColor);
|
||
}
|
||
} else {
|
||
if (d <= 30) {
|
||
this.blendMode = 1;
|
||
this.opacity = d * 9;
|
||
var radian = (30 - d) * Math.PI / 60;
|
||
this.anchor.y = Math.cos(radian) / 2;
|
||
}
|
||
}
|
||
this.visible = true;
|
||
}
|
||
};
|
||
|
||
Sprite_StatePopup.prototype.isPlaying = function() {
|
||
return this._duration > 0;
|
||
};
|
||
|
||
|
||
})();
|