# ▽▽▽ XRXSv22. 詳細設定、属性&ステートレベル ▽▽▽ # # publish 2010/ 3/18 # update  - 4/28 # #============================================================================== # カスタマイズポイント #============================================================================== module XRXSV22 # # 「属性有効度」「ステート有効度」ランクとレート #        A B C D E F ElementRates = [0, 200, 150, 100, 50, 0,-100] StateRates = [0, 60, 80, 100, 40, 20, 0] # # 属性有効度、最大と最低の制限 # ERMax = 200 ERMin = -100 # # 装備・ステート「半減する属性」による基本値 # ElementGuardRate = -50 # # 同じステートを与えた時の処理タイプ # 0 : 変化させず、継続メッセージを表示する (VX標準) # 1 : 継続ターン数を上書き(延長する場合のみ) # 2 : 継続ターン数を加算する # StateAddType = 2 # # ステート継続ターン数最大制限(通常, [相殺]) # StateTurnMax = 99 StateTurnMax2 = 6 # # \restriction_by_level での係数[単位:%] # RestrictionLevelBy = 10 # # 相殺時、ステートを消さずにターン数を削る # TurnCountOffset = true # # [逆効果と相殺]ステートのレベルをターン経過で減少させない # KeepOffsetStates = true # # ↑に加え、ステートレベルを保持するステートID配列 # KeepStates = [] # # [逆効果と相殺]のステートはステートガードレベルを無視する? # AddFullOffsetStates = true # # (ベーシック・セッティング連動) # 基本ステートガードレベル # \state_guard[]の記述がなくてもガードレベルを持つようになります。 # # (例 : 体力(元々の防御力)200 につき Lv+1 # 魔法防御力 50 につき Lv+1 ) # ParameterStateGuard = false StateGuardLevelbyVIT = 200 StateGuardLevelbyMND = 50 # # 魔法防御力によってステート有効度をダウンさせる? # (...と全有効度を0にする時の魔法防御力値) # StateRateDownByMND = false StateRateDownMNDMax = 1000 end #============================================================================== # ステートレベルによるレート倍化計算式 #============================================================================== class Game_Battler def get_rate_by_level(rate, state_level) if rate >= 101 n = 100 + (rate -100) * state_level else m = (((200.0 / [rate, 1].max).round - 2) * state_level) n = 100 * 2 / [m, 2].max end return n end alias xrxsv22_states states def states states = xrxsv22_states for i in 0...states.size state = states[i] if state.note.include?("\\rate_by_level") state_level = @state_turns[state.id] if state_level new_state = state.dup new_state.atk_rate = get_rate_by_level(state.atk_rate, state_level) new_state.def_rate = get_rate_by_level(state.def_rate, state_level) new_state.spi_rate = get_rate_by_level(state.spi_rate, state_level) new_state.agi_rate = get_rate_by_level(state.agi_rate, state_level) states[i] = new_state end end end return states end end #============================================================================== # [逆効果と相殺]ステートターン数保持 #============================================================================== class Game_Battler alias xrxsv22_remove_states_auto remove_states_auto def remove_states_auto for i in @state_turns.keys.clone state = $data_states[i] if @state_turns[i] and (XRXSV22::KeepStates.include?(state.id) or (state.offset_by_opposite and XRXSV22::KeepOffsetStates)) @state_turns[i] += 1 end end xrxsv22_remove_states_auto end end #============================================================================== # 属性修正値の取得 [再定義] #============================================================================== class Game_Battler def element_rate(element_id) rank = self.element_ranks[element_id] rate = XRXSV22::ElementRates[rank] for obj in self.armors.compact + self.states if obj.element_set.include?(element_id) if obj.note.scan(/\\element_rate\[([+-]*?[0-9]+?)\]/) rate += $1.to_i else rate += XRXSV22::ElementGuardRate end end end return rate end def armors return [] end end class Game_Actor < Game_Battler def element_rate(element_id) return super end def element_ranks return self.class.element_ranks end end class Game_Enemy < Game_Battler def element_rate(element_id) return super end def element_ranks return self.enemy.element_ranks end end #============================================================================== # 一時無効化ステート機能 #============================================================================== module XRXSV_DisableStates def states return super - self.disabled_states end def disabled_states @disabled_states = [] unless @disabled_states return @disabled_states end end class Game_Actor < Game_Battler include XRXSV_DisableStates end class Game_Enemy < Game_Battler include XRXSV_DisableStates end #============================================================================== # 行動制約系 *(再定義 - inputable?, movable?) #============================================================================== class Game_Battler def inputable? return (not @hidden and certain_restriction <= 1) end def movable? return (not @hidden and certain_restriction < 4) end def certain_restriction restriction_max = 0 for state in states next if state.note[/\\restriction_(.+?)/] if state.restriction >= restriction_max restriction_max = state.restriction end end return restriction_max end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● 戦闘行動の実行 #-------------------------------------------------------------------------- alias xrxsv22_execute_action execute_action def execute_action for state in @active_battler.states percent = nil if state.note[/\\restriction_percent\[([0-9]+?)\]/] percent = $1.to_i elsif state.note[/\\restriction_by_level/] percent = @active_battler.state_turn(state.id).to_i * XRXSV22::RestrictionLevelBy end if percent if rand(100) < percent case state.restriction when 2,3 @active_battler.action.prepare when 4,5 return end else @active_battler.disabled_states.push(state) end end end xrxsv22_execute_action end #-------------------------------------------------------------------------- # ● 戦闘行動の処理 #-------------------------------------------------------------------------- alias xrxsv22_process_action process_action def process_action xrxsv22_process_action @active_battler.disabled_states.clear if @active_battler end end #============================================================================== # ステートターン数の取得 #============================================================================== class Game_Battler def state_turn(state_id) return @state_turns[state_id] end end #============================================================================== # ステート変化の適用 *(再定義 - add_state, apply_state_changes) #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● ステートの付加 * #-------------------------------------------------------------------------- def add_state(state_id, state_level = nil) state = $data_states[state_id] # ステートデータを取得 return if state == nil # データが無効? return if state_ignore?(state_id) # 無視するべきステート? state_level = state.hold_turn + 1 unless state_level unless state?(state_id) # このステートが付加されていない? if XRXSV22::TurnCountOffset and state.offset_by_opposite power = state_level for i in state.state_set power -= remove_state_level(i, power) end if power != state_level # 余力があるなら付加へ add_state(state_id, power) if power >= 1 #* # 相殺で値を使い果たした場合はここで終了 return end # 相殺しなかった場合は続ける end unless state_offset?(state_id) # 相殺するべきステートではない? @states.push(state_id) # ID を @states 配列に追加 end if state_id == 1 # 戦闘不能 (ステート 1 番) なら @hp = 0 # HP を 0 に変更する end unless inputable? # 自由意思で行動できない場合 @action.clear # 戦闘行動をクリアする end for i in state.state_set # [解除するステート] に指定されて remove_state(i) # いるステートを実際に解除する @removed_states.delete(i) # 自動解除の分は表示しない end sort_states # 表示優先度の大きい順に並び替え end n = 0 if XRXSV22::StateAddType == 2 and @state_turns[state_id] n = @state_turns[state_id] + 1 end n = state_level - 1 + n n = @state_turns[state_id] if XRXSV22::StateAddType == 1 and n < @state_turns[state_id] @state_turns[state_id] = n # 自然解除のターン数を設定 max = (state.offset_by_opposite ? XRXSV22::StateTurnMax2 : XRXSV22::StateTurnMax) @state_turns[state_id] = [@state_turns[state_id], max - 1].min end #-------------------------------------------------------------------------- # ステートレベルが既に最大かどうか? #-------------------------------------------------------------------------- def state_level_max?(state_id) state = $data_states[state_id] max = (state.offset_by_opposite ? XRXSV22::StateTurnMax2 : XRXSV22::StateTurnMax) now = (@state_turns[state_id] ? @state_turns[state_id] + 1 : 0) return (now == max) end #-------------------------------------------------------------------------- # ● ステート変化の適用 * #-------------------------------------------------------------------------- def apply_state_changes(obj) note = apply_state_notes(obj) plus = obj.plus_state_set # ステート変化(+) を取得 minus = obj.minus_state_set # ステート変化(-) を取得 for i in plus # ステート変化 (+) next if state_resist?(i) # 無効化されている? next if dead? # 戦闘不能? next if i == 1 and @immortal # 不死身? apply_add_state_changes(i, note) end for i in minus # ステート変化 (-) apply_remove_state_changes(i, note) end for i in @added_states & @removed_states @added_states.delete(i) # 付加と解除の両方に記録されている @removed_states.delete(i) # ステートがあれば両方削除する end end #-------------------------------------------------------------------------- # ○ マイナスステートの適用 #-------------------------------------------------------------------------- def apply_remove_state_changes(i, note) return unless state?(i) # 付加されていない? remove_level = nil if note[/\\remove_state_level\[([+-]*?[0-9]+?)\]/] remove_level = $1.to_i end if remove_level and @state_turns[i] remove_state_level(i, remove_level) else remove_state(i) # ステートを解除 @removed_states.push(i) # 解除したステートを記録する end end def remove_state_level(state_id, remove_level) n = 0 if @state_turns[state_id] n = [@state_turns[state_id] + 1, remove_level].min @state_turns[state_id] -= n if @state_turns[state_id] <= -1 remove_state(state_id) @removed_states.push(state_id) end end return n end #-------------------------------------------------------------------------- # ○ プラスステートの適用 #-------------------------------------------------------------------------- def apply_add_state_changes(i, note) if note[/\\plus_state([0-9]+?)\%/] return if rand(100) >= $1.to_i end if rand(100) < state_probability(i) # 確率判定 state = $data_states[i] state_level = state.hold_turn + 1 note.gsub(/\\state_level\[([0-9]+?)\]/) do state_level = $1.to_i end if XRXSV22::AddFullOffsetStates and state.offset_by_opposite # else state_level -= self.state_guard_level(i) end return if state_level <= 0 return if state_level_max?(i) add_state(i, state_level) # ステートを付加 @added_states.push(i) # 付加したステートを記録 end end if XRXSV22::StateAddType == 0 alias xrxsv22_apply_add_state_changes apply_add_state_changes def apply_add_state_changes(i, note) if XRXSV22::StateAddType == 0 and state?(i) # すでに付加されている? @remained_states.push(i) # 変化しなかったステートを記録 else xrxsv22_apply_add_state_changes(i, note) end end end #-------------------------------------------------------------------------- # ○ ステート適用のメモを取得 #-------------------------------------------------------------------------- def apply_state_notes(obj) note = "" case obj when Game_Battler for weapon in obj.weapons.compact note += weapon.note end when RPG::Item, RPG::Skill note = obj.note end return note end def weapons return [] end def armors return [] end end #============================================================================== # ステートガードレベル #============================================================================== class Game_Battler def state_guard_level(state_id = nil) n = 0 if XRXSV22::ParameterStateGuard n += self.base_def / XRXSV22::StateGuardLevelbyVIT n += (self.mnd / XRXSV22::StateGuardLevelbyMND rescue 0) end note = note_for_state_guard() note.gsub(/\\state_guard\[([0-9]+?)\,([+-]*?[0-9]+?)\]/) do n += $2.to_i if $1.to_i == state_id end note.gsub(/\\state_guard\[([+-]*?[0-9]+?)\]/) do n += $1.to_i end return n end def note_for_state_guard return "" end end class Game_Actor < Game_Battler def note_for_state_guard note = "" for equip in self.equips.compact note += equip.note end return note end end class Game_Enemy < Game_Battler def note_for_state_guard return self.enemy.note end end #============================================================================== # ステートレート設定 *(再定義 - state_probability) #============================================================================== class Game_Battler def state_probability(state_id) if $data_states[state_id].nonresistance return 100 else return XRXSV22::StateRates[self.state_ranks[state_id].to_i] end end def state_ranks return [] end end class Game_Actor < Game_Battler def state_ranks return self.class.state_ranks end def state_probability(state_id) n = super n -= self.guard_state_rate(state_id) unless $data_states[state_id].nonresistance return n end end class Game_Enemy < Game_Battler def state_ranks return enemy.state_ranks end def state_probability(state_id) return super end end #============================================================================== # ステート有効度防具 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ステート防御率 #-------------------------------------------------------------------------- def guard_state_rate(state_id) rate = 0 for armor in self.armors.compact if armor.state_set.include?(state_id) if armor.note[/\\state_rate\[([0-9]+?)\]/] rate += $1.to_i end end end if XRXSV22::StateRateDownByMND if (n = self.mnd rescue false) rate += 100 * n / XRXSV22::StateRateDownMNDMax end end return rate end #-------------------------------------------------------------------------- # ● ステート無効化判定 *(再定義) #-------------------------------------------------------------------------- def state_resist?(state_id) for armor in armors.compact if armor.state_set.include?(state_id) and !(armor.note[/\\state_rate\[[0-9]+?\]/] or armor.note[/\\state_guard\[.+?\]/]) return true end end return false end end