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

Project1

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

[已经过期] 怎么判定敌人,攻击技能,打击我方最少血量的角色

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1360
在线时间
179 小时
注册时间
2019-10-4
帖子
257
跳转到指定楼层
1
发表于 2023-2-20 18:57:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我渴望更强大的敌人,就是希望稍微有点针对性。比如敌人进行攻击判定,找到最少血量的角色,然后发动攻击,给予致命一击.

Lv5.捕梦者

梦石
0
星屑
36322
在线时间
10774 小时
注册时间
2009-3-15
帖子
4813
2
发表于 2023-2-20 22:16:07 | 只看该作者
本帖最后由 soulsaga 于 2023-2-20 22:20 编辑

最少血量堆满回避
低血回避坦成立

点评

除非你复活很珍贵..不然死一个人就复活就一直到战斗结束  发表于 2023-2-21 21:47
回避不成立那超级硬也可以成立吧  发表于 2023-2-21 21:46
还有设定的敌人是必中,回避满回避依然会诶打  发表于 2023-2-21 20:46
并不成立,游戏不存在回避的情况下。而且我游戏设定最高回避率才15,还是大大后期才有一件回避装备  发表于 2023-2-21 20:42
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3670
在线时间
357 小时
注册时间
2018-9-4
帖子
272
3
发表于 2023-2-21 00:48:30 | 只看该作者
XP的敌人技能选取判定和目标判定是各自独立的,需要分开讨论

至于主楼说的属于目标判定,可以通过修改Game_Party类解决

RUBY 代码复制
  1. class Game_Party
  2.   #--------------------------------------------------------------------------
  3.   # ● 对像角色的随机确定
  4.   #     hp0 : 限制为 HP 0 的角色
  5.   #--------------------------------------------------------------------------
  6.   def random_target_actor(hp0 = false)
  7.     # 初始化轮流
  8.     roulette = []
  9.     # 循环
  10.     for actor in @actors
  11.       # 符合条件的场合
  12.       if (not hp0 and actor.exist?) or (hp0 and actor.hp0?)
  13.         # 获取角色职业的位置 [位置]
  14.         position = $data_classes[actor.class_id].position
  15.         # 前卫的话 n = 4、中卫的话 n = 3、后卫的话 n = 2
  16.         n = 4 - position
  17.         # ++优先攻击血量低于1/3的角色
  18.         if actor.hp <= (actor.maxhp / 3).ceil #向上取整以增大概率
  19.           n += 4 #极大增加,本参数可自行调整
  20.         end
  21.         # ++
  22.         # 添加角色的轮流 n 回
  23.         n.times do
  24.           roulette.push(actor)
  25.         end
  26.       end
  27.     end
  28.     # 轮流大小为 0 的情况
  29.     if roulette.size == 0
  30.       return nil
  31.     end
  32.     # 转轮盘赌,决定角色
  33.     return roulette[rand(roulette.size)]
  34.   end
  35. end


仅供参考不建议直接复制粘贴覆盖。XP允许覆盖式重定义是很方便,但是多个覆盖会存在后面的取代前面的问题,只要是战斗增强类脚本这个类就极大可能被改过

点评

实际使用,确实会出现问题。不过也是一种方法,我现在知道的是SEP插件可以,不过没法单独使用。  发表于 2023-4-29 12:30
不过如果每回合都维持满血这功能就没有用了  发表于 2023-2-22 17:13
取最低角色的话在这之上要加个判定用的接口,而且感觉低比最低打击面更大一点  发表于 2023-2-22 10:27
我方最少血量的角色是指剩余血量比例吗? 我还以为是指血量值  发表于 2023-2-21 13:46
回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5651
在线时间
111 小时
注册时间
2023-2-9
帖子
26
4
发表于 2023-2-21 22:20:42 | 只看该作者
好像yep有个战斗智能核心插件,可以试试YEP_BattleAICore.js
定制立绘,定制行走图,定制CG,定制龙骨模型,live2d制作,简单产品的3D建模渲染,可联系qq1101340379。
十分擅长10-20岁的美少女绘制
新作-近代西方魔幻克系RPG《虚构未来》筹备制作中。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4654
在线时间
431 小时
注册时间
2016-5-11
帖子
140
5
发表于 2023-2-22 15:34:22 | 只看该作者
我这里也有一个思路,就是Scene_Battle 4设置对象的时候强制改变攻击的对象

点评

可以说一下  发表于 2023-2-26 17:21
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2319
在线时间
567 小时
注册时间
2012-5-3
帖子
86

开拓者

6
发表于 2023-2-26 19:05:23 | 只看该作者
Game_Enemy类里面有个make_action方法,在这里面可以判断敌人id和各种东西
回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4628
在线时间
683 小时
注册时间
2013-1-18
帖子
710
7
发表于 2023-2-26 21:50:21 | 只看该作者
复活就死,楼主你好狠呀,不敢玩你的游戏。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1360
在线时间
179 小时
注册时间
2019-10-4
帖子
257
8
 楼主| 发表于 2023-3-3 22:36:46 | 只看该作者
nhycs01 发表于 2023-2-26 21:50
复活就死,楼主你好狠呀,不敢玩你的游戏。

哈哈哈哈还好啦 魂系回合制
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23989
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

