summaryrefslogtreecommitdiff
path: root/Stages/Wintermaul/wintermaul.gd
diff options
context:
space:
mode:
Diffstat (limited to 'Stages/Wintermaul/wintermaul.gd')
-rw-r--r--Stages/Wintermaul/wintermaul.gd133
1 files changed, 133 insertions, 0 deletions
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,
+ })