设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1447|回复: 3
打印 上一主题 下一主题

[讨论] VA的这个设定是bug还是feature?

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
22457
在线时间
2335 小时
注册时间
2005-10-15
帖子
1160

开拓者

跳转到指定楼层
1
发表于 2022-2-5 11:54:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 SailCat 于 2022-2-5 12:09 编辑

Game_Action  Line 174
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # * Targets for Opponents
  3.   #--------------------------------------------------------------------------
  4.   def targets_for_opponents
  5.     if item.for_random?
  6.       Array.new(item.number_of_targets) { opponents_unit.random_target }
  7.     elsif item.for_one?
  8.       num = 1 + (attack? ? subject.atk_times_add.to_i : 0)
  9.       if @target_index < 0
  10.         [opponents_unit.random_target] * num
  11.       else
  12.         [opponents_unit.smooth_target(@target_index)] * num
  13.       end
  14.     else
  15.       opponents_unit.alive_members
  16.     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(这样表现和默认引擎一样)
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 复数对像的随机确定
  3.   #     num : 需要的对像个数
  4.   #     hp0 : 限制为 HP 0 的角色
  5.   #--------------------------------------------------------------------------
  6.   def random_targets(num = 1, hp0 = false)
  7.     # 取得参与随机的战斗者和总括机率
  8.     candidate_set = hp0 ? hp0_members : alive_members
  9.     return candidate_set if candidate_set.size <= num
  10.     total_rate = candidate_set.sum {|a| a.target_rate}
  11.     result_set = []
  12.     # 逐一添加随机对象
  13.     num.times do
  14.       # 转轮盘赌决定机率
  15.       n = rand(total_rate)
  16.       candidate_set.each do |battler|
  17.         n -= battler.target_rate
  18.         if n < 0
  19.           result_set << battler
  20.           total_rate -= battler.target_rate
  21.           candidate_set.delete(battler)
  22.           break
  23.         end
  24.       end
  25.     end
  26.     result_set
  27.   end

因为有一个delete的操作,取完了是不放回去的,再加上前面有一个预判,就不会出现“队伍只有3个,随机打3个人,结果打到了一个人3下,另外两个人豁免了”的情况下
至于如何实现“打到一个人,打3下”或者“随机打人(不取回)3下”,我想说atk_times_add也不是放着好玩的,自有别的实现,和设置对象没关系(也就是很容易实现暴走后全体大招放N次的效果)

评分

参与人数 1+1 收起 理由
alexncf125 + 1 我很赞同

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

2
发表于 2022-2-5 19:25:52 | 只看该作者
我觉得就是feature吧,跟炉石里的奥术飞弹一样

点评

默认数据库里有“二连击(序号4)”和“二回攻击(序号5)”两个技能,但是我试了很久也没办法不改脚本实现“选择不重复的2个敌人,各打一下”  发表于 2022-2-5 21:10
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9275
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

3
发表于 2022-2-13 00:37:47 | 只看该作者
就是程序员偷懒了吧···一般一个游戏里随机目标技能数量不会有多高的占比所以有细化需求的使用者不够多就没调整
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 13:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表