2025-05-31 22:21:22 +01:00
|
|
|
extends Node
|
2025-06-21 14:35:32 +01:00
|
|
|
class_name Players
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
@export var player_scene: PackedScene = preload("res://objects/player.tscn")
|
2025-06-21 14:35:32 +01:00
|
|
|
@export var bot_scene: PackedScene = preload("res://objects/bot.tscn")
|
|
|
|
@export var bot_count: int = 7
|
|
|
|
@export var bot_test_mode = false
|
|
|
|
|
|
|
|
@onready var game_state: GameState = get_parent() as GameState
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
signal player_joined(player: Player)
|
|
|
|
signal player_left(player: Player)
|
|
|
|
|
2025-06-21 14:35:32 +01:00
|
|
|
static var instance: Players = null
|
|
|
|
|
2025-05-31 22:21:22 +01:00
|
|
|
func _ready() -> void:
|
|
|
|
connect("child_entered_tree", on_child_added)
|
2025-06-21 14:35:32 +01:00
|
|
|
if instance == null:
|
|
|
|
instance = self
|
|
|
|
|
|
|
|
await get_tree().create_timer(0.5).timeout
|
|
|
|
|
|
|
|
for i in range(bot_count):
|
|
|
|
create_bot(i)
|
|
|
|
#bot.player_name = "Bot %d" % i
|
|
|
|
#bot.player_pronouns = "they/them"
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
@rpc("any_peer", "call_remote", "reliable")
|
2025-06-21 14:35:32 +01:00
|
|
|
func clear_all_players():
|
|
|
|
for child in get_children():
|
|
|
|
child.queue_free()
|
|
|
|
|
|
|
|
@rpc("any_peer", "call_remote", "reliable")
|
|
|
|
func create_player_for_session_id(session_id: int) -> Player:
|
2025-05-31 22:21:22 +01:00
|
|
|
for child in get_children():
|
|
|
|
var player: Player = child as Player
|
|
|
|
if player == null:
|
|
|
|
continue
|
|
|
|
if player.session_id == session_id:
|
2025-06-21 14:35:32 +01:00
|
|
|
return player
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
var player: Player = player_scene.instantiate() as Player
|
|
|
|
player.name = "Player %d" % session_id
|
|
|
|
player.session_id = session_id
|
2025-06-21 14:35:32 +01:00
|
|
|
player.game_state = game_state
|
2025-05-31 22:21:22 +01:00
|
|
|
print("Created player object for session ID %d" % session_id)
|
|
|
|
add_child(player)
|
2025-06-21 14:35:32 +01:00
|
|
|
return player
|
|
|
|
|
|
|
|
@rpc("any_peer", "call_remote", "reliable")
|
|
|
|
func create_bot(bot_id: int) -> Bot:
|
|
|
|
var bot: Bot = bot_scene.instantiate() as Bot
|
|
|
|
bot.session_id = bot_id
|
|
|
|
bot.game_state = game_state
|
|
|
|
bot.player_name = "Bot %d" % bot_id
|
|
|
|
bot.test_mode = bot_test_mode
|
|
|
|
add_child(bot)
|
|
|
|
return bot
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
func find_player_by_session_id(session_id: int) -> Player:
|
|
|
|
for child in get_children():
|
|
|
|
var player: Player = child as Player
|
|
|
|
if player == null:
|
|
|
|
continue
|
|
|
|
if player.session_id == session_id:
|
|
|
|
return player
|
|
|
|
|
|
|
|
create_player_for_session_id.rpc_id(1, session_id)
|
|
|
|
|
|
|
|
for child in get_children():
|
|
|
|
var player: Player = child as Player
|
|
|
|
if player == null:
|
|
|
|
continue
|
|
|
|
if player.session_id == session_id:
|
|
|
|
return player
|
|
|
|
return null
|
2025-06-21 14:35:32 +01:00
|
|
|
|
|
|
|
func find_player_by_name(name: String) -> Player:
|
|
|
|
for player in get_players():
|
|
|
|
if player.player_name == name:
|
|
|
|
return player
|
|
|
|
return null
|
|
|
|
|
|
|
|
func get_players() -> Array[Player]:
|
|
|
|
var ret: Array[Player]
|
|
|
|
for child in get_children():
|
|
|
|
if child is Player:
|
|
|
|
ret.append(child as Player)
|
|
|
|
return ret
|
|
|
|
|
|
|
|
func get_active_players() -> Array[Player]:
|
|
|
|
return get_players().filter(func(player: Player): return player.playing)
|
2025-05-31 22:21:22 +01:00
|
|
|
|
|
|
|
func on_child_added(node: Node) -> void:
|
|
|
|
if node is Player:
|
|
|
|
print("Player joined: %d" % node.session_id)
|
|
|
|
player_joined.emit(node as Player)
|
2025-06-21 14:35:32 +01:00
|
|
|
|
|
|
|
func call_on_active_players(method: StringName):
|
|
|
|
for player in get_active_players():
|
|
|
|
player.call(method)
|