From 0697f674ec33f8381ba68cf064732ee40e6e584f Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Sat, 12 Oct 2024 23:09:56 +0200 Subject: next commit --- Stages/Wintermaul/wintermaul.gd | 133 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Stages/Wintermaul/wintermaul.gd (limited to 'Stages/Wintermaul/wintermaul.gd') diff --git a/Stages/Wintermaul/wintermaul.gd b/Stages/Wintermaul/wintermaul.gd new file mode 100644 index 0000000..f80234d --- /dev/null +++ b/Stages/Wintermaul/wintermaul.gd @@ -0,0 +1,133 @@ +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, + }) -- cgit v1.2.3