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

Project1

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

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

[复制链接]

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
跳转到指定楼层
1
发表于 2017-2-24 07:18:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

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

评分

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

查看全部评分

Lv5.捕梦者 (版主)

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

开拓者

来自 9楼
发表于 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 行
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 生成行动
  3.   #--------------------------------------------------------------------------
  4.   def make_action
  5.     # 清除当前行动
  6.     self.current_action.clear
  7.     # 无法行动的情况
  8.     unless self.movable?
  9.       # 过程结束
  10.       return
  11.     end
  12.     # 抽取现在有效的行动
  13.     available_actions = []
  14.     rating_max = 0
  15.     for action in self.actions
  16.       # 确认回合条件
  17.       n = $game_temp.battle_turn
  18.       a = action.condition_turn_a
  19.       b = action.condition_turn_b
  20.       if (b == 0 and n != a) or
  21.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  22.         next
  23.       end
  24.       # 确认 HP 条件
  25.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  26.         next
  27.       end
  28.       # 确认等级条件
  29.       if $game_party.max_level < action.condition_level
  30.         next
  31.       end
  32.       # 确认开关条件
  33.       switch_id = action.condition_switch_id
  34.       if switch_id > 0 and $game_switches[switch_id] == false
  35.         next
  36.       end
  37.       # ------------------------------------------------------------
  38.       # 开关 1 打开时,还需要满足 SP 不足 100
  39.       # ------------------------------------------------------------
  40.       if switch_id == 1
  41.         if self.sp >= 100
  42.           next
  43.         end
  44.       end
  45.       # ------------------------------------------------------------
  46.       # 符合条件 : 添加本行动
  47.       available_actions.push(action)
  48.       if action.rating > rating_max
  49.         rating_max = action.rating
  50.       end
  51.     end
  52.     # 最大概率值作为 3 合计计算(0 除外)
  53.     ratings_total = 0
  54.     for action in available_actions
  55.       if action.rating > rating_max - 3
  56.         ratings_total += action.rating - (rating_max - 3)
  57.       end
  58.     end
  59.     # 概率合计不为 0 的情况下
  60.     if ratings_total > 0
  61.       # 生成随机数
  62.       value = rand(ratings_total)
  63.       # 设置对应生成随机数的当前行动
  64.       for action in available_actions
  65.         if action.rating > rating_max - 3
  66.           if value < action.rating - (rating_max - 3)
  67.             self.current_action.kind = action.kind
  68.             self.current_action.basic = action.basic
  69.             self.current_action.skill_id = action.skill_id
  70.             self.current_action.decide_random_target_for_enemy
  71.             return
  72.           else
  73.             value -= action.rating - (rating_max - 3)
  74.           end
  75.         end
  76.       end
  77.     end
  78.   end

这样修改后,如果设置敌人行动的出现条件为“开关 1 打开”,则不仅要保证 开关 1 打开,还要保证敌人的 SP < 100,该行动才会生效。
然后设置敌人的行动:
1. 概率为 3 ,无出现条件,释放技能

2. 概率为 6 ,出现条件是开关 1 打开,普通攻击(也可以设置成回蓝魔法)


整体看来是这样:


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


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



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

修改编辑器是肯定办不到的,但是修改脚本后的等效作用,也可以增加任意的行动出现条件
例子里就是把原来只要【开关 1 打开】就会执行的行动,变成了【开关 1 打开】且满足【另一个条件】才会执行。
然后设置【另一个条件】为 SP 不足 100。
也就是说, SP >= 100 时此行动不会执行
RUBY 代码复制
  1. # ------------------------------------------------------------
  2.       # 开关 1 打开时,还需要满足 SP 不足 100
  3.       # ------------------------------------------------------------
  4.       if switch_id == 1
  5.         if self.sp >= 100
  6.           next
  7.         end
  8.       end
  9.       # ------------------------------------------------------------

然后在战斗开始前(比如游戏开始时)把【开关 1】打开。由于开关 1 是常开的,如果设置行动的出现条件是【开关 1】打开,就相当于条件是 SP < 100。

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

RUBY 代码复制
  1. # ------------------------------------------------------------
  2. # 开关 1 打开时,还需要满足 SP 不足 100
  3. # ------------------------------------------------------------
  4. if switch_id == 1
  5.   if not self.sp < 100
  6.     next
  7.   end
  8. end
  9. # ------------------------------------------------------------

这里用 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 网络脚本 *
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
844
在线时间
3 小时
注册时间
2017-3-28
帖子
2
21
发表于 2017-4-14 14:55:42 | 只看该作者
希望能帮到你。

敌人回蓝.rar

188.83 KB, 下载次数: 104

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
844
在线时间
3 小时
注册时间
2017-3-28
帖子
2
20
发表于 2017-4-14 14:11:02 | 只看该作者
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

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

