本帖最后由 guoxiaomi 于 2017-2-25 14:18 编辑
我想到了一个方法是,让敌人使用物品,此物品能回复全体敌人的SP值,但是物品有属性,比如物品自带属性“ ...
试了试还是可以的,同样是修改 Game_Enemy 的 make_action。因为就是这个方法决定了敌人的行动嘛。看下面这个脚本的第 62-72 行。
#-------------------------------------------------------------------------- # ● 生成行动 #-------------------------------------------------------------------------- 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 # 符合条件 : 添加本行动 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 # ------------------------------------------------------------ # 在返回行动前做出修改 # ------------------------------------------------------------ # 此技能标记了属性 17 时 if $data_skills[action.skill_id].element_set.include?(17) # 更改为使用 物品 self.current_action.kind = 2 # 物品 ID 设置为 技能 ID self.current_action.item_id = action.skill_id end # ------------------------------------------------------------ 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
# 符合条件 : 添加本行动
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
# ------------------------------------------------------------
# 在返回行动前做出修改
# ------------------------------------------------------------
# 此技能标记了属性 17 时
if $data_skills[action.skill_id].element_set.include?(17)
# 更改为使用 物品
self.current_action.kind = 2
# 物品 ID 设置为 技能 ID
self.current_action.item_id = action.skill_id
end
# ------------------------------------------------------------
return
else
value -= action.rating - (rating_max - 3)
end
end
end
end
end
使用物品效果的方法在Scene_Battle 4 # make_item_action_result,这里面会检查物品是否被用完,以及如果消耗品会损失物品的情况。下面要修改“检查物品是否被用完”的部分,使得如果是敌人则不用检测。
def make_item_action_result # 获取物品 @item = $data_items[@active_battler.current_action.item_id] # 因为物品耗尽而无法使用的情况下 unless $game_party.item_can_use?(@item.id) || @active_battler.is_a?(Game_Enemy) # 移至步骤 1 @phase4_step = 1 return end # 消耗品的情况下 if @item.consumable # 使用的物品减 1 $game_party.lose_item(@item.id, 1) end ... ...
def make_item_action_result
# 获取物品
@item = $data_items[@active_battler.current_action.item_id]
# 因为物品耗尽而无法使用的情况下
unless $game_party.item_can_use?(@item.id) || @active_battler.is_a?(Game_Enemy)
# 移至步骤 1
@phase4_step = 1
return
end
# 消耗品的情况下
if @item.consumable
# 使用的物品减 1
$game_party.lose_item(@item.id, 1)
end
...
...
请注意,这个方法很可能被重写过!试着全局搜索一下:
- def make_item_action_result
复制代码
如果出现多次,在最后一次出现的地方,找到unless $game_party.item_can_use?(@item.id)在后面加上上面第 5 行 || 和后面的内容。
- || @active_battler.is_a?(Game_Enemy)
复制代码
然后在【数据库-系统】里添加一个属性:17 - 敌人技能->物品。技能的属性设置要勾上属性 17,这样在使用此技能时,会变成使用相同 ID 的物品。
个人认为,给每个人敌人单独设计技能对应的物品不是很大的开销,而且这样对脚本的改动很小。
此外要注意的是:
1. 技能的范围要和对应物品的范围设为一样。注意:敌人对敌人使用,是“己方单体”。
2. 物品设置为不消耗(否则真的会消耗背包里的物品),其他正常设置。
3. 显示物品名称,播放物品动画并且执行物品附带公共事件。
如果现有的技能物品已经重叠了,可以类似这样做。
- self.current_action.item_id = action.skill_id + 100
复制代码
总之逻辑就是:
1. 让敌人使用技能
2. 检查此技能是否被标记(这里用含某种特定属性来标记)
3. 如果此技能被标记,把行动改为使用物品
4. 设置物品的ID(这里设置物品ID与技能ID相同)
5. 进入到物品生效的场合,因为是敌人,所以不因为背包没有物品而终止行动。
其中 2、4两步都是可以自己定义的,比如用开关,变量什么的存一下。
|