# ▼▲▼ バトルパーツ25. バトルステータス・ラピッドデザイン ▼▲▼ # by 桜雅 在土 # #============================================================================== # □ カスタマイズポイント #============================================================================== module XRXS65 # # 表示位置セッティング # X_OFFSET = [508, 8] # 横位置(配列) Y_OFFSET = 348 # 縦位置 ALIGN = 1 #「位置揃え」(CPメーターの位置。0:左寄せ 1:中央 2:右寄せ) MAX = [3, 5] # 確保するサイズ[単位:〜人分] end module XRXS73 # # 「位置揃え」(0:左寄せ 1:中央 2:右寄せ) # ALIGN = 1 # # 確保するサイズ[単位:〜人分] # MAX = [3, 5] # # 仮想桁数 # ESTIMATE_DIGIT = 4 # # ステートID=>アイコン名 関連付けハッシュ (Icons) # STATE_ICON = {3=>"045-Skill02",5=>"skill_027",7=>"skill_026",8=>"skill_025"} # # メータースキン (Windowskins) # NUM_HP = "NumberL" NUM_SP = "NumberS" HP_BAR = "HPBar" AS_BACK = "AS_Back" ES_BACK = "ES_Back" # # 割合%=>段数 関連付けハッシュ # NUM_HASH = {100=>1, 40=>2, 12.5=>3} end #============================================================================== # --- ラピッドナンバー スプライトシステム --- #============================================================================== class RapidNumber def initialize(x, y, skin) @skin = skin @x = x @y = y @w = skin.rect.width / 10 @h = skin.rect.height / XRXS73::NUM_HASH.size @digit = XRXS73::ESTIMATE_DIGIT @sprites = [] @number_bitmaps = [] for i in 0...@digit @sprites.push(Sprite.new) end # ビットマップ作成 set_bit # reset end def set(number, max) numbers = [] for i in 0...@digit numbers.push(number / (10 ** (@digit - i - 1)) % 10) end display = false sort = XRXS73::NUM_HASH.keys.sort percent = (number * 100 / max) for j in sort if percent <= j c = XRXS73::NUM_HASH[j] break end end for i in 0...@digit n = numbers[i] display |= (n != 0 or i == (@digit - 1)) @sprites[i].bitmap = display ? @number_bitmaps[c - 1][n] : nil end end def reset n = @x for sprite in @sprites.reverse sprite.x = n sprite.y = @y sprite.z = 601 n -= @w end end def set_bit # ビットマップ生成 @number_bitmaps = [] rect = Rect.new(0, 0, @w, @h) for j in 0...XRXS73::NUM_HASH.size @number_bitmaps[j] = [] for i in 0..9 rect.x = i * @w rect.y = j * @h bitmap = Bitmap.new(@w, @h) bitmap.blt(0, 0, @skin, rect) @number_bitmaps[j][i] = bitmap end end end def skin=(skin) @skin = skin end def x=(n) @x = n reset end def y=(n) @y = n reset end def dispose @sprites.each{|sprite| sprite.dispose } end end class ActorStatus_SpriteSet def initialize(actor, side) @side = side @now_hp = actor.hp @now_sp = actor.sp if actor.is_a?(Game_Actor) @num_skin_l = RPG::Cache.windowskin(XRXS73::NUM_HP) @num_skin_s = RPG::Cache.windowskin(XRXS73::NUM_SP) else @num_skin_l = RPG::Cache.windowskin("") @num_skin_s = RPG::Cache.windowskin("") end @sprite_hp = RapidNumber.new(0, 0, @num_skin_l) @sprite_sp = RapidNumber.new(0, 0, @num_skin_s) @bar_skin = RPG::Cache.windowskin(XRXS73::HP_BAR) @w = @bar_skin.rect.width @h = @bar_skin.rect.height / (XRXS73::NUM_HASH.size + 1) hpbar = Sprite.new hpbar.z = 602 hpbar.bitmap = @bar_skin hpbar.src_rect = Rect.new(0, @h, @w, @h) @sprite_hpbar = hpbar @baspace = Sprite.new @baspace.z = 599 @baspace.bitmap = Bitmap.new(256, 128) if @side == "Actor" @states = Sprite.new @states.z = 600 @states.bitmap = Bitmap.new(128, 128) else @textline = Sprite.new @textline.z = 600 @textline.bitmap = Bitmap.new(128, 40) end @sprites = [@sprite_hp, @sprite_sp, @sprite_hpbar, @baspace] if @side == "Actor" @sprites.push(@states) else @sprites.push(@textline) end set_actor(actor) end def actor return @actor end def set_actor(actor) @actor = actor @now_hp = @actor.hp @now_sp = @actor.sp sort = XRXS73::NUM_HASH.keys.sort percent = (@now_hp * 100 / @actor.maxhp) for j in sort if percent <= j c = XRXS73::NUM_HASH[j] break end end refresh @sprite_sp.set(@now_sp, @actor.maxsp) @sprite_hp.set(@now_hp, @actor.maxhp) @sprite_hpbar.src_rect.width = @w * @now_hp / @actor.maxhp @sprite_hpbar.src_rect.y = @h * c end def update # HP/SPの変化を判定 sort = XRXS73::NUM_HASH.keys.sort percent = (@now_hp * 100 / @actor.maxhp) for j in sort if percent <= j c = XRXS73::NUM_HASH[j] break end end if @now_hp != @desthp sign = (@now_hp > @desthp ? -1 : 1) @now_hp = (@now_hp + sign * [(@desthp - @now_hp).abs / 8, 1].max) @sprite_hp.set(@now_hp, @actor.maxhp) @sprite_hpbar.src_rect.width = @w * @now_hp / @actor.maxhp @sprite_hpbar.src_rect.y = @h * c end if @now_sp != @destsp sign = (@now_sp > @destsp ? -1 : 1) @now_sp = @now_sp + sign * [(@destsp - @now_sp).abs / 8, 1].max @sprite_sp.set(@now_sp, @actor.maxsp) end end def refresh @desthp = @actor.hp @destsp = @actor.sp if actor.is_a?(Game_Actor) back = RPG::Cache.windowskin(XRXS73::AS_BACK) elsif actor.is_a?(Game_Enemy) back = RPG::Cache.windowskin(XRXS73::ES_BACK) end @baspace.bitmap.clear @baspace.bitmap.blt(0, 0, back, back.rect) @baspace.bitmap.blt(0, 96, @bar_skin, Rect.new(0,0,@w,@h)) if actor.is_a?(Game_Actor) state_icon_names = [] for state_id in @actor.states.sort icon_name = XRXS73::STATE_ICON[state_id] if icon_name != nil state_icon_names.push(icon_name) end end if not state_icon_names.empty? i = 0 for icon_name in state_icon_names icon = RPG::Cache.icon(icon_name) @states.bitmap.blt(2 + (i % 4) * 28, 36 + (i / 4) * 28, icon, icon.rect) i += 1 end end else @textline.bitmap.clear text = RPG::Cache.text(96, 20, actor.name, @textline.bitmap.font.color, 16) @textline.bitmap.blt(20, 8, text, text.rect) end end def x=(n) if @side == "Actor" n += 292 @states.x = n - 128 else @textline.x = n end @baspace.x = n @sprite_hp.x = n + 90 @sprite_sp.x = n + 96 @sprite_hpbar.x = n end def y=(n) if @side == "Actor" @baspace.y = n @states.y = n + 40 else n -= 24 @baspace.y = n + 68 end @sprite_hp.y = n + 77 @sprite_sp.y = n + 102 @sprite_hpbar.y = n + 96 if @side == "Enemy" @textline.y = n + 68 end end def dispose @sprites.each{|sprite| sprite.dispose } end end #============================================================================== # ■ Window_BattleStatus #============================================================================== class Window_BattleStatus def initialize @states = [Window_StatusList.new(210, 430, "Actor"), Window_StatusList.new(0, 210, "Enemy")] end def level_up(actor_index) @states[0].level_up_flags[actor_index] = true end def dispose @states.each{|s| s.dispose} end def refresh @states.each{|s| s.refresh} end def update @states.each{|s| s.update} end end #============================================================================== # ■ Window_StatusList #============================================================================== class Window_StatusList < Window_Base #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :level_up_flags #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x = 0, width = 0, side = "") @battler = nil if side != "" @side = side super(x, 240, width, 120) self.contents = Bitmap.new(width - 32, self.height - 32) if side == "Enemy" @battler = $game_troop.enemies else @battler = $game_party.actors end self.opacity = 0 @status_sprites = [] @level_up_flags = [] for battler in @battler if battler.is_a?(Game_Actor) @level_up_flags.push(false) end end refresh end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh if @battler != nil # 最大確保人数の取得 if @side == "Actor" max = XRXS73::MAX[0] elsif @side == "Enemy" max = XRXS73::MAX[1] end @item_max = @battler.size # self.contents.clear for i in 0...@battler.size battler = @battler[i] if @side == "Actor" space = 60 elsif @side == "Enemy" space = 40 end height = [self.height / max, space].min case XRXS73::ALIGN when 0 actor_y = i * space + 4 when 1 actor_y = (space * ((max - @battler.size) / 2.0 + i)).floor when 2 actor_y = (i + max - @battler.size) * space + 4 end if @status_sprites[i] == nil @status_sprites[i] = ActorStatus_SpriteSet.new(battler, @side) elsif @status_sprites[i].actor != battler @status_sprites[i].set_actor(battler) end @status_sprites[i].x = self.x + 8 @status_sprites[i].y = self.y - 8 + actor_y @status_sprites[i].refresh end if @battler.size < @status_sprites.size pos = $game_party.actors.size len = @status_sprites.size - pos + 1 disuse_sprites = @status_sprites.slice!(pos, len) disuse_sprites.each{|sprite| sprite.dispose } end end end #-------------------------------------------------------------------------- # ○ フレーム更新 #-------------------------------------------------------------------------- def update super @status_sprites.each{|spriteset| spriteset.update } return end def dispose @status_sprites.each{|spriteset| spriteset.dispose } super end end #============================================================================== # --- CP メーターをまとめて管理するクラス、表示関係はすべてココ --- #============================================================================== class CP_Meters # 同時投入判定 if XRXS65.const_defined?("SKIN") #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # メーター群の生成 @meters = [] for i in 0...($game_party.actors.size + $game_troop.enemies.size) make_meter(i) end refresh end #-------------------------------------------------------------------------- # ○ リフレッシュ #-------------------------------------------------------------------------- def refresh # 戦闘メンバー数の変更を判別 for i in @meters.size...($game_party.actors.size + $game_troop.enemies.size) make_meter(i) end for i in ($game_party.actors.size + $game_troop.enemies.size)...@meters.size @meters[i].dispose @meters[i] = nil end @meters.compact! # 表示更新 for i in 0...($game_party.actors.size + $game_troop.enemies.size) if i < $game_party.actors.size actor = $game_party.actors[i] @meters[i].line = actor.cp_linetype @meters[i].amount = actor.cp_lineamount else enemy = $game_troop.enemies[i - $game_party.actors.size] @meters[i].line = enemy.cp_linetype @meters[i].amount = enemy.cp_lineamount end end end #-------------------------------------------------------------------------- # ○ メーターひとつの生成 #-------------------------------------------------------------------------- def make_meter(i) # スキンの取得 skin = RPG::Cache.windowskin(XRXS65::SKIN) # if i < $game_party.actors.size space = 60 case XRXS65::ALIGN when 0 actor_y = i * space + 4 when 1 actor_y = (space * ((XRXS65::MAX[0] - $game_party.actors.size)/2.0 + i)).floor when 2 actor_y = (i + XRXS65::MAX[0] - $game_party.actors.size) * space + 4 end else space = 40 j = (i - $game_party.actors.size - 1) case XRXS65::ALIGN when 0 actor_y = j * space + 6 when 1 actor_y = (space * ((XRXS65::MAX[1] - $game_troop.enemies.size)/2.0 + j)).floor + 2 when 2 actor_y = (j + XRXS65::MAX[1] - $game_troop.enemies.size) * space + 6 end end meter = MeterSprite.new(skin, XRXS65::LINE_HEIGHT) if i < $game_party.actors.size meter.x = XRXS65::X_OFFSET[0] else meter.x = XRXS65::X_OFFSET[1] end meter.y = XRXS65::Y_OFFSET + actor_y @meters[i] = meter end end end