开拓者

19
发表于 2017-3-2 12:41:51 | 只看该作者
Taroxd给出了另一个方法:

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

使用道具 举报

Lv5.捕梦者 (版主)

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

开拓者

18
发表于 2017-2-25 13:24:28 | 只看该作者
本帖最后由 guoxiaomi 于 2017-2-25 14:18 编辑
我想到了一个方法是,让敌人使用物品,此物品能回复全体敌人的SP值,但是物品有属性,比如物品自带属性“ ...


试了试还是可以的,同样是修改 Game_Enemy 的 make_action。因为就是这个方法决定了敌人的行动嘛。看下面这个脚本的第 62-72 行。

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 生成行动
  3.   #--------------------------------------------------------------------------
  4.   def make_action
  5.     # 清除当前行动
  6.     self.current_action.clear
  7.     # 无法行动的情况
  8.     unless self.movable?
  9.       # 过程结束
  10.       return
  11.     end
  12.     # 抽取现在有效的行动
  13.     available_actions = []
  14.     rating_max = 0
  15.     for action in self.actions
  16.       # 确认回合条件
  17.       n = $game_temp.battle_turn
  18.       a = action.condition_turn_a
  19.       b = action.condition_turn_b
  20.       if (b == 0 and n != a) or
  21.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  22.         next
  23.       end
  24.       # 确认 HP 条件
  25.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  26.         next
  27.       end
  28.       # 确认等级条件
  29.       if $game_party.max_level < action.condition_level
  30.         next
  31.       end
  32.       # 确认开关条件
  33.       switch_id = action.condition_switch_id
  34.       if switch_id > 0 and $game_switches[switch_id] == false
  35.         next
  36.       end
  37.       # 符合条件 : 添加本行动
  38.       available_actions.push(action)
  39.       if action.rating > rating_max
  40.         rating_max = action.rating
  41.       end
  42.     end
  43.     # 最大概率值作为 3 合计计算(0 除外)
  44.     ratings_total = 0
  45.     for action in available_actions
  46.       if action.rating > rating_max - 3
  47.         ratings_total += action.rating - (rating_max - 3)
  48.       end
  49.     end
  50.     # 概率合计不为 0 的情况下
  51.     if ratings_total > 0
  52.       # 生成随机数
  53.       value = rand(ratings_total)
  54.       # 设置对应生成随机数的当前行动
  55.       for action in available_actions
  56.         if action.rating > rating_max - 3
  57.           if value < action.rating - (rating_max - 3)
  58.             self.current_action.kind = action.kind
  59.             self.current_action.basic = action.basic
  60.             self.current_action.skill_id = action.skill_id
  61.             self.current_action.decide_random_target_for_enemy
  62.             # ------------------------------------------------------------
  63.             # 在返回行动前做出修改
  64.             # ------------------------------------------------------------
  65.             # 此技能标记了属性 17 时
  66.             if $data_skills[action.skill_id].element_set.include?(17)
  67.               # 更改为使用 物品
  68.               self.current_action.kind = 2
  69.               # 物品 ID 设置为 技能 ID
  70.               self.current_action.item_id = action.skill_id
  71.             end
  72.             # ------------------------------------------------------------  
  73.             return
  74.           else
  75.             value -= action.rating - (rating_max - 3)
  76.           end
  77.         end
  78.       end
  79.     end
  80.   end


使用物品效果的方法在Scene_Battle 4 # make_item_action_result,这里面会检查物品是否被用完,以及如果消耗品会损失物品的情况。下面要修改“检查物品是否被用完”的部分,使得如果是敌人则不用检测。
RUBY 代码复制
  1. def make_item_action_result
  2.     # 获取物品
  3.     @item = $data_items[@active_battler.current_action.item_id]
  4.     # 因为物品耗尽而无法使用的情况下
  5.     unless $game_party.item_can_use?(@item.id) || @active_battler.is_a?(Game_Enemy)
  6.       # 移至步骤 1
  7.       @phase4_step = 1
  8.       return
  9.     end
  10.     # 消耗品的情况下
  11.     if @item.consumable
  12.       # 使用的物品减 1
  13.       $game_party.lose_item(@item.id, 1)
  14.     end
  15.     ...
  16.     ...


请注意,这个方法很可能被重写过!试着全局搜索一下:
  1. def make_item_action_result
复制代码

如果出现多次,在最后一次出现的地方,找到unless $game_party.item_can_use?(@item.id)在后面加上上面第 5 行 || 和后面的内容。
  1. || @active_battler.is_a?(Game_Enemy)
复制代码


然后在【数据库-系统】里添加一个属性:17 - 敌人技能->物品。技能的属性设置要勾上属性 17,这样在使用此技能时,会变成使用相同 ID 的物品。

