#============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ #  エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler attr_accessor :overkill # オーバーキル判定 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias :base_initialize :initialize def initialize(troop_id, member_index) base_initialize(troop_id, member_index) @overkill = false end #-------------------------------------------------------------------------- # ● オーバーキル判定用 #-------------------------------------------------------------------------- def over #case self.id #when # #else return [10, 1] #end end end #============================================================================== # ■ Sprite_Battler #------------------------------------------------------------------------------ #  バトラー表示用のスプライトです。Game_Battler クラスのインスタンスを監視し、 # スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super # バトラーが nil の場合 if @battler == nil self.bitmap = nil loop_animation(nil) return end # ファイル名か色相が現在のものと異なる場合 if @battler.battler_name != @battler_name or @battler.battler_hue != @battler_hue # ビットマップを取得、設定 @battler_name = @battler.battler_name @battler_hue = @battler.battler_hue self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue) @width = bitmap.width @height = bitmap.height self.ox = @width / 2 self.oy = @height # 戦闘不能または隠れ状態なら不透明度を 0 にする if @battler.dead? or @battler.hidden self.opacity = 0 end end # アニメーション ID が現在のものと異なる場合 if @battler.damage == nil and @battler.state_animation_id != @state_animation_id @state_animation_id = @battler.state_animation_id loop_animation($data_animations[@state_animation_id]) end # 表示されるべきアクターの場合 if @battler.is_a?(Game_Actor) and @battler_visible # メインフェーズでないときは不透明度をやや下げる if $game_temp.battle_main_phase self.opacity += 3 if self.opacity < 255 else self.opacity -= 3 if self.opacity > 207 end end # 明滅 if @battler.blink blink_on else blink_off end # 不可視の場合 unless @battler_visible # 出現 if not @battler.hidden and not @battler.dead? and (@battler.damage == nil or @battler.damage_pop) appear @battler_visible = true end end # 可視の場合 if @battler_visible # 逃走 if @battler.hidden $game_system.se_play($data_system.escape_se) escape @battler_visible = false end # 白フラッシュ if @battler.white_flash whiten @battler.white_flash = false end # アニメーション if @battler.animation_id != 0 animation = $data_animations[@battler.animation_id] animation(animation, @battler.animation_hit) @battler.animation_id = 0 end # ダメージ if @battler.damage_pop if @battler.is_a?(Game_Enemy) damage(@battler.damage, @battler.critical, @battler.overkill) else damage(@battler.damage, @battler.critical, false) end @battler.damage = nil @battler.critical = false @battler.damage_pop = false end # コラプス if @battler.damage == nil and @battler.dead? if @battler.is_a?(Game_Enemy) $game_system.se_play($data_system.enemy_collapse_se) else $game_system.se_play($data_system.actor_collapse_se) end collapse @battler_visible = false end end # スプライトの座標を設定 self.x = @battler.screen_x self.y = @battler.screen_y self.z = @battler.screen_z end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle #-------------------------------------------------------------------------- # ● アフターバトルフェーズ開始 #-------------------------------------------------------------------------- def start_phase5 # フェーズ 5 に移行 @phase = 5 # バトル終了 ME を演奏 $game_system.me_play($game_system.battle_end_me) # バトル開始前の BGM に戻す $game_system.bgm_play($game_temp.map_bgm) # EXP、ゴールド、トレジャーを初期化 exp = 0 gold = 0 treasures = [] # ループ for enemy in $game_troop.enemies # エネミーが隠れ状態でない場合 unless enemy.hidden if enemy.overkill enemy = $data_enemies[enemy.over[1]] end # 獲得 EXP、ゴールドを追加 exp += enemy.exp gold += enemy.gold # トレジャー出現判定 if rand(100) < enemy.treasure_prob if enemy.item_id > 0 treasures.push($data_items[enemy.item_id]) end if enemy.weapon_id > 0 treasures.push($data_weapons[enemy.weapon_id]) end if enemy.armor_id > 0 treasures.push($data_armors[enemy.armor_id]) end end end end # トレジャーの数を 6 個までに限定 treasures = treasures[0..5] # EXP 獲得 for i in 0...$game_party.actors.size actor = $game_party.actors[i] if actor.cant_get_exp? == false last_level = actor.level actor.exp += exp if actor.level > last_level @status_window.level_up(i) end end end # ゴールド獲得 $game_party.gain_gold(gold) # トレジャー獲得 for item in treasures case item when RPG::Item $game_party.gain_item(item.id, 1) when RPG::Weapon $game_party.gain_weapon(item.id, 1) when RPG::Armor $game_party.gain_armor(item.id, 1) end end # バトルリザルトウィンドウを作成 @result_window = Window_BattleResult.new(exp, gold, treasures) # ウェイトカウントを設定 @phase5_wait_count = 100 end #-------------------------------------------------------------------------- # ● フレーム更新 (メインフェーズ ステップ 5 : ダメージ表示) #-------------------------------------------------------------------------- def update_phase4_step5 # ヘルプウィンドウを隠す @help_window.visible = false # ステータスウィンドウをリフレッシュ @status_window.refresh # ダメージ表示 for target in @target_battlers if target.damage != nil target.damage_pop = true end if target.is_a?(Game_Enemy) if target.damage.is_a?(Numeric) percent = target.damage * 100 / target.maxhp if target.over[0] > 0 and target.over[0] < percent if target.hp <= 0 target.overkill = true end end end end end # ステップ 6 に移行 @phase4_step = 6 end end #============================================================================== # ■ RPG::Sprite #------------------------------------------------------------------------------ #  アニメーションの管理を行うクラスです。 #============================================================================== module RPG class Sprite < ::Sprite def damage(value, critical, overkill) dispose_damage if value.is_a?(Numeric) damage_string = value.abs.to_s else damage_string = value.to_s end bitmap = Bitmap.new(160, 64) bitmap.font.name = "Arial Black" bitmap.font.size = 32 bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, 32-1, 160, 36, damage_string, 1) bitmap.draw_text(+1, 32-1, 160, 36, damage_string, 1) bitmap.draw_text(-1, 32+1, 160, 36, damage_string, 1) bitmap.draw_text(+1, 32+1, 160, 36, damage_string, 1) if value.is_a?(Numeric) and value < 0 bitmap.font.color.set(176, 255, 144) else bitmap.font.color.set(255, 255, 255) end bitmap.draw_text(0, 32, 160, 36, damage_string, 1) if overkill bitmap.font.size = 20 if critical bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, -1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(+1, -1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(-1, +1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(+1, +1, 160, 20, "CRITICAL!", 1) bitmap.font.color.set(255, 255, 255) bitmap.draw_text(0, 0, 160, 20, "CRITICAL!", 1) end bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, 16-1, 160, 20, "OVER KILL", 1) bitmap.draw_text(+1, 16-1, 160, 20, "OVER KILL", 1) bitmap.draw_text(-1, 16+1, 160, 20, "OVER KILL", 1) bitmap.draw_text(+1, 16+1, 160, 20, "OVER KILL", 1) bitmap.font.color.set(255, 255, 255) bitmap.draw_text(0, 16, 160, 20, "OVER KILL", 1) elsif critical bitmap.font.size = 20 bitmap.font.color.set(0, 0, 0) bitmap.draw_text(-1, 16-1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(+1, 16-1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(-1, 16+1, 160, 20, "CRITICAL!", 1) bitmap.draw_text(+1, 16+1, 160, 20, "CRITICAL!", 1) bitmap.font.color.set(255, 255, 255) bitmap.draw_text(0, 16, 160, 20, "CRITICAL!", 1) end @_damage_sprite = ::Sprite.new(self.viewport) @_damage_sprite.bitmap = bitmap @_damage_sprite.ox = 80 @_damage_sprite.oy = 40 @_damage_sprite.x = self.x @_damage_sprite.y = self.y - self.oy / 2 @_damage_sprite.z = 3000 @_damage_duration = 40 end end end