#---------------------------------------------------------------------------- # ステート詳細化 Plus By 貪藻矢射妥← # ちょっとクセがあります・・・多分。 #---------------------------------------------------------------------------- # 原作: ▼▲▼ XRXS18. ステート防御/有効度詳細化 ver.2 ▼▲▼ # 原作者: 森穂様、XRXS.様 # HP: 小さな本屋 # アドレス: http://xrxs.at-ninja.jp/ # # 改造内容: # ・防具にステート%防御を設定していない場合の処理を追加 # ・ステート変化の処理で防具にステート防御が設定されている場合、本処理が # 走らないバグを修正 #============================================================================ # 更新っぽいもの # 2011:07:01 # ・ステートバリア実装 $OuterFlgs = {} if $OuterFlgs == nil $OuterFlgs["State_Extend"] = true #============================================================================== # カスタマイズポイント (最大と最小) #============================================================================== module XRXS18 STATE_RATE_MAX = 100 STATE_RATE_MIN = 0 # 有効なステートとして使うステート一覧。 USE_STATE = [1..18] DEFAULT_RATE = 0.8 # ステートバリア設定 # [[バリア用ステートID, [ガードするステートID]], ... ] STATE_GUARD_STATE = [[261, [ 2, 3, 6, 7, 8, 18]], [262, [ 2, 3, 6, 7, 8, 18, 4, 9, 15, 16, 11, 12]], [263, [ 2, 3, 6, 7, 8, 18, 4, 9, 15, 16, 11, 12, 5, 10, 13, 14, 1, 17]]] end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ # アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● ステート防御判定 # state_id : ステート ID #-------------------------------------------------------------------------- def state_guard?(state_id) return state_percent(state_id) end end #============================================================================== # ■ Game_Enemy #------------------------------------------------------------------------------ # エネミーを扱うクラスです。このクラスは Game_Troop クラス ($game_troop) の # 内部で使用されます。 #============================================================================== class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # ● ステート防御判定 # state_id : ステート ID #-------------------------------------------------------------------------- def state_guard?(state_id) return 100 end end #============================================================================== # ■ Game_Battler #============================================================================== class Game_Battler include XRXS18 #-------------------------------------------------------------------------- # ○ ステート有効度の取得 #-------------------------------------------------------------------------- def state_percent(state_id) effect_percent = [0,100,80,60,40,20,0][self.state_ranks[state_id]] state_name = $data_states[state_id].name # ステートセットを取得 plus_state_set = [] minus_state_set = [] for k in self.states plus_state_set += $data_states[k].plus_state_set minus_state_set += $data_states[k].minus_state_set end if self.is_a?(Game_Actor) weapon_list = [@weapon_id] armor_list = [@armor1_id, @armor2_id, @armor3_id, @armor4_id, @armor5_id, @armor6_id, @armor7_id] # もし盾に武器を装備していたら除外 if @armor1_buki armor_list.delete_at(0) weapon_list.push(@armor1_id) end for id in weapon_list#self.weapon_ids if id >= 1 plus_state_set += $data_weapons[id].plus_state_set minus_state_set += $data_weapons[id].minus_state_set end end for id in armor_list#self.armor_ids if id >= 1 minus_state_set += $data_armors[id].guard_state_set end end # エネミーの場合 else weapon_list = [] armor_list = [] end # 計算 # 防具にステート%防御が設定されている場合は確率減少 for id in plus_state_set if $data_states[id].name =~ /^#{state_name}([0-9]+)(%|%)/ effect_percent += $1.to_i end end for id in minus_state_set if $data_states[id].name =~ /^#{state_name}([0-9]+)(%|%)/ effect_percent -= $1.to_i end end # 防具にステート%防御が設定されていない場合 if effect_percent == [0,100,80,60,40,20,0][self.state_ranks[state_id]] for k in armor_list#self.armor_ids armor = $data_armors[k] next if armor == nil for j in armor.guard_state_set if $data_states[j] != nil #if j <= 18 for tmp_value in USE_STATE if tmp_value.is_a?(Range) && tmp_value === j || tmp_value == j if $data_states[j].name.clone == state_name.clone effect_percent *= DEFAULT_RATE effect_percent = Integer(effect_percent) end end end end end end end # ステートバリアの場合 for s_g_s in STATE_GUARD_STATE st_br_id = s_g_s[0] guard_id = s_g_s[1] if self.states.include?(st_br_id) if guard_id.include?(state_id) effect_percent = 0 end end end return [[effect_percent, STATE_RATE_MIN].max, STATE_RATE_MAX].min end #-------------------------------------------------------------------------- # ● ステート変化 (+) の適用 [再定義] #-------------------------------------------------------------------------- def states_plus(plus_state_set) # 有効フラグをクリア effective = false # ループ (付加するステート) for i in plus_state_set # このステートが防御されていない場合 unless self.state_guard?(i) == 0 # このステートがフルでなければ有効フラグをセット effective |= self.state_full?(i) == false # ステートが [抵抗しない] の場合 if $data_states[i].nonresistance # ステート変化フラグをセット @state_changed = true # ステートを付加 add_state(i) # このステートがフルではない場合 elsif self.state_full?(i) == false # ステート有効度を確率に変換し、乱数と比較 if rand(100) < self.state_percent(i) # ステート変化フラグをセット @state_changed = true # ステートを付加 add_state(i) end end end end # メソッド終了 return effective end end |