#============================================================================== # ■ RGSS3 キャンセル可能行動 Ver1.02 by 星潟 #------------------------------------------------------------------------------ # 被攻撃時に、まだ行動をしていなかった場合 # 行動内容と受けた攻撃次第で # 行動がキャンセルされるアイテム・スキルが # 作成できるようになります。 # # 絶対に防がなくてはいけない # ボスの大技等に設定すると面白いかもしれません。 #------------------------------------------------------------------------------ # 以下、記入例です。(全てアイテム・スキルのメモ欄に記入) # # # その行動内容のキャンセルワードとして # 回復魔法という文字列を追加する。 # 複数指定する場合は「,」(鍵括弧なし)で区切る。 # # # キャンセル対象として炎魔法と氷魔法という文字列を登録する。 # スキル使用時、対象の行動内容のキャンセルワードに # 炎魔法、もしくは氷魔法という文字列が登録されている場合 # この行動のキャンセル判定が行われる。 # 複数指定する場合は「,」(鍵括弧なし)で区切る。 # # <絶対C> # 行動前に何かの行動の対象になった場合、この行動のキャンセル判定が行われる。 # # # 500以上のダメージを受ける事で、この行動のキャンセル判定が行われる。 # キャンセル属性が設定されている場合は、そちらも満たさなければ # キャンセル判定は行われない。 # # # 属性ID3・4・5の何れかのダメージを # Cダメージで設定した値分受ける事でキャンセル判定が行われる。 # Cダメージを設定していない場合は設定が無効化される。 # 複数指定する場合は「,」(鍵括弧なし)で区切る。 # # # この行動がキャンセル判定時にキャンセルされる確率は50%となる。 # (設定しない場合は100%) # # # この行動がキャンセルされた時に # [行動者名前]は魔法の詠唱を中断した!と表示される。 #------------------------------------------------------------------------------ # 設定例 # # スキルのメモ欄に下記のように記述した場合 # # # # # # # # このスキルは、炎魔法と雷魔法を # キャンセルワードとしているアイテム・スキルに対し # キャンセル判定を行う事が出来る。 # # 攻撃魔法という文字列をキャンセルワードとして登録しているので # 攻撃魔法をキャンセル対象としているアイテム・スキルから # キャンセル判定を受ける。 # # また、毒性ID1の攻撃を受けて300以上のダメージを受けた時も # キャンセル判定を受ける。 # # このスキルがキャンセル判定時にキャンセルされる確率は50%となる。 #------------------------------------------------------------------------------ # Ver1.01 # -色々おかしかったので修正。 # -キャンセル効果のみを持つスキルを作成できるように改修。 #============================================================================== module CANCEL_ACT #そのアイテム・スキルを行う事で #キャンセルできる対象を指定する為の #キーワードを設定します。 WORD1 = "C対象" #行動者のキャンセル対象と一致している場合に #キャンセルさせる為のキーワードを設定します。 WORD2 = "Cワード" #何らかの行動を受けたら絶対にキャンセルさせる場合の #キーワードを設定します。 WORD3 = "絶対C" #一定値以上のダメージを受けたらキャンセルさせる場合の #キーワードを設定します。 WORD4 = "Cダメージ" #特定の属性攻撃を受けたらキャンセルさせる場合の #キーワードを設定します。 #(キャンセルダメージ設定時のみ有効になります) WORD5 = "C属性" #キャンセル成功率設定用のキーワードを設定します。 #(設定しない場合は100%) WORD6 = "C確率" #キャンセルさせた際のキャンセルメッセージを設定する為のキーワードを設定します。 #(設定しない場合はデフォルトメッセージ) WORD7 = "Cメッセージ" #キャンセル発動時のメッセージを表示するかどうかを決定します。 #trueで表示、falseで非表示 TEXT_FLAG = true #キャンセル発動時のデフォルトメッセージを設定します。 #このメッセージの前に対象の名前が入ります。 TEXT = "の行動がキャンセルされた!" end class Game_ActionResult attr_accessor :cancel_success attr_accessor :cancel_element_ids #-------------------------------------------------------------------------- # 命中系フラグのクリア #-------------------------------------------------------------------------- alias clear_hit_flags_cancel_success clear_hit_flags def clear_hit_flags clear_hit_flags_cancel_success @cancel_success = [] @cancel_element_ids = [] end #-------------------------------------------------------------------------- # 何らかのステータス(能力値かステート)が影響を受けたかの判定 #-------------------------------------------------------------------------- alias status_affected_cancel_success? status_affected? def status_affected? status_affected_cancel_success? or @cancel_success.size > 0 end end class Game_BattlerBase #-------------------------------------------------------------------------- # 属性有効度の取得 #-------------------------------------------------------------------------- alias element_rate_cancel_action element_rate def element_rate(element_id) @result.cancel_element_ids.push(element_id) if @cancel_action_element_ids_flag element_rate_cancel_action(element_id) end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # スキル/アイテムの属性修正値を取得 #-------------------------------------------------------------------------- alias item_element_rate_cancel_action item_element_rate def item_element_rate(user, item) @cancel_action_element_ids_flag = true r = item_element_rate_cancel_action(user, item) @cancel_action_element_ids_flag = nil r end #-------------------------------------------------------------------------- # 使用効果の適用 #-------------------------------------------------------------------------- alias item_apply_cancel_action item_apply def item_apply(user, item) item_apply_cancel_action(user, item) #行動内容が存在しない場合は処理しない if self.actions != nil #行動内容をそれぞれチェック self.actions.each do |action| #行動が存在しない場合もしくは #アイテム・スキルが設定されていない場合は飛ばす next if !(action && action.item) #条件に合う場合は行動を消去する action.clear if action_canceler_judge(item, action.item, user) end end end #-------------------------------------------------------------------------- # 行動キャンセル判定 #-------------------------------------------------------------------------- def action_canceler_judge(item, a_i, user) #何をされても消去される場合、特定の行動を取られた場合、 #ダメージ指定がある場合、それぞれ条件に応じて消去判定。 if all_cancel_item(a_i) or action_cancel_item(a_i, item) or (damage_cancel_item(a_i) && element_cancel_item(a_i, item, user)) return action_cancel_execute(a_i) end false end #-------------------------------------------------------------------------- # 何をされても消去される行動か? #-------------------------------------------------------------------------- def all_cancel_item(a_i) a_i.all_cancel_item end #-------------------------------------------------------------------------- # ダメージ条件を満たすか? #-------------------------------------------------------------------------- def damage_cancel_item(a_i) #ダメージ値の指定があり、なおかつダメージ値が指定値を上回るか a_i.damage_cancel_item != 0 && @result.hp_damage > a_i.damage_cancel_item end #-------------------------------------------------------------------------- # 属性条件を満たすか? #-------------------------------------------------------------------------- def element_cancel_item(a_i, item, user) a = a_i.element_cancel_item #属性IDの指定がなければキャンセルする。 return true if a.empty? #属性の処理タイプの判定を行う。 #通常攻撃依存の場合は通常攻撃を参照する data = @result.cancel_element_ids #属性がない場合はfalseを返す return false if data.empty? #属性にキャンセル属性が含まれていればtrueを返す data.any? {|eid| a.include?(eid)} end def action_cancel_item(a_i, item) a = a_i.cancel_words #キャンセル用の単語とキャンセル対象の単語が #一致している場合はtrueを返す item.cancel_execute_words.any? {|word| a.include?(word)} end def action_cancel_execute(a_i) return false unless a_i.cancel_rate > rand(100) #キャンセルした行動のキャンセルメッセージを保存する @result.success = true @result.cancel_success.push(a_i.cancel_message) true end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # 影響を受けたステータスの表示 #-------------------------------------------------------------------------- alias display_affected_status_action_cancel display_affected_status def display_affected_status(target, item) display_affected_status_action_cancel(target, item) #キャンセルメッセージを表示しない場合は飛ばす return if !CANCEL_ACT::TEXT_FLAG #キャンセルメッセージが存在しない場合は飛ばす if !target.result.cancel_success.empty? add_text("") if line_number < max_line_number target.result.cancel_success.each do |text| message = text == "" ? CANCEL_ACT::TEXT : text replace_text(target.name + message) wait end end end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # キャンセル対象登録 #-------------------------------------------------------------------------- def cancel_execute_words @star_c_e_words ||= /<#{CANCEL_ACT::WORD1}[::](\S+)>/ =~ note ? $1.to_s.split(/\s*,\s*/) : [] end #-------------------------------------------------------------------------- # キャンセルワード登録 #-------------------------------------------------------------------------- def cancel_words @star_c_words ||= /<#{CANCEL_ACT::WORD2}[::](\S+)>/ =~ note ? $1.to_s.split(/\s*,\s*/) : [] end #-------------------------------------------------------------------------- # 全キャンセル登録 #-------------------------------------------------------------------------- def all_cancel_item (@all_cancel ||= self.note.include?(CANCEL_ACT::WORD3) ? 1 : 0) == 1 end #-------------------------------------------------------------------------- # ダメージキャンセル登録 #-------------------------------------------------------------------------- def damage_cancel_item @damage_cancel ||= /<#{CANCEL_ACT::WORD4}[::](\d+)>/ =~ note ? $1.to_i : 0 end #-------------------------------------------------------------------------- # 属性キャンセル登録 #-------------------------------------------------------------------------- def element_cancel_item @element_cancel ||= /<#{CANCEL_ACT::WORD5}[::](\S+)>/ =~ note ? $1.to_s.split(/\s*,\s*/).inject([]) {|r,i| r.push(i.to_i)} : [] end #-------------------------------------------------------------------------- # キャンセル確率登録 #-------------------------------------------------------------------------- def cancel_rate @star_cancel_rate ||= /<#{CANCEL_ACT::WORD6}[::](\S+)>/ =~ note ? $1.to_i : 100 end #-------------------------------------------------------------------------- # キャンセルメッセージ登録 #-------------------------------------------------------------------------- def cancel_message @star_cancel_message ||= /<#{CANCEL_ACT::WORD7}[::](\S+)>/ =~ note ? $1.to_s : "" end end