#============================================================================== # ■ RGSS3 ステートスワップ・ステートインポーズ Ver2.01 by 星潟 #------------------------------------------------------------------------------ # 対象と自分のステート・強化・弱体の状態を入れ替える # スキル・アイテムを作成できます。 # 有効度が1以上あれば、付与に失敗することはありません。 # (運によるステート耐性・弱体耐性は完全に無視します) # # また、ステートのメモ欄に<スワップ禁止>と書き込む事で # そのステートが入れ替え・押し付けの対象にならないようにする事が出来ます。 # # なお、入れ替えようとする相手の # ステート有効度が0もしくは無効の場合や弱体有効度が0の場合は # 使用者からはそのステート・弱体は消滅しますが、相手に付与されることはありません。 # # また、性質上、敵単体もしくは味方単体用スキルとしての使用を想定しています。 # 複数ランダムや全体など、二体以上の相手を対象とした場合は考慮していませんので # 予めご了承ください。 #============================================================================== # アイテム/スキルのメモ欄に記入。 #------------------------------------------------------------------------------ # <ステートスワップ:0> # # 使用者と対象のステートを入れ替えます。 #------------------------------------------------------------------------------ # <ステートスワップ:1> # # 使用者と対象の強化・弱体を入れ替えます。 #------------------------------------------------------------------------------ # <ステートスワップ:2> # # 使用者と対象のステート・強化・弱体を入れ替えます。 #------------------------------------------------------------------------------ # <ステートインポーズ:0> # # 使用者のステートを対象に押し付けます。 # (自分のステートは解除されます) #------------------------------------------------------------------------------ # <ステートインポーズ:1> # # 使用者の強化・弱体を対象に押し付けます。 # (自分の強化・弱体は解除されます) #------------------------------------------------------------------------------ # <ステートインポーズ:2> # # 使用者のステート・強化・弱体を対象に押しつけます。 # (自分のステート・強化・弱体は解除されます) #============================================================================== # ステートのメモ欄に記入。 #------------------------------------------------------------------------------ # <スワップ禁止> # # このステートはステートスワップの対象にならない。 #------------------------------------------------------------------------------ # <インポーズ禁止> # # このステートはステートインポーズの対象にならない。 #============================================================================== module StateSwap #ステート・強化・弱体の入れ替え用キーワードを設定します。 Words1 = ["ステートスワップ","ステートインポーズ"] #ステートの入れ替え・押し付け禁止用キーワードを設定します。 Words2 = ["スワップ禁止","インポーズ禁止"] #空の配列を用意。(ここは変更不要) Message = [] #ステートの入れ替えメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[0] = "%sとステートが入れ替わった!" #強化・弱体の入れ替えメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[1] = "%sと強化・弱体が入れ替わった!" #ステート・強化・弱体の入れ替えメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[2] = "%sとステート・強化・弱体が入れ替わった!" #ステートの押し付けメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[3] = "%sにステートを移した!" #強化・弱体の押し付けメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[4] = "%sに強化・弱体を移した!" #ステート・強化・弱体の押し付けメッセージを設定します。 #%sの部分には対象の名前が自動的に入ります。 Message[5] = "%sにステート・強化・弱体を移した!" end class Game_ActionResult attr_accessor :swap_impose #-------------------------------------------------------------------------- # 命中系フラグのクリア #-------------------------------------------------------------------------- alias clear_hit_flags_state_swap_impose clear_hit_flags def clear_hit_flags clear_hit_flags_state_swap_impose @swap_impose = -1 end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # ステートID配列の複製の取得 #-------------------------------------------------------------------------- def get_states_clone @states.clone end #-------------------------------------------------------------------------- # ステートIDターンハッシュの複製の取得 #-------------------------------------------------------------------------- def get_state_turns_clone @state_turns.clone end #-------------------------------------------------------------------------- # ステートIDターン歩数の複製の取得 #-------------------------------------------------------------------------- def get_state_steps_clone @state_steps.clone end #-------------------------------------------------------------------------- # 強化弱体レベルの複製の取得 #-------------------------------------------------------------------------- def get_buffs_clone @buffs.clone end #-------------------------------------------------------------------------- # 強化弱体ターンの複製の取得 #-------------------------------------------------------------------------- def get_buff_turns_clone @buff_turns.clone end #-------------------------------------------------------------------------- # 有効な効果が存在するか? #-------------------------------------------------------------------------- alias item_has_any_valid_effects_state_swap? item_has_any_valid_effects? def item_has_any_valid_effects?(user, item) item.swap_or_impose? or item_has_any_valid_effects_state_swap?(user, item) end #-------------------------------------------------------------------------- # スキル/アイテムの使用者側への効果 #-------------------------------------------------------------------------- alias item_user_effect_state_swap item_user_effect def item_user_effect(user, item) state_swap_impose(user, item) item_user_effect_state_swap(user, item) end #-------------------------------------------------------------------------- # スワップ・インポーズの実行 #-------------------------------------------------------------------------- def state_swap_impose(user, item) s = item.state_swap return state_swap_execute(user,s) if s > -1 && s < 3 s = item.state_impose return state_impose_execute(user,s) if s > -1 && s < 3 end #-------------------------------------------------------------------------- # ステートスワップの実行 #-------------------------------------------------------------------------- def state_swap(a1,a2,a3) a1.each {|s| next if $data_states[s].anti_swap? unless state_resist_set.include?(s) && state_rate(s) <= 0 @states.push(s) unless @states.include?(s) @state_turns[s] = a2[s] @state_steps[s] = a3[s] end} end #-------------------------------------------------------------------------- # 強化弱体スワップの実行 #-------------------------------------------------------------------------- def buff_swap(a4,a5) 8.times {|i| next if a4[i].to_i < 0 && debuff_rate(i) <= 0 @buffs[i] = a4[i].to_i @buff_turns[i] = a5[i].to_i} end #-------------------------------------------------------------------------- # ステートインポーズの実行 #-------------------------------------------------------------------------- def state_impose(a1,a2,a3) a1.each {|s| next if $data_states[s].anti_impose? unless state_resist_set.include?(s) && state_rate(s) <= 0 @states.push(s) unless @states.include?(s) @state_turns[s] = a2[s] @state_steps[s] = a3[s] end} end #-------------------------------------------------------------------------- # 強化弱体インポーズの実行 #-------------------------------------------------------------------------- def buff_impose(a4,a5) 8.times {|i| next if a4[i] == 0 or a4[i].to_i < 0 && debuff_rate(i) <= 0 @buffs[i] = a4[i].to_i @buff_turns[i] = a5[i].to_i} end #-------------------------------------------------------------------------- # スワップの実行 #-------------------------------------------------------------------------- def state_swap_execute(user, type) @result.swap_impose = type @result.success = true if type != 1 a1 = user.get_states_clone a2 = user.get_state_turns_clone a3 = user.get_state_steps_clone b1 = get_states_clone b2 = get_state_turns_clone b3 = get_state_steps_clone a1.each {|s| user.erase_state(s) unless $data_states[s].anti_swap?} b1.each {|s| erase_state(s) unless $data_states[s].anti_swap?} user.state_swap(b1,b2,b3) state_swap(a1,a2,a3) end if type != 0 a4 = user.get_buffs_clone a5 = user.get_buff_turns_clone b4 = get_buffs_clone b5 = get_buff_turns_clone user.buff_swap(b4,b5) buff_swap(a4,a5) end end #-------------------------------------------------------------------------- # インポーズの実行 #-------------------------------------------------------------------------- def state_impose_execute(user, type) @result.swap_impose = type + 3 @result.success = true if type != 1 a1 = user.get_states_clone a2 = user.get_state_turns_clone a3 = user.get_state_steps_clone a1.each {|i| user.erase_state(i) unless $data_states[i].anti_impose?} state_impose(a1,a2,a3) end if type != 0 a4 = user.get_buffs_clone a5 = user.get_buff_turns_clone user.clear_buffs buff_impose(a4,a5) end end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # 影響を受けたステータスの表示 #-------------------------------------------------------------------------- alias display_affected_status_state_swap display_affected_status def display_affected_status(target, item) display_affected_status_state_swap(target, item) t = target.result.swap_impose display_state_swap(target,t) if t != -1 end #-------------------------------------------------------------------------- # スワップ・インポーズの表示 #-------------------------------------------------------------------------- def display_state_swap(target,type) add_text("") if line_number < max_line_number replace_text(sprintf(StateSwap::Message[type],target.name)) wait end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # スワップ #-------------------------------------------------------------------------- def state_swap @state_swap ||= create_state_swap_impose(0) end #-------------------------------------------------------------------------- # インポーズ #-------------------------------------------------------------------------- def state_impose @state_impose ||= create_state_swap_impose(1) end #-------------------------------------------------------------------------- # スワップかインポーズどちらかの効果を持つか? #-------------------------------------------------------------------------- def swap_or_impose? state_swap > -1 or state_impose > -1 end #-------------------------------------------------------------------------- # スワップ・インポーズのデータ作成 #-------------------------------------------------------------------------- def create_state_swap_impose(type) r = /<#{StateSwap::Words1[type]}[::](\d+)>/ =~ note ? $1.to_i : -1 r = -1 if r > 2 r = -1 if r < -1 r end end class RPG::State < RPG::BaseItem #-------------------------------------------------------------------------- # スワップ無視か? #-------------------------------------------------------------------------- def anti_swap? (@anti_swap ||= create_state_swap_seal_impose(0)) == 1 end #-------------------------------------------------------------------------- # インポーズ無視か? #-------------------------------------------------------------------------- def anti_impose? (@anti_impose ||= create_state_swap_seal_impose(1)) == 1 end #-------------------------------------------------------------------------- # スワップ・インポーズ無視のデータ作成 #-------------------------------------------------------------------------- def create_state_swap_seal_impose(type) /<#{StateSwap::Words2[type]}>/ =~ note ? 1 : 0 end end