king-exit/Scripts/Game_Enemy.rb
2024-08-31 14:17:23 -05:00

264 lines
10 KiB
Ruby
Raw Permalink 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_Enemy
#------------------------------------------------------------------------------
#  敵キャラを扱うクラスです。このクラスは Game_Troop クラス($game_troop
# 内部で使用されます。
#==============================================================================
class Game_Enemy < Game_Battler
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :index # 敵グループ内インデックス
attr_reader :enemy_id # 敵キャラ ID
attr_reader :original_name # 元の名前
attr_accessor :letter # 名前につける ABC の文字
attr_accessor :plural # 複数出現フラグ
attr_accessor :screen_x # バトル画面 X 座標
attr_accessor :screen_y # バトル画面 Y 座標
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(index, enemy_id)
super()
@index = index
@enemy_id = enemy_id
enemy = $data_enemies[@enemy_id]
@original_name = enemy.name
@letter = ""
@plural = false
@screen_x = 0
@screen_y = 0
@battler_name = enemy.battler_name
@battler_hue = enemy.battler_hue
@hp = mhp
@mp = mmp
end
#--------------------------------------------------------------------------
# ● 敵キャラか否かの判定
#--------------------------------------------------------------------------
def enemy?
return true
end
#--------------------------------------------------------------------------
# ● 味方ユニットを取得
#--------------------------------------------------------------------------
def friends_unit
$game_troop
end
#--------------------------------------------------------------------------
# ● 敵ユニットを取得
#--------------------------------------------------------------------------
def opponents_unit
$game_party
end
#--------------------------------------------------------------------------
# ● 敵キャラオブジェクト取得
#--------------------------------------------------------------------------
def enemy
$data_enemies[@enemy_id]
end
#--------------------------------------------------------------------------
# ● 特徴を保持する全オブジェクトの配列取得
#--------------------------------------------------------------------------
def feature_objects
super + [enemy]
end
#--------------------------------------------------------------------------
# ● 表示名の取得
#--------------------------------------------------------------------------
def name
@original_name + (@plural ? letter : "")
end
#--------------------------------------------------------------------------
# ● 通常能力値の基本値取得
#--------------------------------------------------------------------------
def param_base(param_id)
enemy.params[param_id]
end
#--------------------------------------------------------------------------
# ● 経験値の取得
#--------------------------------------------------------------------------
def exp
enemy.exp
end
#--------------------------------------------------------------------------
# ● お金の取得
#--------------------------------------------------------------------------
def gold
enemy.gold
end
#--------------------------------------------------------------------------
# ● ドロップアイテムの配列作成
#--------------------------------------------------------------------------
def make_drop_items
enemy.drop_items.inject([]) do |r, di|
if di.kind > 0 && rand * di.denominator < drop_item_rate
r.push(item_object(di.kind, di.data_id))
else
r
end
end
end
#--------------------------------------------------------------------------
# ● ドロップアイテム取得率の倍率を取得
#--------------------------------------------------------------------------
def drop_item_rate
$game_party.drop_item_double? ? 2 : 1
end
#--------------------------------------------------------------------------
# ● アイテムオブジェクトの取得
#--------------------------------------------------------------------------
def item_object(kind, data_id)
return $data_items [data_id] if kind == 1
return $data_weapons[data_id] if kind == 2
return $data_armors [data_id] if kind == 3
return nil
end
#--------------------------------------------------------------------------
# ● スプライトを使うか?
#--------------------------------------------------------------------------
def use_sprite?
return true
end
#--------------------------------------------------------------------------
# ● バトル画面 Z 座標の取得
#--------------------------------------------------------------------------
def screen_z
return 100
end
#--------------------------------------------------------------------------
# ● ダメージ効果の実行
#--------------------------------------------------------------------------
def perform_damage_effect
@sprite_effect_type = :blink
Sound.play_enemy_damage
end
#--------------------------------------------------------------------------
# ● コラプス効果の実行
#--------------------------------------------------------------------------
def perform_collapse_effect
case collapse_type
when 0
@sprite_effect_type = :collapse
Sound.play_enemy_collapse
when 1
@sprite_effect_type = :boss_collapse
Sound.play_boss_collapse1
when 2
@sprite_effect_type = :instant_collapse
end
end
#--------------------------------------------------------------------------
# ● 変身
#--------------------------------------------------------------------------
def transform(enemy_id)
@enemy_id = enemy_id
if enemy.name != @original_name
@original_name = enemy.name
@letter = ""
@plural = false
end
@battler_name = enemy.battler_name
@battler_hue = enemy.battler_hue
refresh
make_actions unless @actions.empty?
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定
# action : RPG::Enemy::Action
#--------------------------------------------------------------------------
def conditions_met?(action)
method_table = {
1 => :conditions_met_turns?,
2 => :conditions_met_hp?,
3 => :conditions_met_mp?,
4 => :conditions_met_state?,
5 => :conditions_met_party_level?,
6 => :conditions_met_switch?,
}
method_name = method_table[action.condition_type]
if method_name
send(method_name, action.condition_param1, action.condition_param2)
else
true
end
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[ターン数]
#--------------------------------------------------------------------------
def conditions_met_turns?(param1, param2)
n = $game_troop.turn_count
if param2 == 0
n == param1
else
n > 0 && n >= param1 && n % param2 == param1 % param2
end
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定HP
#--------------------------------------------------------------------------
def conditions_met_hp?(param1, param2)
hp_rate >= param1 && hp_rate <= param2
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定MP
#--------------------------------------------------------------------------
def conditions_met_mp?(param1, param2)
mp_rate >= param1 && mp_rate <= param2
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[ステート]
#--------------------------------------------------------------------------
def conditions_met_state?(param1, param2)
state?(param1)
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[パーティレベル]
#--------------------------------------------------------------------------
def conditions_met_party_level?(param1, param2)
$game_party.highest_level >= param1
end
#--------------------------------------------------------------------------
# ● 行動条件合致判定[スイッチ]
#--------------------------------------------------------------------------
def conditions_met_switch?(param1, param2)
$game_switches[param1]
end
#--------------------------------------------------------------------------
# ● 現在の状況で戦闘行動が有効か否かを判定
# action : RPG::Enemy::Action
#--------------------------------------------------------------------------
def action_valid?(action)
conditions_met?(action) && usable?($data_skills[action.skill_id])
end
#--------------------------------------------------------------------------
# ● 戦闘行動をランダムに選択
# action_list : RPG::Enemy::Action の配列
# rating_zero : ゼロとみなすレーティング値
#--------------------------------------------------------------------------
def select_enemy_action(action_list, rating_zero)
sum = action_list.inject(0) {|r, a| r += a.rating - rating_zero }
return nil if sum <= 0
value = rand(sum)
action_list.each do |action|
return action if value < action.rating - rating_zero
value -= action.rating - rating_zero
end
end
#--------------------------------------------------------------------------
# ● 戦闘行動の作成
#--------------------------------------------------------------------------
def make_actions
super
return if @actions.empty?
action_list = enemy.actions.select {|a| action_valid?(a) }
return if action_list.empty?
rating_max = action_list.collect {|a| a.rating }.max
rating_zero = rating_max - 3
action_list.reject! {|a| a.rating <= rating_zero }
@actions.each do |action|
action.set_enemy_action(select_enemy_action(action_list, rating_zero))
end
end
end