本帖最后由 guoxiaomi 于 2017-2-24 18:25 编辑
我上面的脚本,好像把 sp 写成了 mp,所以应该会报错Orz
再详细说一下吧:
1. 敌人通常情况只会使用【技能1】,消耗 100 SP
2. 在敌人的SP不足 100 时,只会使用【攻击】,有的敌人会使用【技能2】,回复 500 SP
首先修改 Game_Enemy 的 make_action,这是 Game_Enemy 的最后一个方法。因为这是 Game_Enemy 的方法,所以敌人本身用 self 引用。
修改的部分在 第 284-292 行
#-------------------------------------------------------------------------- # ● 生成行动 #-------------------------------------------------------------------------- def make_action # 清除当前行动 self.current_action.clear # 无法行动的情况 unless self.movable? # 过程结束 return end # 抽取现在有效的行动 available_actions = [] rating_max = 0 for action in self.actions # 确认回合条件 n = $game_temp.battle_turn a = action.condition_turn_a b = action.condition_turn_b if (b == 0 and n != a) or (b > 0 and (n < 1 or n < a or n % b != a % b)) next end # 确认 HP 条件 if self.hp * 100.0 / self.maxhp > action.condition_hp next end # 确认等级条件 if $game_party.max_level < action.condition_level next end # 确认开关条件 switch_id = action.condition_switch_id if switch_id > 0 and $game_switches[switch_id] == false next end # ------------------------------------------------------------ # 开关 1 打开时,还需要满足 SP 不足 100 # ------------------------------------------------------------ if switch_id == 1 if self.sp >= 100 next end end # ------------------------------------------------------------ # 符合条件 : 添加本行动 available_actions.push(action) if action.rating > rating_max rating_max = action.rating end end # 最大概率值作为 3 合计计算(0 除外) ratings_total = 0 for action in available_actions if action.rating > rating_max - 3 ratings_total += action.rating - (rating_max - 3) end end # 概率合计不为 0 的情况下 if ratings_total > 0 # 生成随机数 value = rand(ratings_total) # 设置对应生成随机数的当前行动 for action in available_actions if action.rating > rating_max - 3 if value < action.rating - (rating_max - 3) self.current_action.kind = action.kind self.current_action.basic = action.basic self.current_action.skill_id = action.skill_id self.current_action.decide_random_target_for_enemy return else value -= action.rating - (rating_max - 3) end end end end end
#--------------------------------------------------------------------------
# ● 生成行动
#--------------------------------------------------------------------------
def make_action
# 清除当前行动
self.current_action.clear
# 无法行动的情况
unless self.movable?
# 过程结束
return
end
# 抽取现在有效的行动
available_actions = []
rating_max = 0
for action in self.actions
# 确认回合条件
n = $game_temp.battle_turn
a = action.condition_turn_a
b = action.condition_turn_b
if (b == 0 and n != a) or
(b > 0 and (n < 1 or n < a or n % b != a % b))
next
end
# 确认 HP 条件
if self.hp * 100.0 / self.maxhp > action.condition_hp
next
end
# 确认等级条件
if $game_party.max_level < action.condition_level
next
end
# 确认开关条件
switch_id = action.condition_switch_id
if switch_id > 0 and $game_switches[switch_id] == false
next
end
# ------------------------------------------------------------
# 开关 1 打开时,还需要满足 SP 不足 100
# ------------------------------------------------------------
if switch_id == 1
if self.sp >= 100
next
end
end
# ------------------------------------------------------------
# 符合条件 : 添加本行动
available_actions.push(action)
if action.rating > rating_max
rating_max = action.rating
end
end
# 最大概率值作为 3 合计计算(0 除外)
ratings_total = 0
for action in available_actions
if action.rating > rating_max - 3
ratings_total += action.rating - (rating_max - 3)
end
end
# 概率合计不为 0 的情况下
if ratings_total > 0
# 生成随机数
value = rand(ratings_total)
# 设置对应生成随机数的当前行动
for action in available_actions
if action.rating > rating_max - 3
if value < action.rating - (rating_max - 3)
self.current_action.kind = action.kind
self.current_action.basic = action.basic
self.current_action.skill_id = action.skill_id
self.current_action.decide_random_target_for_enemy
return
else
value -= action.rating - (rating_max - 3)
end
end
end
end
end
这样修改后,如果设置敌人行动的出现条件为“开关 1 打开”,则不仅要保证 开关 1 打开,还要保证敌人的 SP < 100,该行动才会生效。
然后设置敌人的行动:
1. 概率为 3 ,无出现条件,释放技能
2. 概率为 6 ,出现条件是开关 1 打开,普通攻击(也可以设置成回蓝魔法)
整体看来是这样:
3. 在战斗开始前,打开开关1
这样就没问题了。由于概率为 6 的技能一定会覆盖掉概率为 3 的技能,所以要这么设置。
话说
敌人行为这里,能不能把菜单加个当敌人mp小于多少多少执行什么操作的选项呢?
修改编辑器是肯定办不到的,但是修改脚本后的等效作用,也可以增加任意的行动出现条件。
例子里就是把原来只要【开关 1 打开】就会执行的行动,变成了【开关 1 打开】且满足【另一个条件】才会执行。
然后设置【另一个条件】为 SP 不足 100。
也就是说, SP >= 100 时此行动不会执行。
# ------------------------------------------------------------ # 开关 1 打开时,还需要满足 SP 不足 100 # ------------------------------------------------------------ if switch_id == 1 if self.sp >= 100 next end end # ------------------------------------------------------------
# ------------------------------------------------------------
# 开关 1 打开时,还需要满足 SP 不足 100
# ------------------------------------------------------------
if switch_id == 1
if self.sp >= 100
next
end
end
# ------------------------------------------------------------
然后在战斗开始前(比如游戏开始时)把【开关 1】打开。由于开关 1 是常开的,如果设置行动的出现条件是【开关 1】打开,就相当于条件是 SP < 100。
不知道这样说清楚了没>_<
# ------------------------------------------------------------ # 开关 1 打开时,还需要满足 SP 不足 100 # ------------------------------------------------------------ if switch_id == 1 if not self.sp < 100 next end end # ------------------------------------------------------------
# ------------------------------------------------------------
# 开关 1 打开时,还需要满足 SP 不足 100
# ------------------------------------------------------------
if switch_id == 1
if not self.sp < 100
next
end
end
# ------------------------------------------------------------
这里用 if not 是不是更好理解?如果不满足【另一个条件】,处理下一个行动。 |