#============================================================================== # ■ Game_Troop #------------------------------------------------------------------------------ #  敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も # 行います。このクラスのインスタンスは $game_troop で参照されます。 #============================================================================== class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # ● 敵キャラ名の後ろにつける文字の表 #-------------------------------------------------------------------------- LETTER_TABLE_HALF = [' A',' B',' C',' D',' E',' F',' G',' H',' I',' J', ' K',' L',' M',' N',' O',' P',' Q',' R',' S',' T', ' U',' V',' W',' X',' Y',' Z'] LETTER_TABLE_FULL = ['A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z'] #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :screen # バトル画面の状態 attr_reader :interpreter # バトルイベント用インタプリタ attr_reader :event_flags # バトルイベント実行済みフラグ attr_reader :turn_count # ターン数 attr_reader :name_counts # 敵キャラ名の出現数記録ハッシュ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super @screen = Game_Screen.new @interpreter = Game_Interpreter.new @event_flags = {} clear end #-------------------------------------------------------------------------- # ● メンバーの取得 #-------------------------------------------------------------------------- def members @enemies end #-------------------------------------------------------------------------- # ● クリア #-------------------------------------------------------------------------- def clear @screen.clear @interpreter.clear @event_flags.clear @enemies = [] @turn_count = 0 @names_count = {} end #-------------------------------------------------------------------------- # ● 敵グループオブジェクト取得 #-------------------------------------------------------------------------- def troop $data_troops[@troop_id] end #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- def setup(troop_id) clear @troop_id = troop_id @enemies = [] troop.members.each do |member| next unless $data_enemies[member.enemy_id] enemy = Game_Enemy.new(@enemies.size, member.enemy_id) enemy.hide if member.hidden enemy.screen_x = member.x enemy.screen_y = member.y + 30 #エネミーのY座標を下に @enemies.push(enemy) end init_screen_tone make_unique_names end #-------------------------------------------------------------------------- # ● 画面の色調を初期化 #-------------------------------------------------------------------------- def init_screen_tone @screen.start_tone_change($game_map.screen.tone, 0) if $game_map end #-------------------------------------------------------------------------- # ● 同名の敵キャラに ABC などの文字を付加 #-------------------------------------------------------------------------- def make_unique_names members.each do |enemy| next unless enemy.alive? next unless enemy.letter.empty? n = @names_count[enemy.original_name] || 0 enemy.letter = letter_table[n % letter_table.size] @names_count[enemy.original_name] = n + 1 end members.each do |enemy| n = @names_count[enemy.original_name] || 0 enemy.plural = true if n >= 2 end end #-------------------------------------------------------------------------- # ● 敵キャラ名の後ろにつける文字の表を取得 #-------------------------------------------------------------------------- def letter_table $game_system.japanese? ? LETTER_TABLE_FULL : LETTER_TABLE_HALF end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update @screen.update end #-------------------------------------------------------------------------- # ● 敵キャラ名の配列取得 # 戦闘開始時の表示用。重複は除去する。 #-------------------------------------------------------------------------- def enemy_names names = [] members.each do |enemy| next unless enemy.alive? next if names.include?(enemy.original_name) names.push(enemy.original_name) end names end #-------------------------------------------------------------------------- # ● バトルイベント(ページ)の条件合致判定 #-------------------------------------------------------------------------- def conditions_met?(page) c = page.condition if !c.turn_ending && !c.turn_valid && !c.enemy_valid && !c.actor_valid && !c.switch_valid return false # 条件未設定…実行しない end if @event_flags[page] return false # 実行済み end if c.turn_ending # ターン終了時 return false unless BattleManager.turn_end? end if c.turn_valid # ターン数 n = @turn_count a = c.turn_a b = c.turn_b return false if (b == 0 && n != a) return false if (b > 0 && (n < 1 || n < a || n % b != a % b)) end if c.enemy_valid # 敵キャラ enemy = $game_troop.members[c.enemy_index] return false if enemy == nil return false if enemy.hp_rate * 100 > c.enemy_hp end if c.actor_valid # アクター actor = $game_actors[c.actor_id] return false if actor == nil return false if actor.hp_rate * 100 > c.actor_hp end if c.switch_valid # スイッチ return false if !$game_switches[c.switch_id] end return true # 条件合致 end #-------------------------------------------------------------------------- # ● バトルイベントのセットアップ #-------------------------------------------------------------------------- def setup_battle_event return if @interpreter.running? return if @interpreter.setup_reserved_common_event troop.pages.each do |page| next unless conditions_met?(page) @interpreter.setup(page.list) @event_flags[page] = true if page.span <= 1 return end end #-------------------------------------------------------------------------- # ● ターンの増加 #-------------------------------------------------------------------------- def increase_turn troop.pages.each {|page| @event_flags[page] = false if page.span == 1 } @turn_count += 1 end #-------------------------------------------------------------------------- # ● 経験値の合計計算 #-------------------------------------------------------------------------- def exp_total dead_members.inject(0) {|r, enemy| r += enemy.exp } end #-------------------------------------------------------------------------- # ● お金の合計計算 #-------------------------------------------------------------------------- def gold_total dead_members.inject(0) {|r, enemy| r += enemy.gold } * gold_rate end #-------------------------------------------------------------------------- # ● お金の倍率を取得 #-------------------------------------------------------------------------- def gold_rate $game_party.gold_double? ? 2 : 1 end #-------------------------------------------------------------------------- # ● ドロップアイテムの配列作成 #-------------------------------------------------------------------------- def make_drop_items dead_members.inject([]) {|r, enemy| r += enemy.make_drop_items } end end