#============================================================================== # ■ RGSS3 行動強制封印特徴 Ver1.01 by 星潟 #------------------------------------------------------------------------------ # コマンドを選択しても一定確率で # 行動を行えなくする特徴を作成できるようになります。 # また、その効果に耐性を持たせる特徴と # 特定アイテム・スキルを使用した場合のみ耐性を持たせられるように出来ます。 #============================================================================== # 特徴を有する項目のメモ欄で記述。 #------------------------------------------------------------------------------ # <行動強制封印:1,50> # # この特徴を有する場合、行動封印タイプ1と判定される。 # 50%の確率で行動不能になる。 #------------------------------------------------------------------------------ # <行動強制封印時メッセージ:は動けない!> # # この特徴で行動強制封印が発生した場合 # バトルログに「***は動けない!」と表示される。 # ***は行動不能者名。 #------------------------------------------------------------------------------ # <行動強制封印時アニメーションID:60> # # この特徴で行動強制封印が発生した場合 # バトルログへの表示の後、指定IDのアニメーションが実行される。 #============================================================================== # 特徴を有する項目、もしくはアイテム・スキルのメモ欄で記述。 #------------------------------------------------------------------------------ # <行動強制封印耐性:1,50> # # このように記述されている場合 # 行動封印タイプ1の行動強制封印特徴に対して50%の耐性を得ます。 # 某モンスターをボールで捕獲して戦うゲームの「いびき」や「ねごと」等のような # 行動不能状態異常の中でも使用できる、といったスキルを実装出来ます。 # # 例.<行動強制封印:1,50>と<行動強制封印耐性:1,50>の場合 # 50%×50%で25%の行動封印となる。 # # 例.<行動強制封印:2,1000>と<行動強制封印耐性:2,100>の場合 # 1000%×0%で0%の行動封印となる。 # # 例.<行動強制封印:1,1000>と<行動強制封印耐性:2,100>の場合 # 対象のタイプが異なる為、耐性は機能しない。 # 1000%×100%で100%の行動封印となる。 #============================================================================== module ActionBreakFeature #行動強制封印の設定用キーワードを指定。 Word1 = "行動強制封印" #行動強制封印時メッセージの設定用キーワードを指定。 Word2 = "行動強制封印時メッセージ" #行動強制封印時アニメーションIDの設定用キーワードを指定。 Word3 = "行動強制封印時アニメーションID" #行動強制封印耐性の設定用キーワードを指定。 Word4 = "行動強制封印耐性" #行動強制封印時アニメーション実行中のウェイトを有効にするかを指定。 #trueで有効。falseで無効。 AWait = true #実装形式を変更。 #trueでexecute_action。falseでuse_itemをエイリアスする。 #何らかの競合が発生した場合のみ変更して下さい。 #ひょっとすると競合を回避できるかもしれません。 Type = false #耐性計算形式を変更。 #trueで加算、falseで乗算。 CalT = true end class RPG::BaseItem #-------------------------------------------------------------------------- # 行動不能発生率 #-------------------------------------------------------------------------- def action_break_feature_rate @action_break_feature_rate ||= /<#{ActionBreakFeature::Word1}[::](\d+),(\S+)>/ =~ note ? [$1.to_i,$2.to_s] : [] end #-------------------------------------------------------------------------- # 行動不能時テキスト #-------------------------------------------------------------------------- def action_break_feature_text @action_break_feature_text ||= /<#{ActionBreakFeature::Word2}[::](\S+)>/ =~ note ? $1.to_s : "" end #-------------------------------------------------------------------------- # 行動不能時アニメーションID #-------------------------------------------------------------------------- def action_break_feature_animation_id @action_break_feature_animation_id ||= /<#{ActionBreakFeature::Word3}[::](\d+)>/ =~ note ? $1.to_i : 0 end #-------------------------------------------------------------------------- # 行動不能時テキスト・アニメーションIDの配列 #-------------------------------------------------------------------------- def action_break_feature_array [action_break_feature_text,action_break_feature_animation_id] end #-------------------------------------------------------------------------- # 行動不能無効率 #-------------------------------------------------------------------------- def action_break_feature_void_rate @action_break_feature_void_rate ||= create_action_break_feature_void_rate end #-------------------------------------------------------------------------- # 行動不能無効率データ作成 #-------------------------------------------------------------------------- def create_action_break_feature_void_rate h = {} note.each_line {|l| h[$1.to_i] = $2.to_s if /<#{ActionBreakFeature::Word4}[::](\d+),(\S+)>/ =~ l} h end end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # 行動不能をチェックし、更にテキストとアニメーションIDを返す #-------------------------------------------------------------------------- def action_break_feature_check(item) h = {} fo = feature_objects (fo + [item]).each {|f| f.action_break_feature_void_rate.each {|k,v| h[k] ||= 100 if ActionBreakFeature::CalT h[k] -= eval(v) else h[k] *= (100 - eval(v)).to_f / 100 end}} fo.each {|f| r = f.action_break_feature_rate if !r.empty? if eval(r[1]) * (h[r[0]] ? h[r[0]] : 100).to_f / 100 > rand(100) return f.action_break_feature_array end end } nil end end class Scene_Battle if ActionBreakFeature::Type #-------------------------------------------------------------------------- # 戦闘行動の実行 #-------------------------------------------------------------------------- alias execute_action_action_break_feature_rate execute_action def execute_action if @subject.current_action && @subject.current_action.item n = @subject.action_break_feature_check(@subject.current_action.item) if n @log_window.display_action_break_feature(@subject, n[0]) @subject.animation_id = n[1] if n[1] > 0 wait_for_animation if ActionBreakFeature::AWait @log_window.wait_and_clear return end end execute_action_action_break_feature_rate end else #-------------------------------------------------------------------------- # スキル/アイテムの使用 #-------------------------------------------------------------------------- alias use_item_action_break_feature_rate use_item def use_item if @subject.current_action && @subject.current_action.item n = @subject.action_break_feature_check(@subject.current_action.item) if n @log_window.display_action_break_feature(@subject, n[0]) @subject.animation_id = n[1] if n[1] > 0 wait_for_animation if ActionBreakFeature::AWait @log_window.wait_and_clear return end end use_item_action_break_feature_rate end end end class Window_BattleLog < Window_Selectable #-------------------------------------------------------------------------- # 行動不能の表示 #-------------------------------------------------------------------------- def display_action_break_feature(target, n) if !n.empty? add_text(sprintf("%s" + n,target.name)) wait end end end