summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-06-27 16:51:18 +0200
committerDaniel Weipert <git@mail.dweipert.de>2025-06-27 16:51:18 +0200
commit76d1ec723b6f6f68a512f27607749f3ff885f385 (patch)
tree36cee159d2e7bc7dc6df76de3e8fe20e3658ae8d
parent0b1fd02d3cb080effe29e00f14773994d87e2e27 (diff)
managers + various changesHEADmain
-rw-r--r--Game/Client.gd6
-rw-r--r--Game/Lobby/Server/index.php186
-rw-r--r--Game/Network.gd28
-rw-r--r--Game/Selection/selection_rectangle.gd2
-rw-r--r--Game/States/Build/StateBuild.gd4
-rw-r--r--Game/States/Default/StateDefault.gd5
-rw-r--r--Stages/Stage.gd16
-rw-r--r--Stages/Wintermaul/HUD.gd42
-rw-r--r--Stages/Wintermaul/Units/ina.tres2
-rw-r--r--Stages/Wintermaul/Units/laplus.tres2
-rw-r--r--Stages/Wintermaul/Units/tux.tres2
-rw-r--r--Stages/Wintermaul/Wintermaul.tscn29
-rw-r--r--Stages/Wintermaul/hud_tower.gd76
-rw-r--r--Stages/Wintermaul/money_manager.gd50
-rw-r--r--Stages/Wintermaul/money_manager.gd.uid1
-rw-r--r--Stages/Wintermaul/notification_manager.gd13
-rw-r--r--Stages/Wintermaul/notification_manager.gd.uid1
-rw-r--r--Stages/Wintermaul/wintermaul.gd50
-rw-r--r--Stages/Wintermaul2/Wintermaul2.tscn5
-rw-r--r--UI/PlayerLobby/Lobby.tscn41
-rw-r--r--UI/PlayerLobby/lobby.gd13
-rw-r--r--UI/PlayerLobby/map_button.gd6
-rw-r--r--UI/PlayerLobby/map_button.gd.uid1
-rw-r--r--UI/PlayerLobby/map_button.tscn9
-rw-r--r--UI/Start.gd1
-rw-r--r--UI/spawn_button.gd2
-rw-r--r--Units/Unit.tscn1
-rw-r--r--project.godot2
28 files changed, 326 insertions, 270 deletions
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(<<<SQL
- create table if not exists games (
- id text primary key,
- ip text unique,
- port integer,
- creation_time integer,
- ping_time integer,
- name text,
- secret text
- );
- SQL)
- ->execute();
+ $db->query(<<<SQL
+ create table if not exists games (
+ id text primary key,
+ ip text unique,
+ port integer,
+ creation_time integer,
+ ping_time integer,
+ name text,
+ secret text
+ );
+ SQL)
+ ->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(<<<SQL
- insert or replace into games (id, ip, port, creation_time, ping_time, name, secret) values (:id, :ip, :port, :timestamp, :timestamp, :name, :secret)
- SQL)
- ->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(<<<SQL
+ insert or replace into games (id, ip, port, creation_time, ping_time, name, secret) values (:id, :ip, :port, :timestamp, :timestamp, :name, :secret)
+ SQL)
+ ->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(<<<SQL
- select id, name from games
- where ping_time > :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(<<<SQL
- select ip, port from games
- where id = :id
- SQL);
+ select ip, port from games
+ where id = :id
+ SQL);
$statement->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(<<<SQL
- delete from games where id = :id and secret = :secret
- SQL)
- ->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(<<<SQL
- update games set ping_time = :ping_time where id = :id and secret = :secret
- SQL)
- ->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",