Project1

标题: 请教队伍里有人有第2号状态的话对方的群攻技能变成单体 [打印本页]

作者: taeckle    时间: 2020-12-27 05:16
标题: 请教队伍里有人有第2号状态的话对方的群攻技能变成单体
我想做一个状态,有此状态后对方释放的群攻技能50%几率变成单体攻击技能,想了下大概需要两步:
1.判断我方队伍里是否有人有第2号状态 (请问下用这个判断用if改怎么写呢?可以写成$game_party.actors.any? {|x| x.state == 2}吗?)
2.判断结果为真的话对方释放的群攻技能50%几率变成单体攻击技能(单体攻击代码是1,群体是2,但就是不知道在哪里写好。。)


还请大家指点指点,多谢了!
作者: RPGzh500223    时间: 2020-12-27 12:13
本帖最后由 RPGzh500223 于 2020-12-27 12:43 编辑

Game_Battler 的 状态 states(不是state) 是一个数组 并不是数值……
你该好好看脚本啊
这状态是对敌我双方生效还是只有我方?(你的想法部分,直接把这状态只对我方生效)
PS:这状态是“嘲讽”之类的吧

脚本是对敌我都生效
全体技能变为单体技能的目标为2号状态的首位持有者
RUBY 代码复制
  1. class Scene_Battle
  2.   alias ori_set_target_battlers set_target_battlers
  3.   def set_target_battlers(scope)
  4.     ori_set_target_battlers(scope)
  5.     if scope == 2
  6.       if rand(100) < 50
  7.         target = @target_battlers.find{|battler|battler.states.include?(2)}
  8.         @target_battlers = [target] if target != nil        
  9.       end
  10.     end
  11.   end
  12. end


作者: taeckle    时间: 2020-12-27 15:47
RPGzh500223 发表于 2020-12-27 12:13
Game_Battler 的 状态 states(不是state) 是一个数组 并不是数值……
你该好好看脚本啊
这状态是对敌我双方 ...


