extends RefCounted ## Queue that represents player's hand interactions with game mechanics class_name CommandQueue ## Commands that can be pushed to queue enum Command { NONE, TAKE_WEAPON, FIRE, RELOAD, HOLSTER_WEAPON, TAKE_ZAZA, LIGHT_ZAZA, SMOKE } signal command_pushed(sides: Array[CommandQueue.Side], commands: Array[CommandQueue.Command]) signal command_popped(commands: Array[CommandQueue.Command]) ## Human-readable hand numbers. You could even make extra hands with it, if you wish enum Side { LEFT, RIGHT } ## Used anywhere you could get null const DEFAULT_COMMAND = Command.NONE ## Dictionary filled with queues for each side var command_queue: Dictionary = {} func _init() -> void: for side in Side.values(): var arr: Array[Command] = [] command_queue[side] = arr ## Add command to queue and signal about it func push(commands: Array[CommandQueue.Command], sides: Array[CommandQueue.Side]) -> void: assert(sides.size() == Side.size()) for i in range(commands.size()): command_queue[sides[i]].push_back(commands[i]) command_pushed.emit(sides, commands) ## Remove first command from queue and signal about it func pop() -> void: # Checking if stack is actually empty (arrays must have same size) if command_queue[Side.LEFT].size() == 0: return var commands = [] for side in Side.values(): commands.push_back(command_queue[side].pop_front()) command_popped.emit(commands) func current_command(side: CommandQueue.Side) -> CommandQueue.Command: if command_queue[side].is_empty(): return DEFAULT_COMMAND var command = command_queue[side].front() return command