//============================================================================= // 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: * * 隐藏血量 * This HP gauge will always be hidden if this notetag is present. * * * 显示血量 * This HP gauge will always be shown if this notetag is present while the * target is selected or taking damage. * * * 血量槽宽度,如果宽度小于最小宽度,将会取最小宽度 * 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. * * * 血量槽高度 * This set's the HP Gauge height to x pixels. * * * 血量槽背景颜色 * This changes the HP Gauge's back color to x text color. * * * 血量槽颜色1 * This changes the HP Gauge's color 1 to x text color. * * * 血量槽颜色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 //============================================================================= };