From 76d1ec723b6f6f68a512f27607749f3ff885f385 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 27 Jun 2025 16:51:18 +0200 Subject: managers + various changes --- Game/Client.gd | 6 - Game/Lobby/Server/index.php | 186 +++++++++++++------------- Game/Network.gd | 28 +--- Game/Selection/selection_rectangle.gd | 2 +- Game/States/Build/StateBuild.gd | 4 +- Game/States/Default/StateDefault.gd | 5 +- Stages/Stage.gd | 16 +-- Stages/Wintermaul/HUD.gd | 42 +++--- Stages/Wintermaul/Units/ina.tres | 2 +- Stages/Wintermaul/Units/laplus.tres | 2 +- Stages/Wintermaul/Units/tux.tres | 2 +- Stages/Wintermaul/Wintermaul.tscn | 29 +++- Stages/Wintermaul/hud_tower.gd | 76 ++++++----- Stages/Wintermaul/money_manager.gd | 50 +++++++ Stages/Wintermaul/money_manager.gd.uid | 1 + Stages/Wintermaul/notification_manager.gd | 13 ++ Stages/Wintermaul/notification_manager.gd.uid | 1 + Stages/Wintermaul/wintermaul.gd | 50 ++----- Stages/Wintermaul2/Wintermaul2.tscn | 5 +- UI/PlayerLobby/Lobby.tscn | 41 ++---- UI/PlayerLobby/lobby.gd | 13 +- UI/PlayerLobby/map_button.gd | 6 + UI/PlayerLobby/map_button.gd.uid | 1 + UI/PlayerLobby/map_button.tscn | 9 ++ UI/Start.gd | 1 + UI/spawn_button.gd | 2 +- Units/Unit.tscn | 1 - project.godot | 2 + 28 files changed, 326 insertions(+), 270 deletions(-) create mode 100644 Stages/Wintermaul/money_manager.gd create mode 100644 Stages/Wintermaul/money_manager.gd.uid create mode 100644 Stages/Wintermaul/notification_manager.gd create mode 100644 Stages/Wintermaul/notification_manager.gd.uid create mode 100644 UI/PlayerLobby/map_button.gd create mode 100644 UI/PlayerLobby/map_button.gd.uid create mode 100644 UI/PlayerLobby/map_button.tscn diff --git a/Game/Client.gd b/Game/Client.gd index 0af4e9d..4eb48bb 100644 --- a/Game/Client.gd +++ b/Game/Client.gd @@ -18,8 +18,6 @@ var state: State : var current_stage: Stage -var selection: SelectionManager - var player: Player: get(): return Network.get_player(multiplayer.get_unique_id()) @@ -33,10 +31,6 @@ func _notification(what: int) -> void: func initialize_stage(stage: Stage): current_stage = stage - - if not selection: - selection = preload("res://Game/Selection/SelectionManager.tscn").instantiate() - add_child(selection) func ready_stage(_stage: Stage): pass diff --git a/Game/Lobby/Server/index.php b/Game/Lobby/Server/index.php index 1086d24..7d12195 100644 --- a/Game/Lobby/Server/index.php +++ b/Game/Lobby/Server/index.php @@ -19,18 +19,18 @@ $db = new PDO('sqlite:./' . $dbname, options: [ if (php_sapi_name() == 'cli') { if ($argv[$argc - 1] == 'init-db') { - $db->query(<<execute(); + $db->query(<<execute(); } return; @@ -42,7 +42,7 @@ $method = $_SERVER['REQUEST_METHOD']; if ($method == 'POST') { $inputPost = json_decode(file_get_contents('php://input'), true); if ($inputPost) { - $_POST = $inputPost + $_POST; + $_POST = $inputPost + $_POST; } } @@ -50,73 +50,73 @@ $response = []; if ($method == 'POST' && $url['path'] == '/host') { $ip = filter_var( - $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'], - FILTER_VALIDATE_IP + $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'], + FILTER_VALIDATE_IP ); if ($ip === false) { - $response = [ - 'success' => false, - 'error' => 'Invalid IP.', - ]; + $response = [ + 'success' => false, + 'error' => 'Invalid IP.', + ]; } else { - $port = intval($_POST['port']); - $name = $_POST['name']; - $id = md5($name . time()); - $secret = md5($id . random_bytes($port)); - - $success = $db->prepare(<<execute([ - 'id' => $id, - 'ip' => $ip, - 'port' => $port, - 'timestamp' => time(), - 'name' => $name, - 'secret' => $secret, - ]); - - if ($success) { - $response = [ - 'success' => $success, - 'data' => [ - 'id' => $id, - 'secret' => $secret, - ], - ]; - } else { - $response = [ - 'success' => $success, - 'error' => $db->errorInfo(), - ]; - } + $port = intval($_POST['port']); + $name = $_POST['name']; + $id = md5($name . time()); + $secret = md5($id . random_bytes($port)); + + $success = $db->prepare(<<execute([ + 'id' => $id, + 'ip' => $ip, + 'port' => $port, + 'timestamp' => time(), + 'name' => $name, + 'secret' => $secret, + ]); + + if ($success) { + $response = [ + 'success' => $success, + 'data' => [ + 'id' => $id, + 'secret' => $secret, + ], + ]; + } else { + $response = [ + 'success' => $success, + 'error' => $db->errorInfo(), + ]; + } } } else if ($method == 'GET' && $url['path'] == '/get-list') { $statement = $db->prepare(<< :comparison_time - SQL); + select id, name from games + where ping_time > :comparison_time + SQL); $statement->execute([ - 'comparison_time' => time() - $timeoutMax, + 'comparison_time' => time() - $timeoutMax, ]); $results = $statement->fetchAll(); $list = []; foreach ($results as $row) { - $list[] = [ - 'id' => $row['id'], - 'name' => $row['name'], - ]; + $list[] = [ + 'id' => $row['id'], + 'name' => $row['name'], + ]; } $response = [ - 'success' => true, - 'data' => $list, + 'success' => true, + 'data' => $list, ]; } @@ -124,30 +124,30 @@ else if ($method == 'GET' && $url['path'] == '/join') { $id = $_GET['id']; $statement = $db->prepare(<<execute([ - 'id' => $id, + 'id' => $id, ]); $result = $statement->fetch(); if ($result === false) { - $response = [ - 'success' => false, - 'error' => 'Game not found.' - ]; - http_response_code(404); + $response = [ + 'success' => false, + 'error' => 'Game not found.' + ]; + http_response_code(404); } else { - $response = [ - 'success' => true, - 'data' => [ - 'ip' => $result['ip'], - 'port' => $result['port'], - ], - ]; + $response = [ + 'success' => true, + 'data' => [ + 'ip' => $result['ip'], + 'port' => $result['port'], + ], + ]; } } @@ -156,15 +156,15 @@ else if ($method == 'POST' && $url['path'] == '/close') { $secret = $_POST['secret']; $success = $db->prepare(<<execute([ - 'id' => $id, - 'secret' => $secret, - ]); + delete from games where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } @@ -173,23 +173,23 @@ else if ($method == 'POST' && $url['path'] == '/keep-alive') { $secret = $_POST['secret']; $success = $db->prepare(<<execute([ - 'id' => $id, - 'secret' => $secret, - 'ping_time' => time(), - ]); + update games set ping_time = :ping_time where id = :id and secret = :secret + SQL) + ->execute([ + 'id' => $id, + 'secret' => $secret, + 'ping_time' => time(), + ]); $response = [ - 'success' => $success, + 'success' => $success, ]; } else { $response = [ - 'success' => false, - 'error' => 'Route not found.' + 'success' => false, + 'error' => 'Route not found.' ]; http_response_code(404); } diff --git a/Game/Network.gd b/Game/Network.gd index 4413548..345b305 100644 --- a/Game/Network.gd +++ b/Game/Network.gd @@ -62,14 +62,6 @@ func _on_peer_connected(id: int): print(multiplayer.get_unique_id(), ": peer connected: ", id) add_to_players.rpc_id(id, inst_to_dict(Client.player)) - # TODO: check why bug and adds more players than intended - #ask_game_running.rpc_id(id) - #is_game_running.connect(func(is_running: bool): - #if not is_running: - #add_to_players.rpc_id(id, inst_to_dict(Client.player)) - #elif is_running: - #get_tree().change_scene_to_file("res://UI/Start.tscn") - #) func _on_peer_disconnected(id: int): print(multiplayer.get_unique_id(), ": peer disconnected: ", id) @@ -113,18 +105,6 @@ func remove_player(id: int): players_changed.emit() -signal is_game_running(is_running: bool) - -@rpc("any_peer") -func ask_game_running(): - var is_running = get_tree().current_scene is Stage - receive_game_running.rpc_id(multiplayer.get_remote_sender_id(), is_running) - -@rpc("any_peer") -func receive_game_running(is_running: bool): - is_game_running.emit(is_running) - - @rpc("any_peer") func add_to_players(remote_data: Dictionary): var id = multiplayer.get_remote_sender_id() @@ -152,7 +132,7 @@ func update_player(id: int, remote_data: Dictionary): players_changed.emit() -@rpc("any_peer") +@rpc("any_peer", "call_remote") func destroy_tower(remote_data: Dictionary): var data: Tower.NetworkData = dict_to_inst(remote_data) var remote_tower = Tower.from_network_data(data) @@ -163,7 +143,7 @@ func destroy_tower(remote_data: Dictionary): Client.current_stage.destroy_tower(tower) -@rpc("any_peer") +@rpc("any_peer", "call_remote") func update_tower(remote_tower_node_path: NodePath, remote_data: Dictionary): var data: Tower.NetworkData = dict_to_inst(remote_data) var tower: Tower = get_tree().current_scene.get_node_or_null(remote_tower_node_path) @@ -172,14 +152,14 @@ func update_tower(remote_tower_node_path: NodePath, remote_data: Dictionary): tower.update_with_network_data(data) -@rpc("any_peer") +@rpc("any_peer", "call_remote") func remove_unit(remote_unit_node_path: NodePath): var unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path) if unit: unit.queue_free() -@rpc("any_peer") +@rpc("any_peer", "call_remote") func update_unit(remote_unit_node_path: NodePath, remote_data: Dictionary): var data: Unit.NetworkData = dict_to_inst(remote_data) var unit: Unit = get_tree().current_scene.get_node_or_null(remote_unit_node_path) diff --git a/Game/Selection/selection_rectangle.gd b/Game/Selection/selection_rectangle.gd index b643636..0b6bb22 100644 --- a/Game/Selection/selection_rectangle.gd +++ b/Game/Selection/selection_rectangle.gd @@ -47,7 +47,7 @@ func _draw(): if is_active: var rect = Rect2(Vector2.ZERO, size) draw_rect(rect, color_background) - draw_rect(rect, color_border, false, 1.25 / max(camera.zoom.x, camera.zoom.y)) + draw_rect(rect, color_border, false, 1.1 / max(camera.zoom.x, camera.zoom.y)) func _on_area_entered(area: Area2D) -> void: diff --git a/Game/States/Build/StateBuild.gd b/Game/States/Build/StateBuild.gd index 303a2b1..84bfa2c 100644 --- a/Game/States/Build/StateBuild.gd +++ b/Game/States/Build/StateBuild.gd @@ -4,11 +4,13 @@ extends State static var current_builder_element: BuilderElement +@export var selection_manager: SelectionManager + func _state_enter(): %BuildGrid.visible = true - for tower: Tower in Client.selection.get_nodes().duplicate(): + for tower: Tower in selection_manager.get_nodes().duplicate(): tower.is_selected = false diff --git a/Game/States/Default/StateDefault.gd b/Game/States/Default/StateDefault.gd index 014eb40..205fa3f 100644 --- a/Game/States/Default/StateDefault.gd +++ b/Game/States/Default/StateDefault.gd @@ -2,6 +2,9 @@ class_name StateDefault extends State +@export var selection_manager: SelectionManager + + func _state_input(event: InputEvent) -> void: if event.is_action_pressed("build_mode_start"): set_state("StateBuild") @@ -16,5 +19,5 @@ func _state_unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("select"): # if not multi selecting if not event.is_double_click() and not Input.is_action_pressed("select_multiple"): - for tower: Tower in Client.selection.get_nodes().duplicate(): + for tower: Tower in selection_manager.get_nodes().duplicate(): tower.is_selected = false diff --git a/Stages/Stage.gd b/Stages/Stage.gd index 40c805a..3d29b21 100644 --- a/Stages/Stage.gd +++ b/Stages/Stage.gd @@ -116,21 +116,13 @@ func set_player_script(script: Script): player[property] = previous_values[property] -func add_status_message(message: String): - var label = Label.new() - label.text = message - $HUD.get_node("%StatusMessages").add_child(label) - await get_tree().create_timer(3.0).timeout - label.queue_free() - - ## get spawn node -func get_spawn(): - pass +func get_spawn() -> Spawn: + return null ## get target after spawn to overwrite default spawn target -func get_overwrite_target(): - pass +func get_spawn_target() -> Node2D: + return null func _on_peer_disconnected(id): diff --git a/Stages/Wintermaul/HUD.gd b/Stages/Wintermaul/HUD.gd index 62a5abd..b9b831f 100644 --- a/Stages/Wintermaul/HUD.gd +++ b/Stages/Wintermaul/HUD.gd @@ -2,6 +2,10 @@ class_name HUD extends CanvasLayer +@export var selection_manager: SelectionManager +@export var money_manager: MoneyManager +@export var notification_manager: NotificationManager + @onready var time: Label = %Time @onready var money: Label = %Money @onready var income: Label = %Income @@ -11,6 +15,8 @@ extends CanvasLayer @onready var lives_top: Label = %LivesTop @onready var lives_bottom: Label = %LivesBottom +@onready var status_messages: Control = %StatusMessages + func _ready(): Client.player.money_changed.connect(func(): @@ -37,7 +43,7 @@ func _ready(): %MultiSelectionContainer.visible = false # add tower to selection - Client.selection.added_to_group.connect(func(nodes: Array[Node], id: String): + selection_manager.added_to_group.connect(func(nodes: Array[Node], id: String): for tower: Tower in nodes: var multi_select_hud_data = TextureRect.new() multi_select_hud_data.modulate = Color(0.5, 0.5, 0.5) @@ -55,11 +61,11 @@ func _ready(): multi_select_hud_data.add_to_group(id) %MultiSelectionList.add_child(multi_select_hud_data) - if Client.selection.node_count == 1: + if selection_manager.node_count == 1: %SelectionContainer.visible = true %MultiSelectionContainer.visible = false - elif Client.selection.node_count > 1: + elif selection_manager.node_count > 1: %MultiSelectionContainer.visible = true redraw_multiselect() @@ -67,13 +73,13 @@ func _ready(): ) # remove tower from selection - Client.selection.removed_from_group.connect(func(nodes: Array[Node], _id: String): + selection_manager.removed_from_group.connect(func(nodes: Array[Node], _id: String): for tower: Tower in nodes: - if Client.selection.node_count == 0: + if selection_manager.node_count == 0: %SelectionContainer.visible = false %MultiSelectionContainer.visible = false - elif Client.selection.node_count == 1: + elif selection_manager.node_count == 1: %MultiSelectionContainer.visible = false %SelectionContainer.visible = true @@ -85,22 +91,26 @@ func _ready(): ) # move tower to new selection group - Client.selection.moved_to_group.connect(func(nodes: Array[Node], previous_id: String, new_id: String): + selection_manager.moved_to_group.connect(func(nodes: Array[Node], previous_id: String, new_id: String): for tower: Tower in nodes: tower.get_meta("multi_select_hud").remove_from_group(previous_id) tower.get_meta("multi_select_hud").add_to_group(new_id) - if Client.selection.has_node_in_group(tower, new_id): + if selection_manager.has_node_in_group(tower, new_id): redraw_select(tower) redraw_multiselect(previous_id, new_id) ) # redraw on selected group change - Client.selection.selected_group_changed.connect(func(previous_id: String, new_id: String): - if Client.selection.get_selected_nodes(): - redraw_select(Client.selection.get_selected_nodes()[0]) + selection_manager.selected_group_changed.connect(func(previous_id: String, new_id: String): + if selection_manager.get_selected_nodes(): + redraw_select(selection_manager.get_selected_nodes()[0]) redraw_multiselect(previous_id, new_id) ) + + %TowerData.selection_manager = selection_manager + %TowerData.money_manager = money_manager + %TowerData.notification_manager = notification_manager func _input(event: InputEvent): @@ -112,19 +122,19 @@ func _input(event: InputEvent): if event.is_action_pressed("selection_cycle") and %MultiSelectionContainer.visible: if Input.is_action_pressed("reverse_cycle_direction"): - Client.selection.go_to_previous() + selection_manager.go_to_previous() else: - Client.selection.go_to_next() + selection_manager.go_to_next() func redraw_select(tower: Tower): %TowerData.current_tower = tower -func redraw_multiselect(previous_group: String = "", new_group: String = Client.selection.selected_group): +func redraw_multiselect(previous_group: String = "", new_group: String = selection_manager.selected_group): var idx = 0 - for id in Client.selection.get_ordered_group_ids(): - var group = Client.selection.selection_groups[id] + for id in selection_manager.get_ordered_group_ids(): + var group = selection_manager.selection_groups[id] for node: Tower in group: # when double click selecting in quick succession not found error if (node.has_meta("multi_select_hud") and diff --git a/Stages/Wintermaul/Units/ina.tres b/Stages/Wintermaul/Units/ina.tres index 0d8bc8c..c3ee5d4 100644 --- a/Stages/Wintermaul/Units/ina.tres +++ b/Stages/Wintermaul/Units/ina.tres @@ -6,7 +6,7 @@ [resource] script = ExtResource("1_tv002") cost = 10 -income = 3 +income = 2 sprite_frames = ExtResource("2_3lxif") sprite_scale = Vector2(1, 1) hp = 10 diff --git a/Stages/Wintermaul/Units/laplus.tres b/Stages/Wintermaul/Units/laplus.tres index fae9ca8..9015633 100644 --- a/Stages/Wintermaul/Units/laplus.tres +++ b/Stages/Wintermaul/Units/laplus.tres @@ -6,7 +6,7 @@ [resource] script = ExtResource("1_v867v") cost = 15 -income = 5 +income = 3 sprite_frames = ExtResource("2_hko3p") sprite_scale = Vector2(1, 1) hp = 10 diff --git a/Stages/Wintermaul/Units/tux.tres b/Stages/Wintermaul/Units/tux.tres index b493541..0f3a949 100644 --- a/Stages/Wintermaul/Units/tux.tres +++ b/Stages/Wintermaul/Units/tux.tres @@ -6,7 +6,7 @@ [resource] script = ExtResource("1_hb4f3") cost = 20 -income = 7 +income = 4 sprite_frames = ExtResource("2_qgpsq") sprite_scale = Vector2(1, 1) hp = 15 diff --git a/Stages/Wintermaul/Wintermaul.tscn b/Stages/Wintermaul/Wintermaul.tscn index 2621af8..33291dc 100644 --- a/Stages/Wintermaul/Wintermaul.tscn +++ b/Stages/Wintermaul/Wintermaul.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=4 uid="uid://bl65jllb3e2py"] +[gd_scene load_steps=20 format=4 uid="uid://bl65jllb3e2py"] [ext_resource type="Script" uid="uid://c7qjm8tuhhe4p" path="res://Stages/Wintermaul/wintermaul.gd" id="1_o88ua"] [ext_resource type="Shader" uid="uid://bvni6cdwtojtr" path="res://UI/sliding_background.gdshader" id="2_tom3b"] @@ -10,6 +10,9 @@ [ext_resource type="PackedScene" uid="uid://ic2hc7gr27p3" path="res://Game/Selection/SelectionRectangle.tscn" id="6_7dk4w"] [ext_resource type="PackedScene" uid="uid://d0ukgoppkh1fn" path="res://Stages/Paths/PathNode.tscn" id="6_lh0f6"] [ext_resource type="PackedScene" uid="uid://t8feyd2giabm" path="res://UI/Camera.tscn" id="6_yijl8"] +[ext_resource type="PackedScene" uid="uid://mgm4npqeybbr" path="res://Game/Selection/SelectionManager.tscn" id="14_rsm68"] +[ext_resource type="Script" uid="uid://cdfmuda1ibg4a" path="res://Stages/Wintermaul/money_manager.gd" id="15_iudrt"] +[ext_resource type="Script" uid="uid://bmuymcnxw1mv1" path="res://Stages/Wintermaul/notification_manager.gd" id="16_qx3xb"] [ext_resource type="PackedScene" uid="uid://d4hgrh7danbbx" path="res://Game/States/StateManager.tscn" id="22_gur1m"] [ext_resource type="PackedScene" uid="uid://cg16o7eqqha70" path="res://Game/States/Default/StateDefault.tscn" id="23_qknks"] [ext_resource type="PackedScene" uid="uid://bo5dp02vlui3l" path="res://Game/States/Build/StateBuild.tscn" id="24_yl2il"] @@ -44,8 +47,11 @@ grow_vertical = 2 mouse_filter = 2 color = Color(0, 0, 0, 1) -[node name="HUD" parent="." instance=ExtResource("2_v3f6l")] +[node name="HUD" parent="." node_paths=PackedStringArray("selection_manager", "money_manager", "notification_manager") instance=ExtResource("2_v3f6l")] unique_name_in_owner = true +selection_manager = NodePath("../SelectionManager") +money_manager = NodePath("../MoneyManager") +notification_manager = NodePath("../NotificationManager") [node name="Map" type="TileMapLayer" parent="."] unique_name_in_owner = true @@ -69,6 +75,7 @@ drag_horizontal_enabled = true drag_vertical_enabled = true [node name="SelectionRectangle" parent="." instance=ExtResource("6_7dk4w")] +color_border = Color(1, 1, 1, 0.501961) [node name="Paths" type="Node2D" parent="."] visible = false @@ -137,9 +144,20 @@ y_sort_enabled = true [node name="StateManager" parent="." instance=ExtResource("22_gur1m")] unique_name_in_owner = true -[node name="StateDefault" parent="StateManager" instance=ExtResource("23_qknks")] +[node name="StateDefault" parent="StateManager" node_paths=PackedStringArray("selection_manager") instance=ExtResource("23_qknks")] +selection_manager = NodePath("../../SelectionManager") -[node name="StateBuild" parent="StateManager" instance=ExtResource("24_yl2il")] +[node name="StateBuild" parent="StateManager" node_paths=PackedStringArray("selection_manager") instance=ExtResource("24_yl2il")] +selection_manager = NodePath("../../SelectionManager") + +[node name="SelectionManager" parent="." instance=ExtResource("14_rsm68")] + +[node name="MoneyManager" type="Node" parent="."] +script = ExtResource("15_iudrt") + +[node name="NotificationManager" type="Node" parent="." node_paths=PackedStringArray("hud")] +script = ExtResource("16_qx3xb") +hud = NodePath("../HUD") [node name="BuilderCollisions" type="Node2D" parent="."] visible = false @@ -164,3 +182,6 @@ shape = SubResource("RectangleShape2D_cwpxx") one_shot = true [connection signal="timeout" from="IncomeTimer" to="." method="_on_income_timer_timeout"] + +[editable path="StateManager/StateDefault"] +[editable path="StateManager/StateBuild"] diff --git a/Stages/Wintermaul/hud_tower.gd b/Stages/Wintermaul/hud_tower.gd index 7a7ef69..5214636 100644 --- a/Stages/Wintermaul/hud_tower.gd +++ b/Stages/Wintermaul/hud_tower.gd @@ -5,6 +5,10 @@ extends Control #signal power_applied(previous_value: int, current_value: int, number_of_towers: int) #signal speed_applied(previous_value: int, current_value: int, number_of_towers: int) +@export var selection_manager: SelectionManager +@export var money_manager: MoneyManager +@export var notification_manager: NotificationManager + var current_tower: Tower: set = set_current_tower @@ -36,7 +40,7 @@ func redraw_components(): func get_selected_towers() -> Array: - return Client.selection.get_selected_nodes().duplicate() + return selection_manager.get_selected_nodes().duplicate() func _on_range_gui_input(event: InputEvent) -> void: @@ -44,14 +48,14 @@ func _on_range_gui_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() if current_tower.components.has(TowerComponent.ComponentType.Range): - Client.current_stage.add_status_message("Component already added") + notification_manager.add_status_message("Component already added") return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_range(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Range, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to add component") + notification_manager.add_status_message("Not enough money to add component") return for tower: Tower in towers: @@ -69,14 +73,14 @@ func _on_attack_gui_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() if current_tower.components.has(TowerComponent.ComponentType.Attack): - Client.current_stage.add_status_message("Component already added") + notification_manager.add_status_message("Component already added") return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_attack(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Attack, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to add component") + notification_manager.add_status_message("Not enough money to add component") return for tower: Tower in towers: @@ -94,14 +98,14 @@ func _on_frost_gui_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() if current_tower.components.has(TowerComponent.ComponentType.Frost): - Client.current_stage.add_status_message("Component already added") + notification_manager.add_status_message("Component already added") return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_frost(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Frost, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to add component") + notification_manager.add_status_message("Not enough money to add component") return for tower: Tower in towers: @@ -119,14 +123,14 @@ func _on_burn_gui_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() if current_tower.components.has(TowerComponent.ComponentType.Burn): - Client.current_stage.add_status_message("Component already added") + notification_manager.add_status_message("Component already added") return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_burn(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Burn, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to add component") + notification_manager.add_status_message("Not enough money to add component") return for tower: Tower in towers: @@ -144,14 +148,14 @@ func _on_poison_gui_input(event: InputEvent) -> void: get_viewport().set_input_as_handled() if current_tower.components.has(TowerComponent.ComponentType.Poison): - Client.current_stage.add_status_message("Component already added") + notification_manager.add_status_message("Component already added") return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_poison(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Poison, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to add component") + notification_manager.add_status_message("Not enough money to add component") return for tower: Tower in towers: @@ -172,9 +176,9 @@ func _on_range_level_up_pressed() -> void: if not component: return - var cost = Client.current_stage.PriceMapTower.component_range_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to level up") + notification_manager.add_status_message("Not enough money to level up") return for tower in towers: @@ -204,9 +208,9 @@ func _on_attack_level_up_pressed() -> void: if not component: return - var cost = Client.current_stage.PriceMapTower.component_attack_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to level up") + notification_manager.add_status_message("Not enough money to level up") return for tower: Tower in towers: @@ -236,9 +240,9 @@ func _on_frost_level_up_pressed() -> void: if not component: return - var cost = Client.current_stage.PriceMapTower.component_frost_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to level up") + notification_manager.add_status_message("Not enough money to level up") return for tower: Tower in towers: @@ -261,9 +265,9 @@ func _on_burn_level_up_pressed() -> void: if not component: return - var cost = Client.current_stage.PriceMapTower.component_burn_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to level up") + notification_manager.add_status_message("Not enough money to level up") return for tower: Tower in towers: @@ -286,9 +290,9 @@ func _on_poison_level_up_pressed() -> void: if not component: return - var cost = Client.current_stage.PriceMapTower.component_poison_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) if Client.player.money < cost: - Client.current_stage.add_status_message("Not enough money to level up") + notification_manager.add_status_message("Not enough money to level up") return for tower: Tower in towers: @@ -310,7 +314,7 @@ func _on_range_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_range(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Range, towers.size()) $Components/Range.tooltip_text = "Cost: " + str(cost) func _on_range_level_up_mouse_entered() -> void: @@ -320,7 +324,7 @@ func _on_range_level_up_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_range_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) $Components/Range/RangeLevelUp.tooltip_text = "Cost: " + str(cost) func _on_attack_mouse_entered() -> void: @@ -329,7 +333,7 @@ func _on_attack_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_attack(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Attack, towers.size()) $Components/Attack.tooltip_text = "Cost: " + str(cost) func _on_attack_level_up_mouse_entered() -> void: @@ -339,7 +343,7 @@ func _on_attack_level_up_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_attack_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) $Components/Attack/AttackLevelUp.tooltip_text = "Cost: " + str(cost) func _on_frost_mouse_entered() -> void: @@ -348,7 +352,7 @@ func _on_frost_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_frost(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Frost, towers.size()) $Components/Frost.tooltip_text = "Cost: " + str(cost) func _on_frost_level_up_mouse_entered() -> void: @@ -358,7 +362,7 @@ func _on_frost_level_up_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_frost_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) $Components/Frost/FrostLevelUp.tooltip_text = "Cost: " + str(cost) func _on_burn_mouse_entered() -> void: @@ -367,7 +371,7 @@ func _on_burn_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_burn(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Burn, towers.size()) $Components/Burn.tooltip_text = "Cost: " + str(cost) func _on_burn_level_up_mouse_entered() -> void: @@ -377,7 +381,7 @@ func _on_burn_level_up_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_burn_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) $Components/Burn/BurnLevelUp.tooltip_text = "Cost: " + str(cost) func _on_poison_mouse_entered() -> void: @@ -386,7 +390,7 @@ func _on_poison_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_poison(towers.size()) + var cost = money_manager.get_component_price(TowerComponent.ComponentType.Poison, towers.size()) $Components/Poison.tooltip_text = "Cost: " + str(cost) func _on_poison_level_up_mouse_entered() -> void: @@ -396,5 +400,5 @@ func _on_poison_level_up_mouse_entered() -> void: return var towers = get_selected_towers() - var cost = Client.current_stage.PriceMapTower.component_poison_level(component, towers.size()) + var cost = money_manager.get_component_level_up_price(component, towers.size()) $Components/Poison/PoisonLevelUp.tooltip_text = "Cost: " + str(cost) diff --git a/Stages/Wintermaul/money_manager.gd b/Stages/Wintermaul/money_manager.gd new file mode 100644 index 0000000..3029a67 --- /dev/null +++ b/Stages/Wintermaul/money_manager.gd @@ -0,0 +1,50 @@ +class_name MoneyManager +extends Node + + +func get_tower_price() -> int: + return 5 + + +func get_component_price( + component_type: TowerComponent.ComponentType, + number_of_towers: int +) -> int: + if component_type == TowerComponent.ComponentType.Range: + return 100 * number_of_towers + + elif component_type == TowerComponent.ComponentType.Attack: + return 100 * number_of_towers + + elif component_type == TowerComponent.ComponentType.Frost: + return 100 * number_of_towers + + elif component_type == TowerComponent.ComponentType.Burn: + return 100 * number_of_towers + + elif component_type == TowerComponent.ComponentType.Poison: + return 100 * number_of_towers + + return 0 + + +func get_component_level_up_price( + component: TowerComponent, + number_of_towers: int +) -> int: + if component.type == TowerComponent.ComponentType.Range: + return int(pow(5, component.level)) * number_of_towers + + elif component.type == TowerComponent.ComponentType.Attack: + return 10 * component.level * number_of_towers + + elif component.type == TowerComponent.ComponentType.Frost: + return 10 * component.level * number_of_towers + + elif component.type == TowerComponent.ComponentType.Burn: + return 10 * component.level * number_of_towers + + elif component.type == TowerComponent.ComponentType.Poison: + return 10 * component.level * number_of_towers + + return 0 diff --git a/Stages/Wintermaul/money_manager.gd.uid b/Stages/Wintermaul/money_manager.gd.uid new file mode 100644 index 0000000..36f0e46 --- /dev/null +++ b/Stages/Wintermaul/money_manager.gd.uid @@ -0,0 +1 @@ +uid://cdfmuda1ibg4a diff --git a/Stages/Wintermaul/notification_manager.gd b/Stages/Wintermaul/notification_manager.gd new file mode 100644 index 0000000..ddb1f06 --- /dev/null +++ b/Stages/Wintermaul/notification_manager.gd @@ -0,0 +1,13 @@ +class_name NotificationManager +extends Node + + +@export var hud: HUD + + +func add_status_message(message: String): + var label = Label.new() + label.text = message + hud.status_messages.add_child(label) + await get_tree().create_timer(3.0).timeout + label.queue_free() diff --git a/Stages/Wintermaul/notification_manager.gd.uid b/Stages/Wintermaul/notification_manager.gd.uid new file mode 100644 index 0000000..4260170 --- /dev/null +++ b/Stages/Wintermaul/notification_manager.gd.uid @@ -0,0 +1 @@ +uid://bmuymcnxw1mv1 diff --git a/Stages/Wintermaul/wintermaul.gd b/Stages/Wintermaul/wintermaul.gd index 0de2cdb..73ad8c4 100644 --- a/Stages/Wintermaul/wintermaul.gd +++ b/Stages/Wintermaul/wintermaul.gd @@ -1,4 +1,3 @@ -class_name Wintermaul extends Stage @@ -19,40 +18,16 @@ var teams := Teams.new() var income_frequency := 15.0 -class PriceMapTower: - static var cost: int = 5 - - static func component_range(number_of_towers: int = 1): - return 100 * number_of_towers - static func component_range_level(component: TowerComponent, number_of_towers: int = 1): - return pow(5, component.level) * number_of_towers - - static func component_attack(number_of_towers: int = 1): - return 100 * number_of_towers - static func component_attack_level(component: TowerComponent, number_of_towers: int = 1): - return 10 * component.level * number_of_towers - - static func component_frost(number_of_towers: int = 1): - return 100 * number_of_towers - static func component_frost_level(component: TowerComponent, number_of_towers: int = 1): - return 10 * component.level * number_of_towers - - static func component_burn(number_of_towers: int = 1): - return 100 * number_of_towers - static func component_burn_level(component: TowerComponent, number_of_towers: int = 1): - return 10 * component.level * number_of_towers - - static func component_poison(number_of_towers: int = 1): - return 100 * number_of_towers - static func component_poison_level(component: TowerComponent, number_of_towers: int = 1): - return 10 * component.level * number_of_towers - 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 + func _init(): super._init() @@ -122,7 +97,7 @@ func place_tower(remote_data: Dictionary): var player = Network.get_player(tower.owner_id) player.towers[tower.global_position] = tower - player.money -= PriceMapTower.cost + player.money -= money_manager.get_tower_price() Network.players_changed.emit() _place_tower(%Towers, tower) @@ -154,15 +129,15 @@ func spawn_unit(remote_data: Dictionary): func can_place_tower(): - if Client.player.money < PriceMapTower.cost: - add_status_message("Not enough money to build 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: - add_status_message("Not enough money to spawn unit") + notification_manager.add_status_message("Not enough money to spawn unit") return false return true @@ -182,17 +157,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(): @@ -224,7 +200,7 @@ func update_lives(team: String, lives: int): lives_changed.emit() if lives < 0: - add_status_message("Team " + team + " lost " + str(abs(lives)) + " life") + notification_manager.add_status_message("Team " + team + " lost " + str(abs(lives)) + " life") if teams[team].lives <= 0: - add_status_message("Team " + team + " lost the game") + notification_manager.add_status_message("Team " + team + " lost the game") diff --git a/Stages/Wintermaul2/Wintermaul2.tscn b/Stages/Wintermaul2/Wintermaul2.tscn index ebf97a1..d96c851 100644 --- a/Stages/Wintermaul2/Wintermaul2.tscn +++ b/Stages/Wintermaul2/Wintermaul2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=4 uid="uid://dwscklgkbhq28"] +[gd_scene load_steps=18 format=4 uid="uid://dwscklgkbhq28"] [ext_resource type="Script" uid="uid://c7qjm8tuhhe4p" path="res://Stages/Wintermaul/wintermaul.gd" id="1_sv3vj"] [ext_resource type="PackedScene" uid="uid://bylx30cweulmk" path="res://Stages/Wintermaul/HUD.tscn" id="2_ba5js"] @@ -13,6 +13,7 @@ [ext_resource type="PackedScene" uid="uid://d4hgrh7danbbx" path="res://Game/States/StateManager.tscn" id="9_r04jr"] [ext_resource type="PackedScene" uid="uid://cg16o7eqqha70" path="res://Game/States/Default/StateDefault.tscn" id="10_vqjkx"] [ext_resource type="PackedScene" uid="uid://bo5dp02vlui3l" path="res://Game/States/Build/StateBuild.tscn" id="11_8hpm2"] +[ext_resource type="PackedScene" uid="uid://mgm4npqeybbr" path="res://Game/Selection/SelectionManager.tscn" id="14_8t5ap"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_sdgwb"] shader = ExtResource("2_vy0x7") @@ -160,6 +161,8 @@ unique_name_in_owner = true [node name="StateBuild" parent="StateManager" instance=ExtResource("11_8hpm2")] +[node name="SelectionManager" parent="." instance=ExtResource("14_8t5ap")] + [node name="BuilderCollisions" type="Node2D" parent="."] visible = false diff --git a/UI/PlayerLobby/Lobby.tscn b/UI/PlayerLobby/Lobby.tscn index 958b3fa..05eaea1 100644 --- a/UI/PlayerLobby/Lobby.tscn +++ b/UI/PlayerLobby/Lobby.tscn @@ -1,15 +1,16 @@ -[gd_scene load_steps=11 format=3 uid="uid://r45j806p4a74"] +[gd_scene load_steps=12 format=3 uid="uid://r45j806p4a74"] [ext_resource type="Script" uid="uid://87etsgjm04nb" path="res://UI/PlayerLobby/lobby.gd" id="1_mm4gt"] [ext_resource type="Texture2D" uid="uid://kwgx33awj4y2" path="res://UI/Assets/Enjl-Starry Space Background/background_1.png" id="2_0pdjl"] [ext_resource type="Theme" uid="uid://bt84t61hrvoyn" path="res://UI/PlayerLobby/lobby_theme.tres" id="2_syjfh"] [ext_resource type="PackedScene" uid="uid://cq6p055yuac0o" path="res://UI/players_list_container.tscn" id="3_2r7nj"] -[ext_resource type="PackedScene" uid="uid://bl65jllb3e2py" path="res://Stages/Wintermaul/Wintermaul.tscn" id="3_3hc3h"] [ext_resource type="Texture2D" uid="uid://ci7qydmwbanbp" path="res://Stages/Wintermaul/Assets/thumbnail.png" id="3_8r1n2"] [ext_resource type="PackedScene" uid="uid://dwscklgkbhq28" path="res://Stages/Wintermaul2/Wintermaul2.tscn" id="4_v1caa"] +[ext_resource type="PackedScene" uid="uid://uwfmfa3c0gqk" path="res://UI/PlayerLobby/map_button.tscn" id="5_3omml"] [ext_resource type="Texture2D" uid="uid://cfiu7ah67vdpg" path="res://Stages/Square/Assets/thumbnail.png" id="5_5ewsi"] -[ext_resource type="PackedScene" uid="uid://jxy7fj7yymfl" path="res://Stages/TinySwords/WintermaulTinySwords.tscn" id="5_hnsfx"] [ext_resource type="Texture2D" uid="uid://cujvoqsqfrl4a" path="res://Stages/Wintermaul2/Assets/thumbnail.png" id="5_j23oc"] +[ext_resource type="PackedScene" uid="uid://bl65jllb3e2py" path="res://Stages/Wintermaul/Wintermaul.tscn" id="6_qk8ma"] +[ext_resource type="PackedScene" uid="uid://cw0hxxa1m1qm7" path="res://Stages/Square/square.tscn" id="8_qk8ma"] [node name="Lobby" type="Control"] layout_mode = 3 @@ -85,37 +86,23 @@ layout_mode = 2 size_flags_horizontal = 3 theme = ExtResource("2_syjfh") -[node name="MapButton" type="Button" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps"] +[node name="MapButton" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps" instance=ExtResource("5_3omml")] layout_mode = 2 -mouse_default_cursor_shape = 2 -toggle_mode = true -text = "Wintermaul" -metadata/map_scene = ExtResource("3_3hc3h") -metadata/thumbnail = ExtResource("3_8r1n2") -metadata/settings = ["starting_lives", "starting_money", "starting_income", "use_premade_teams"] +map_scene = ExtResource("6_qk8ma") +thumbnail = ExtResource("3_8r1n2") +settings = Array[String](["starting_lives", "starting_money", "starting_income", "use_premade_teams"]) -[node name="MapButton2" type="Button" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps"] +[node name="MapButton2" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps" instance=ExtResource("5_3omml")] layout_mode = 2 -mouse_default_cursor_shape = 2 -toggle_mode = true text = "Squares" -metadata/thumbnail = ExtResource("5_5ewsi") +map_scene = ExtResource("8_qk8ma") +thumbnail = ExtResource("5_5ewsi") -[node name="MapButton3" type="Button" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps"] +[node name="MapButton3" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps" instance=ExtResource("5_3omml")] layout_mode = 2 -mouse_default_cursor_shape = 2 -toggle_mode = true text = "Wintermaul 2" -metadata/map_scene = ExtResource("4_v1caa") -metadata/thumbnail = ExtResource("5_j23oc") - -[node name="MapButton4" type="Button" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer/Maps"] -visible = false -layout_mode = 2 -mouse_default_cursor_shape = 2 -toggle_mode = true -text = "Wintermaul Tiny Swords" -metadata/map_scene = ExtResource("5_hnsfx") +map_scene = ExtResource("4_v1caa") +thumbnail = ExtResource("5_j23oc") [node name="Thumbnail" type="TextureRect" parent="MarginContainer/VBoxContainer/CenterContainer/HBoxContainer"] unique_name_in_owner = true diff --git a/UI/PlayerLobby/lobby.gd b/UI/PlayerLobby/lobby.gd index a278a33..c391a11 100644 --- a/UI/PlayerLobby/lobby.gd +++ b/UI/PlayerLobby/lobby.gd @@ -103,7 +103,7 @@ func _on_cancel_button_pressed() -> void: @rpc("authority", "call_local") func start(host_settings: Dictionary): - var packed_scene = %Maps.get_child(current_map_idx).get_meta("map_scene") + var packed_scene = %Maps.get_child(current_map_idx).map_scene var scene = packed_scene.instantiate() for setting in host_settings: @@ -115,6 +115,8 @@ func start(host_settings: Dictionary): premade_teams[team_name] = teams[team_name]["players"] scene.premade_teams = premade_teams + multiplayer.multiplayer_peer.refuse_new_connections = true + Client.change_scene_to_instance(scene) @@ -130,16 +132,15 @@ func set_map(index: int): node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 0.5)) var map_button = %Maps.get_child(index) - var thumbnail = map_button.get_meta("thumbnail") + var thumbnail = map_button.thumbnail # settings for child in %Settings.get_children(): child.free() - if map_button.has_meta("settings"): - current_map_scene = map_button.get_meta("map_scene").instantiate() - var map_settings = map_button.get_meta("settings", []) - for setting in map_settings: + if map_button.settings.size() > 0: + current_map_scene = map_button.map_scene.instantiate() + for setting in map_button.settings: if not settings.has(setting): settings[setting] = current_map_scene[setting] diff --git a/UI/PlayerLobby/map_button.gd b/UI/PlayerLobby/map_button.gd new file mode 100644 index 0000000..a52c2f7 --- /dev/null +++ b/UI/PlayerLobby/map_button.gd @@ -0,0 +1,6 @@ +extends Button + + +@export var map_scene: PackedScene +@export var thumbnail: Texture2D +@export var settings: Array[String] diff --git a/UI/PlayerLobby/map_button.gd.uid b/UI/PlayerLobby/map_button.gd.uid new file mode 100644 index 0000000..6c7009f --- /dev/null +++ b/UI/PlayerLobby/map_button.gd.uid @@ -0,0 +1 @@ +uid://c118jfgnuae7q diff --git a/UI/PlayerLobby/map_button.tscn b/UI/PlayerLobby/map_button.tscn new file mode 100644 index 0000000..c947db1 --- /dev/null +++ b/UI/PlayerLobby/map_button.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=3 uid="uid://uwfmfa3c0gqk"] + +[ext_resource type="Script" uid="uid://c118jfgnuae7q" path="res://UI/PlayerLobby/map_button.gd" id="1_ks6re"] + +[node name="MapButton" type="Button"] +mouse_default_cursor_shape = 2 +toggle_mode = true +text = "Wintermaul" +script = ExtResource("1_ks6re") diff --git a/UI/Start.gd b/UI/Start.gd index 8724cee..53b18fb 100644 --- a/UI/Start.gd +++ b/UI/Start.gd @@ -31,6 +31,7 @@ func get_port() -> int: func _on_peer_connected(id): Network._on_peer_connected(id) + func _on_peer_disconnected(id): Network._on_peer_disconnected(id) diff --git a/UI/spawn_button.gd b/UI/spawn_button.gd index bcf9da0..a5a1947 100644 --- a/UI/spawn_button.gd +++ b/UI/spawn_button.gd @@ -13,4 +13,4 @@ func _on_pressed() -> void: unit.unit_resource = unit_resource - Client.spawn_unit(unit, Client.current_stage.get_spawn(), Client.current_stage.get_overwrite_target()) + Client.spawn_unit(unit, Client.current_stage.get_spawn(), Client.current_stage.get_spawn_target()) diff --git a/Units/Unit.tscn b/Units/Unit.tscn index a6b035c..3c9d697 100644 --- a/Units/Unit.tscn +++ b/Units/Unit.tscn @@ -74,7 +74,6 @@ text = "1000" horizontal_alignment = 1 [node name="SelectionArea" type="Area2D" parent="."] -visible = false collision_layer = 32 collision_mask = 0 diff --git a/project.godot b/project.godot index eab08f1..61f77fd 100644 --- a/project.godot +++ b/project.godot @@ -29,6 +29,8 @@ window/size/viewport_height=720 [file_customization] folder_colors={ +"res://Effects/": "orange", +"res://Game/": "gray", "res://Stages/": "blue", "res://Towers/": "green", "res://UI/": "teal", -- cgit v1.2.3