个人认为,给每个人敌人单独设计技能对应的物品不是很大的开销,而且这样对脚本的改动很小。

此外要注意的是:
1. 技能的范围要和对应物品的范围设为一样。注意:敌人对敌人使用,是“己方单体”。
2. 物品设置为不消耗(否则真的会消耗背包里的物品),其他正常设置。
3. 显示物品名称,播放物品动画并且执行物品附带公共事件。

如果现有的技能物品已经重叠了,可以类似这样做。
  1. self.current_action.item_id = action.skill_id + 100
复制代码

总之逻辑就是:
1. 让敌人使用技能
2. 检查此技能是否被标记(这里用含某种特定属性来标记)
3. 如果此技能被标记,把行动改为使用物品
4. 设置物品的ID(这里设置物品ID与技能ID相同)
5. 进入到物品生效的场合,因为是敌人,所以不因为背包没有物品而终止行动。

其中 2、4两步都是可以自己定义的,比如用开关,变量什么的存一下。


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

使用道具 举报

Lv5.捕梦者 (版主)

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

开拓者

17
发表于 2017-2-25 12:30:00 | 只看该作者
本帖最后由 guoxiaomi 于 2017-2-25 12:33 编辑
soulsaga 发表于 2017-2-25 09:43
话说有没回复敌人单人SP量的技能?


我想到了一个方法是,让敌人使用物品,此物品能回复全体敌人的SP值,但是物品有属性,比如物品自带属性“炎”。

这样的话,在敌人的“属性有效度”里设置对“炎”的抗性,比如说是“E: 0%”,SP的回复会变成 0。

同样的方法也可制作“治疗效果加倍”的职业,比如此职业对“治疗”属性的攻击有效度是“A: 200%”,游戏里所有的治疗类技能,勾上“治疗”属性。作用到该职业身上就是双倍的效果。

点评

写好啦,看楼下吧~  发表于 2017-2-25 13:44
(⊙o⊙)…是我弄错了!我是拿主角进行测试的,忘了敌人不能用物品,我再思考思考……  发表于 2017-2-25 12:40
敌人会用物品的么..怎么用?  发表于 2017-2-25 12:38
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36427
在线时间
10796 小时
注册时间
2009-3-15
帖子
4814
16
发表于 2017-2-25 10:00:42 | 只看该作者
本帖最后由 soulsaga 于 2017-2-25 10:05 编辑
89444640 发表于 2017-2-25 09:55
给自己回复还好……对地方其他指定单人对程序不会的咱们好像有困难,还是放弃吧。
要不就设置敌人有群体s ...


我找到方法了..给回复SP的技能附加一个状态
然后技能调用公共事件..判断每个敌人身上有没该状态然后回复SP
配合SP不足的开关敌人行为 就可以轻松做到了..

点评

嗯!是个好主意,我记得以前见过的死亡后自动复活一次之类的效果也是这么实现的?  发表于 2017-2-25 10:03
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
15
 楼主| 发表于 2017-2-25 09:55:04 | 只看该作者
soulsaga 发表于 2017-2-25 09:43
话说有没回复敌人单人SP量的技能?

给自己回复还好……对地方其他指定单人对程序不会的咱们好像有困难,还是放弃吧。
要不就设置敌人有群体sp回复技能,直接加全体的。
话说敌人为地方单人回复sp好像没啥必要- -b

刚想到也不是不可能,比如敌方只有两个人,那就肯定是1给2回复
如果敌人三人,敌人给1或者2回复,加个1、2随机的变量好了。
如果敌人一共8个能互相回复…………咱能不设定那么蛋疼的敌人群组吗ORZ
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36427
在线时间
10796 小时
注册时间
2009-3-15
帖子
4814
14
发表于 2017-2-25 09:43:18 | 只看该作者
话说有没回复敌人单人SP量的技能?
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35186
在线时间
4169 小时
注册时间
2007-12-15
帖子
10067
13
 楼主| 发表于 2017-2-25 09:06:40 | 只看该作者
guoxiaomi 发表于 2017-2-24 22:54
我看了一下之前楼主发的《全动画修正测试》,Game_Enemy#make_action果然没有被修改,这个方法应该是有效的 ...

晚上和刚起来趁着脑子清醒,画了几帧下重脚的连贯动作草图来着,刚看到。
非常感谢您耐心细致的回答。
game enemy什么的没修改过。
先保存下网页,因为这个不常用,回头肯定忘。
脚本多确实有好多冲突,比如那个反击,普通物理攻击就没问题,魔法反击一阵一阵的死活就不出,我新建工程把脚本文件复制过去就能魔反。
唉……我还是少碰不熟悉的东西吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-21 23:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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