加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 SailCat 于 2022-2-5 12:09 编辑
Game_Action Line 174
#-------------------------------------------------------------------------- # * Targets for Opponents #-------------------------------------------------------------------------- def targets_for_opponents if item.for_random? Array.new(item.number_of_targets) { opponents_unit.random_target } elsif item.for_one? num = 1 + (attack? ? subject.atk_times_add.to_i : 0) if @target_index < 0 [opponents_unit.random_target] * num else [opponents_unit.smooth_target(@target_index)] * num end else opponents_unit.alive_members end
#--------------------------------------------------------------------------
# * Targets for Opponents
#--------------------------------------------------------------------------
def targets_for_opponents
if item.for_random?
Array.new(item.number_of_targets) { opponents_unit.random_target }
elsif item.for_one?
num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
if @target_index < 0
[opponents_unit.random_target] * num
else
[opponents_unit.smooth_target(@target_index)] * num
end
else
opponents_unit.alive_members
end
这里看得我挺晕乎的,for_random?会在目标设定为“随机1个敌人,随机2个……随机4个”的时候返回true,然而他这个处理方法是
反复N遍执行从敌人中随机取1个的操作
因为取1个取完了是会重置的,这就有意思了,因为如果敌人数目小于4个,然后目标是随机4个,那就会有人被取到2次,甚至是2次以上
甚至我测试的结果是,就算敌人只有1个,然后攻击目标是“随机3个”,那就会把这个敌人打3遍,仿佛是设定了atk_times_add=200%一样的效果
我能理解这个设定,但总觉得要么是实现上有bug,要么是表述上有bug
而且这段代码导致atk_times_add只能对指定单体攻击生效,不能通过设定这个feature来实现暴走时全体大招放N次
我现在XP里做攻击范围扩展,对于随机目标的实现是这样的
以下执行上下文是Game_Unit(也就是Game_Party和Game_Troop的超级模块)
target_rate的定义:对于Game_Actor返回4 - $data_classes[class_id].position,对于Game_Enemy固定返回4(这样表现和默认引擎一样)
#-------------------------------------------------------------------------- # ● 复数对像的随机确定 # num : 需要的对像个数 # hp0 : 限制为 HP 0 的角色 #-------------------------------------------------------------------------- def random_targets(num = 1, hp0 = false) # 取得参与随机的战斗者和总括机率 candidate_set = hp0 ? hp0_members : alive_members return candidate_set if candidate_set.size <= num total_rate = candidate_set.sum {|a| a.target_rate} result_set = [] # 逐一添加随机对象 num.times do # 转轮盘赌决定机率 n = rand(total_rate) candidate_set.each do |battler| n -= battler.target_rate if n < 0 result_set << battler total_rate -= battler.target_rate candidate_set.delete(battler) break end end end result_set end
#--------------------------------------------------------------------------
# ● 复数对像的随机确定
# num : 需要的对像个数
# hp0 : 限制为 HP 0 的角色
#--------------------------------------------------------------------------
def random_targets(num = 1, hp0 = false)
# 取得参与随机的战斗者和总括机率
candidate_set = hp0 ? hp0_members : alive_members
return candidate_set if candidate_set.size <= num
total_rate = candidate_set.sum {|a| a.target_rate}
result_set = []
# 逐一添加随机对象
num.times do
# 转轮盘赌决定机率
n = rand(total_rate)
candidate_set.each do |battler|
n -= battler.target_rate
if n < 0
result_set << battler
total_rate -= battler.target_rate
candidate_set.delete(battler)
break
end
end
end
result_set
end
因为有一个delete的操作,取完了是不放回去的,再加上前面有一个预判,就不会出现“队伍只有3个,随机打3个人,结果打到了一个人3下,另外两个人豁免了”的情况下
至于如何实现“打到一个人,打3下”或者“随机打人(不取回)3下”,我想说atk_times_add也不是放着好玩的,自有别的实现,和设置对象没关系(也就是很容易实现暴走后全体大招放N次的效果) |