class_name Wintermaul extends Stage class Teams extends Resource: var top := Team.new() var bottom := Team.new() func list() -> Array[Team]: return [top, bottom] class Team extends Resource: var lives := 0 var players: Array[Player] = [] var teams := Teams.new() func _init(): transform_players(preload("res://Stages/Wintermaul/player.gd")) teams.top.lives = 10 teams.bottom.lives = 10 func _ready(): super._ready() if multiplayer.is_server(): for player in Network.get_players(): Network.update_player.rpc(player.id, { "money": 5, "income": 1, }) $Camera.limit_left = $Map.get_used_rect().position.x * %Map.tile_set.tile_size.x $Camera.limit_right = $Map.get_used_rect().end.x * %Map.tile_set.tile_size.x $Camera.limit_top = %Map.get_used_rect().position.y * %Map.tile_set.tile_size.y $Camera.limit_bottom = %Map.get_used_rect().end.y * %Map.tile_set.tile_size.y Network.player_joined.connect(add_player) for id in Network.get_ordered_player_ids(): add_player(Network.get_player(id)) if get_team(Client.player) == teams.top: $Camera.set_center($BuilderCollisions/TeamTop/CollisionShape2D.global_position) elif get_team(Client.player) == teams.bottom: $Camera.set_center($BuilderCollisions/TeamBottom/CollisionShape2D.global_position) %HUD.get_node("%TeamTop").players = teams.top.players %HUD.get_node("%TeamBottom").players = teams.bottom.players if multiplayer.is_server(): $IncomeTimer.start() @rpc("any_peer", "call_local") func place_tower(remote_data: Dictionary): var data: Tower.NetworkData = dict_to_inst(remote_data) var tower = Tower.from_network_data(data) Network.get_player(tower.owner_id).towers[tower.global_position] = tower if multiplayer.is_server(): var player = Network.get_player(tower.owner_id) Network.update_player.rpc(player.id, {"money": -1}) _place_tower(%Towers, tower) @rpc("any_peer", "call_local") func spawn_unit(remote_data: Dictionary): var data: Unit.NetworkData = dict_to_inst(remote_data) var unit := Unit.from_network_data(data) if multiplayer.is_server(): var player = Network.get_player(unit.owner_id) unit.reached_goal.connect(func(): var team = get_team(player) if team == teams.top: teams.bottom.lives -= 1 elif team == teams.bottom: teams.top.lives -= 1 ) Network.update_player.rpc(player.id, { "money": -1, "income": 1, }) _spawn_unit(%Units, unit) func add_player(player: Player): if teams.bottom.players.size() < teams.top.players.size(): teams.bottom.players.append(player) else: teams.top.players.append(player) func get_team(player: Player) -> Team: for team in teams.list(): if player in team.players: return team return null func get_spawn(): return %Spawn func get_overwrite_target(): var team = get_team(Client.player) if team == teams.top: return [$Paths/PathNodeLeftDown, $Paths/PathNodeRightDown].pick_random() elif team == teams.bottom: return [$Paths/PathNodeLeftUp, $Paths/PathNodeRightUp].pick_random() func get_builder_collision_masks(): var team = get_team(Client.player) if team == teams.top: return [28] elif team == teams.bottom: return [27] func _on_income_timer_timeout() -> void: for player in Network.get_players(): Network.update_player.rpc(player.id, { "money": player.income, })