Too sexy for your party.
- Mar 14, 2012
- Reaction score
- Primarily Uses
Parallel Process Events Execution Bug Fix.
There is a problem with the execution of Parallel Process events in RPG Maker VX Ace (at least at the time of writing). Unlike Autorun events, they are not executed every update cycle (frame) by default due to a misplaced line in Game_Interpreter. The execution of the Parallel Process events skips one frame after one successful execution, potentially causing serious synchronization problems for event based systems.
That behavior is completely unexpected and counterintuitive, and has the potential of making your game feel unresponsive to your players if you rely on Parallel Process events for any system that requires player input (like mini games).
How to corroborate the problem?
The easier way is to make a Parallel Process event report the game's frame count. To do that, simply create a Parallel Process event and add a Call Script command on it with the following:
Solistra was kind enough to provide a video showing the problem and comparing the execution with Autorun events (which works as expected):
What causes the bug?
Event "update" method setups the interpreter only if it is not "running":
def update super check_event_trigger_auto return unless @interpreter @interpreter.setup(@list, @event.id) unless @interpreter.running? @interpreter.update end
"running?" is defined as the following in Game_Interpreter:
def running? @fiber != nil end
and the "run" method for the interpreter is the following:
def run wait_for_message while @list[@index] do execute_command @index += 1 end Fiber.yield @fiber = nil end
The problem is that the control is passed back to the caller before the "@fiber = nil" line is executed, so by the time of the next Event update cycle, the Interpreter is still "running" and won't setup again, making it skip one update cycle because when the Fiber gains back control, it will execute the pending "@fiber = nil" line, and the condition for the Interpreter update won't be met:
def update @fiber.resume if @fiber end
How to fix the problem?
The solution is simple:
# Parallel Process Events Execution Bug Fix.# Version 1.0.0# 09/02/15 - DD/MM/YY# www.rpgmakersource.com# forums.rpgmakersource.comclass Game_Interpreter # Overwrites default method with the fixed version. def run wait_for_message while @list[@index] do execute_command @index += 1 end @fiber = nil Fiber.yield endend
Pasting the above code right below the default scripts, or anywhere below Game_Interpreter and above any custom script, will fix the problem.
The code is free. You can use it in any commercial or non commercial game. Credits are appreciated but not necessary. Don't remove the original header.
Last edited by a moderator: