本帖最后由 KB.Driver 于 2019-2-9 21:43 编辑
我设计的技能A,有通过“触发公共事件-强制使用技能指令”来使用二段技能B的设计
但这样做就会遇到一个bug,那就是在战斗中,你可以一回合行动两次的时候,你的操作是“使用技能A,再使用另一个技能C”
而实际效果会变成“你使用技能A,再使用技能B”
↑解决这个问题的脚本
#============================================================================== # ■ 强制战斗行动不覆盖原行动 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
#==============================================================================
# ■ 强制战斗行动不覆盖原行动 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
新建工程插入楼主提供的脚本和以上脚本,测试通过。
脚本比较麻烦,调试了不少时间,与其他代码兼容性的帮助暂不提供,请谅解。
示例工程
project1.zip
(1.41 MB, 下载次数: 81)
仔细看了一下,好像还有人为控制再行动的需求。
请使用下面的脚本。
#============================================================================== # ■ 人为控制再行动 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
#==============================================================================
# ■ 人为控制再行动 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
加入了这个脚本的工程
project2.zip
(1.41 MB, 下载次数: 101)
|