#============================================================================== # ■ RGSS3 特殊身代わり特徴 Ver1.01 by 星潟 #------------------------------------------------------------------------------ # デフォルトの身代わりと異なり # 多様な条件で身代わりを発生させる特徴を作成できるようになります。 #------------------------------------------------------------------------------ # ★設定例(特徴を有する項目のメモ欄を使用します) # aが庇う者、bが庇われる者、cが行動者(アイテム/スキルの使用者)となります。 #------------------------------------------------------------------------------ # <特殊身代わり:true> # # 全ての攻撃に対して身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:a.enemy?&&c.actor?> # <特殊身代わり:a.actor?&&c.enemy?> # # 自分にとっての敵の行動であれば身代わりを発生させます。 # (アクターであればエネミー、エネミーであればアクター) #------------------------------------------------------------------------------ # <特殊身代わり:b.actor?&&b.id==2> # # 対象がアクターID2のアクターである場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:b.enemy?&&b.enemy_id==50> # # 対象がエネミーID50のエネミーである場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:b.enemy?&&b.enemy_id!=a.enemy_id> # # 対象が自分と異なるエネミーIDのエネミーである場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:a.hp_rate*100>=50&&b.hp_rate*100<=50> # # 自分のHPが50%以上であり、対象のHPが50%以下の場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:a.hp>b.hp> # # 自分のHPが対象のHPより高い場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:a.tp>=50> # # 自分のTPが50以上の場合、身代わりを発生させます。 #------------------------------------------------------------------------------ # <特殊身代わり:b.actor?&&b.id==3&&$game_variables[10]-100>=rand(100)> # # 対象がアクターID3のアクターである場合、 # 変数10の値から100を引いた値%分の確率で身代わりを発生させます。 #============================================================================== module EXTRA_SUBSTITUTE #特殊身代わり設定用のキーワードを指定。 WORD = "特殊身代わり" #命中タイプ:必中のアイテム/スキルについては判定を行わないようにするか? #trueで行わない。falseで行う。 #falseの場合は、追加で条件を加えなければ #防御等に対しても行う為、設定が非常に複雑化します。true推奨。 CERT = true #行動不能の場合は判定を行わないようにするか? #trueで行わない。falseで行う。 #falseの場合は、追加で条件を加えなければ #戦闘不能でも身代わりを行う為、設定が非常に複雑化します。true推奨。 UNMO = true end class Game_Temp attr_accessor :extra_substitute_character end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # 身代わり可能か否かの基本判定 #-------------------------------------------------------------------------- def check_substitute_base_conditions(item) #命中タイプや行動不能状態の情報を元に結果を返す。 !(EXTRA_SUBSTITUTE::CERT && item.certain?) && !(EXTRA_SUBSTITUTE::UNMO && !movable?) end #-------------------------------------------------------------------------- # 身代わり可能か否かの取得 #-------------------------------------------------------------------------- def extra_substitute_enable?(b, item, c) #自分用データを用意。 a = self #条件を判定し、満たすものがあればtrueを返す。 extra_substitute_condition.any? {|d| eval(d)} end #-------------------------------------------------------------------------- # 身代わり条件の取得 #-------------------------------------------------------------------------- def extra_substitute_condition #各特徴から条件を取得。 feature_objects.inject([]) {|r,f| r += f.extra_substitute_condition} end end class Game_Unit #-------------------------------------------------------------------------- # 身代わりバトラーの取得 #-------------------------------------------------------------------------- alias substitute_battler_extra_substitute substitute_battler def substitute_battler #身代わりバトラーが指定されていない場合は通常の処理を行う。 #指定されている場合はそのバトラーを返す。 $game_temp.extra_substitute_character != nil ? $game_temp.extra_substitute_character : substitute_battler_extra_substitute end end class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # 身代わりの適用 #-------------------------------------------------------------------------- alias apply_substitute_extra_substitute apply_substitute def apply_substitute(target, item) #本来の処理の結果を取得する。 result = apply_substitute_extra_substitute(target, item) #身代わりバトラーデータを消去する。 $game_temp.extra_substitute_character = nil #本来の処理の結果を返す。 result end #-------------------------------------------------------------------------- # 身代わり条件チェック #-------------------------------------------------------------------------- alias check_substitute_extra_substitute check_substitute def check_substitute(target, item) #アイテムが存在する場合のみ分岐。 if item #仲間キャラクターの中の先頭から順に判定。 target.friends_unit.members.each {|m| #基本条件を満たさない場合は飛ばす。 next unless m.check_substitute_base_conditions(item) #身代わり条件を満たすかどうかを判定し #満たす場合はそのキャラクターを身代わりバトラーとして処理を中断。 if m.extra_substitute_enable?(target, item, @subject) $game_temp.extra_substitute_character = m return true end} end #本来の処理を実行。 check_substitute_extra_substitute(target, item) end end class RPG::BaseItem #-------------------------------------------------------------------------- # 身代わり条件 #-------------------------------------------------------------------------- def extra_substitute_condition #キャッシュが存在する場合はキャッシュを返す。 @extra_substitute_condition ||= create_extra_substitute_condition end def create_extra_substitute_condition #空の配列を作成。 a = [] #メモ欄の各行からデータを取得。 w = EXTRA_SUBSTITUTE::WORD self.note.each_line {|l| a.push($1.to_s) if /<#{w}[::](\S+)>/ =~ l} #データを返す。 a end end