#============================================================================== # ■ RGSS3 指定値強化・弱体アイテム・スキル Ver2.01 by 星潟 #------------------------------------------------------------------------------ # 強化・弱体の効果とは別に、一時的に能力を変化させるシステムを追加します。 # 特定の能力値を「一定割合」ではなく、「指定数値」変化させます。 # この効果はターン経過による解除が行われず、戦闘終了時に効果が失われます。 # (使用タイミングは、戦闘中を想定しています) # アイテム・スキルのメモ欄に特定の書式を書き込む事で効果を得られます。 # なお、この能力変化は、各能力値の上限及び下限の影響を強く受けます。 # (通常の強化・弱体の効果で攻撃力が上限に達しているキャラには # 攻撃力強化は無効であり、強化が切れる等で攻撃力が上限を下回らない限り # 攻撃力を強化する一時変化効果を与える事は出来ない、等) # # # 以下、設定例 # <一時変化:0,25,5> # # 25%の確率で最大HPに+5の補正をかける。 # # # <一時変化:1,50,-10> # # 50%の確率で最大MPに-10の補正をかける。 # # # <一時変化消去:2,100> # # 100%の確率で攻撃力の補正を打ち消す。 # # # <一時変化:3,user.mat/2,50> # # 「使用者の魔法力の1/2」の値の確率で防御力に+50の補正をかける。 # # # <一時変化:4,self.mp,-100> # # 「受ける側のMP」の値分の確率で魔法力に-100の補正をかける。 # # # <一時変化消去:5,user.mat-self.mdf> # # 使用者の魔法攻撃力の値から受ける側の魔法防御の値を引いた確率で # 魔法防御の補正を打ち消す。 # # # <一時低下消去:6,user.atk-self.def> # # 使用者の攻撃力の値から受ける側の防御の値分の確率で # 敏捷性のマイナス補正を打ち消す。 # # # <一時上昇消去:7,50,$game_variables[1]> # # 変数1の値の確率で運のプラス補正を打ち消す。 #------------------------------------------------------------------------------ # また、以下のイベントコマンドを使用できるようにします。 # # # ppexn_p(id, p_id, number) # # ppexn_e(id, p_id, number) # # idには対象指定用ID、p_idにはパラメータ指定(0が最大HP〜7が運)、 # numberには値を指定します。正の数でも負の数でも指定できます。 # # ppexn_pは対象の指定したパラメータ補正値に対して、指定した値を加算します。 # ただし、各能力値の本来の上限・下限の影響を受けます。 # # ppexn_eは対象の指定したパラメータ補正値を指定した値にします。 # この効果のみ、補正上限・下限に達していない限りは # 補正値を強制的に指定値に変更します。 #(補正値そのものは能力値本来の上限・下限の影響を受けません) # # なお、idが0以下の場合は敵グループ内ID(0〜-7に-1をかけたIDが対象になります)、 # 1以上の場合はアクターIDでの指定となります。 # # 設定例 # # ppexn_p(1,2,250) # アクターID1のアクターの攻撃力補正を+250する。 # # ppexn_e(-1,2,-500) # 敵グループ内ID1のエネミーの攻撃力補正を-500にする。 #============================================================================== module PPEXN #能力を一時変化させる際のキーワードを指定します。(変更不要) WORD1 = "一時変化" #能力を消去させる際のキーワードを指定します。(変更不要) WORD2 = "一時変化消去" #能力低下を消去させる際のキーワードを指定します。(変更不要) WORD3 = "一時低下消去" #能力上昇を消去させる際のキーワードを指定します。(変更不要) WORD4 = "一時上昇消去" #各能力値の補正上限を指定します。() #左から、最大HP、最大MP、攻撃力、防御力、魔法力、魔法防御、敏捷性、運です。 MAX = [9999, 9999, 999, 999, 999, 999, 999, 999] #各能力値の補正下限を指定します。() #左から、最大HP、最大MP、攻撃力、防御力、魔法力、魔法防御、敏捷性、運です。 MIN = [-9999, -9999, -999, -999, -999, -999, -999, -999] end module Vocab BuffPPEXN = "%sの%sが%s上がった!" DebuffPPEXN = "%sの%sが%s下がった!" NoPPEXN = "%sの%sは変化しなかった!" DDisPPEXN = "%sの%s低下効果が元に戻った!" UDisPPEXN = "%sの%s上昇効果が元に戻った!" DLIMIT = "%sの%sはもう下がらない!" ULIMIT = "%sの%sはもう上がらない!" end class Game_BattlerBase attr_accessor :pp_ex_number #-------------------------------------------------------------------------- # 能力値強化 #-------------------------------------------------------------------------- alias param_plus_exnumber param_plus def param_plus(param_id) data = param_plus_exnumber(param_id) data += pp_ex_number(param_id) data end #-------------------------------------------------------------------------- # 一時強化 #-------------------------------------------------------------------------- def pp_ex_number(param_id) pp_ex_n_reset if @pp_ex_number == nil @pp_ex_number[param_id] end #-------------------------------------------------------------------------- # 一時強化値を指定値にする #-------------------------------------------------------------------------- def pp_ex_number_equal(param_id ,number) pp_ex_n_reset if @pp_ex_number == nil @pp_ex_number[param_id] = [[number, PPEXN::MAX[param_id]].min, PPEXN::MIN[param_id]].max refresh end #-------------------------------------------------------------------------- # 一時強化値を指定値にする #-------------------------------------------------------------------------- def pp_ex_change(param_id, number, int_flag = false) pp_ex_n_reset(int_flag) if @pp_ex_number == nil if !int_flag @result.ppexn[param_id] = 0 if @result.ppexn[param_id] == nil @result.ppexn[param_id] = 0 if @result.ppexn[param_id].is_a?(String) if number > 0 && (@pp_ex_number[param_id] == PPEXN::MAX[param_id] or param(param_id) == param_max(param_id)) @result.ppexn[param_id] = "ulimit" return elsif number < 0 && (@pp_ex_number[param_id] == PPEXN::MIN[param_id] or param(param_id) == param_min(param_id)) @result.ppexn[param_id] = "dlimit" return end end temp = number + @pp_ex_number[param_id] if temp > PPEXN::MAX[param_id] data = PPEXN::MAX[param_id] - @pp_ex_number[param_id] elsif temp < PPEXN::MIN[param_id] data = PPEXN::MIN[param_id] - @pp_ex_number[param_id] else data = number end if data < 0 if param(param_id) == param_min(param_id) data = 0 elsif (data + param(param_id)) < param_min(param_id) data = -param(param_id) + param_min(param_id) end elsif data > 0 if param(param_id) == param_max(param_id) data = 0 elsif param(param_id) + data > param_max(param_id) data = param_max(param_id) - param(param_id) end end @result.ppexn[param_id] += data if !int_flag @pp_ex_number[param_id] += data if param_id == 0 self.hp = [hp, mhp].min elsif param_id == 1 self.mp = [mp, mmp].min end refresh end #-------------------------------------------------------------------------- # 一時強化値を消去する #-------------------------------------------------------------------------- def pp_ex_dispel(param_id, int_flag = false) if !int_flag if @pp_ex_number[param_id] < 0 @result.ppexn[param_id] = "ddispel" elsif @pp_ex_number[param_id] > 0 @result.ppexn[param_id] = "udispel" end end @pp_ex_number[param_id] = 0 refresh end #-------------------------------------------------------------------------- # 一時強化値を全てリセットする #-------------------------------------------------------------------------- def pp_ex_n_reset(flag = false) @pp_ex_number = [0] * 8 refresh if flag end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # 使用者に対する効果 #-------------------------------------------------------------------------- alias item_user_effect_ppexn item_user_effect def item_user_effect(user, item) pe = item.ppexn_effects pe[:ppexn].each {|a| item_effect_ppexn(user, item, a)} pe[:ppexd].each {|a| item_effect_ppexd(user, item, a)} pe[:ppexr].each {|a| item_effect_ppexr(user, item, a)} pe[:ppexe].each {|a| item_effect_ppexe(user, item, a)} item_user_effect_ppexn(user, item) end #-------------------------------------------------------------------------- # 一時強化値変動 #-------------------------------------------------------------------------- def item_effect_ppexn(user, item, array) if eval(array[1]) > rand(100) pp_ex_change(array[0], eval(array[2])) @result.success = true end end #-------------------------------------------------------------------------- # 一時強化値消去 #-------------------------------------------------------------------------- def item_effect_ppexd(user, item, array) if eval(array[1]) > rand(100) pp_ex_dispel(array[0]) @result.success = true end end #-------------------------------------------------------------------------- # 一時強化値消去(対弱体用) #-------------------------------------------------------------------------- def item_effect_ppexr(user, item, array) if @pp_ex_number[array[0]] < 0 && eval(array[1]) > rand(100) pp_ex_dispel(array[0]) @result.success = true end end #-------------------------------------------------------------------------- # 一時強化値消去(対強化用) #-------------------------------------------------------------------------- def item_effect_ppexe(user, item, array) if @pp_ex_number[array[0]] > 0 && eval(array[1]) > rand(100) pp_ex_dispel(array[0]) @result.success = true end end #-------------------------------------------------------------------------- # 戦闘終了処理 #-------------------------------------------------------------------------- alias on_battle_end_ppexn on_battle_end def on_battle_end on_battle_end_ppexn pp_ex_n_reset(true) end end class Game_ActionResult attr_accessor :ppexn #-------------------------------------------------------------------------- # クリア #-------------------------------------------------------------------------- alias clear_ppexn clear def clear clear_ppexn @ppexn = [nil] * 8 end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # 影響を受けたステータスの表示 #-------------------------------------------------------------------------- alias display_affected_status_ppexn display_affected_status def display_affected_status(target, item) display_affected_status_ppexn(target, item) display_changed_ppexn(target) end #-------------------------------------------------------------------------- # 一時強化値変動の表示 #-------------------------------------------------------------------------- def display_changed_ppexn(target) target.result.ppexn.each_with_index {|ppexn,i| case ppexn when "ddispel" display_ppexn2(target,i,Vocab::DDisPPEXN) when "udispel" display_ppexn2(target,i,Vocab::UDisPPEXN) when "dlimit" display_ppexn2(target,i,Vocab::DLIMIT) when "ulimit" display_ppexn2(target,i,Vocab::ULIMIT) when "nothing" display_ppexn2(target,i,Vocab::NoPPEXN) else if ppexn if ppexn > 0 display_ppexn1(target, i, ppexn, Vocab::BuffPPEXN) elsif ppexn < 0 display_ppexn1(target, i, -ppexn, Vocab::DebuffPPEXN) end end end} end #-------------------------------------------------------------------------- # 一時強化値変動の表示(数値) #-------------------------------------------------------------------------- def display_ppexn1(target, type, ppexn, fmt) replace_text(sprintf(fmt, target.name, Vocab::param(type), ppexn)) wait end #-------------------------------------------------------------------------- # 一時強化値変動の表示(解除) #-------------------------------------------------------------------------- def display_ppexn2(target, type, fmt) replace_text(sprintf(fmt, target.name, Vocab::param(type))) wait end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # 一時強化値変動効果 #-------------------------------------------------------------------------- def ppexn_effects @ppexn_effects ||= create_ppexn_effects end #-------------------------------------------------------------------------- # 一時強化値変動効果作成 #-------------------------------------------------------------------------- def create_ppexn_effects h = { :ppexn => [], :ppexd => [], :ppexr => [], :ppexe => [] } note.each_line {|l| if /<#{PPEXN::WORD1}[::](\d+),(\S+),(\S+)>/ =~ l h[:ppexn].push([$1.to_i,$2.to_s,$3.to_s]) end if /<#{PPEXN::WORD2}[::](\d+),(\S+)>/ =~ l h[:ppexd].push([$1.to_i,$2.to_s]) end if /<#{PPEXN::WORD3}[::](\d+),(\S+)>/ =~ l h[:ppexr].push([$1.to_i,$2.to_s]) end if /<#{PPEXN::WORD4}[::](\d+),(\S+)>/ =~ l h[:ppexe].push([$1.to_i,$2.to_s]) end} h end end class Game_Interpreter #-------------------------------------------------------------------------- # 一時強化値加算 #-------------------------------------------------------------------------- def ppexn_p(id, p_id, number) target = id > 0 ? $game_actors[id] : $game_troop.members[id] target.pp_ex_change(p_id, number, true) if target end #-------------------------------------------------------------------------- # 一時強化値指定 #-------------------------------------------------------------------------- def ppexn_e(id, p_id, number) target = id > 0 ? $game_actors[id] : $game_troop.members[id] target.pp_ex_number_equal(p_id ,number) if target end end