#============================================================================== # ■ RGSS3 エネミー行動条件詳細設定 Ver1.00 by 星潟 #------------------------------------------------------------------------------ # 敵の行動条件を詳細に設定できるようになります。 # スイッチと条件を紐付ける形で判定を行います。 # このスクリプトで用いられるスイッチは # ONとなっている場合でも行動条件にならず # あくまで紐付けられた行動条件を満たしている事が条件となります。 #============================================================================== module EnemyActionSwitch #空の配列と空のハッシュを用意。(変更しないで下さい) C = [] SW = {} #条件個別設定(あくまで例です。適宜変更して下さい) #例.C[0] = {:t => シンボル,:a => 配列} #シンボルの部分に条件として扱うデータの種類のシンボルデータ、 #配列の部分にデータの種類に応じたデータ配列を入れます。 C[0] = {:t => :turn,:a => ["同値",1,2]}#ターン数が1+2*Xの時 C[1] = {:t => :turn,:a => ["以外",2,3]}#ターン数が2+3*Xの時以外 C[2] = {:t => :turn,:a => ["以上",4]}#ターン数が4以上の時 C[3] = {:t => :turn,:a => ["以下",5]}#ターン数が5以下の時 C[4] = {:t => :turn,:a => ["超",6]}#ターン数が6より大きい時 C[5] = {:t => :turn,:a => ["未満",7]}#ターン数が7より小さい時 C[6] = {:t => :hp,:a => ["同値",100,false]}#HPが100%の時(HP〜TPは最後がfalseなら直前の数字%、trueなら直前の数字の値そのままを比較材料として用いる) C[7] = {:t => :hp,:a => ["以外",200,true]}#HPが200以外の時 C[8] = {:t => :hp,:a => ["以上",50,false]}#HPが50%以上の時 C[9] = {:t => :hp,:a => ["以下",50,true]}#HPが50以下の時 C[10] = {:t => :hp,:a => ["超",25,false]}#HPが25%より大きい時 C[11] = {:t => :hp,:a => ["未満",100,true]}#HPが100より小さい時 C[12] = {:t => :mp,:a => ["同値",100,false]}#MPが100%の時(※最大MP0の対象は、常にMP0%扱いなので注意) C[13] = {:t => :mp,:a => ["以外",200,true]}#MPが200以外の時 C[14] = {:t => :mp,:a => ["以上",50,false]}#MPが50%以上の時 C[15] = {:t => :mp,:a => ["以下",50,true]}#MPが50以下の時 C[16] = {:t => :mp,:a => ["超",25,false]}#MPが25%より大きい時 C[17] = {:t => :mp,:a => ["未満",100,true]}#MPが100より小さい時 C[18] = {:t => :tp,:a => ["同値",100,false]}#TPが100%の時 C[19] = {:t => :tp,:a => ["以外",50,true]}#TPが50の時 C[20] = {:t => :tp,:a => ["以上",50,false]}#TPが50%以上の時 C[21] = {:t => :tp,:a => ["以下",50,true]}#TPが50以下の時 C[22] = {:t => :tp,:a => ["超",25,false]}#TPが25%より大きい時 C[23] = {:t => :tp,:a => ["未満",100,true]}#TPが100より小さい時 C[24] = {:t => :state,:a => [5,true]}#ステートID5が付与されている時 C[25] = {:t => :state,:a => [7,false]}#ステートID7が付与されていない時 C[26] = {:t => :buff,:a => [0,"同値",-2]}#最大HPの段階が-2(2段階弱体)の時 C[27] = {:t => :buff,:a => [1,"以外",2]}#最大MPの段階が2(2段階強化)以外の時 C[28] = {:t => :buff,:a => [2,"以上",-1]}#攻撃力の段階が-1(1段階弱体)以上の時 C[29] = {:t => :buff,:a => [3,"以下",1]}#防御力の段階が1(1段階強化)以下の時 C[30] = {:t => :buff,:a => [4,"超",0]}#魔法力の段階が0(強化弱体なし)より大きい時 C[31] = {:t => :buff,:a => [5,"未満",0]}#魔法防御の段階が0(強化弱体なし)より小さい時 C[32] = {:t => :ptlv,:a => ["同値",5]}#パーティレベルが5の時 C[33] = {:t => :ptlv,:a => ["以外",10]}#パーティレベルが10以外の時 C[34] = {:t => :ptlv,:a => ["以上",15]}#パーティレベルが15以外の時 C[35] = {:t => :ptlv,:a => ["以下",20]}#パーティレベルが20以下の時 C[36] = {:t => :ptlv,:a => ["超",25]}#パーティレベルが25より大きい時 C[37] = {:t => :ptlv,:a => ["未満",30]}#パーティレベルが30より小さい時 C[38] = {:t => :switch,:a => [5,true]}#スイッチID5がONの時 C[39] = {:t => :switch,:a => [10,false]}#スイッチID10がOFFの時 C[40] = {:t => :variables,:a => [5,"同値",0]}#変数ID5が0の時 C[41] = {:t => :variables,:a => [10,"以外",1]}#変数ID10が1以外の時 C[42] = {:t => :variables,:a => [15,"以上",2]}#変数ID15が2以上の時 C[43] = {:t => :variables,:a => [20,"以下",3]}#変数ID20が3以下の時 C[44] = {:t => :variables,:a => [25,"超",4]}#変数ID25が4より大きい時 C[45] = {:t => :variables,:a => [30,"未満",5]}#変数ID30が5より小さい時 C[46] = {:t => :script,:a => ["$game_party.members.include?($game_actors[1])"]}#パーティメンバーにアクターID1がいる。 C[47] = {:t => :script,:a => ["$game_party.agi > $game_troop.agi"]}#パーティの敏捷平均値より敵グループの敏捷平均値が大きい時。 C[48] = {:t => :script,:a => ["$game_party.members.size > 2"]}#パーティ人数が2人より多い時。 #スイッチ別条件統合(あくまで例です。適宜変更して下さい) #例.SW[101] = [0,8] #行動条件としてスイッチID101を指定した場合、条件個別設定の0と8を条件とします。 SW[101] = [0,8]#スイッチID101の場合、ターン数が1+2*X、HPが50%以上の条件となる。 SW[102] = [6,12,18]#スイッチID102の場合、HP、MP、TPが全て100%という条件となる。 SW[103] = [24,25]#スイッチID103の場合、ステートID5が付与されており、ステートID7が付与されていないという条件となる。 end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # 戦闘行動の作成 #-------------------------------------------------------------------------- alias make_actions_action_switch make_actions def make_actions @eas_ok_hash = {} make_actions_action_switch @eas_ok_hash = nil end #-------------------------------------------------------------------------- # 行動条件合致判定[スイッチ] #-------------------------------------------------------------------------- alias conditions_met_switch_action_switch? conditions_met_switch? def conditions_met_switch?(param1, param2) return true if @eas_ok_hash && @eas_ok_hash[param1] if EnemyActionSwitch::SW[param1] return true if eas_check(param1) else conditions_met_switch_action_switch?(param1, param2) end end #-------------------------------------------------------------------------- # スイッチ条件チェック #-------------------------------------------------------------------------- def eas_check(sid) h = EnemyActionSwitch::SW[sid] f = h && eas_check_detail(h) @eas_ok_hash[sid] = f if @eas_ok_hash f end #-------------------------------------------------------------------------- # スイッチ条件判定 #-------------------------------------------------------------------------- def eas_check_detail(a) a.each {|i| x = EnemyActionSwitch::C[i] type = 0 v = x[:a] case x[:t] when :script ;v.each {|s| return false unless eval(s)} when :turn ;return false unless eas_comparison(v[0],false,$game_troop.turn_count,v[1],v[2]) when :hp ;d = (v[2] ? hp : hp_rate * 100).to_i ;type = 3 when :mp ;d = (v[2] ? mp : mp_rate * 100).to_i ;type = 3 when :tp ;d = (v[2] ? tp : tp / max_tp * 100).to_i;type = 3 when :state ;d = state?(v[0]) ;type = 2 when :buff ;d = @buffs[v[0]] ;type = 1 when :ptlv ;d = $game_party.highest_level ;type = 3 when :switch ;d = $game_switches[v[0]] ;type = 2 when :variables;d = $game_variables[v[0]] ;type = 1 end case type when 1;return false unless eas_comparison(v[1],true,d,v[2]) when 2;return false unless d == v[1] when 3;return false unless eas_comparison(v[0],true,d,v[1]) end } true end #-------------------------------------------------------------------------- # 比較処理 #-------------------------------------------------------------------------- def eas_comparison(ctype,dtype,d1,d2,d3 = nil) case ctype when "同値";return false unless dtype ? (d1 == d2) : conditions_met_turns?(d2, (d3 ? d3 : 0)) when "以外";return false if dtype ? (d1 == d2) : conditions_met_turns?(d2, (d3 ? d3 : 0)) when "以上";return false unless d1 >= d2 when "以下";return false unless d1 <= d2 when "超" ;return false unless d1 > d2 when "未満";return false unless d1 < d2 end true end end