#=========================================================================== # ◆ A1 Scripts ◆ # VX機能再現(RGSS3) # # バージョン : 1.00 (2011/12/15) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・VXの機能を再現します #--------------------------------------------------------------------------- # 更新履歴   :2011/12/15 Ver1.00 リリース #--------------------------------------------------------------------------- # 設置場所 #  RGSS3用A1共通スクリプトより下 # 一部再定義メソッドがあるため、なるべく上の方 # # 必要スクリプト # RGSS3用A1共通スクリプト #--------------------------------------------------------------------------- # 使い方 # データベースのメモ欄に記述します # [ステート] # <抵抗しない>   : VX機能「抵抗しない」再現 # <逆効果と相殺>  : VX機能「逆効果と相殺」再現 # <自動解除率 d>  : VX機能「○ターン経過後□パーセントの確率で解除」再現 #   d = 解除率 #   ターン数は「継続ターン数」で設定 # <解除ステート a> : VX機能「解除するステート」再現 #   a = 解除するステートIDをカンマ(,)区切りで指定 #============================================================================== $imported ||= {} $imported["A1_VX_State"] = true if $imported["A1_Common_Script"] #============================================================================== # ■ RPG::State #============================================================================== class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # ○ 抵抗しない設定 #-------------------------------------------------------------------------- def set_nonresistance @nonresistance = $a1_common.note_data(self.note, "抵抗しない") end #-------------------------------------------------------------------------- # ○ 抵抗しない #-------------------------------------------------------------------------- def nonresistance @nonresistance ||= set_nonresistance return @nonresistance end #-------------------------------------------------------------------------- # ○ 逆効果と相殺設定 #-------------------------------------------------------------------------- def set_offset_by_opposite @offset_by_opposite = $a1_common.note_data(self.note, "逆効果と相殺") end #-------------------------------------------------------------------------- # ○ 逆効果と相殺 #-------------------------------------------------------------------------- def offset_by_opposite @offset_by_opposite ||= set_offset_by_opposite return @offset_by_opposite end #-------------------------------------------------------------------------- # ○ 自動解除率設定 #-------------------------------------------------------------------------- def set_auto_release_prob prob = $a1_common.note_data(self.note, "自動解除率") return -1 unless prob.is_a?(Array) @auto_release_prob = prob[0].to_i end #-------------------------------------------------------------------------- # ○ 自動解除率設定 #-------------------------------------------------------------------------- def auto_release_prob @auto_release_prob ||= set_auto_release_prob return @auto_release_prob end #-------------------------------------------------------------------------- # ○ 解除ステートの設定 #-------------------------------------------------------------------------- def set_remove_states @remove_states = $a1_common.note_data_array(self.note, "解除ステート", 0) end #-------------------------------------------------------------------------- # ○ 解除ステート #-------------------------------------------------------------------------- def remove_states @remove_states ||= set_remove_states return @remove_states end end #============================================================================== # ■ RPG::Class #============================================================================== class RPG::Class < RPG::BaseItem #-------------------------------------------------------------------------- # ☆ レベルアップまでの経験値 #-------------------------------------------------------------------------- alias a1_vx_rc_exp_for_level exp_for_level def exp_for_level(level) return a1_vx_rc_exp_for_level(level) unless $a1_common.note_data(self.note, "VX経験テーブル") return next_exp_vx(level) end #-------------------------------------------------------------------------- # ○ VXの経験値計算 #-------------------------------------------------------------------------- def make_exp_list_vx @exp_list_vx = Array.new(101) @exp_list_vx[1] = @exp_list_vx[100] = 0 m = @exp_params[0] n = 0.75 + @exp_params[2] / 200.0; for i in 2..99 @exp_list_vx[i] = @exp_list_vx[i-1] + Integer(m) m *= 1 + n; n *= 0.9; end return @exp_list_vx end #-------------------------------------------------------------------------- # ☆ レベルアップまでの経験値(VX式) #-------------------------------------------------------------------------- def next_exp_vx(level) @exp_list_vx ||= make_exp_list_vx return @exp_list_vx[level] end end #============================================================================== # ■ Game_Battler #------------------------------------------------------------------------------ #  スプライトや行動に関するメソッドを追加したバトラーのクラスです。このクラス # は Game_Actor クラスと Game_Enemy クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ★ ステート自動解除 # timing : タイミング(1:行動終了 2:ターン終了) #-------------------------------------------------------------------------- def remove_states_auto(timing) states.each do |state| if @state_turns[state.id] == 0 && state.auto_removal_timing == timing if state.auto_release_prob >= 0 if rand(100) < state.auto_release_prob remove_state(state.id) else @state_turns[state.id] += 1 end else remove_state(state.id) end end end end #-------------------------------------------------------------------------- # ★ ステートの付加 #-------------------------------------------------------------------------- def add_state(state_id) if state_addable?(state_id) return unless add_new_state(state_id) unless state?(state_id) reset_state_counts(state_id) @result.added_states.push(state_id).uniq! end end #-------------------------------------------------------------------------- # ☆ 新しいステートの付加 #-------------------------------------------------------------------------- alias a1_vx_gb_add_new_state add_new_state def add_new_state(state_id) remove = false remove_list = $data_states[state_id].remove_states remove_list.each {|id| remove = true if state?(id) remove_state(id) } return false if $data_states[state_id].offset_by_opposite and remove a1_vx_gb_add_new_state(state_id) return true end #-------------------------------------------------------------------------- # ☆ 使用効果[ステート付加]:通常 #-------------------------------------------------------------------------- alias a1_vx_gb_item_effect_add_state_normal item_effect_add_state_normal def item_effect_add_state_normal(user, item, effect) return a1_vx_gb_item_effect_add_state_normal(user, item, effect) unless $data_states[effect.data_id].nonresistance add_state(effect.data_id) @result.success = true end end end