diff options
Diffstat (limited to 'Stages/Wintermaul/wintermaul.gd')
| -rw-r--r-- | Stages/Wintermaul/wintermaul.gd | 142 | 
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") | 
