red_dragon_pon/base/scripts/player/command_queue.gd

57 lines
1.6 KiB
GDScript

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,
SHOOT,
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