bad-end-collector/Scripts/Game_Troop.rb
2024-05-18 13:05:37 -05:00

205 lines
8.4 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# ■ 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 = ['','','','','','','','','','',
'','','','','','','','','','',
'','','','','','']
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
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
@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