查看: 4304|回复: 3

[已经解决] 如何修改再行动在战斗中的判定顺序

[复制链接]
梦石
10
星屑
7625
在线时间
684 小时
注册时间
2017-1-9
回帖
596

我没有哭开拓者

发表于 2019-2-5 15:37:13 | 显示全部楼层 |阅读模式
悬赏50星屑已解决
本帖最后由 世界第一中二 于 2019-2-5 15:42 编辑

我使用的是rmva默认的战斗系统
我设计的技能A,有通过“触发公共事件-强制使用技能指令”来使用二段技能B的设计
但这样做就会遇到一个bug,那就是在战斗中,你可以一回合行动两次的时候,你的操作是“使用技能A,再使用另一个技能C”
而实际效果会变成“你使用技能A,再使用技能B”
通过搜索我找到了一个遇到和我一样的问题的帖子、但是我不喜欢那个帖子的解决方法
所以现在在这里跑来求助各位大佬了

我希望能修改第二次行动在战斗中的判定顺序
且兼容下面这个脚本
[pre lang="ruby"]#==============================================================================
# ■ RGSS3 行動回数仕様変更 Ver1.00  by 星潟
#------------------------------------------------------------------------------
# 特徴による過剰な複数回行動を防止し、2回行動までに限定します。
# この効果はアクターとエネミーはそれぞれ別に設定が可能です。
# (このスクリプトのデフォルトでは
#   アクターのみ制限し、敵は通常通りの行動を行います)
#
# なお、制限を行った場合は、行動回数増加率を個別に計算せず合算します。
#------------------------------------------------------------------------------
# 例1.
# 行動回数増加率20%の装備を3つ付けた場合
#
# 制限しない場合 => 20%で3回判定し、最大4回行動を行う。
#
# 制限する場合   => 20%を3回分合算し、60%の確率で2回行動を行う。
#------------------------------------------------------------------------------
# 例2.
# 行動回数増加率60%の装備を2つ付けた場合
#
# 制限しない場合 => 60%で2回判定し、最大3回行動を行う。
#
# 制限する場合   => 60%を2回分合算し、120%の確率で2回行動を行う。
#                   (100%を超えても確実になるだけで、3回行動にはならない)
#------------------------------------------------------------------------------
# 当方の「XPスタイルバトル拡張スクリプト 再行動」を導入されている場合
# 必ず、該当スクリプトよりもこのスクリプトを上側に配置して下さい。
#==============================================================================
module ACTT_C
  
  #アクターの行動回数を2回までに制限し、計算方法を変えるか?
  
  ACTOR = true
  
  #エネミーの行動回数を2回までに制限し、計算方法を変えるか?
  
  ENEMY = true
  
end
class Game_Battler < Game_BattlerBase
  #--------------------------------------------------------------------------
  # 行動回数の決定
  #--------------------------------------------------------------------------
  alias make_action_times_calc_change make_action_times
  def make_action_times
    #アクターかエネミーかで条件分岐し
    #それぞれの場合で更に計算を分岐させる。
    if self.actor?
      ACTT_C::ACTOR ? total_type_action_times : make_action_times_calc_change
    else
      ACTT_C::ENEMY ? total_type_action_times : make_action_times_calc_change
    end
  end
  #--------------------------------------------------------------------------
  # 行動回数増加確率の総和を以て1回行動か2回行動かの決定
  #--------------------------------------------------------------------------
  def total_type_action_times
    #0.0に確率を足していく。
    data = action_plus_set.inject(0.0) {|r, i| r + i}
    #乱数が確率の総和より低い場合に2回行動。
    rand < data ? 2 : 1
  end
end[/pre]
通过这个脚本我将再行动次数上限锁死在了1次,也就是无论行动次数增加几率累积到了多少、一个角色一回合都最多行动两次

我想要达到的效果是:
小明(50%再行动率)和小红(50%再行动率)和老师(0再行动率)开始战斗

第一回合
玩家输入小明和小红的战斗指令
小明、小红和老师互相殴打了起来,叮咣叮咣叮叮咣
小明再行动率判定成功
小红再行动率判定失败
显示战斗提示文字“小明可以再行动!”
玩家输入小明的战斗指令(此时无法对小红输入战斗指令)
“诺曼底的寒假作业!”小明单方面殴打了老师!

第二回合
玩家输入小明和小红的战斗指令
小明、小红和老师互相又殴打了起来,叮咣叮咣叮叮咣
小明再行动率判定失败
小红再行动率判定成功
显示战斗提示文字“小红可以再行动!”
玩家输入小红的战斗指令(此时无法对小明输入战斗指令)
“柠檬杯的快乐寒假!”小红单方面殴打了老师!

第三回合
玩家输入小明和小红的战斗指令
小明、小红和老师互相殴打了起来,叮咣叮咣叮叮咣
小明再行动率判定成功
小红再行动率判定成功
显示战斗提示文字“小明可以再行动!”
显示战斗提示文字“小红可以再行动!”
玩家输入小明和小红的战斗指令
“寒假作业就是用来抄的!”小明和小红单方面殴打了老师!

第四回合
玩家输入小明和小红的战斗指令
小明、小红和老师互相殴打了起来,叮咣叮咣叮叮咣
小明再行动率判定失败
小红再行动率判定失败
(此时直接进入第五回合)

队伍上限是默认的四人
另外,我不会给怪物添加增加行动次数几率这一属性,所以怪物的再行动也可以不用考虑

我想达到上面这样的效果,恳求诸位的帮忙



最佳答案

查看完整内容

