#===================条件付ステート ver0.90============================ # by かーい # 2006/12/30 # 連絡先 ka-i_msn_address@hotmail.co.jp #===================================================================== #============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset PINCH_TEXT = "発動" # 発動条件の名前 STSTE_NORMAL_TEXT = "健康" # ステートがない場合の文字 end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  バトラーを扱うクラスです。このクラスは Game_Actor クラスと Game_Enemy クラ # スのスーパークラスとして使用されます。 #============================================================================== class Game_Battler #-------------------------------------------------------------------------- # ● 有効ステートの取得 #-------------------------------------------------------------------------- def states result = [] for state in @states eleset = $data_states[state].guard_element_set if XRXS.element_percent(eleset, "#{Numset::PINCH_TEXT}上限#{$data_system.words.hp}") < (self.hp * 100.0 / self.base_maxhp) next elsif XRXS.element_percent(eleset, "#{Numset::PINCH_TEXT}下限#{$data_system.words.hp}") > (self.hp * 100.0 / self.base_maxhp) next elsif XRXS.element_percent(eleset, "#{Numset::PINCH_TEXT}上限#{$data_system.words.sp}") < (self.sp * 100.0 / self.base_maxsp) elsif XRXS.element_percent(eleset, "#{Numset::PINCH_TEXT}下限#{$data_system.words.sp}") > (self.sp * 100.0 / self.base_maxsp) else result.push(state) end end return result end #-------------------------------------------------------------------------- # ● MaxHP の取得 #-------------------------------------------------------------------------- def maxhp n = base_maxhp + @maxhp_plus for i in self.states n *= $data_states[i].maxhp_rate / 100.0 end n = [[Integer(n), 1].max, 999999].min return n end #-------------------------------------------------------------------------- # ● MaxSP の取得 #-------------------------------------------------------------------------- def maxsp n = base_maxsp + @maxsp_plus for i in self.states n *= $data_states[i].maxsp_rate / 100.0 end n = [[Integer(n), 0].max, 9999].min return n end #-------------------------------------------------------------------------- # ● 腕力の取得 #-------------------------------------------------------------------------- def str n = base_str + @str_plus for i in self.states n *= $data_states[i].str_rate / 100.0 end n = [[Integer(n), 1].max, 999].min return n end #-------------------------------------------------------------------------- # ● 器用さの取得 #-------------------------------------------------------------------------- def dex n = base_dex + @dex_plus for i in self.states n *= $data_states[i].dex_rate / 100.0 end n = [[Integer(n), 1].max, 999].min return n end #-------------------------------------------------------------------------- # ● 素早さの取得 #-------------------------------------------------------------------------- def agi n = base_agi + @agi_plus for i in self.states n *= $data_states[i].agi_rate / 100.0 end n = [[Integer(n), 1].max, 999].min return n end #-------------------------------------------------------------------------- # ● 魔力の取得 #-------------------------------------------------------------------------- def int n = base_int + @int_plus for i in self.states n *= $data_states[i].int_rate / 100.0 end n = [[Integer(n), 1].max, 999].min return n end #-------------------------------------------------------------------------- # ● 命中率の取得 #-------------------------------------------------------------------------- def hit n = 100 for i in self.states n *= $data_states[i].hit_rate / 100.0 end return Integer(n) end #-------------------------------------------------------------------------- # ● 攻撃力の取得 #-------------------------------------------------------------------------- def atk n = base_atk for i in self.states n *= $data_states[i].atk_rate / 100.0 end return Integer(n) end #-------------------------------------------------------------------------- # ● 物理防御の取得 #-------------------------------------------------------------------------- def pdef n = base_pdef for i in self.states n *= $data_states[i].pdef_rate / 100.0 end return Integer(n) end #-------------------------------------------------------------------------- # ● 魔法防御の取得 #-------------------------------------------------------------------------- def mdef n = base_mdef for i in self.states n *= $data_states[i].mdef_rate / 100.0 end return Integer(n) end #-------------------------------------------------------------------------- # ● 回避修正の取得 #-------------------------------------------------------------------------- def eva n = base_eva for i in self.states n += $data_states[i].eva end return n end #-------------------------------------------------------------------------- # ● ステートの付加 # state_id : ステート ID # force : 強制付加フラグ (オートステートの処理で使用) #-------------------------------------------------------------------------- def add_state(state_id, force = false) # 無効なステートの場合 if $data_states[state_id] == nil # メソッド終了 return end # 強制付加ではない場合 unless force # 既存のステートのループ for i in self.states # 新しいステートが既存のステートのステート変化 (-) に含まれており、 # そのステートが新しいステートのステート変化 (-) には含まれない場合 # (ex : 戦闘不能のときに毒を付加しようとした場合) if $data_states[i].minus_state_set.include?(state_id) and not $data_states[state_id].minus_state_set.include?(i) # メソッド終了 return end end end # このステートが付加されていない場合 unless state?(state_id) # ステート ID を self.states 配列に追加 @states.push(state_id) # オプション [HP 0 の状態とみなす] が有効の場合 if $data_states[state_id].zero_hp # HP を 0 に変更 @hp = 0 end # 全ステートのループ for i in 1...$data_states.size # ステート変化 (+) 処理 if $data_states[state_id].plus_state_set.include?(i) add_state(i) end # ステート変化 (-) 処理 if $data_states[state_id].minus_state_set.include?(i) remove_state(i) end end # レーティングの大きい順 (同値の場合は制約の強い順) に並び替え self.states.sort! do |a, b| state_a = $data_states[a] state_b = $data_states[b] if state_a.rating > state_b.rating -1 elsif state_a.rating < state_b.rating +1 elsif state_a.restriction > state_b.restriction -1 elsif state_a.restriction < state_b.restriction +1 else a <=> b end end end # 強制付加の場合 if force # 自然解除の最低ターン数を -1 (無効) に設定 @states_turn[state_id] = -1 end # 強制付加ではない場合 unless @states_turn[state_id] == -1 # 自然解除の最低ターン数を設定 @states_turn[state_id] = $data_states[state_id].hold_turn end # 行動不能の場合 unless movable? # アクションをクリア @current_action.clear end # HP および SP の最大値チェック @hp = [@hp, self.maxhp].min @sp = [@sp, self.maxsp].min end #-------------------------------------------------------------------------- # ● ステートのアニメーション ID 取得 #-------------------------------------------------------------------------- def state_animation_id # ステートがひとつも付加されていない場合 if self.states.size == 0 return 0 end # レーティング最大のステートのアニメーション ID を返す return $data_states[self.states[0]].animation_id end #-------------------------------------------------------------------------- # ● 制約の取得 #-------------------------------------------------------------------------- def restriction restriction_max = 0 # 現在付加されているステートから最大の restriction を取得 for i in self.states if $data_states[i].restriction >= restriction_max restriction_max = $data_states[i].restriction end end return restriction_max end #-------------------------------------------------------------------------- # ● ステート [EXP を獲得できない] 判定 #-------------------------------------------------------------------------- def cant_get_exp? for i in self.states if $data_states[i].cant_get_exp return true end end return false end #-------------------------------------------------------------------------- # ● ステート [攻撃を回避できない] 判定 #-------------------------------------------------------------------------- def cant_evade? for i in self.states if $data_states[i].cant_evade return true end end return false end #-------------------------------------------------------------------------- # ● ステート [スリップダメージ] 判定 #-------------------------------------------------------------------------- def slip_damage? for i in self.states if $data_states[i].slip_damage return true end end return false end end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● MaxHP の取得 #-------------------------------------------------------------------------- def maxhp n = base_maxhp + @maxhp_plus for i in self.states n *= $data_states[i].maxhp_rate / 100.0 end n = [[Integer(n), 1].max, 9999].min return n end #-------------------------------------------------------------------------- # ● 属性補正値の取得 # element_id : 属性 ID #-------------------------------------------------------------------------- def element_rate(element_id) # 属性有効度に対応する数値を取得 table = [0,200,150,100,50,0,-100] result = table[$data_classes[@class_id].element_ranks[element_id]] # 防具でこの属性が防御されている場合は半減 for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id] armor = $data_armors[i] if armor != nil and armor.guard_element_set.include?(element_id) result /= 2 end end # ステートでこの属性が防御されている場合は半減 for i in self.states if $data_states[i].guard_element_set.include?(element_id) result /= 2 end end # メソッド終了 return result end end #============================================================================== # ■ Window_Base #------------------------------------------------------------------------------ #  ゲーム中のすべてのウィンドウのスーパークラスです。 #============================================================================== class Window_Base < Window #-------------------------------------------------------------------------- # ● 描画用のステート文字列作成 # actor : アクター # width : 描画先の幅 # need_normal : [正常] が必要かどうか (true / false) #-------------------------------------------------------------------------- def make_battler_state_text(battler, width, need_normal) # 括弧の幅を取得 brackets_width = self.contents.text_size("[]").width # ステート名の文字列を作成 text = "" for i in battler.states if $data_states[i].rating >= 1 if text == "" text = $data_states[i].name else new_text = text + "/" + $data_states[i].name text_width = self.contents.text_size(new_text).width if text_width > width - brackets_width break end text = new_text end end end # ステート名の文字列が空の場合は "[正常]" にする if text == "" if need_normal text = "[#{Numset::STSTE_NORMAL_TEXT}]" end else # 括弧をつける text = "[" + text + "]" end # 完成した文字列を返す return text end end