Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
| #=============================================================================== | |
| # )----------------------------------------------------------------------------( | |
| # )-- AUTHOR: Mr Trivel --( | |
| # )-- NAME: Multi Layer Boss HP Bar --( | |
| # )-- CREATED: 2014-10-31 --( | |
| # )-- VERSION: 1.2b --( | |
| #=============================================================================== | |
| # )-- VERSION HISTORY --( | |
| # )-- 1.0 - Initial script. --( | |
| # )-- 1.1 - Crash fix. --( | |
| # )-- 1.1a - Small code change. --( | |
| # )-- 1.2 - Boss Health bar is now in it's own class. Added a switch to --( | |
| # )-- hide boss health bar. --( | |
| # )-- 1.2a - Crash fix in non-boss battles. --( | |
| # )-- 1.2b - Bar now disappears when boss dies. Can be turned off. --( | |
| #=============================================================================== | |
| # )-- DESCRIPTION --( | |
| # )-- Boss can now have a multi-layer health bar. Meaning it won't just go --( | |
| # )-- to empty, the layers will deplete 1 by 1 until the bar is completely --( | |
| # )-- empty. --( | |
| #=============================================================================== | |
| # )-- INSTRUCTIONS --( | |
| # )-- #1 Set up images carefully: --( | |
| # )-- Place 7 images in Graphics/System folder with these names - --( | |
| # )-- boss_hp_bar_borders - this is the frame of the health bar --( | |
| # )-- boss_hp_bar_bcg - background of health bar, this is what player will --( | |
| # )-- as the last layer is depleting. --( | |
| # )-- boss_hp_bar1 \ --( | |
| # )-- boss_hp_bar2 \ --( | |
| # )-- boss_hp_bar3 - Health Layers. --( | |
| # )-- boss_hp_bar4 / --( | |
| # )-- boss_hp_bar5 / --( | |
| # )-- --( | |
| # )-- #2 Find your boss enemy and add this note tag to it: --( | |
| # )-- <boss: X> - X is how many health layers the boss will have. --( | |
| # )-- In the video example I used <boss: 10> --( | |
| # )-- --( | |
| # )-- #3 Set up the BHP module below to fit your HP bar's needs. --( | |
| #=============================================================================== | |
| # )-- LICENSE INFO --( | |
| # )-- Free for non-commercial & commercial games if credit was given to --( | |
| # )-- Mr Trivel. --( | |
| # )----------------------------------------------------------------------------( | |
| #=============================================================================== | |
| module BHP | |
| # )--------------------------------------------------------------------------( | |
| # )-- Because HP bar is not sometimes from the start of the image to the --( | |
| # )-- end of it, you might need to offset some unneeded pixels. --( | |
| # )-- The numbers here are taken from the video example, HP bar there is --( | |
| # )-- far from both sides of the image. --( | |
| # )--------------------------------------------------------------------------( | |
| # )--------------------------------------------------------------------------( | |
| # )-- Offset from the left in pixels --( | |
| # )--------------------------------------------------------------------------- | |
| FILL_X_OFFSET_LEFT = 93 | |
| # )--------------------------------------------------------------------------( | |
| # )-- Offset from the right in pixels --( | |
| # )--------------------------------------------------------------------------- | |
| FILL_X_OFFSET_RIGHT = 76 | |
| # )--------------------------------------------------------------------------( | |
| # )-- By default the text that shows how many layers are left is shown --( | |
| # )-- in the middle of the HP bar. You can offset it's X position and Y --( | |
| # )-- positions. Number is in pixels. --( | |
| # )--------------------------------------------------------------------------( | |
| TIMES_X_OFFSET = 230 | |
| TIMES_Y_OFFSET = 0 | |
| # )--------------------------------------------------------------------------( | |
| # )-- How low should the HP bar be --( | |
| # )--------------------------------------------------------------------------( | |
| BAR_Y = 40 | |
| # )--------------------------------------------------------------------------( | |
| # )-- Switch to show/hide the boss HP bar. In case of cutscenes in battle.--( | |
| # )-- Set it to 0 if you do not wish to use this. --( | |
| # )--------------------------------------------------------------------------( | |
| HIDE_SWITCH = 0 | |
| # )--------------------------------------------------------------------------( | |
| # )-- Should bar be hidden after boss dies? --( | |
| # )--------------------------------------------------------------------------( | |
| HIDE_BAR_WHEN_BOSS_DIES = true | |
| end | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: Game_Enemy --( | |
| # )---------------------------------------------------------------------=======( | |
| class Game_Enemy < Game_Battler | |
| # )--------------------------------------------------------------------------( | |
| # )-- Aliased methods --( | |
| # )--------------------------------------------------------------------------( | |
| alias :bosses_initialize :initialize | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: initialize --( | |
| # )--------------------------------------------------------------------------( | |
| def initialize(index, enemy_id) | |
| bosses_initialize(index, enemy_id) | |
| enemy = $data_enemies[@enemy_id] | |
| @boss = enemy.boss | |
| @boss_bars = enemy.boss_bars | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: boss --( | |
| # )--------------------------------------------------------------------------( | |
| def boss | |
| @boss | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: boss_bars --( | |
| # )--------------------------------------------------------------------------( | |
| def boss_bars | |
| @boss_bars | |
| end | |
| end | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: Game_Temp --( | |
| # )---------------------------------------------------------------------=======( | |
| class Game_Temp | |
| # )--------------------------------------------------------------------------( | |
| # )-- Aliased methods --( | |
| # )--------------------------------------------------------------------------( | |
| alias :bosses_initialize :initialize | |
| # )--------------------------------------------------------------------------( | |
| # )-- Public Instance Variables --( | |
| # )--------------------------------------------------------------------------( | |
| attr_accessor :bhp_frame | |
| attr_accessor :bhp_background | |
| attr_accessor :bhp_fill | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: initialize --( | |
| # )--------------------------------------------------------------------------( | |
| def initialize | |
| bosses_initialize | |
| @bhp_frame = Cache.system("boss_hp_bar_borders") | |
| @bhp_background = Cache.system("boss_hp_bar_bcg") | |
| @bhp_fill = [] | |
| 5.times { |time| | |
| @bhp_fill.push(Cache.system("boss_hp_bar#{time+1}")) | |
| } | |
| end | |
| end # Game_Temp | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: Sprite_Boss_bar --( | |
| # )---------------------------------------------------------------------=======( | |
| class Sprite_Boss_bar | |
| # )--------------------------------------------------------------------------( | |
| # )-- Method: initialize --( | |
| # )--------------------------------------------------------------------------( | |
| def initialize | |
| @boss = $game_troop.members.find { |e| e.boss } | |
| return unless @boss | |
| @current_bar = @boss.boss_bars | |
| @confusing_bar = -1 | |
| @per_bar = 1.0 / @current_bar | |
| @current_rate = @boss.hp_rate | |
| @bhpb_frame = Sprite.new(@viewport2) | |
| @bhpb_frame.bitmap = $game_temp.bhp_frame | |
| @bhpb_frame.x = Graphics.width/2 - @bhpb_frame.bitmap.width/2 | |
| @bhpb_frame.y = BHP::BAR_Y | |
| @bhpb_frame.z = @current_bar + 1 | |
| @bhpb_bcg = Sprite.new(@viewport2) | |
| @bhpb_bcg.bitmap = $game_temp.bhp_background | |
| @bhpb_bcg.x = Graphics.width/2 - @bhpb_bcg.bitmap.width/2 | |
| @bhpb_bcg.y = @bhpb_frame.y | |
| @bhpb_bcg.z = 0 | |
| @bhpb_bars = [] | |
| @current_bar.times do |bar| | |
| tmp = Sprite.new(@viewport2) | |
| tmp.bitmap = $game_temp.bhp_fill[(@current_bar-bar)%5] | |
| tmp.x = Graphics.width/2 - tmp.bitmap.width/2 | |
| tmp.y = @bhpb_frame.y | |
| tmp.z = @current_bar-bar | |
| @bhpb_bars.push(tmp) | |
| end | |
| @bhpb_x = Sprite.new(@viewport2) | |
| @bhpb_x.bitmap = Bitmap.new(@bhpb_frame.width, @bhpb_frame.height) | |
| @bhpb_x.x = Graphics.width/2 - @bhpb_x.bitmap.width/2 | |
| @bhpb_x.y = @bhpb_frame.y + BHP::TIMES_Y_OFFSET | |
| @bhpb_x.z = @current_bar + 2 | |
| txt = "x" + @current_bar.to_s | |
| @bhpb_x.bitmap.draw_text(BHP::TIMES_X_OFFSET, 0, @bhpb_x.width, @bhpb_x.height, txt) | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- Method: update --( | |
| # )--------------------------------------------------------------------------( | |
| def update | |
| return unless @bhpb_frame && @bhpb_bcg && @bhpb_bars | |
| @bhpb_frame.update | |
| @bhpb_bcg.update | |
| i = 0 | |
| @bhpb_bars.each { |b| | |
| max_rate = (@current_bar - i).to_f * @per_bar | |
| empty_rate = max_rate - @per_bar | |
| if @current_rate >= max_rate | |
| b.src_rect.width = b.bitmap.width | |
| b.wave_amp = 0 | |
| elsif @current_rate < empty_rate | |
| b.src_rect.width = 0.0 | |
| b.wave_amp = 0 | |
| else | |
| max_rate = (max_rate - empty_rate) - (@current_rate - empty_rate) | |
| max_rate = 1.0 - (max_rate * 100.0 / @per_bar) / 100.0 | |
| b.src_rect.width = ((b.bitmap.width - BHP::FILL_X_OFFSET_LEFT - BHP::FILL_X_OFFSET_RIGHT) * max_rate) + BHP::FILL_X_OFFSET_LEFT | |
| end | |
| b.update | |
| i += 1 | |
| } | |
| if @current_rate != @boss.hp_rate | |
| @current_rate -= 0.0045 if @current_rate > @boss.hp_rate | |
| @current_rate = 0.0 if @current_rate < 0.0 | |
| @current_rate += 0.0045 if @current_rate < @boss.hp_rate | |
| @current_rate = 1.0 if @current_rate > 1.0 | |
| end | |
| if @confusing_bar != (@current_rate / @per_bar).ceil | |
| @confusing_bar = (@current_rate / @per_bar).ceil | |
| txt = "x" + @confusing_bar.to_s | |
| @bhpb_x.bitmap.clear | |
| @bhpb_x.bitmap.draw_text(BHP::TIMES_X_OFFSET, 0, @bhpb_x.width, @bhpb_x.height, txt) | |
| end | |
| @bhpb_x.update | |
| if @current_rate <= 0.0 && BHP::HIDE_BAR_WHEN_BOSS_DIES | |
| @bhpb_frame.opacity = 0 | |
| @bhpb_bcg.opacity = 0 | |
| @bhpb_bars.each { |b| b.opacity = 0 } | |
| @bhpb_x.opacity = 0 | |
| elsif @current_rate > 0.0 && BHP::HIDE_BAR_WHEN_BOSS_DIES | |
| @bhpb_frame.opacity = 255 | |
| @bhpb_bcg.opacity = 255 | |
| @bhpb_bars.each { |b| b.opacity = 255 } | |
| @bhpb_x.opacity = 255 | |
| end | |
| return if (BHP::HIDE_BAR_WHEN_BOSS_DIES && @current_rate <= 0.0) || BHP::HIDE_SWITCH == 0 || ($game_switches[BHP::HIDE_SWITCH] && @bhpb_frame.opacity == 0) || (!$game_switches[BHP::HIDE_SWITCH] && @bhpb_frame.opacity == 255) | |
| if $game_switches[BHP::HIDE_SWITCH] && @bhpb_frame.opacity != 0 | |
| @bhpb_frame.opacity = 0 | |
| @bhpb_bcg.opacity = 0 | |
| @bhpb_bars.each { |b| b.opacity = 0 } | |
| @bhpb_x.opacity = 0 | |
| elsif !$game_switches[BHP::HIDE_SWITCH] && @bhpb_frame.opacity != 255 | |
| @bhpb_frame.opacity = 255 | |
| @bhpb_bcg.opacity = 255 | |
| @bhpb_bars.each { |b| b.opacity = 255 } | |
| @bhpb_x.opacity = 255 | |
| end | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- Method: dispose --( | |
| # )--------------------------------------------------------------------------( | |
| def dispose | |
| @bhpb_frame.dispose if @bhpb_frame | |
| @bhpb_bcg.dispose if @bhpb_bcg | |
| @bhpb_bars.each { |b| b.dispose if b } if @bhpb_bars | |
| @bhpb_x.dispose if @bhpb_x | |
| end | |
| end | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: Spriteset_Battle --( | |
| # )---------------------------------------------------------------------=======( | |
| class Spriteset_Battle | |
| # )--------------------------------------------------------------------------( | |
| # )-- Aliased methods --( | |
| # )--------------------------------------------------------------------------( | |
| alias :bosses_initialize :initialize | |
| alias :bosses_update :update | |
| alias :bosses_dispose :dispose | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: initialize --( | |
| # )--------------------------------------------------------------------------( | |
| def initialize | |
| create_boss_hp_bar | |
| bosses_initialize | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: update --( | |
| # )--------------------------------------------------------------------------( | |
| def update | |
| bosses_update | |
| update_boss_hp_bar | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: dispose --( | |
| # )--------------------------------------------------------------------------( | |
| def dispose | |
| dispose_boss_hp_bar | |
| bosses_dispose | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: create_boss_hp_bar --( | |
| # )--------------------------------------------------------------------------( | |
| def create_boss_hp_bar | |
| @boss_hp_bar = Sprite_Boss_bar.new | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: update_boss_hp_bar --( | |
| # )--------------------------------------------------------------------------( | |
| def update_boss_hp_bar | |
| return unless @boss_hp_bar | |
| @boss_hp_bar.update | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: dispose_boss_hp_bar --( | |
| # )--------------------------------------------------------------------------( | |
| def dispose_boss_hp_bar | |
| return unless @boss_hp_bar | |
| @boss_hp_bar.dispose | |
| end | |
| end | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: RPG::Enemy --( | |
| # )---------------------------------------------------------------------=======( | |
| class RPG::Enemy < RPG::BaseItem | |
| # )--------------------------------------------------------------------------( | |
| # )-- Public Instance Variables --( | |
| # )--------------------------------------------------------------------------( | |
| attr_accessor :boss | |
| attr_accessor :boss_bars | |
| # )--------------------------------------------------------------------------( | |
| # )-- Method: parse_bosses --( | |
| # )--------------------------------------------------------------------------( | |
| def parse_bosses | |
| @boss_bars = note =~ /<boss:[ ]*(\d+)>/i ? $1.to_i : nil | |
| @boss = @boss_bars ? true : false | |
| end | |
| end | |
| # )=======---------------------------------------------------------------------( | |
| # )-- Class: Game_Enemy --( | |
| # )---------------------------------------------------------------------=======( | |
| module DataManager | |
| class << self | |
| # )--------------------------------------------------------------------------( | |
| # )-- Aliased methods --( | |
| # )--------------------------------------------------------------------------( | |
| alias :bosses_game_objects :create_game_objects | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- Alias: create_game_objects --( | |
| # )--------------------------------------------------------------------------( | |
| def self.create_game_objects | |
| bosses_game_objects | |
| parse_bosses | |
| end | |
| # )--------------------------------------------------------------------------( | |
| # )-- New Method: self.parse_bosses --( | |
| # )--------------------------------------------------------------------------( | |
| def self.parse_bosses | |
| enemies = $data_enemies | |
| for enemy in enemies | |
| next if enemy.nil? | |
| enemy.parse_bosses | |
| end | |
| end | |
| end |