9
发表于 2023-4-5 03:47:54 | 只看该作者
如6楼所说,可以在make_action里做文章。关于智能的方式可以参考我写的这段set_auto_action:
  1. class Scene_Battle
  2.   # 选项:0=随机攻击,1=仅恢复魔法,2=节省魔法,3=最大输出,
  3.   # 1:随机/固定目标,2:节省/不节省魔法,4:输出/治疗优先
  4.   #
  5.   def plan
  6.     {
  7.       'save_mana' => $game_setting['auto_battle_save_mana'] == 0,
  8.     }
  9.   end
  10.   
  11.   def set_auto_action(actor)
  12.     skills = actor.skills.select{|id| actor.skill_can_use?(id)}
  13.     skills.push 0
  14.     scores = {}
  15.     for index in 0..2 do
  16.       for skill_id in skills do
  17.         scores[[skill_id, index]] = score(actor, skill_id ,index)
  18.       end
  19.     end
  20.    
  21.     max_score = scores.values.sort{|v1, v2| v2.abs <=> v1.abs}[0]
  22.     skill_id, index = scores.index(max_score)
  23.     $last_auto_action = [index, max_score]
  24.    
  25.     if skill_id == 0
  26.       actor.current_action.kind = 0
  27.       actor.current_action.basic = 0
  28.       actor.current_action.target_index = index
  29.     else
  30.       actor.current_action.kind = 1
  31.       actor.current_action.skill_id = skill_id
  32.       actor.current_action.target_index = index
  33.     end
  34.   end
  35.   
  36.   def score(actor, skill_id, index)   
  37.     # 1. 获取目标
  38.     if skill_id == 0 || $data_skills[skill_id].scope <= 2
  39.       target = $game_troop.enemies[index]
  40.     else
  41.       target = $game_party.actors[index]
  42.     end
  43.     # 如果此目标不存在,返回 -1
  44.     return -1 if !target || !target.exist?
  45.     # 2. 计算基本伤害
  46.     if skill_id == 0
  47.       dps = actor.atk * (1 + actor.crt * 0.01 * (actor.crtd - 100) * 0.01)
  48.     else
  49.       skill = $data_skills[skill_id]
  50.       dps = get_skill_power(actor, skill)
  51.       if dps < 0
  52.         dps = [target.hp - target.maxhp, dps].max * 0.6
  53.       end
  54.     end
  55.     # 3. 计算护甲、闪避、命中
  56.     if skill_id == 0 || skill.atk_f > 0
  57.       dps = dps * def2rate(target.pdef)
  58.       eva_f = (skill_id == 0) ? 1 : skill.eva_f * 0.01
  59.       dps = dps * (1 - eva_f * target.eva * 0.01)
  60.       dps = dps * actor.hit * 0.01
  61.     else
  62.       x = 50 + (target.mdef - 50) * skill.mdef_f / 100
  63.       dps = dps * def2rate(x)
  64.       dps = dps * skill.hit * 0.01
  65.       dps = dps * target.elements_correct(skill.element_set) * 0.01
  66.     end   
  67.     # 4. 治疗/伤害 与目标生命值的关系
  68.     if dps < 0
  69.       if target.hp < target.maxhp * 0.5
  70.         dps = dps * target.maxhp / (target.hp + 1)
  71.       end
  72.       dps *= 1.5 if target == actor # 优先治疗自身
  73.     else
  74.       dps = dps * (1 + [(dps / (target.hp + 1)) ** 2, 1].min)
  75.     end
  76.     # 5. 节省魔法
  77.     if skill_id != 0 && plan['save_mana']
  78.       r = skill.sp_cost.to_f / [actor.sp, 10].max
  79.       dps = dps * [1 - r * 1.5, 0.5].max
  80.     end
  81.     # 6. spread
  82.     if skill_id != 0
  83.       enemy_size = $game_troop.enemies.select{|e| e.exist?}.size
  84.       dps = dps * (1 + actor.spread * enemy_size * 0.01)
  85.     end   
  86.     # 7. 分散度
  87.     dps = dps * (rand(0.3) + 0.85)
  88.     # 8. 上个角色的行动
  89.     if $last_auto_action
  90.       last_index, last_dps = $last_auto_action
  91.       if last_index == index
  92.         if last_dps < 0 && dps < 0
  93.           dps = dps * 0.7
  94.         elsif last_dps > 0 && dps > 0
  95.           dps = dps * 1.3
  96.         end
  97.       end
  98.     end
  99.     # 输出信息
  100.     # p [dps.abs, skill_id == 0 ? '攻击' : skill.name, target.name]
  101.     return dps
  102.   end
  103.   
  104.   def get_skill_power(user, skill)
  105.     if skill.power >= 0        
  106.       if skill.atk_f > 0
  107.         power = skill.power + user.atk * skill.atk_f / 100
  108.       else
  109.         power = skill.power + user.int * skill.eva_f / 100
  110.       end
  111.     else
  112.       if skill.atk_f > 0
  113.         power = skill.power - user.atk * skill.atk_f / 100
  114.       else
  115.         power = skill.power - user.int * skill.eva_f / 100
  116.       end
  117.     end
  118.     # 主属性
  119.     rate = 100.0
  120.     case user.main
  121.     when 0
  122.       rate += user.str * skill.str_f * 0.05
  123.     when 1
  124.       rate += user.dex * skill.dex_f * 0.05
  125.     when 2
  126.       rate += user.agi * skill.agi_f * 0.05
  127.     when 3
  128.       rate += user.int * skill.int_f * 0.05
  129.     end
  130.     # 计算基本伤害
  131.     power = (power * rate).round / 100
  132.     return power
  133.   end
  134.   
  135.   #------------------------------------------------------------------------
  136.   # ● 防御减伤公式
  137.   # x = 0, +25% | x = 20, 0% | x = 40, -20% |
  138.   #------------------------------------------------------------------------
  139.   def def2rate(x)
  140.     1.5 ** (1 - 0.02 * x)
  141.   end
  142. end
复制代码

点评

看不懂,有点看懵了。不过我倒是有了一个新想法,就是一直固定打击一个敌人。也是非常可观的伤害输出。  发表于 2023-4-29 12:29
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-1 09:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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