| 赞 | 67 |
| VIP | |
| 好人卡 | |
| 积分 | 170 |
| 经验 | |
| 最后登录 | 2026-10-2 |
| 在线时间 | 6058 小时 |
- 梦石
- 0
- 星屑
- 17038
- 在线时间
- 6058 小时
- 注册时间
- 2011-7-18
- 回帖
- 152

|
发表于 2021-10-30 02:46:23
|
显示全部楼层
本帖最后由 gqxastg 于 2021-10-30 09:16 编辑
研究了一下...
确实光修是修不好的,还是需要个人注意用法
(其实说真的并行处理的事件还是应该套一层循环,每次执行完会空一帧太伤了)
试图修正[pre lang="ruby"]# 事件解释器存储的时候@index + 1,原意是事件中使用“打开存档画面”等存档操作时,
# 为了避免读档后会再执行一次。
# 而没考虑到某些指令的脚本选项和其他并行处理的事件解释器,都会被错误的推后一个指令
# 正确解法应该是:除了调用存档操作的解释器推后外,其他(大多)不推后
# 考虑到变量操作里也有用脚本的选项,所以也算上推后
# 而条件分歧推后会直接到成立时的指令,且未经判断则算作不成立,导致两种处理均会执行
# 故不推后(当然暴力点可以所有指令均不推后,代价就是读档后会再存一次档之类的)
# 设置移动路径因为会保存在角色/事件里,如果在等待移动结束时再次执行会重置路径,
# 导致移动紊乱,所以如果已设置路径则必须推后
# 剩下这些是带wait的,而且多半是依据现有变量数值的渐变,重设也会打乱效果
class Game_Interpreter
# 打开菜单画面, 打开存档画面, 脚本, 设置移动路径
# 淡出画面, 淡入画面, 更改画面色调, 画面闪烁, 画面震动, 移动图片, 更改图片色调,
# 设置天气
[351, 352, 355, 205,
221, 222, 223, 224, 225, 232, 234, 236].each do |i|
new_name = "fixindexold_" + (name = "command_#{i}")
alias_method new_name, name
define_method(name) do
@dump_skip_index = true
send(new_name)
@dump_skip_index = false
end
end
#--------------------------------------------------------------------------
# ● 变量操作
#--------------------------------------------------------------------------
alias fixindexold_command_122 command_122
def command_122
@dump_skip_index = true if @params[3] == 4 # 脚本
fixindexold_command_122
@dump_skip_index = false
end if true # 将这里的true改为false则变量操作所有情况都不推后
#--------------------------------------------------------------------------
# ● 储存实例
#--------------------------------------------------------------------------
alias fixindexold_marshal_dump marshal_dump
def marshal_dump
return fixindexold_marshal_dump unless @list && @list[@index]
old_index = @index
@index = old_index - 1 if !@dump_skip_index
ret = fixindexold_marshal_dump # 原本为@index + 1
@index = old_index
ret
end
end[/pre] 结果仔细想了一下,并行处理错误存储的根源是指令根本没执行
一旦执行了不是瞬间完成就是在等待结束,而等待结束的也基本不适合重设(还是有等待和显示动画之类的不适合跳)
所以还是可以只限制未执行的不推后,剩下执行中的统统跳过
(至于直接在条件分歧里save_game本身就应该避免,可以不管)暴力修正[pre lang="ruby"]class Game_Interpreter
#--------------------------------------------------------------------------
# ● 执行事件指令
#--------------------------------------------------------------------------
alias fixindexold_execute_command execute_command
def execute_command
@dump_skip_index = true
fixindexold_execute_command
@dump_skip_index = false
end
#--------------------------------------------------------------------------
# ● 储存实例
#--------------------------------------------------------------------------
alias fixindexold_marshal_dump marshal_dump
def marshal_dump
return fixindexold_marshal_dump unless @list && @list[@index]
old_index = @index
@index = old_index - 1 if !@dump_skip_index
ret = fixindexold_marshal_dump # 原本为@index + 1
@index = old_index
ret
end
end[/pre] 所以最后结合这两点,只有在执行指令时且排除特定几个指令之外才跳过就可以了
(当然可能有点偏离主题了,排除指令纯粹是附加的)最终修正[pre lang="ruby"]class Game_Interpreter
# 条件分歧, 显示动画, 显示心情图标, 集合队伍成员, 等待
[111, 212, 213, 217, 230].each do |i|
new_name = "fixindexold_" + (name = "command_#{i}")
alias_method new_name, name
define_method(name) do
old = @dump_skip_index; @dump_skip_index = false
send(new_name)
@dump_skip_index = old
end
end
#--------------------------------------------------------------------------
# ● 执行事件指令
#--------------------------------------------------------------------------
alias fixindexold_execute_command execute_command
def execute_command
@dump_skip_index = true
fixindexold_execute_command
@dump_skip_index = false
end
#--------------------------------------------------------------------------
# ● 储存实例
#--------------------------------------------------------------------------
alias fixindexold_marshal_dump marshal_dump
def marshal_dump
return fixindexold_marshal_dump unless @list && @list[@index]
old_index = @index
@index = old_index - 1 if !@dump_skip_index
ret = fixindexold_marshal_dump # 原本为@index + 1
@index = old_index
ret
end
end[/pre]
|
评分
-
查看全部评分
|