请问下单独写我方(或敌方)队伍里是否有人有第2号状态的判断该怎么写呢? (可以写成$game_party.actors.any? {|x| x.state.include?(2)}吗?)
作者: soulsaga    时间: 2020-12-27 16:45
本帖最后由 soulsaga 于 2020-12-27 16:50 编辑
taeckle 发表于 2020-12-27 15:47
请问下单独写我方(或敌方)队伍里是否有人有第2号状态的判断该怎么写呢?  (可以写成$game_party.actors.an ...


引用大佬的脚本

RUBY 代码复制
  1. class Scene_Battle
  2.   alias ori_set_target_battlers set_target_battlers
  3.   def set_target_battlers(scope)
  4.     ori_set_target_battlers(scope)
  5.     if scope == 2
  6.       if rand(100) < 50
  7.         target = @target_battlers.find{|battler|battler.states.include?(2) and battler.is_a?(Game_Actor)}#被攻击对像为角色时battler.is_a?(Game_Enemy) 为敌人时
  8.         @target_battlers = [target] if target != nil
  9.       end
  10.     end
  11.   end
  12. end

作者: taeckle    时间: 2020-12-27 17:07
taeckle 发表于 2020-12-27 15:47
请问下单独写我方(或敌方)队伍里是否有人有第2号状态的判断该怎么写呢?  (可以写成$game_party.actors.an ...


那在公共事件中判断我方队伍里是否有人有第2号状态该怎么写呢?
(可以写成$game_party.actors.any? {|x| x.state.include?(2)}吗?)
作者: RPGzh500223    时间: 2020-12-27 18:46
本帖最后由 RPGzh500223 于 2020-12-27 18:47 编辑
taeckle 发表于 2020-12-27 17:07
那在公共事件中判断我方队伍里是否有人有第2号状态该怎么写呢?
(可以写成$game_party.actors.any? {|x|  ...


连续的操作,为了简单,才写成公共事件
你这只有一个判断……没必要写成公共事件吧
最多写成Game_Party的方法
  1. class Game_Party  
  2.   def have_state?(state_id)
  3.     return @actors.any?{|e|e.states.include?(state_id)}
  4.   end
  5. end
复制代码

使用的话  判断队伍是否有2号状态
$game_party.have_state?(2)
作者: RPGzh500223    时间: 2020-12-27 18:58
等等 我没理解你的公共事件
(其实这判断你也可以写进事件指令)
你得把判断是否含有2号状态的之后"操作"写进去
不论指令还是脚本
大概
是否含有2号状态
  do something
else
  do someting
end
作者: taeckle    时间: 2020-12-28 01:52
soulsaga 发表于 2020-12-27 16:45
引用大佬的脚本

class Scene_Battle

大神请问下按照这样写的话当我方全队(4人)全都有第2号状态时是不是敌方的群攻技能还是能群攻呐?
作者: RPGzh500223    时间: 2020-12-28 11:25
taeckle 发表于 2020-12-28 01:52
大神请问下按照这样写的话当我方全队(4人)全都有第2号状态时是不是敌方的群攻技能还是能群攻呐? ...

这脚本 就算我方全体都有2号状态
也只会被敌方的全体技能(RMXP默认技能范围里没有群攻)攻击存活的的首位携带2号状态的我方队员
第一次回复你时 已经说明这个问题了啊
其实你要是这状态只对我方有效,只要敌方获得不了这状态即可

下面的脚本是全体技能会攻击所有携带2号状态的目标,只对一方生效的话,参照楼上的回复修改
class Scene_Battle
  alias ori_set_target_battlers set_target_battlers
  def set_target_battlers(scope)
    ori_set_target_battlers(scope)
    if scope == 2
      if rand(100) < 50
        targets = @target_battlers.find_all{|battler|battler.states.include?(2)}
        @target_battlers = targets if targets != []        
      end
    end
  end
end
其实你可以先看看RMXP脚本与F1,累积一定的基础,再制作游戏
我从接触RMXP到现在都一年了,看F1,还是会发现原来理解错的东西或者新东西以及看不懂的东西
作者: 芯☆淡茹水    时间: 2020-12-28 11:49
本帖最后由 芯☆淡茹水 于 2020-12-28 12:00 编辑

这样好理解些吧

  1. #==============================================================================
  2. class Scene_Battle
  3.   #--------------------------------------------------------------------------
  4.   alias xr_last_set_target_battlers set_target_battlers
  5.   def set_target_battlers(scope)
  6.     xr_last_set_target_battlers(scope)
  7.     result = @active_battler.is_a?(Game_Enemy) && # 攻击者是敌人
  8.              rand < 0.5 &&                         # 一半几率
  9.              scope == 2 &&                        # 用的是全体攻击
  10.              @target_battlers.size > 1 &&         # 实际被攻击角色个数大于 1
  11.              $game_party.actors.any?{|a| a.state?(2) } # 角色队伍有任意一个 2 号状态
  12.     # 从被攻击者中随机一个
  13.     @target_battlers = [@target_battlers[rand(@target_battlers.size)]] if result
  14.   end
  15. end
  16. #==============================================================================
复制代码

作者: RPGzh500223    时间: 2020-12-28 12:17
本帖最后由 RPGzh500223 于 2020-12-28 12:24 编辑
芯☆淡茹水 发表于 2020-12-28 11:49
这样好理解些吧


假如@target_battlers为空之前就胜负判定,结束战斗了
不从@active_battler角度写
是因为担心“混乱”,尽管RMXP默认的限制行动没有 “技能攻击队友”

我都忘了Game_Battler.state? 方法了
更简单了


作者: RPGzh500223    时间: 2020-12-28 14:15
本帖最后由 RPGzh500223 于 2020-12-28 14:29 编辑
RPGzh500223 发表于 2020-12-28 12:17
假如@target_battlers为空之前就胜负判定,结束战斗了
不从@active_battler角度写
是因为担心“混乱”, ...


我表达错了  "@target_battlers为空"
我想表达的意思是 @target_battlers.empty?
不是@terget_battlers == nil……

好尴尬我把@target_battlers.size > 1 看成  >0

作者: guoxiaomi    时间: 2020-12-28 23:24
另一种方案是按照字面意思,在对方行动前把技能改成群攻就行了。在update_phase4_step2之前执行:
  1. $origin_skill = Marshal.dump($data_skills[100])
  2. if $game_party.actors.find{|a| a.state?(2)}
  3.   if $data_skills[100].scope == 2
  4.     $data_skills[100].scope = 1
  5.   end
  6. end
复制代码

然后在update_phase4_step5之后执行:
  1. $data_skills[100] = $origin_skill
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1