/* $Id: command_queue.c 5306 2006-06-18 00:29:44Z richk $ */ #include "stdafx.h" #include "openttd.h" #include "table/sprites.h" #include "table/strings.h" #include "functions.h" #include "player.h" #include "tile.h" #include "window.h" #include "gui.h" #include "viewport.h" #include "gfx.h" #include "sound.h" #include "command.h" #include "vehicle.h" #include "tunnel_map.h" #include "bridge_map.h" #include "waypoint.h" #include "variables.h" #include "debug.h" void CQ_Put(void) { //increase size _command_queue_size++; //increase pop index, wrap if necessary _command_queue_put++; if (_command_queue_put >= COMMAND_QUEUE_CAPACITY) _command_queue_put = 0; } void QueueCommand(TileIndex tile, uint32 p1, uint32 p2, void *callback, uint32 cmd) { if (_command_queue_size < COMMAND_QUEUE_CAPACITY) { _command_queue_tile[_command_queue_put] = tile; _command_queue_p1[_command_queue_put] = p1; _command_queue_p2[_command_queue_put] = p2; _command_queue_callback[_command_queue_put] = callback; _command_queue_cmd[_command_queue_put] = cmd; CQ_Put(); } else { debug("WARNING: Command Queue full!"); } } void CQ_Pop(void) { //decrease size _command_queue_size--; //increase pop index, wrap if necessary _command_queue_pop++; if (_command_queue_pop >= COMMAND_QUEUE_CAPACITY) _command_queue_pop = 0; } uint32 GetRemainingQueueSpace(void) { return COMMAND_QUEUE_CAPACITY - _command_queue_size; } void ExecuteNextCommand(void) { //We store & unset shift_pressed during execution bool _temp_shift_pressed; if (_command_queue_size > 0) { _temp_shift_pressed = _shift_pressed; _shift_pressed = false; DoCommandP( _command_queue_tile[_command_queue_pop], _command_queue_p1[_command_queue_pop], _command_queue_p2[_command_queue_pop], (CommandCallback *)_command_queue_callback[_command_queue_pop], _command_queue_cmd[_command_queue_pop] ); CQ_Pop(); _shift_pressed = _temp_shift_pressed; } } void ClearCommandQueue(void) { _command_queue_size = 0; _command_queue_pop = 0; _command_queue_put = 0; }