This commit is contained in:
Marek Le
2026-05-09 23:37:26 +02:00
parent 6d28b04c12
commit 2d4002bd3f
263 changed files with 5250 additions and 4597 deletions

View File

@@ -1,21 +0,0 @@
extends CanvasLayer
@onready var label: Label = $Center/VBox/Label
@onready var button: Button = $Center/VBox/Button
func _ready() -> void:
visible = false
button.pressed.connect(_on_button)
func show_overlay(wave: int) -> void:
label.text = "GAME OVER — Welle %d erreicht" % wave
visible = true
func _on_button() -> void:
GameState.reset()
PlayerData.reset_run()
EnemyData.entities.clear()
BossData.entities.clear()
PortalData.entities.clear()
TavernData.entities.clear()
get_tree().change_scene_to_file("res://scenes/menu/main_menu.tscn")

View File

@@ -1 +0,0 @@
uid://dm00anoh5wtyu

View File

@@ -1,41 +0,0 @@
[gd_scene format=3]
[ext_resource type="Script" path="res://scenes/menu/game_over_overlay.gd" id="1"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_button"]
bg_color = Color(0.2, 0.2, 0.25, 0.9)
border_width_bottom = 2
border_width_left = 2
border_width_right = 2
border_width_top = 2
border_color = Color(0.7, 0.7, 0.7, 1)
[node name="GameOverOverlay" type="CanvasLayer"]
layer = 10
script = ExtResource("1")
[node name="Background" type="ColorRect" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
color = Color(0, 0, 0, 0.75)
[node name="Center" type="CenterContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
[node name="VBox" type="VBoxContainer" parent="Center"]
custom_minimum_size = Vector2(400, 0)
theme_override_constants/separation = 30
[node name="Label" type="Label" parent="Center/VBox"]
text = "GAME OVER"
horizontal_alignment = 1
theme_override_font_sizes/font_size = 48
theme_override_colors/font_color = Color(1, 0.3, 0.3, 1)
[node name="Button" type="Button" parent="Center/VBox"]
custom_minimum_size = Vector2(0, 48)
text = "Zurück zum Menü"
theme_override_styles/normal = SubResource("StyleBoxFlat_button")

55
scenes/menu/lobby.gd Normal file
View File

@@ -0,0 +1,55 @@
extends Control
@onready var player_list: ItemList = %PlayerList
@onready var status_label: Label = %StatusLabel
@onready var start_button: Button = %StartButton
func _ready() -> void:
Net.peer_connected.connect(_refresh)
Net.peer_disconnected.connect(_refresh)
Net.server_disconnected.connect(_on_disconnect)
start_button.visible = Net.is_host()
if Net.is_host():
status_label.text = "Hosting on port %d — press Start when ready" % Net.DEFAULT_PORT
else:
status_label.text = "Joined — waiting for host to start"
_refresh(0)
func _refresh(_id: int) -> void:
player_list.clear()
var ids: Array = []
if multiplayer.multiplayer_peer == null:
ids.append(1)
else:
ids.append(multiplayer.get_unique_id())
for p in multiplayer.get_peers():
if not p in ids:
ids.append(p)
ids.sort()
for id in ids:
var n: String = Net.player_names.get(id, "Player %d" % id)
player_list.add_item("[%d] %s" % [id, n])
func _on_start_pressed() -> void:
if not Net.is_host():
return
_start_world.rpc()
@rpc("authority", "call_local", "reliable")
func _start_world() -> void:
GameState.change_scene(GameState.SCENE_WORLD)
var _leaving: bool = false
func _on_back_pressed() -> void:
if _leaving:
return
_leaving = true
Net.disconnect_net()
GameState.change_scene(GameState.SCENE_MAIN_MENU)
func _on_disconnect() -> void:
if _leaving:
return
_leaving = true
GameState.change_scene(GameState.SCENE_MAIN_MENU)

1
scenes/menu/lobby.gd.uid Normal file
View File

@@ -0,0 +1 @@
uid://d3gurtlgr2a6o

58
scenes/menu/lobby.tscn Normal file
View File

@@ -0,0 +1,58 @@
[gd_scene load_steps=2 format=3 uid="uid://b0lobby0001"]
[ext_resource type="Script" path="res://scenes/menu/lobby.gd" id="1"]
[node name="Lobby" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource("1")
[node name="Background" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
color = Color(0.08, 0.08, 0.12, 1)
[node name="Center" type="CenterContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
[node name="VBox" type="VBoxContainer" parent="Center"]
layout_mode = 2
custom_minimum_size = Vector2(420, 0)
[node name="Title" type="Label" parent="Center/VBox"]
layout_mode = 2
text = "Lobby"
horizontal_alignment = 1
theme_override_font_sizes/font_size = 36
[node name="StatusLabel" type="Label" parent="Center/VBox"]
unique_name_in_owner = true
layout_mode = 2
horizontal_alignment = 1
text = ""
[node name="PlayerList" type="ItemList" parent="Center/VBox"]
unique_name_in_owner = true
layout_mode = 2
custom_minimum_size = Vector2(0, 180)
[node name="StartButton" type="Button" parent="Center/VBox"]
unique_name_in_owner = true
layout_mode = 2
text = "Start"
custom_minimum_size = Vector2(0, 40)
[node name="BackButton" type="Button" parent="Center/VBox"]
layout_mode = 2
text = "Back"
custom_minimum_size = Vector2(0, 40)
[connection signal="pressed" from="Center/VBox/StartButton" to="." method="_on_start_pressed"]
[connection signal="pressed" from="Center/VBox/BackButton" to="." method="_on_back_pressed"]

View File

@@ -1,32 +1,47 @@
extends CanvasLayer
extends Control
@onready var singleplayer_button: Button = $Center/VBox/SingleplayerButton
@onready var host_button: Button = $Center/VBox/HostButton
@onready var join_button: Button = $Center/VBox/JoinButton
@onready var quit_button: Button = $Center/VBox/QuitButton
@onready var name_input: LineEdit = %NameInput
@onready var ip_input: LineEdit = %IpInput
@onready var status_label: Label = %StatusLabel
func _ready() -> void:
singleplayer_button.pressed.connect(_on_singleplayer)
host_button.pressed.connect(_on_host)
join_button.pressed.connect(_on_join)
quit_button.pressed.connect(_on_quit)
host_button.disabled = true
join_button.disabled = true
name_input.text = Net.local_name
Net.connected_to_server.connect(_on_connected)
Net.connection_failed.connect(_on_failed)
func _on_singleplayer() -> void:
GameState.reset()
PlayerData.reset_run()
EnemyData.entities.clear()
BossData.entities.clear()
PortalData.entities.clear()
TavernData.entities.clear()
get_tree().change_scene_to_file("res://scenes/world/world.tscn")
func _on_singleplayer_pressed() -> void:
Net.local_name = name_input.text.strip_edges() if name_input.text.strip_edges() != "" else "Player"
GameState.reset_run()
if Net.host_singleplayer():
GameState.change_scene(GameState.SCENE_WORLD)
func _on_host() -> void:
pass
func _on_host_pressed() -> void:
Net.local_name = name_input.text.strip_edges() if name_input.text.strip_edges() != "" else "Host"
GameState.reset_run()
if Net.host():
status_label.text = "Hosting on port %d" % Net.DEFAULT_PORT
GameState.change_scene(GameState.SCENE_LOBBY)
else:
status_label.text = "Hosting failed."
func _on_join() -> void:
pass
func _on_join_pressed() -> void:
Net.local_name = name_input.text.strip_edges() if name_input.text.strip_edges() != "" else "Client"
var addr := ip_input.text.strip_edges()
if addr == "":
addr = "127.0.0.1"
status_label.text = "Connecting to %s..." % addr
if not Net.join(addr):
status_label.text = "Join failed."
func _on_quit() -> void:
func _on_options_pressed() -> void:
GameState.change_scene(GameState.SCENE_OPTIONS)
func _on_quit_pressed() -> void:
get_tree().quit()
func _on_connected() -> void:
status_label.text = "Connected."
GameState.change_scene(GameState.SCENE_LOBBY)
func _on_failed() -> void:
status_label.text = "Connection failed."

View File

@@ -1 +1 @@
uid://b4m6byh4k2mg7
uid://d0k5a5qreg1uu

View File

@@ -1,57 +1,115 @@
[gd_scene format=3]
[gd_scene format=3 uid="uid://bm5gsrlveyvnk"]
[ext_resource type="Script" path="res://scenes/menu/main_menu.gd" id="1"]
[ext_resource type="Script" uid="uid://d0k5a5qreg1uu" path="res://scenes/menu/main_menu.gd" id="1"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_button"]
bg_color = Color(0.2, 0.2, 0.25, 0.9)
border_width_bottom = 2
border_width_left = 2
border_width_right = 2
border_width_top = 2
border_color = Color(0.7, 0.7, 0.7, 1)
[node name="MainMenu" type="CanvasLayer"]
[node name="MainMenu" type="Control" unique_id=282057399]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1")
[node name="Background" type="ColorRect" parent="."]
[node name="Background" type="ColorRect" parent="." unique_id=1892952438]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
color = Color(0.08, 0.08, 0.12, 1)
grow_horizontal = 2
grow_vertical = 2
color = Color(0.1, 0.1, 0.15, 1)
[node name="Center" type="CenterContainer" parent="."]
[node name="Center" type="CenterContainer" parent="." unique_id=303933157]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="VBox" type="VBoxContainer" parent="Center"]
custom_minimum_size = Vector2(320, 0)
theme_override_constants/separation = 20
[node name="VBox" type="VBoxContainer" parent="Center" unique_id=576802246]
custom_minimum_size = Vector2(420, 0)
layout_mode = 2
[node name="Title" type="Label" parent="Center/VBox"]
[node name="Title" type="Label" parent="Center/VBox" unique_id=1058778255]
layout_mode = 2
theme_override_font_sizes/font_size = 56
text = "MMO"
horizontal_alignment = 1
theme_override_font_sizes/font_size = 64
[node name="Spacer" type="Control" parent="Center/VBox"]
[node name="Spacer1" type="Control" parent="Center/VBox" unique_id=707057681]
custom_minimum_size = Vector2(0, 24)
layout_mode = 2
[node name="NameRow" type="HBoxContainer" parent="Center/VBox" unique_id=1693567332]
layout_mode = 2
[node name="NameLabel" type="Label" parent="Center/VBox/NameRow" unique_id=1012504876]
custom_minimum_size = Vector2(80, 0)
layout_mode = 2
text = "Name:"
[node name="NameInput" type="LineEdit" parent="Center/VBox/NameRow" unique_id=318387796]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
text = "Player"
[node name="IpRow" type="HBoxContainer" parent="Center/VBox" unique_id=674693362]
layout_mode = 2
[node name="IpLabel" type="Label" parent="Center/VBox/IpRow" unique_id=222908556]
custom_minimum_size = Vector2(80, 0)
layout_mode = 2
text = "Server IP:"
[node name="IpInput" type="LineEdit" parent="Center/VBox/IpRow" unique_id=99390081]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
placeholder_text = "127.0.0.1"
[node name="Spacer2" type="Control" parent="Center/VBox" unique_id=979762154]
custom_minimum_size = Vector2(0, 16)
layout_mode = 2
[node name="Singleplayer" type="Button" parent="Center/VBox" unique_id=156537849]
custom_minimum_size = Vector2(0, 40)
[node name="SingleplayerButton" type="Button" parent="Center/VBox"]
custom_minimum_size = Vector2(0, 48)
layout_mode = 2
text = "Singleplayer"
theme_override_styles/normal = SubResource("StyleBoxFlat_button")
[node name="HostButton" type="Button" parent="Center/VBox"]
custom_minimum_size = Vector2(0, 48)
text = "Host (bald)"
theme_override_styles/normal = SubResource("StyleBoxFlat_button")
[node name="Host" type="Button" parent="Center/VBox" unique_id=1117468477]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
text = "Host"
[node name="JoinButton" type="Button" parent="Center/VBox"]
custom_minimum_size = Vector2(0, 48)
text = "Join (bald)"
theme_override_styles/normal = SubResource("StyleBoxFlat_button")
[node name="Join" type="Button" parent="Center/VBox" unique_id=1669660415]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
text = "Join"
[node name="QuitButton" type="Button" parent="Center/VBox"]
custom_minimum_size = Vector2(0, 48)
[node name="Options" type="Button" parent="Center/VBox" unique_id=1739276223]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
text = "Options"
[node name="Quit" type="Button" parent="Center/VBox" unique_id=182300116]
custom_minimum_size = Vector2(0, 40)
layout_mode = 2
text = "Quit"
theme_override_styles/normal = SubResource("StyleBoxFlat_button")
[node name="Spacer3" type="Control" parent="Center/VBox" unique_id=1580062158]
custom_minimum_size = Vector2(0, 16)
layout_mode = 2
[node name="StatusLabel" type="Label" parent="Center/VBox" unique_id=643981255]
unique_name_in_owner = true
layout_mode = 2
horizontal_alignment = 1
[connection signal="pressed" from="Center/VBox/Singleplayer" to="." method="_on_singleplayer_pressed"]
[connection signal="pressed" from="Center/VBox/Host" to="." method="_on_host_pressed"]
[connection signal="pressed" from="Center/VBox/Join" to="." method="_on_join_pressed"]
[connection signal="pressed" from="Center/VBox/Options" to="." method="_on_options_pressed"]
[connection signal="pressed" from="Center/VBox/Quit" to="." method="_on_quit_pressed"]

View File

@@ -0,0 +1,49 @@
extends Control
const SETTINGS_PATH: String = "user://settings.cfg"
@onready var master: HSlider = %MasterSlider
@onready var music: HSlider = %MusicSlider
@onready var sfx: HSlider = %SfxSlider
@onready var sens: HSlider = %SensSlider
func _ready() -> void:
load_settings()
master.value_changed.connect(_on_master_changed)
music.value_changed.connect(_on_music_changed)
sfx.value_changed.connect(_on_sfx_changed)
func load_settings() -> void:
var cfg := ConfigFile.new()
if cfg.load(SETTINGS_PATH) == OK:
master.value = cfg.get_value("audio", "master", 1.0)
music.value = cfg.get_value("audio", "music", 1.0)
sfx.value = cfg.get_value("audio", "sfx", 1.0)
sens.value = cfg.get_value("input", "sens", 1.0)
_apply_audio()
func save_settings() -> void:
var cfg := ConfigFile.new()
cfg.set_value("audio", "master", master.value)
cfg.set_value("audio", "music", music.value)
cfg.set_value("audio", "sfx", sfx.value)
cfg.set_value("input", "sens", sens.value)
cfg.save(SETTINGS_PATH)
func _on_master_changed(_v: float) -> void:
_apply_audio()
save_settings()
func _on_music_changed(_v: float) -> void:
_apply_audio()
save_settings()
func _on_sfx_changed(_v: float) -> void:
_apply_audio()
save_settings()
func _apply_audio() -> void:
AudioServer.set_bus_volume_db(0, linear_to_db(max(0.001, master.value)))
func _on_back_pressed() -> void:
GameState.change_scene(GameState.SCENE_MAIN_MENU)

View File

@@ -0,0 +1 @@
uid://fpukylp3yy1c

View File

@@ -0,0 +1,108 @@
[gd_scene load_steps=2 format=3 uid="uid://b0options0001"]
[ext_resource type="Script" path="res://scenes/menu/options_menu.gd" id="1"]
[node name="OptionsMenu" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource("1")
[node name="Background" type="ColorRect" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
color = Color(0.1, 0.1, 0.15, 1)
[node name="Center" type="CenterContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
[node name="VBox" type="VBoxContainer" parent="Center"]
layout_mode = 2
custom_minimum_size = Vector2(420, 0)
[node name="Title" type="Label" parent="Center/VBox"]
layout_mode = 2
text = "Options"
horizontal_alignment = 1
theme_override_font_sizes/font_size = 36
[node name="MasterRow" type="HBoxContainer" parent="Center/VBox"]
layout_mode = 2
[node name="MasterLabel" type="Label" parent="Center/VBox/MasterRow"]
layout_mode = 2
custom_minimum_size = Vector2(110, 0)
text = "Master"
[node name="MasterSlider" type="HSlider" parent="Center/VBox/MasterRow"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
min_value = 0.0
max_value = 1.0
step = 0.05
value = 1.0
[node name="MusicRow" type="HBoxContainer" parent="Center/VBox"]
layout_mode = 2
[node name="MusicLabel" type="Label" parent="Center/VBox/MusicRow"]
layout_mode = 2
custom_minimum_size = Vector2(110, 0)
text = "Music"
[node name="MusicSlider" type="HSlider" parent="Center/VBox/MusicRow"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
min_value = 0.0
max_value = 1.0
step = 0.05
value = 1.0
[node name="SfxRow" type="HBoxContainer" parent="Center/VBox"]
layout_mode = 2
[node name="SfxLabel" type="Label" parent="Center/VBox/SfxRow"]
layout_mode = 2
custom_minimum_size = Vector2(110, 0)
text = "SFX"
[node name="SfxSlider" type="HSlider" parent="Center/VBox/SfxRow"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
min_value = 0.0
max_value = 1.0
step = 0.05
value = 1.0
[node name="SensRow" type="HBoxContainer" parent="Center/VBox"]
layout_mode = 2
[node name="SensLabel" type="Label" parent="Center/VBox/SensRow"]
layout_mode = 2
custom_minimum_size = Vector2(110, 0)
text = "Mouse Sens"
[node name="SensSlider" type="HSlider" parent="Center/VBox/SensRow"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
min_value = 0.1
max_value = 3.0
step = 0.1
value = 1.0
[node name="Back" type="Button" parent="Center/VBox"]
layout_mode = 2
text = "Back"
custom_minimum_size = Vector2(0, 40)
[connection signal="pressed" from="Center/VBox/Back" to="." method="_on_back_pressed"]