You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ycrpg/js/plugins/YEP_X_VisualHpGauge.js

690 lines
23 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//=============================================================================
// Yanfly Engine Plugins - Battle Engine Extension - Visual HP Gauge
// YEP_X_VisualHpGauge.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_VisualHpGauge = true;
var Yanfly = Yanfly || {};
Yanfly.VHG = Yanfly.VHG || {};
//=============================================================================
/*:
* @plugindesc v1.06 血量槽外观☁️
* @author Yanfly Engine Plugins
*
* @param ---全局---
* @default
*
* @param Display Actor
* @text 角色HP条
* @desc Do you wish to display the HP Gauge for actors?
* NO - false YES - true
* @default true
*
* @param Defeat First
* @text 敌人需击败显示血条
* @desc Enemies must be defeated first before showing the HP Gauge.
* NO - false YES - true
* @default false
*
* @param Always Visible
* @text 始终可见
* @desc HP Gauge is always visible and doesn't fade away.
* NO - false YES - true
* @default false
*
* @param ---外观---
* @default
*
* @param Minimum Gauge Width
* @desc This is the minimum width in pixels for HP Gauges.
* @default 144
*
* @param Gauge Height
* @desc This is the height in pixels for HP Gauges.
* @default 18
*
* @param Back Color
* @desc This is the text color used for the back of HP Gauges.
* @default 19
*
* @param HP Color 1
* @desc This is the text color used for the 1st part of HP Gauges.
* @default 20
*
* @param HP Color 2
* @desc This is the text color used for the 2nd part of HP Gauges.
* @default 21
*
* @param Gauge Duration
* @text
* @desc This is the frames the HP gauge will continue to show after
* it finishes draining or filling.
* @default 30
*
* @param Gauge Position
* @text 条位置
* @desc Where do you wish to show the HP gauge?
* BELOW - false ABOVE - true
* @default false
*
* @param Y Buffer
* @desc How much do you wish to shift the gauge Y position?
* @default -16
*
* @param Use Thick Gauges
* @text 使用厚量规
* @desc Use the thick gauges provided by this plugin?
* Default - false Thick - true
* @default true
*
* @param ---文本显示---
* @default
*
* @param Show HP
* @desc Show the actual 'HP' text.
* NO - false YES - true
* @default false
*
* @param Show Value
* @desc Show the HP value.
* NO - false YES - true
* @default false
*
* @param Show Max
* @desc Show the MaxHP value if value is shown?
* NO - false YES - true
* @default false
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* 这个插件需要YEP_BattleEngineCore战斗引擎核心确保放在这个插件下面
*
*
* 这个插件可以在敌方被击中或者选择时显示血量,你也可以设置队员的
* 血量显示。你可以调整血量显示的参数。
*
* 敌方默认不需要先击倒在显示血量。这个可以通过参数设定。但是,在编
* 辑器战斗测试时,血量会一直显示,除非敌方隐藏。
*
* ============================================================================
* Notetags
* ============================================================================
*
* Class and Enemy Notetags:
* <Hide HP Gauge>
* 隐藏血量
* This HP gauge will always be hidden if this notetag is present.
*
* <Show HP Gauge>
* 显示血量
* This HP gauge will always be shown if this notetag is present while the
* target is selected or taking damage.
*
* <HP Gauge Width: x>
* 血量槽宽度,如果宽度小于最小宽度,将会取最小宽度
* This will set the battler's HP Gauge width to x pixels. However, if this
* width is less than the minimum width, minimum width will take priority.
*
* <HP Gauge Height: x>
* 血量槽高度
* This set's the HP Gauge height to x pixels.
*
* <HP Gauge Back Color: x>
* 血量槽背景颜色
* This changes the HP Gauge's back color to x text color.
*
* <HP Gauge Color 1: x>
* 血量槽颜色1
* This changes the HP Gauge's color 1 to x text color.
*
* <HP Gauge Color 2: x>
* 血量槽颜色2
* This changes the HP Gauge's color 2 to x text color.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.06:
* - Compatibility update with State Categories.
*
* Version 1.05:
* - Updated for RPG Maker MV version 1.1.0.
*
* Version 1.04:
* - Optimization update.
*
* Version 1.03:
* - Fixed a bug when Escape skill-effects are used on battlers.
*
* Version 1.02:
* - Fixed a bug with gauge height not adjusting.
*
* Version 1.01b:
* - Fixed a bug regarding dependancy checks.
* - Fixed many bugs regarding stacking errors.
*
* Version 1.01:
* - Rewrote the good majority of plugin to accomodate the following features:
* ---'Always Visible' parameter.
* ---'Gauge Position' parameter.
* ---'Y Buffer' parameter.
* ---'Use Thick Gauges' parameter.
* ---'Show HP' parameter.
* ---'Show Value' parameter.
* ---'Show Max' parameter.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
if (Imported.YEP_BattleEngineCore) {
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_X_VisualHpGauge');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.VHGDisplayActor = String(Yanfly.Parameters['Display Actor']);
Yanfly.Param.VHGDefeatFirst = String(Yanfly.Parameters['Defeat First']);
Yanfly.Param.VHGAlwaysShow = eval(String(Yanfly.Parameters['Always Visible']));
Yanfly.Param.VHGMinHpWidth = Number(Yanfly.Parameters['Minimum Gauge Width']);
Yanfly.Param.VHGGaugeHeight = Number(Yanfly.Parameters['Gauge Height']);
Yanfly.Param.VHGBackColor = Number(Yanfly.Parameters['Back Color']);
Yanfly.Param.VHGHpColor1 = Number(Yanfly.Parameters['HP Color 1']);
Yanfly.Param.VHGHpColor2 = Number(Yanfly.Parameters['HP Color 2']);
Yanfly.Param.VHGGaugeDuration = Number(Yanfly.Parameters['Gauge Duration']);
Yanfly.Param.VHGGaugePos = eval(String(Yanfly.Parameters['Gauge Position']));
Yanfly.Param.VHGBufferY = Number(Yanfly.Parameters['Y Buffer']);
Yanfly.Param.VHGThick = eval(String(Yanfly.Parameters['Use Thick Gauges']));
Yanfly.Param.VHGShowHP = eval(String(Yanfly.Parameters['Show HP']));
Yanfly.Param.VHGShowValue = eval(String(Yanfly.Parameters['Show Value']));
Yanfly.Param.VHGShowMax = eval(String(Yanfly.Parameters['Show Max']));
//=============================================================================
// DataManager
//=============================================================================
Yanfly.VHG.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() {
if (!Yanfly.VHG.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_X_VisualHpGauge) {
this.processVHGNotetags($dataClasses);
this.processVHGNotetags($dataEnemies);
Yanfly._loaded_YEP_X_VisualHpGauge = true;
}
return true;
};
DataManager.processVHGNotetags = function(group) {
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.hideHpGauge = false;
obj.showHpGauge = false;
obj.hpGaugeWidth = 0;
obj.hpGaugeHeight = Yanfly.Param.VHGGaugeHeight;
obj.hpGaugeBackColor = Yanfly.Param.VHGBackColor;
obj.hpGaugeColor1 = Yanfly.Param.VHGHpColor1;
obj.hpGaugeColor2 = Yanfly.Param.VHGHpColor2;
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(/<(?:HIDE HP GAUGE)>/i)) {
obj.hideHpGauge = true;
} else if (line.match(/<(?:SHOW HP GAUGE)>/i)) {
obj.showHpGauge = true;
} else if (line.match(/<(?:HP GAUGE WIDTH):[ ](\d+)>/i)) {
obj.hpGaugeWidth = parseInt(RegExp.$1);
} else if (line.match(/<(?:HP GAUGE HEIGHT):[ ](\d+)>/i)) {
obj.hpGaugeHeight = parseInt(RegExp.$1);
} else if (line.match(/<(?:HP GAUGE BACK COLOR):[ ](\d+)>/i)) {
obj.hpGaugeBackColor = parseInt(RegExp.$1);
} else if (line.match(/<(?:HP GAUGE COLOR 1):[ ](\d+)>/i)) {
obj.hpGaugeColor1 = parseInt(RegExp.$1);
} else if (line.match(/<(?:HP GAUGE COLOR 2):[ ](\d+)>/i)) {
obj.hpGaugeColor2 = parseInt(RegExp.$1);
}
}
}
};
//=============================================================================
// Game_System
//=============================================================================
Yanfly.VHG.Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
Yanfly.VHG.Game_System_initialize.call(this);
this.initShownHpGauge();
};
Game_System.prototype.initShownHpGauge = function() {
this._shownHpGauge = [];
};
Game_System.prototype.showHpGaugeEnemy = function(id) {
if (this._shownHpGauge === undefined) this.initShownHpGauge();
if (!eval(Yanfly.Param.VHGDefeatFirst)) return true;
return this._shownHpGauge.contains(id);
};
Game_System.prototype.addHpGaugeEnemy = function(id) {
if (this._shownHpGauge === undefined) this.initShownHpGauge();
if (this._shownHpGauge.contains(id)) return;
this._shownHpGauge.push(id);
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
Yanfly.VHG.Game_BattlerBase_die = Game_BattlerBase.prototype.die;
Game_BattlerBase.prototype.die = function() {
Yanfly.VHG.Game_BattlerBase_die.call(this);
if (!this.isEnemy()) return;
if (eval(Yanfly.Param.VHGDefeatFirst)) {
if (!$gameSystem.showHpGaugeEnemy(this._enemyId)) this._noHpGauge = true;
}
$gameSystem.addHpGaugeEnemy(this._enemyId);
};
//=============================================================================
// Game_Battler
//=============================================================================
Game_Battler.prototype.hpGaugeVisible = function() {
if (this._noHpGauge) return false;
if (this.isHidden()) return false;
return true;
};
Game_Battler.prototype.hpGaugeWidth = function() {
var width = Math.max(this.spriteWidth(), Yanfly.Param.VHGMinHpWidth);
return (width & 1) ? width + 1 : width;
};
Game_Battler.prototype.hpGaugeHeight = function() {
return Yanfly.Param.VHGGaugeHeight;
};
Game_Battler.prototype.hpGaugeBackColor = function() {
return Yanfly.Param.VHGBackColor;
};
Game_Battler.prototype.hpGaugeColor1 = function() {
return Yanfly.Param.VHGHpColor1;
};
Game_Battler.prototype.hpGaugeColor2 = function() {
return Yanfly.Param.VHGHpColor2;
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.hpGaugeVisible = function() {
if (this.isHidden()) return false;
if (this.currentClass().showHpGauge) return true;
if (!eval(Yanfly.Param.VHGDisplayActor)) return false;
if (this.currentClass().hideHpGauge) return false;
return Game_Battler.prototype.hpGaugeVisible.call(this);
};
Game_Actor.prototype.hpGaugeWidth = function() {
if (this.currentClass().hpGaugeWidth > 0) {
var width = this.currentClass().hpGaugeWidth;
} else {
var width = this.spriteWidth();
}
width = Math.max(width, Yanfly.Param.VHGMinHpWidth);
return (width & 1) ? width + 1 : width;
};
Game_Actor.prototype.hpGaugeHeight = function() {
return this.currentClass().hpGaugeHeight;
};
Game_Actor.prototype.hpGaugeBackColor = function() {
return this.currentClass().hpGaugeBackColor;
};
Game_Actor.prototype.hpGaugeColor1 = function() {
return this.currentClass().hpGaugeColor1;
};
Game_Actor.prototype.hpGaugeColor2 = function() {
return this.currentClass().hpGaugeColor2;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.hpGaugeVisible = function() {
if (this.isHidden()) return false;
if (this.enemy().hideHpGauge) return false;
if (BattleManager.isBattleTest()) return true;
if (this.enemy().showHpGauge) return true;
if (!$gameSystem.showHpGaugeEnemy(this._enemyId)) return false;
return Game_Battler.prototype.hpGaugeVisible.call(this);
};
Yanfly.VHG.Game_Enemy_revive = Game_Enemy.prototype.revive;
Game_Enemy.prototype.revive = function() {
if (this._hp === 0) this._noHpGauge = false;
Yanfly.VHG.Game_Enemy_revive.call(this);
};
Game_Enemy.prototype.hpGaugeWidth = function() {
if (this.enemy().hpGaugeWidth > 0) {
var width = this.enemy().hpGaugeWidth;
} else {
var width = this.spriteWidth();
}
width = Math.max(width, Yanfly.Param.VHGMinHpWidth);
return (width & 1) ? width + 1 : width;
};
Game_Enemy.prototype.hpGaugeHeight = function() {
return this.enemy().hpGaugeHeight;
};
Game_Enemy.prototype.hpGaugeBackColor = function() {
return this.enemy().hpGaugeBackColor;
};
Game_Enemy.prototype.hpGaugeColor1 = function() {
return this.enemy().hpGaugeColor1;
};
Game_Enemy.prototype.hpGaugeColor2 = function() {
return this.enemy().hpGaugeColor2;
};
//=============================================================================
// Sprite_Battler
//=============================================================================
Yanfly.VHG.Sprite_Battler_update = Sprite_Battler.prototype.update;
Sprite_Battler.prototype.update = function() {
Yanfly.VHG.Sprite_Battler_update.call(this);
this.createVisualHpGaugeWindow();
};
Sprite_Battler.prototype.createVisualHpGaugeWindow = function() {
if (this._createdVisualHpGaugeWindow) return;
if (!this._battler) return;
if (this.checkVisualATBGauge()) {
if (!this._visualATBWindow) return;
if (!this.parent.parent.children.contains(this._visualATBWindow)) return;
}
this._createdVisualHpGaugeWindow = true;
this._visualHpGauge = new Window_VisualHPGauge();
this._visualHpGauge.setBattler(this._battler);
this.parent.parent.addChild(this._visualHpGauge);
};
Sprite_Battler.prototype.checkVisualATBGauge = function() {
if (!Imported.YEP_X_BattleSysATB) return false;
if (!BattleManager.isATB()) return false;
if (!Imported.YEP_X_VisualATBGauge) return false;
return this._battler.isEnemy();
};
Yanfly.VHG.Sprite_Battler_setBattler = Sprite_Battler.prototype.setBattler;
Sprite_Battler.prototype.setBattler = function(battler) {
Yanfly.VHG.Sprite_Battler_setBattler.call(this, battler);
if (this._visualHpGauge) this._visualHpGauge.setBattler(battler);
};
//=============================================================================
// Window_VisualHPGauge
//=============================================================================
function Window_VisualHPGauge() {
this.initialize.apply(this, arguments);
}
Window_VisualHPGauge.prototype = Object.create(Window_Base.prototype);
Window_VisualHPGauge.prototype.constructor = Window_VisualHPGauge;
Window_VisualHPGauge.prototype.initialize = function() {
this._opacitySpeed = 255 / Yanfly.Param.VHGGaugeDuration;
this._dropSpeed = 0;
this._visibleCounter = 0;
Window_Base.prototype.initialize.call(this, 0, 0, 1, 1);
this._battler = null;
this._requestRefresh = false;
this._currentHpValue = 0;
this._displayedValue = 0;
this.contentsOpacity = 0;
this.opacity = 0;
};
Window_VisualHPGauge.prototype.setBattler = function(battler) {
if (this._battler === battler) return;
this._battler = battler;
this._currentHpValue = this._battler ? this._battler.hp : 0;
this._displayedValue = this._battler ? this._battler.hp : 0;
};
Window_VisualHPGauge.prototype.update = function() {
Window_Base.prototype.update.call(this);
if (!this._battler) return;
this.updateWindowAspects();
};
Window_VisualHPGauge.prototype.updateWindowAspects = function() {
this.updateWindowSize();
this.updateWindowPosition();
this.updateOpacity();
this.updateHpPosition();
this.updateRefresh();
};
Window_VisualHPGauge.prototype.updateWindowSize = function() {
var spriteWidth = this._battler.hpGaugeWidth();
var width = spriteWidth + this.standardPadding() * 2;
width = Math.min(width, Graphics.boxWidth + this.standardPadding() * 2);
var height = Math.max(this.lineHeight(), this.gaugeHeight() + 4);
height += this.standardPadding() * 2;
if (width === this.width && height === this.height) return;
this.width = width;
this.height = height;
this.createContents();
this._requestRefresh = true;
this.makeWindowBoundaries();
};
Window_VisualHPGauge.prototype.makeWindowBoundaries = function() {
if (!this._requestRefresh) return;
this._minX = -1 * this.standardPadding();
this._maxX = Graphics.boxWidth - this.width + this.standardPadding();
this._minY = -1 * this.standardPadding();
this._maxY = Graphics.boxHeight - this.height + this.standardPadding();
this._maxY -= SceneManager._scene._statusWindow.height;
};
Window_VisualHPGauge.prototype.updateWindowPosition = function() {
if (!this._battler) return;
var battler = this._battler;
this.x = battler.spritePosX();
this.x -= Math.ceil(this.width / 2);
this.x = this.x.clamp(this._minX, this._maxX);
this.y = battler.spritePosY();
if (Yanfly.Param.VHGGaugePos) {
this.y -= battler.spriteHeight();
} else {
this.y -= this.standardPadding();
}
this.y = this.y.clamp(this._minY, this._maxY);
this.y += Yanfly.Param.VHGBufferY;
};
Window_VisualHPGauge.prototype.updateOpacity = function() {
if (this.isShowWindow()) {
this.contentsOpacity += 32;
} else {
this.contentsOpacity -= 32;
}
};
Window_VisualHPGauge.prototype.isShowWindow = function() {
if (!this._battler.isAppeared()) return false;
if (!this._battler.hpGaugeVisible()) return false;
if (Yanfly.Param.VHGAlwaysShow && !this._battler.isDead()) return true;
if (this._currentHpValue !== this._displayedValue) return true;
if (this._battler.isSelected()) return true;
--this._visibleCounter;
return this._visibleCounter > 0;
};
Window_VisualHPGauge.prototype.updateHpPosition = function() {
if (!this._battler) return;
if (this._currentHpValue !== this._battler.hp) {
this._visibleCounter = Yanfly.Param.VHGGaugeDuration;
this._currentHpValue = this._battler.hp;
var difference = Math.abs(this._displayedValue - this._battler.hp);
this._dropSpeed = Math.ceil(difference / Yanfly.Param.VHGGaugeDuration);
}
this.updateDisplayCounter();
};
Window_VisualHPGauge.prototype.updateDisplayCounter = function() {
if (this._battler._barrierAltered) {
this._battler._barrierAltered = false;
} else if (this._currentHpValue === this._displayedValue) {
return;
}
var d = this._dropSpeed;
var c = this._currentHpValue;
if (this._displayedValue > this._currentHpValue) {
this._displayedValue = Math.max(this._displayedValue - d, c);
} else if (this._displayedValue < this._currentHpValue) {
this._displayedValue = Math.min(this._displayedValue + d, c);
}
this._requestRefresh = true;
};
Window_VisualHPGauge.prototype.updateRefresh = function() {
if (this._requestRefresh) this.refresh();
};
Window_VisualHPGauge.prototype.refresh = function() {
this.contents.clear();
if (!this._battler) return;
this._requestRefresh = false;
var wy = this.contents.height - this.lineHeight();
var ww = this.contents.width;
this.drawActorHp(this._battler, 0, wy, ww);
};
Window_VisualHPGauge.prototype.gaugeBackColor = function() {
return this.textColor(this._battler.hpGaugeBackColor());
};
Window_VisualHPGauge.prototype.hpGaugeColor1 = function() {
return this.textColor(this._battler.hpGaugeColor1());
};
Window_VisualHPGauge.prototype.hpGaugeColor2 = function() {
return this.textColor(this._battler.hpGaugeColor2());
};
Window_VisualHPGauge.prototype.drawActorHp = function(actor, x, y, width) {
width = width || 186;
var color1 = this.hpGaugeColor1();
var color2 = this.hpGaugeColor2();
var rate = this._displayedValue / actor.mhp;
if (Imported.YEP_AbsorptionBarrier && actor.barrierPoints() > 0) {
ww = this.drawBarrierGauge(actor, x, y, width);
} else {
this.drawGauge(x, y, width, rate, color1, color2);
}
if (Yanfly.Param.VHGShowHP) {
this.changeTextColor(this.systemColor());
this.drawText(TextManager.hpA, x, y, 44);
}
if (Yanfly.Param.VHGShowValue) {
var val = this._displayedValue
var max = actor.mhp;
var w = width;
var color = this.hpColor(actor);
this.drawCurrentAndMax(val, max, x, y, w, color, this.normalColor());
}
};
Window_VisualHPGauge.prototype.drawCurrentAndMax = function(current, max, x, y,
width, color1, color2) {
if (Yanfly.Param.VHGShowMax) {
Window_Base.prototype.drawCurrentAndMax.call(this, current, max,
x, y, width, color1, color2);
} else {
var align = Yanfly.Param.VHGShowHP ? 'right' : 'center';
var text = Yanfly.Util.toGroup(current);
this.changeTextColor(color1);
this.drawText(text, x, y, width, align);
}
};
Window_VisualHPGauge.prototype.gaugeHeight = function() {
if (!this._battler) return Window_Base.prototype.gaugeHeight.call(this);
return this._battler.hpGaugeHeight();
};
if (Imported.YEP_CoreEngine && Yanfly.Param.VHGThick) {
Window_VisualHPGauge.prototype.drawGauge =
function(dx, dy, dw, rate, color1, color2) {
var color3 = this.gaugeBackColor();
var fillW = Math.floor(dw * rate).clamp(0, dw);
var gaugeH = this.gaugeHeight();
var gaugeY = dy + this.lineHeight() - gaugeH - 2;
if (eval(Yanfly.Param.GaugeOutline)) {
color3.paintOpacity = this.translucentOpacity();
this.contents.fillRect(dx, gaugeY, dw, gaugeH, color3);
dx += 2;
gaugeY += 2;
fillW = Math.max(0, fillW - 4);
gaugeH -= 4;
} else {
var fillW = Math.floor(dw * rate);
var gaugeY = dy + this.lineHeight() - gaugeH - 2;
this.contents.fillRect(dx, gaugeY, dw, gaugeH, color3);
}
this.contents.gradientFillRect(dx, gaugeY, fillW, gaugeH, color1, color2);
};
} // Imported.YEP_CoreEngine
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
if (!Yanfly.Util.toGroup) {
Yanfly.Util.toGroup = function(inVal) {
return inVal;
}
};
//=============================================================================
// End of File
//=============================================================================
};