查看: 13262|回复: 43

[推荐问答] 敌人mp为零或者一定数值以下用普通攻击或回复MP

[复制链接]
梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2017-2-24 07:18:02 | 显示全部楼层 |阅读模式

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

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

×
战斗设置这里只有HP多少多少以下的行为,
想简单点让敌人可以在MP多少以下时候恢复MP或者只用普通攻击,应该如何设置呢?
现在能想到的笨方法只能是条件分歧 每回合判断一次,代入敌人编号相应的        MP 一定数量以下 就执行回复mp一定数值的操作。或者只执行普通攻击。
有没有更简易的方法呢?

评分

参与人数 1星屑 +100 收起 理由
RyanBern + 100 推荐问答。另:提问请尽量来提问区.

查看全部评分

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-2-24 18:06:43 | 显示全部楼层
本帖最后由 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 行
[pre lang="ruby" line="248"]  #--------------------------------------------------------------------------
  # ● 生成行动
  #--------------------------------------------------------------------------
  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
[/pre]
这样修改后,如果设置敌人行动的出现条件为“开关 1 打开”,则不仅要保证 开关 1 打开,还要保证敌人的 SP < 100,该行动才会生效。
然后设置敌人的行动:
1. 概率为 3 ,无出现条件,释放技能
敌人行动1.PNG
2. 概率为 6 ,出现条件是开关 1 打开,普通攻击(也可以设置成回蓝魔法)
敌人行动2.PNG

整体看来是这样:
敌人行动3.PNG

3. 在战斗开始前,打开开关1
打开开关1.PNG

这样就没问题了。由于概率为 6 的技能一定会覆盖掉概率为 3 的技能,所以要这么设置。



话说
敌人行为这里,能不能把菜单加个当敌人mp小于多少多少执行什么操作的选项呢?

修改编辑器是肯定办不到的,但是修改脚本后的等效作用,也可以增加任意的行动出现条件。
例子里就是把原来只要【开关 1 打开】就会执行的行动,变成了【开关 1 打开】且满足【另一个条件】才会执行。
然后设置【另一个条件】为 SP 不足 100。
也就是说, SP >= 100 时此行动不会执行。
[pre lang="ruby"]# ------------------------------------------------------------
      # 开关 1 打开时,还需要满足 SP 不足 100
      # ------------------------------------------------------------
      if switch_id == 1
        if self.sp >= 100
          next
        end
      end
      # ------------------------------------------------------------[/pre]
然后在战斗开始前(比如游戏开始时)把【开关 1】打开。由于开关 1 是常开的,如果设置行动的出现条件是【开关 1】打开,就相当于条件是 SP < 100。

不知道这样说清楚了没>_<

[pre lang="ruby"]# ------------------------------------------------------------
# 开关 1 打开时,还需要满足 SP 不足 100
# ------------------------------------------------------------
if switch_id == 1
  if not self.sp < 100
    next
  end
end
# ------------------------------------------------------------[/pre]
这里用 if not 是不是更好理解?如果不满足【另一个条件】,处理下一个行动。

点评

非常感谢guoxiaomi耐心细致的回答,同样也感谢soulsaga每次都热心的帮助 - w -  发表于 2017-2-25 08:59
↓其实当时是为了自定义事件页的出现条件研究出来的方法,不过RM的各种出现条件都是通用的。  发表于 2017-2-24 18:43
这方法挺好的..  发表于 2017-2-24 18:38

评分

参与人数 1梦石 +2 收起 理由
RyanBern + 2 快来申请XP版主和我重建帝国吧.

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-2-24 10:53:19 | 显示全部楼层
本帖最后由 soulsaga 于 2017-2-24 11:14 编辑

敌人MP消耗一般不是0的么..?
还是说你想改脚本达到效果?
或且用公共事件比较好?

点评

- -b 想设置成这样的敌人,前几回合勇猛无比,没mp了只能普通攻击,而且显示上也是敌人MP空了,公用事件的话,不知道怎么设置合适。  发表于 2017-2-24 11:45
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-2-24 12:14:48 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-2-24 18:45 编辑

有。

先说几句:

1. 敌人释放魔法时确实会扣SP
2. 数据库里如果可以设置敌人的行动,说明Game_Enemy的make_action方法没被修改,可以在这里添加新的条件

请看脚本 Game_Enemy 的第 248 - 316 行
在第 284 行后添加新的条件:
[pre lang="ruby"]# 开关条件为 10,且 开关 10 打开时
      if switch_id == 10
        # SP 的限制条件是低于变量 10
        if self.sp > $game_variables[10]
          # next 表示这个行动被跳过,是否定条件
          next
        end
      end[/pre]
此时如果设计行动条件为开关 10。此行动出现的条件除了开关 10 打开,还会判断魔法值是否低于变量 10,如果高于的话则不采取此行动。

