57 lines
1.6 KiB
GDScript
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
|