#==============================================================================
# ■ エネミーアクションβ ver.1.03 byスウ
#------------------------------------------------------------------------------
# エネミーの行動精度を向上させるスクリプトです。
# XP用スクリプト「エネミーターゲット」のVXver.。
# 導入すれば、アイディア次第で多様な行動パターンを構築することが可能になります。
# ここで設定されたエネミーはターン中の状況を加味して行動を実行に移します。
# 行動条件の種類などは以下参照。
# 結構な数の行動条件を用意したつもりですが、まだ増やしたいという場合は
# 244行目の「行動条件分岐」あたりに新たな項目やメソッドを追加してください。
# (スクリプト操れる方は簡単に増やせると思います)
#
#
# 【行動条件】(数値に+1000すれば「味方」が「敵」に入れかわります)
# 1.味方1人のHPが10%以下の時、その味方に対して(↓以下略)
# 2.味方1人のHPが20%以下
# 3.味方1人のHPが30%以下
# 4.味方1人のHPが40%以下
# 5.味方1人のHPが50%以下
# 6.味方1人のHPが60%以下
# 7.味方1人のHPが70%以下
# 8.味方1人のHPが80%以下
# 9.味方1人のHPが90%以下
# 10.味方1人のHPが100%以下
# 11.味方の平均HPが10%以下の時、そのグループに対して(↓以下略)
# 12.味方の平均HPが20%以下
# 13.味方の平均HPが30%以下
# 14.味方の平均HPが40%以下
# 15.味方の平均HPが50%以下
# 16.味方の平均HPが60%以下
# 17.味方の平均HPが70%以下
# 18.味方の平均HPが80%以下
# 19.味方の平均HPが90%以下
# 20.味方の平均HPが100%以下
# 21.味方1人のHPが10%以上の時、その味方に対して(↓以下略)
# 22.味方1人のHPが20%以上
# 23.味方1人のHPが30%以上
# 24.味方1人のHPが40%以上
# 25.味方1人のHPが50%以上
# 26.味方1人のHPが60%以上
# 27.味方1人のHPが70%以上
# 28.味方1人のHPが80%以上
# 29.味方1人のHPが90%以上
# 30.味方1人のHPが100%
# 31.味方がステートID1状態でない時、その味方に対して(↓以下略)
# 32.味方がステートID2状態でない
# 33.味方がステートID3状態でない
# 34.味方がステートID4状態でない
# 35.味方がステートID5状態でない
# 36.味方がステートID6状態でない
# 37.味方がステートID7状態でない
# 38.味方がステートID8状態でない
# 39.味方がステートID9状態でない
# 40.味方がステートID10状態でない
# 41.味方がステートID11状態でない
# 42.味方がステートID12状態でない
# 43.味方がステートID13状態でない
# 44.味方がステートID14状態でない
# 45.味方がステートID15状態でない
# 46.味方がステートID16状態でない
# 47.味方がステートID1状態
# 48.味方がステートID2状態
# 49.味方がステートID3状態
# 50.味方がステートID4状態
# 51.味方がステートID5状態
# 52.味方がステートID6状態
# 53.味方がステートID7状態
# 54.味方がステートID8状態
# 55.味方がステートID9状態
# 56.味方がステートID10状態
# 57.味方がステートID11状態
# 58.味方がステートID12状態
# 59.味方がステートID13状態
# 60.味方がステートID14状態
# 61.味方がステートID15状態
# 62.味方がステートID16状態
# 63.属性ID1に弱い味方がいる
# 64.属性ID2に弱い味方がいる
# 65.属性ID3に弱い味方がいる
# 66.属性ID4に弱い味方がいる
# 67.属性ID5に弱い味方がいる
# 68.属性ID6に弱い味方がいる
# 69.属性ID7に弱い味方がいる
# 70.属性ID8に弱い味方がいる
# 71.属性ID9に弱い味方がいる
# 72.属性ID10に弱い味方がいる
# 73.属性ID11に弱い味方がいる
# 74.属性ID12に弱い味方がいる
# 75.属性ID13に弱い味方がいる
# 76.属性ID14に弱い味方がいる
# 77.属性ID15に弱い味方がいる
# 78.属性ID16に弱い味方がいる
# 79.ステートID1に弱い味方がいる
# 80.ステートID2に弱い味方がいる
# 81.ステートID3に弱い味方がいる
# 82.ステートID4に弱い味方がいる
# 83.ステートID5に弱い味方がいる
# 84.ステートID6に弱い味方がいる
# 85.ステートID7に弱い味方がいる
# 86.ステートID8に弱い味方がいる
# 87.ステートID9に弱い味方がいる
# 88.ステートID10に弱い味方がいる
# 89.ステートID11に弱い味方がいる
# 90.ステートID12に弱い味方がいる
# 91.ステートID13に弱い味方がいる
# 92.ステートID14に弱い味方がいる
# 93.ステートID15に弱い味方がいる
# 94.ステートID16に弱い味方がいる
# 95.属性ID1に強い味方がいる
# 96.属性ID2に強い味方がいる
# 97.属性ID3に強い味方がいる
# 98.属性ID4に強い味方がいる
# 99.属性ID5に強い味方がいる
# 100.属性ID6に強い味方がいる
# 101.属性ID7に強い味方がいる
# 102.属性ID8に強い味方がいる
# 103.属性ID9に強い味方がいる
# 104.属性ID10に強い味方がいる
# 105.属性ID11に強い味方がいる
# 106.属性ID12に強い味方がいる
# 107.属性ID13に強い味方がいる
# 108.属性ID14に強い味方がいる
# 109.属性ID15に強い味方がいる
# 110.属性ID16に強い味方がいる
# 111.ステートID1に強い味方がいる
# 112.ステートID2に強い味方がいる
# 113.ステートID3に強い味方がいる
# 114.ステートID4に強い味方がいる
# 115.ステートID5に強い味方がいる
# 116.ステートID6に強い味方がいる
# 117.ステートID7に強い味方がいる
# 118.ステートID8に強い味方がいる
# 119.ステートID9に強い味方がいる
# 120.ステートID10に強い味方がいる
# 121.ステートID11に強い味方がいる
# 122.ステートID12に強い味方がいる
# 123.ステートID13に強い味方がいる
# 124.ステートID14に強い味方がいる
# 125.ステートID15に強い味方がいる
# 126.ステートID16に強い味方がいる
# 127.Index1(隊列1番目)の味方がいる
# 128.Index1(隊列2番目)の味方がいる
# 129.Index1(隊列3番目)の味方がいる
# 130.Index1(隊列4番目)の味方がいる
# 131.Index1(隊列5番目)の味方がいる
# 132.Index1(隊列6番目)の味方がいる
# 133.Index1(隊列7番目)の味方がいる
# 134.Index1(隊列8番目)の味方がいる
# 135.味方が「防御」状態
# 136.味方が「防御」状態でない
# 137.スキルを発動する味方がいる
# 138.スキルを発動する味方がいない
# 139.アイテムを使用する味方がいる
# 140.アイテムを使用する味方がいない
# 141.味方1人のMPが10%以下
# 142.味方1人のMが20%以下
# 143.味方1人のMPが30%以下
# 144.味方1人のMPが40%以下
# 145.味方1人のMPが50%以下
# 146.味方1人のMPが60%以下
# 147.味方1人のMPが70%以下
# 148.味方1人のMPが80%以下
# 149.味方1人のMPが90%以下
# 150.味方1人のMPが100%以下
# 151.味方1人のMPが10%以上
# 152.味方1人のMPが20%以上
# 153.味方1人のMPが30%以上
# 154.味方1人のMPが40%以上
# 155.味方1人のMPが50%以上
# 156.味方1人のMPが60%以上
# 157.味方1人のMPが70%以上
# 158.味方1人のMPが80%以上
# 159.味方1人のMPが90%以上
# 160.味方1人のMPが100%
#
# ※ターゲットがデータベースと不一致の場合
# (例:カスタマイズの対象設定が味方で、データベースの対象設定が敵)は
# データベースにあわせるようになっています。
# 例えば通常攻撃に"1001"を設定した時はHP10%以下の敵に行動を起こしますが、
# 通常攻撃に"1"を設定した時は、対象が自動的に敵に変更されます。
# この場合、ターゲットはランダム決定になります。
#
#
# 【行動内容】
# 1〜10.各優先度の値の行動をランダムで選択します。(例:2→優先度2の行動をランダムで選択)
# 〜-1.数値の絶対値のIDスキルを選択します(例:-5→ID5のスキルを選択)
#
# ※負の数で指定されたスキルは、データベースリスト未記載でも発動します。
#
#
#
#
# 再定義:なし
# 導入法:RGSS2の素材欄にコピペし、カスタマイズポイントで数値設定。
# 履 歴:2008年3月作成
#==============================================================================
#==============================================================================
# ★ カスタマイズポイント
#==============================================================================
module Neo_Enemy
# エネミーアクション(ID=>[[行動条件,行動内容(優先値)],[行動条件,行動内容]...])
# ※左のパターンから順に行動判定を行います(無限にパターン増殖可能)
ACT = {
1=>[[6, -33],[1029, 12]],
# ↑エネミーID1の行動設定[HP60%以下の味方にヒール、HP90%以上の敵に優先度5の行動、それ以外は通常攻撃]
2=>[]}
# ↑エネミーID2の行動設定なし=通常攻撃のみ
end
#==============================================================================
class Scene_Battle < Scene_Base
include Neo_Enemy
#--------------------------------------------------------------------------
# ● 行動直前の状況認識・行動修正
#--------------------------------------------------------------------------
alias setting_battler execute_action
def execute_action
if !@active_battler.actor?
@active_battler.make_action2 if ACT[@active_battler.enemy_id] != nil
end
setting_battler
end
end
class Game_Enemy < Game_Battler
include Neo_Enemy
alias neo_action_initialize initialize
def initialize(index, enemy_id)
neo_action_initialize(index,enemy_id)
make_skill if ACT[@enemy_id] != nil
end
#--------------------------------------------------------------------------
# ● 行動先行抽出(ターン中の負担カット)
#--------------------------------------------------------------------------
def make_skill
@skills = [[],[],[],[],[],[],[],[],[],[]]
for i in enemy.actions
@skills[i.rating - 1].push(i)
end
@skills.reverse!
end
#--------------------------------------------------------------------------
# ● デフォルト行動処理短縮(登録エネミーの場合は処理を省く)
#--------------------------------------------------------------------------
alias old_make_action make_action
def make_action
if ACT[@enemy_id] != nil
@action.set_attack
return
end
old_make_action
end
#--------------------------------------------------------------------------
# ● 新しい行動の作成(登録エネミーのみの処理)
#--------------------------------------------------------------------------
def make_action2
@action.clear
return unless movable?
@target = nil
@targets = sp_actions = []
sp_actions = ACT[@enemy_id].dup # 行動パターン配列の取得
loop do
u_act, @flug = nil, false
if sp_actions.size == 0
@action.set_attack
break
end
action01(sp_actions[0][0])
u_act = sp_actions[0][1] if @flug == true
if u_act != nil && @flug == true
action_decide(u_act) if u_act > 0
skills_decide(u_act.abs) if u_act < 0
end
sp_actions.shift
break if (@action.kind != 0 || @action.basic != -1)
end
if @target == nil
@action.decide_random_target
else
@action.target_index = @target
end
end
#--------------------------------------------------------------------------
# ● 行動種の決定(処理効率の関係上、10 - rating = 逆レーティングを使用)
#--------------------------------------------------------------------------
def action_decide(rating)
wait_action = []
for i in @skills[10 - rating]
next unless conditions_met?(i)
next unless skill_can_use?($data_skills[i.skill_id])
wait_action.push i
end
return if wait_action == []
d_act = wait_action[rand(wait_action.size - 1)]
@action.kind = d_act.kind
@action.basic = d_act.basic
@action.skill_id = d_act.skill_id
if @kind == 1
return if d_act.for_opponent? && rating < 1001
return if d_act.for_friend? && rating > 1000
get_target(@action)
end
end
#--------------------------------------------------------------------------
# ● 使用スキルの決定
#--------------------------------------------------------------------------
def skills_decide(id)
skill = $data_skills[id]
if skill_can_use?(skill)
@action.set_skill(id)
get_target(skill)
end
end
def get_target(action)
if action.for_one? && !action.for_user? && @target != []
@target = @targets[rand(@targets.size - 1)]
end
end
#--------------------------------------------------------------------------
# ● 行動条件分岐
#--------------------------------------------------------------------------
def action01(act)
# 条件分岐
case act
when 1..10
la_hp($game_troop.existing_members, act * 10, 1)
when 11..20
las_hp($game_troop.existing_members, (act % 10) * 10)
when 21..30
la_hp($game_troop.existing_members, (act % 10) * 10, 2)
when 31..46
el_state($game_troop.existing_members, act - 30, 2)
when 47
el_state($game_troop.dead_members, act - 46, 1)
when 48..62
el_state($game_troop.existing_members, act - 46, 1)
when 63..78
el_element($game_troop.existing_members, act - 62, 1)
when 79..94
el_state_rank($game_troop.existing_members, act - 78, 1)
when 95..110
el_element($game_troop.existing_members, act - 94, 2)
when 111..126
el_state_rank($game_troop.existing_members, act - 110, 2)
when 127..134
unit_indexa($game_troop.existing_members, act - 126)
when 135, 136
la_action($game_troop.existing_members, 1, act - 134)
when 137, 138
la_action($game_troop.existing_members, 2, act - 136)
when 139, 140
la_action($game_troop.existing_members, 3, act - 138)
when 141..150
la_mp($game_party.existing_members, (act % 10) * 10, 1)
@targets = []
when 151..160
la_mp($game_party.existing_members, (act % 10) * 10, 2)
@targets = []
when 1001..1010
la_hp($game_party.existing_members, (act % 10) * 10, 1)
when 1011..1020
las_hp($game_party.existing_members, (act % 10) * 10)
when 1021..1030
la_hp($game_party.existing_members, (act % 10) * 10, 2)
when 1031..1046
el_state($game_party.existing_members, act - 1030, 2)
when 1047
el_state($game_party.dead_members, act - 1046, 1)
when 1048..1062
el_state($game_party.existing_members, act - 1046, 1)
when 1063..1078
el_element($game_party.existing_members, act - 1062, 1)
when 1079..1094
el_state_rank($game_party.existing_members, act - 1078, 1)
when 1095..1110
el_element($game_party.existing_members, act - 1094, 2)
when 1111..1126
el_state_rank($game_party.existing_members, act - 1110, 2)
when 1127..1134
unit_indexa($game_party.existing_members, act - 1126)
when 1135, 1136
la_action($game_party.existing_members, 1, act - 1134)
when 1137, 1138
la_action($game_party.existing_members, 2, act - 1136)
when 1139, 1140
la_action($game_party.existing_members, 3, act - 1138)
when 1141..1150
la_mp($game_troop.existing_members, (act % 10) * 10, 1)
@targets = []
when 1151..1160
la_mp($game_troop.existing_members, (act % 10) * 10, 2)
@targets = []
end
end
#--------------------------------------------------------------------------
# ● 単体HP情報解析(グループ,数値, a = 1:以下 or a = 2:以上)
#--------------------------------------------------------------------------
def la_hp(unit, n, a)
n = 100 if n == 0
for i in unit
@targets.push i.index if i.hp <= i.maxhp * n / 100 && a == 1
@targets.push i.index if i.hp >= i.maxhp * n / 100 && a == 2
end
@flug = true if @targets.size != 0
end
#--------------------------------------------------------------------------
# ● 単体MP情報解析(グループ,数値, a = 1:以下 or a = 2:以上)
#--------------------------------------------------------------------------
def la_mp(unit, n, a)
n = 100 if n == 0
for i in unit
next if i.mp == 0
@targets.push i.index if i.mp <= i.maxmp * n / 100 && a == 1
@targets.push i.index if i.mp >= i.maxmp * n / 100 && a == 2
end
@flug = true if @targets.size != 0
end
#--------------------------------------------------------------------------
# ● 複数HP情報解析(グループ,数値)
#--------------------------------------------------------------------------
def las_hp(unit, n)
n = 100 if n == 0
a = b = 0
for i in unit
a += i.hp
b += i.maxhp
end
@flug = true if a <= b * n / 100
end
#--------------------------------------------------------------------------
# ● ステート付与情報解析(グループ,ID, a = 1:付与 or a = 2:NONE)
#--------------------------------------------------------------------------
def el_state(unit, n, a)
for i in unit
@targets.push i.index if i.state?(n) && a == 1
@targets.push i.index if !i.state?(n) && a == 2
@flug = true if @targets.size != 0
end
end
#--------------------------------------------------------------------------
# ● 属性情報解析(グループ,ID, a = 1:弱点 or a = 2:耐性)
#--------------------------------------------------------------------------
def el_element(unit, n, a)
for i in unit
@targets.push i.index if i.element_rate(n) > 100 && a == 1
@targets.push i.index if i.element_rate(n) < 100 && a == 2
end
@flug = true if @targets.size != 0
end
#--------------------------------------------------------------------------
# ● ステート耐性情報解析(グループ,ID, a = 1:弱点 or a = 2:耐性)
#--------------------------------------------------------------------------
def el_state_rank(unit, n ,a)
for i in unit
@targets.push i.index if i.state_probability(n) > 60 && a == 1
@targets.push i.index if i.state_probability(n) < 60 && a == 2
end
@flug = true if @targets.size != 0
end
#--------------------------------------------------------------------------
# ● 隊列情報解析(グループ,数値)
#--------------------------------------------------------------------------
def unit_indexa(unit, n)
@targets.push unit[n - 1].index if unit[n - 1] != nil
@flug = true if @targets.size != 0
end
#--------------------------------------------------------------------------
# ● 行動情報解析(グループ,k = 1:防御・2:スキル・3:アイテム, a = 1:SI or a= 2:NO)
#--------------------------------------------------------------------------
def la_action(unit, k, a)
for i in unit
if a == 1
@targets.push i.index if i.action.guarding? && k == 1
@targets.push i.index if i.action.skill? && k == 2
@targets.push i.index if i.action.item? && k == 3
else
@targets.push i.index if !i.action.guarding? && k == 1
@targets.push i.index if !i.action.skill? && k == 2
@targets.push i.index if !i.action.item? && k == 3
end
end
@flug = true if @targets.size != 0
end
end