↑解决这个问题的脚本 [pre lang="ruby"]#============================================================================== # ■ 强制战斗行动不覆盖原行动 by Calendar99 #------------------------------------------------------------------------------ #  如标题所说。 #============================================================================== module CLD99;end module CLD99::SMART_FORCE_ACTION ENAB ...
这个B天天摸鱼,快点来个谁把他从被窝里拖出来
梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-2-5 15:37:14 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-2-9 21:43 编辑
我设计的技能A,有通过“触发公共事件-强制使用技能指令”来使用二段技能B的设计
但这样做就会遇到一个bug,那就是在战斗中,你可以一回合行动两次的时候,你的操作是“使用技能A,再使用另一个技能C”
而实际效果会变成“你使用技能A,再使用技能B”

↑解决这个问题的脚本

[pre lang="ruby"]#==============================================================================
# ■ 强制战斗行动不覆盖原行动 by Calendar99
#------------------------------------------------------------------------------
#  如标题所说。
#==============================================================================
module CLD99;end
module CLD99::SMART_FORCE_ACTION
  
  ENABLE_SWITCH_ID = 0
  # 开启功能的开关编号
  # 正数为开关编号 0为一直启用 -1为一直禁用
  
  def self.enable?
    if ENABLE_SWITCH_ID < 0
      false
    elsif ENABLE_SWITCH_ID == 0
      true
    else
      $game_switches[ENABLE_SWITCH_ID]
    end
  end
  
end

class Game_Battler
  #--------------------------------------------------------------------------
  # ● [别名修改]强制战斗行动
  #    为不覆盖原行动而做出改动
  #--------------------------------------------------------------------------
  alias force_action_for_twice_move force_action
  def force_action(skill_id, target_index)
    return force_action_for_twice_move(skill_id, target_index) unless CLD99::SMART_FORCE_ACTION.enable?
    @action_forced = true # 不清除行动的标志
    force_action_for_twice_move(skill_id, target_index)
  end
  #--------------------------------------------------------------------------
  # ● [别名修改]清除战斗行动
  #    强制战斗行动时,将未执行的行动入栈
  #--------------------------------------------------------------------------
  alias clear_actions_for_twice_move clear_actions
  def clear_actions
    return clear_actions_for_twice_move unless CLD99::SMART_FORCE_ACTION.enable?
    @action_forced ? action_stack : clear_actions_for_twice_move
  end
  #--------------------------------------------------------------------------
  # ● [别名修改]移除当前战斗行动
  #    强制战斗行动执行完毕时,将入栈的行动取出
  #--------------------------------------------------------------------------
  alias remove_current_action_for_twice_move remove_current_action
  def remove_current_action
    remove_current_action_for_twice_move
    if @action_forced && @actions.empty? && CLD99::SMART_FORCE_ACTION.enable?
      @action_forced = false
      action_stack
    end
  end
  #--------------------------------------------------------------------------
  # ● [追加]行动栈
  #    存储因强制行动而原本要被消除的行动
  #--------------------------------------------------------------------------
  def action_stack
    if @action_stack # 栈已存在则取出
      @actions, @action_stack = @action_stack, @actions
      @action_stack = nil
    else             # 栈不存在则放入
      @action_stack = []
      @actions, @action_stack = @action_stack, @actions
    end
  end
end

class << BattleManager
  #--------------------------------------------------------------------------
  # ● [覆盖]强制行动
  #--------------------------------------------------------------------------
  def self.force_action(battler)
    @action_forced = battler
    @action_battlers.delete(battler) unless CLD99::SMART_FORCE_ACTION.enable?
  end
end[/pre]

新建工程插入楼主提供的脚本和以上脚本,测试通过。
脚本比较麻烦,调试了不少时间,与其他代码兼容性的帮助暂不提供,请谅解。

示例工程
project1.zip (1.41 MB, 下载次数: 81)




仔细看了一下,好像还有人为控制再行动的需求。
请使用下面的脚本。
[pre lang="ruby"]#==============================================================================
# ■ 人为控制再行动 by Calendar99
#------------------------------------------------------------------------------
#  可以通过战斗事件人为控制角色的再行动。(只为行动2次设计)
#   注意,每次控制的效果只持续一回合。
#
#   使用方法:战斗事件中输入脚本 $game_actors[n].twice_action_flag = boolean
#   例 $game_actors[1].twice_action_flag = true  # 这个回合,艾里克必定再行动
#      $game_actors[2].twice_action_flag = false # 这个回合,娜塔莉不可能再行动
#==============================================================================
class Game_Battler < Game_BattlerBase
  attr_accessor :twice_action_flag # 是否必定/禁止二次行动 不起作用时为nil
  #--------------------------------------------------------------------------
  # ● [别名修改]决定行动回数
  #--------------------------------------------------------------------------
  alias make_action_times_cld99 make_action_times
  def make_action_times
    if self.twice_action_flag != nil # 如果有人为操控标志
      action_times = self.twice_action_flag ? 2 : 1
      self.twice_action_flag = nil # 清除标志
      return action_times
    end
    make_action_times_cld99
  end
end[/pre]

加入了这个脚本的工程
project2.zip (1.41 MB, 下载次数: 101)

点评

啊,忘记说了。人为控制再行动的脚本一定要放在决定行动回数脚本的下面_(:3」∠)_  发表于 2019-2-9 21:45

评分

参与人数 1赞 +1 收起 理由
世界第一中二 + 1 虽然的确解决了问题……但是…….

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

梦石
10
星屑
7625
在线时间
684 小时
注册时间
2017-1-9
回帖
596

我没有哭开拓者

 楼主| 发表于 2019-2-9 16:30:10 | 显示全部楼层
自顶QvQ……召唤大佬之术~
这个B天天摸鱼,快点来个谁把他从被窝里拖出来
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部