类似的方法也可以增加其他的条件。
[pre lang="ruby"]if switch_id == 开关ID
    if 不符合的条件1
      next
    end
    if 不符合的条件2
      next
    end
    ...
end[/pre]

点评

不会用ORZ,还是说下想法吧,没MP了1、部分敌人普通攻击。2、部分敌人吃药回复,回复量最大mp50%  发表于 2017-2-24 16:41
问一下..事件脚本怎么得到敌人战斗中的队伍ID?  发表于 2017-2-24 15:13
其实 "and $game_switches[switch_id]" 也可以不要……因为上一步已经判断了设置的开关是否打开了  发表于 2017-2-24 12:55
就这样了,打死也不再编辑了……  发表于 2017-2-24 12:53
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-2-24 16:29:18 | 显示全部楼层
本帖最后由 soulsaga 于 2017-2-24 16:57 编辑

我只能做成这样了..有没更简易的方法?
最后在敌人队伍里调用公共事件就完成..
SP50%的话就这样写吧..
XP.gif

点评

对 就是后面怎么写我不知道……我试试能不能正常执行。  发表于 2017-2-24 16:54
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-2-24 16:50:19 | 显示全部楼层

是不是这样条件分歧里面写脚本,
$game_troop.enemies[1].sp 后面不会写,
一号敌人sp小于多少多少,然后执行普通攻击命令。或者回复命令,写在敌人队伍这里。

同理基本上杂鱼也就三个,只有难打的杂鱼有可能sp用光。

点评

或且敌人队伍里部份敌人打开开关 公共事件改成並行..?  发表于 2017-2-24 17:12
O..部份敌人啊..那只能分开了..  发表于 2017-2-24 17:08
我是写在公共事件里的..写在敌人队伍也不是不行..  发表于 2017-2-24 17:05
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-2-24 17:00:56 | 显示全部楼层
89444640 发表于 2017-2-24 16:50
是不是这样条件分歧里面写脚本,
$game_troop.enemies[1].sp 后面不会写,
一号敌人sp小于多少多少,然后 ...

后面?你SP低于多少?如果按技能消耗的确麻烦..我也不会写..
回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
 楼主| 发表于 2017-2-24 17:14:26 | 显示全部楼层
soulsaga 发表于 2017-2-24 17:00
后面?你SP低于多少?如果按技能消耗的确麻烦..我也不会写..

好像想的有的复杂了,这么写就能可以了,
01.png
技能mp消耗确实不好说,只要mp大于等于该敌人mp消最少消耗的技能即可。
其实写个大概数值也无所谓、

但是有个小问题,敌人恢复MP的同时还会给我一刀,等于一回合行动两次了--b
嘛 不过敌人无赖也情有可原,但是如果想让敌人回复的同时不攻击,或者使用特技,应该如何设定呢?设定个使用药物然后随便设定个1合不行动呢?…………
我试了一下果然可以,就是强制行动 敌人编号 什么也不做,视觉上看着是敌人使用了恢复药,然后不动,下回合看敌人mp 回复了
- -b

话说
敌人行为这里,能不能把菜单加个当敌人mp小于多少多少执行什么操作的选项呢?
02.png
这么用着多方便啊- -b

点评

非常感谢每次都帮忙,辛苦了~确实存在你说的问题,但也不失为加强敌人的一个备用方法XD  发表于 2017-2-25 09:09
那样意义就不大了..  发表于 2017-2-24 17:45
你这样写..敌人1回合都不用等就回复了..  发表于 2017-2-24 17:44
部份敌人只打开开关..部份敌人只用回复MP..因为MP不足敌人什么都不会做..连普攻都不会啊..  发表于 2017-2-24 17:31
说起来..用强制行动是会即时行动的吧..用我那个就不会了..  发表于 2017-2-24 17:29
回复

使用道具 举报

梦石
0
星屑
39236
在线时间
11155 小时
注册时间
2009-3-15
回帖
4768
发表于 2017-2-24 17:38:48 | 显示全部楼层
89444640 发表于 2017-2-24 17:14
好像想的有的复杂了,这么写就能可以了,

技能mp消耗确实不好说,只要mp大于等于该敌人mp消最少消耗的技 ...

分开的话这样就行了..
XP.gif
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2017-2-24 18:35:54 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-2-24 18:38 编辑
事件脚本怎么得到敌人战斗中的队伍ID


想说的是,敌人使用了技能,技能附带了公共事件,公共事件里如何知道是哪一个敌人,对吗?

参加此贴:
https://rpg.blue/forum.php?mod=redirect&goto=findpost&ptid=397714&pid=2707512

获取 $scene.active_battler 后,直接获取 index 属性就可以了
  1. index = $scene.active_battler.index
复制代码


不过,如果要这个index的值是为了用 $game_troop[troop_id].enemies[index]来获取当前行动的敌人的话,就是在绕圈子了。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 1 0

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部