#============================================================================== # ■エネミーの状態を表示 for RGSS3 Ver1.00-β # □作成者 kure #============================================================================== $kure_integrate_script = {} if $kure_integrate_script == nil $kure_integrate_script[:InfoBar] = 100 p "エネミーの情報表示" module KURE module InfoBar #初期設定(変更しない事)----------------------------------------------------- COLOR = [] ; BUFF_ICON = [] #表示色(IDによって割り当てが決まっています。) #バーの背景色(ID0) COLOR[0] = Color.new(32 ,32, 64, 255) #HPバーの色(ID1,ID2) COLOR[1] = Color.new(224 ,128, 64, 255) COLOR[2] = Color.new(240 ,192, 64, 255) #表示アイコン #パラメータIDに対する設定 #BUFF_ICON[パラメータID] = [[強化(1段階),強化(2段階)],[弱体(1段階),弱体(2段階)]] BUFF_ICON[0] = [[64,72], [80,88]] BUFF_ICON[1] = [[65,73], [81,89]] BUFF_ICON[2] = [[66,74], [82,90]] BUFF_ICON[3] = [[67,75], [83,91]] BUFF_ICON[4] = [[68,76], [84,92]] BUFF_ICON[5] = [[69,77], [85,93]] BUFF_ICON[6] = [[70,78], [86,94]] BUFF_ICON[7] = [[71,79], [87,95]] end end #============================================================================== # ■ RPG::State(追加定義) #============================================================================== class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # ☆残りターン非表示の定義(追加定義) #-------------------------------------------------------------------------- def view_turns? return true unless @note return false if @note.include?("<残りターン非表示>") return true end end #============================================================================== # ■ RPG::Enemy(追加定義) #============================================================================== class RPG::Enemy < RPG::BaseItem #-------------------------------------------------------------------------- # ☆ バーの表示幅の定義(追加定義) #-------------------------------------------------------------------------- def infobar_width @note.match(/<情報表示幅\s?(\d+)\s?>/) return 100 unless $1 return $1.to_i end #-------------------------------------------------------------------------- # ☆ バーの表示幅の定義(追加定義) #-------------------------------------------------------------------------- def infobar_visible? return false if @note.include?("<情報非表示>") return true end end #============================================================================== # ■ Game_BattlerBase #============================================================================== class Game_BattlerBase attr_reader :buffs attr_reader :state_turns attr_reader :buff_turns end #============================================================================== # ■ Game_Enemy #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ☆ バーの表示幅の定義(追加定義) #-------------------------------------------------------------------------- def infobar_width return enemy.infobar_width end #-------------------------------------------------------------------------- # ☆ バーの表示幅の定義(追加定義) #-------------------------------------------------------------------------- def infobar_visible? return enemy.infobar_visible? end end #============================================================================== # ■ Spriteset_Battle #============================================================================== class Spriteset_Battle #-------------------------------------------------------------------------- # ● 敵キャラスプライトの作成(エイリアス再定義) #-------------------------------------------------------------------------- alias k_integrate_before_create_enemies create_enemies def create_enemies k_integrate_before_create_enemies @enemy_info_bar = $game_troop.members.reverse.collect do |enemy| Sprite_Infobar.new(@viewport1, enemy) end end #-------------------------------------------------------------------------- # ● 敵キャラスプライトの更新(エイリアス再定義) #-------------------------------------------------------------------------- alias k_integrate_before_update_enemies update_enemies def update_enemies k_integrate_before_update_enemies @enemy_info_bar.each {|sprite| sprite.update } end #-------------------------------------------------------------------------- # ● 敵キャラスプライトの解放(エイリアス再定義) #-------------------------------------------------------------------------- alias k_integrate_before_dispose_enemies dispose_enemies def dispose_enemies k_integrate_before_dispose_enemies @enemy_info_bar.each {|sprite| sprite.dispose } end end #============================================================================== # ■ Sprite_Infobar #============================================================================== class Sprite_Infobar < Sprite_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :battler #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(viewport, battler = nil) super(viewport) @battler = battler @fill_w = nil @bitmap_data = Cache.battler(battler.battler_name, battler.battler_hue) @state = battler.states @buffs = battler.buffs.clone @icon_set = Cache.system("Iconset") end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if @battler && !@battler.hidden? @use_sprite = @battler.use_sprite? if @use_sprite update_bitmap update_origin update_position end else self.bitmap = nil end end #-------------------------------------------------------------------------- # ● 解放 #-------------------------------------------------------------------------- def dispose bitmap.dispose if bitmap super end #-------------------------------------------------------------------------- # ● 転送元ビットマップの更新 #-------------------------------------------------------------------------- def update_bitmap fill_w = @battler.infobar_width * (@battler.hp.to_f / @battler.mhp) state = battler.states buffs = battler.buffs state_turns = battler.state_turns buff_turns = battler.buff_turns if @fill_w != fill_w or @state != state or @buffs != buffs or @state_turns != state_turns or @buff_turns != buff_turns @fill_w = fill_w ; @state = state @buffs = buffs.clone ; @state_turns = state_turns.clone ; @buff_turns = buff_turns.clone @zoom_cheaker = true width = @battler.infobar_width + 4 new_bitmap = Bitmap.new(width, 35) count = 0 @state.each{|state| next if 24 * (count + 1) > new_bitmap.width rect = Rect.new(state.icon_index % 16 * 24, state.icon_index / 16 * 24, 24, 24) new_bitmap.blt(24 * count, 0, @icon_set, rect, 255) if state.auto_removal_timing != 0 && state.view_turns? new_bitmap.draw_text((24 * count) + 12, 6, 10, 18, @state_turns[state.id] ,2) end count += 1 } @buffs.each_with_index{|buff, index| next if buff == 0 case buff when 1 ; icon_id = KURE::InfoBar::BUFF_ICON[index][0][0] when 2 ; icon_id = KURE::InfoBar::BUFF_ICON[index][0][1] when -1 ; icon_id = KURE::InfoBar::BUFF_ICON[index][1][0] when -2 ; icon_id = KURE::InfoBar::BUFF_ICON[index][1][1] end rect = Rect.new(icon_id % 16 * 24, icon_id / 16 * 24, 24, 24) new_bitmap.blt(24 * count, 0, @icon_set, rect, 255) new_bitmap.draw_text((24 * count) + 12, 6, 10, 18, @buff_turns[index] ,2) count += 1 } new_bitmap.fill_rect(0, 25, width, 10, color(0)) new_bitmap.gradient_fill_rect(2, 27, fill_w, 6, color(1), color(2)) self.bitmap = new_bitmap init_visibility self.opacity = 0 unless @battler.infobar_visible? end end #-------------------------------------------------------------------------- # ● 可視状態の初期化 #-------------------------------------------------------------------------- def init_visibility @battler_visible = @battler.alive? self.opacity = 255 if @battler_visible self.opacity = 0 unless @battler_visible end #-------------------------------------------------------------------------- # ● 文字色取得 #-------------------------------------------------------------------------- def color(num) return KURE::InfoBar::COLOR[num] end #-------------------------------------------------------------------------- # ● 原点の更新 #-------------------------------------------------------------------------- def update_origin if bitmap self.ox = bitmap.width / 2 self.oy = bitmap.height end end #-------------------------------------------------------------------------- # ● 位置の更新 #-------------------------------------------------------------------------- def update_position self.x = @battler.screen_x self.y = @battler.screen_y - @bitmap_data.height - 5 self.z = @battler.screen_z + 10 end end