87 lines
3.4 KiB
GDScript
87 lines
3.4 KiB
GDScript
@icon("res://assets/icons/game.svg")
|
|
class_name GameManager
|
|
extends Node2D
|
|
|
|
## -- EXPORTS --
|
|
@export var game_ball: Ball
|
|
@export var court: Court
|
|
@export_group("Teams")
|
|
@export var home_team: Team
|
|
@export var away_team: Team
|
|
|
|
## -- VARIABLES --
|
|
var players: Array
|
|
var active_player: Player: set = set_active_player
|
|
var ball_handler: Player: set = set_ball_handler
|
|
|
|
## -- OVERRIDES --
|
|
func _ready() -> void:
|
|
players = get_tree().get_nodes_in_group("players")
|
|
for player in players:
|
|
player = player as Player
|
|
_connect_player_signals(player)
|
|
player.is_active = false
|
|
player.current_ball = game_ball
|
|
active_player = players[0] as Player
|
|
|
|
## -- RECEIVERS --
|
|
func on_player_ball_dropped() -> void:
|
|
print_debug("%s has dropped the ball" % ball_handler.attributes.player_name)
|
|
game_ball.is_loose = true
|
|
ball_handler = null
|
|
|
|
func on_player_grab_attempted() -> void:
|
|
print_debug("%s has attempted to grab the ball" % active_player.attributes.player_name)
|
|
if game_ball.is_loose:
|
|
print_debug("The ball is loose. This should be easy.")
|
|
active_player.has_ball = true
|
|
ball_handler = active_player
|
|
game_ball.is_loose = false
|
|
else:
|
|
print_debug("%s has the ball. This could be tough." % ball_handler.attributes.player_name)
|
|
_determine_steal_outcome(active_player, ball_handler)
|
|
|
|
func on_player_turn_finished() -> void:
|
|
print_debug("Moving to the next player in the turn order")
|
|
if players.find(active_player) < players.size() -1:
|
|
active_player = players.get(players.find(active_player) + 1)
|
|
else:
|
|
active_player = players.get(0)
|
|
|
|
## -- SETTERS --
|
|
func set_active_player(a_p) -> void:
|
|
active_player = a_p
|
|
print_debug("The game is setting the active player to %s" % active_player.attributes.player_name)
|
|
active_player.is_active = true
|
|
|
|
func set_ball_handler(b_h: Player) -> void:
|
|
ball_handler = b_h
|
|
if ball_handler:
|
|
print_debug("%s has the ball" % ball_handler.attributes.player_name)
|
|
|
|
## -- HELPERS
|
|
|
|
func _connect_player_signals(p: Player) -> void:
|
|
p.connect("ball_dropped", on_player_ball_dropped)
|
|
p.connect("turn_finished", on_player_turn_finished)
|
|
p.connect("grab_attempted", on_player_grab_attempted)
|
|
|
|
func _determine_steal_outcome(grabber: Player, handler: Player) -> void:
|
|
print_debug("%s attempting a steal from %s" % [grabber.attributes.player_name, handler.attributes.player_name])
|
|
var grabber_dexterity_mod: int = grabber.attributes.dexterity
|
|
var handler_handling_mod: int = handler.attributes.ball_handling
|
|
var grabber_roll: int = Dice.roll(Dice.DiceType.d20, 1)
|
|
var grabber_total: int = grabber_roll + grabber_dexterity_mod
|
|
print_debug("%s rolled a %s and has a %s dexterity modifier, for a total of %s" % [grabber.attributes.player_name, grabber_roll, grabber_dexterity_mod, grabber_total])
|
|
var handler_roll: int = Dice.roll(Dice.DiceType.d20, 1)
|
|
var handler_total: int = handler_roll + handler_handling_mod
|
|
print_debug("%s rolled a %s and has a %s ball-handling modifier, for a total of %s" % [handler.attributes.player_name, handler_roll, handler_handling_mod, handler_total])
|
|
var steal_successful: bool = grabber_total > handler_total
|
|
if steal_successful:
|
|
print_debug("Steal successful! Changing possession from %s to %s" % [handler.attributes.player_name, grabber.attributes.player_name])
|
|
ball_handler.has_ball = false
|
|
ball_handler = active_player
|
|
active_player.has_ball = true
|
|
else:
|
|
print_debug("Steal unsuccessful! %s keeps possession" % [handler.attributes.player_name])
|