/* Called by the time manager task in vbl_macintosh.c */ boolean input_controller( void) { if (input_task_active) { if((heartbeat_count-dynamic_world->tick_count) < MAXIMUM_TIME_DIFFERENCE) { if (game_is_networked) // input from network { ; // all handled elsewhere now. (in network.c) } else if (replay.game_is_being_replayed) // input from recorded game file { static short phase= 0; /* When this gets to 0, update the world */ /* Minimum replay speed is a pause. */ if(replay.replay_speed != MINIMUM_REPLAY_SPEED) { if (replay.replay_speed > 0 || (--phase<=0)) { short flag_count= MAX(replay.replay_speed, 1); if (!pull_flags_from_recording(flag_count)) // oops. silly me. { if (replay.have_read_last_chunk) { assert(get_game_state()==_game_in_progress || get_game_state()==_switch_demo); set_game_state(_switch_demo); } } else { /* Increment the heartbeat.. */ heartbeat_count+= flag_count; } /* Reset the phase-> doesn't matter if the replay speed is positive */ /* +1 so that replay_speed 0 is different from replay_speed 1 */ phase= -(replay.replay_speed) + 1; } } } else // then getting input from the keyboard/mouse { long action_flags= parse_keymap(); process_action_flags(local_player_index, &action_flags, 1); heartbeat_count++; // ba-doom } } else { // dprintf("Out of phase.. (%d);g", heartbeat_count - dynamic_world->tick_count); } } return TRUE; // tells the time manager library to reschedule this task }
void enqueue(const tValueType& inFlags) { process_action_flags(mPlayerIndex, static_cast<const uint32 *>(&inFlags), 1); ++mWriteTick; }