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.gd142
1 files changed, 107 insertions, 35 deletions
diff --git a/Stages/Wintermaul/wintermaul.gd b/Stages/Wintermaul/wintermaul.gd
index f80234d..35f32a8 100644
--- a/Stages/Wintermaul/wintermaul.gd
+++ b/Stages/Wintermaul/wintermaul.gd
@@ -1,12 +1,14 @@
-class_name Wintermaul
extends Stage
+signal lives_changed
+
class Teams extends Resource:
var top := Team.new()
var bottom := Team.new()
func list() -> Array[Team]: return [top, bottom]
+ func names() -> Array[String]: return ["top", "bottom"]
class Team extends Resource:
var lives := 0
@@ -14,43 +16,76 @@ class Team extends Resource:
var teams := Teams.new()
+var income_frequency := 15.0
+
+var starting_lives := 10
+var starting_money := 50
+var starting_income := 5
+var use_premade_teams := false
+var premade_teams := {}
+
+@onready var selection_manager: SelectionManager = $SelectionManager
+@onready var money_manager: MoneyManager = $MoneyManager
+@onready var notification_manager: NotificationManager = $NotificationManager
+@onready var tower_manager: TowerManager = $TowerManager
+@onready var unit_manager: UnitManager = $UnitManager
+@onready var path_manager: PathManager = $PathManager
+
func _init():
- transform_players(preload("res://Stages/Wintermaul/player.gd"))
+ super._init()
- teams.top.lives = 10
- teams.bottom.lives = 10
+ set_player_script(preload("res://Stages/Wintermaul/player.gd"))
func _ready():
super._ready()
+ %HUD.local_player = Client.player
+
+ # initialize team lives
+ teams.top.lives = starting_lives
+ teams.bottom.lives = starting_lives
+
+ # initialize player resources
if multiplayer.is_server():
for player in Network.get_players():
Network.update_player.rpc(player.id, {
- "money": 5,
- "income": 1,
+ "money": starting_money,
+ "income": starting_income,
})
- $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
-
+ # add players to teams
Network.player_joined.connect(add_player)
- for id in Network.get_ordered_player_ids():
- add_player(Network.get_player(id))
+ if use_premade_teams:
+ for team_name in premade_teams:
+ for id in premade_teams[team_name]:
+ teams[team_name].players.append(Network.get_player(id))
+ else:
+ for id in Network.get_ordered_player_ids():
+ add_player(Network.get_player(id))
+ # set camera for local player
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)
+ # set players for HUD teams
%HUD.get_node("%TeamTop").players = teams.top.players
%HUD.get_node("%TeamBottom").players = teams.bottom.players
- if multiplayer.is_server():
- $IncomeTimer.start()
+ # initialize timer and start
+ $IncomeTimer.wait_time = income_frequency
+ $IncomeTimer.start()
+
+ # initialize lives display
+ update_lives("top", 0)
+ update_lives("bottom", 0)
+
+
+func _process(_delta: float) -> void:
+ %HUD.time.text = "Time: %.0fs" % clamp($IncomeTimer.time_left + 0.5, 0, $IncomeTimer.wait_time)
@rpc("any_peer", "call_local")
@@ -58,36 +93,53 @@ 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
+ var player = Network.get_player(tower.owner_id)
+ player.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})
+ player.money -= money_manager.get_tower_price()
+ Network.players_changed.emit()
_place_tower(%Towers, tower)
+ Client.placed_tower.emit(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)
+ var player = Network.get_player(unit.owner_id)
+ player.units.append(unit)
+
+ player.money -= unit.unit_resource.cost
+ player.income += unit.unit_resource.income
+ Network.players_changed.emit()
+
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
+ update_lives.rpc("bottom", -1)
elif team == teams.bottom:
- teams.top.lives -= 1
+ update_lives.rpc("top", -1)
)
-
- Network.update_player.rpc(player.id, {
- "money": -1,
- "income": 1,
- })
- _spawn_unit(%Units, unit)
+ _spawn_unit(%Towers, unit)
+
+
+func can_place_tower():
+ if Client.player.money < money_manager.get_tower_price():
+ notification_manager.add_status_message("Not enough money to build tower")
+ return false
+
+ return true
+
+func can_spawn_unit(unit: Unit):
+ if Client.player.money < unit.unit_resource.cost:
+ notification_manager.add_status_message("Not enough money to spawn unit")
+ return false
+
+ return true
func add_player(player: Player):
@@ -104,17 +156,18 @@ func get_team(player: Player) -> Team:
return null
-func get_spawn():
+func get_spawn() -> Spawn:
return %Spawn
-func get_overwrite_target():
+func get_spawn_target() -> Node2D:
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()
+ return null
func get_builder_collision_masks():
@@ -127,7 +180,26 @@ func get_builder_collision_masks():
func _on_income_timer_timeout() -> void:
- for player in Network.get_players():
- Network.update_player.rpc(player.id, {
- "money": player.income,
- })
+ if multiplayer.is_server():
+ for player in Network.get_players():
+ Network.update_player.rpc(player.id, {
+ "money": player.income,
+ })
+ reset_timer.rpc()
+
+@rpc("authority", "call_local")
+func reset_timer():
+ $IncomeTimer.wait_time = income_frequency
+ $IncomeTimer.start()
+
+
+@rpc("authority", "call_local")
+func update_lives(team: String, lives: int):
+ teams[team].lives += lives
+ lives_changed.emit()
+
+ if lives < 0:
+ notification_manager.add_status_message("Team " + team + " lost " + str(abs(lives)) + " life")
+
+ if teams[team].lives <= 0:
+ notification_manager.add_status_message("Team " + team + " lost the game")