Skip to content

Commit

Permalink
Setup correct amount of teams
Browse files Browse the repository at this point in the history
Change creep spawner to remove connection to player's team because
\ player's team is not ready at that point
Change player creation to be separate from teams, add Player.make()
Fix PlayerManager.get_player_list() not returning a copy
  • Loading branch information
Kvel2D committed Oct 19, 2024
1 parent eec77bb commit 5c83047
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 23 deletions.
2 changes: 1 addition & 1 deletion src/creeps/creep_spawner.gd
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ var _creep_index: int = 0
func set_player(player: Player):
_player = player

_player.get_team().game_lose.connect(_on_game_lose)
_player.game_lose.connect(_on_game_lose)

_ground_path = Utils.find_creep_path(player, false)
_air_path = Utils.find_creep_path(player, true)
Expand Down
23 changes: 19 additions & 4 deletions src/game_scene/game_scene.gd
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,12 @@ func _setup_players():
for peer_id in peer_id_list:
var player_id: int = peer_id_list.find(peer_id)

# NOTE: multiply player id in "1 player per team" mode
# by 2 because the second slot in teams is not
# occupied
if team_mode == TeamMode.enm.ONE_PLAYER_PER_TEAM:
player_id *= 2

var user_id: String
match connection_type:
Globals.ConnectionType.ENET:
Expand All @@ -303,12 +309,21 @@ func _setup_players():
var webrtc_player: OnlineMatch.WebrtcPlayer = OnlineMatch.get_player_by_peer_id(peer_id)
user_id = webrtc_player.user_id

var team_id_for_player: int = floori(player_id * 1.0 / player_count_per_team)
var team: Team = _team_container.get_team(team_id_for_player)

var player: Player = team.create_player(player_id, peer_id, user_id)
var player: Player = Player.make(player_id, peer_id, user_id)
PlayerManager.add_player(player)

# Assign players to teams
var remaining_player_list: Array[Player] = PlayerManager.get_player_list()
var team_list: Array[Team] = _team_container.get_team_list()

for team in team_list:
for i in range(0, player_count_per_team):
if remaining_player_list.is_empty():
break

var player: Player = remaining_player_list.pop_front()
team.add_player(player)


func _start_game():
_game_start_timer.stop()
Expand Down
22 changes: 22 additions & 0 deletions src/player/player.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ signal selected_builder()
signal voted_ready()
signal roll_was_disabled()
signal rolled_starting_towers()
signal game_lose()


const STARTING_ELEMENT_COST = 20
Expand Down Expand Up @@ -625,6 +626,10 @@ func roll_starting_towers():
rolled_starting_towers.emit()


func emit_game_lose_signal():
game_lose.emit()


#########################
### Private ###
#########################
Expand Down Expand Up @@ -731,3 +736,20 @@ func _on_selected_unit_tree_exited(unit: Unit):
var selected_unit_is_being_removed: bool = _selected_unit == unit
if selected_unit_is_being_removed:
set_selected_unit(null)


# NOTE: either peer_id or user_id has to be defined,
# depending on if connection is Nakama or Enet
static func make(player_id: int, peer_id: int, user_id: String) -> Player:
var player: Player = Preloads.player_scene.instantiate()
player._id = player_id
player._peer_id = peer_id
player._user_id = user_id

# Add base class Builder as placeholder until the real
# builder is assigned. This builder will have no effects.
var placeholder_builder: Builder = Builder.new()
player._builder = placeholder_builder
player.add_child(placeholder_builder)

return player
21 changes: 4 additions & 17 deletions src/player/team.gd
Original file line number Diff line number Diff line change
Expand Up @@ -66,28 +66,12 @@ func start_next_wave():
_start_wave()


# NOTE: either peer_id or user_id has to be defined,
# depending on if connection is Nakama or Enet
func create_player(player_id: int, peer_id: int, user_id: String) -> Player:
var player: Player = Preloads.player_scene.instantiate()
player._id = player_id
func add_player(player: Player):
player._team = self
player._peer_id = peer_id
player._user_id = user_id

_player_list.append(player)

# Add base class Builder as placeholder until the real
# builder is assigned. This builder will have no effects.
var placeholder_builder: Builder = Builder.new()
player._builder = placeholder_builder
player.add_child(placeholder_builder)

player.wave_spawned.connect(_on_player_wave_spawned)
player.wave_finished.connect(_on_player_wave_finished)

return player


func get_id() -> int:
return _id
Expand Down Expand Up @@ -286,6 +270,9 @@ func _do_game_lose():

game_lose.emit()

for player in _player_list:
player.emit_game_lose_signal()


# This function starts the timer only if it's not already
# running or if new duration is shorter
Expand Down
2 changes: 1 addition & 1 deletion src/singletons/player_manager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func get_player_by_nakama_user_id(user_id: String) -> Player:


func get_player_list() -> Array[Player]:
return _player_list
return _player_list.duplicate()


func reset():
Expand Down

0 comments on commit 5c83047

Please sign in to comment.