Working on Character UI flow

This commit is contained in:
Torsten 2026-02-17 22:28:58 +01:00
parent 22291bf639
commit c5d9de036e
15 changed files with 115 additions and 106 deletions

View file

@ -1,9 +1,4 @@
extends Node
## Project Fugue - Zentrale Steuerung
## Orchestriert den Übergang zwischen Menü und Spielwelt.
@onready var main_menu = $MainMenu
func _ready():
print("--- Start: Projekt Weltenauge ---")

View file

@ -1,17 +1,17 @@
[gd_scene format=3 uid="uid://cpxxy0664jyjm"]
[ext_resource type="Script" uid="uid://162cjpb4lac4" path="res://game_root.gd" id="1_xj5yv"]
[ext_resource type="PackedScene" uid="uid://bhywhrlwjox6t" path="res://ui/menus/main_menu.tscn" id="2_pjpa4"]
[ext_resource type="PackedScene" uid="uid://ca2bhph2k3xpy" path="res://ui/character_select/character_select.tscn" id="3_bxsma"]
[ext_resource type="PackedScene" uid="uid://lb6btb6426mi" path="res://ui/account/login.tscn" id="3_lkrbl"]
[ext_resource type="PackedScene" uid="uid://cdwkmx452hc4k" path="res://ui/character_create/character_create.tscn" id="4_lkrbl"]
[node name="Game_root" type="Node2D" unique_id=1336425327]
script = ExtResource("1_xj5yv")
[node name="MainMenu" parent="." unique_id=1731390780 instance=ExtResource("2_pjpa4")]
visible = false
[node name="Login" parent="." unique_id=1694671237 instance=ExtResource("3_lkrbl")]
[node name="CharacterSelect" parent="." unique_id=2079351175 instance=ExtResource("3_bxsma")]
visible = false
[node name="CharacterCreate" parent="." unique_id=2056198803 instance=ExtResource("4_lkrbl")]
visible = false

View file

@ -14,7 +14,15 @@ extends Node
# signal server_message_received(message, type)
# UI-Events
signal join_requested(ip: String)
signal join_requested(ip: String, username: String, password: String)
@warning_ignore("unused_signal")
signal host_requested()
signal area_join_requested()
signal show_characters(characters:Array)
signal character_created(character: CharacterData)
signal create_character_screen()

View file

@ -23,4 +23,4 @@ func send_message(message: String):
@rpc("authority", "call_remote", "reliable")
func receive_message(sender_name: String, message: String, channel: String):
message_received.emit(sender_name, message, channel)
message_received.emit(sender_name, message, channel)

View file

@ -30,15 +30,23 @@ func host_game():
multiplayer.peer_disconnected.connect(_on_player_disconnected)
print("Server gestartet. id=" + str(multiplayer.get_unique_id()))
func join_game(ip = "127.0.0.1"):
func join_game(ip: String, username: String, password: String):
print("NetworkManager.join_game(", ip, "/", username, "/", password)
var peer = ENetMultiplayerPeer.new()
peer.create_client(ip, PORT)
multiplayer.multiplayer_peer = peer
func _on_player_connected(id):
print("Player connected with id:", id)
# Standardmäßig in Area 1 starten
change_player_area(id, "keuwin_grasland")
client_show_characters.rpc_id(id, [])
@rpc("authority", "call_remote", "reliable")
func client_show_characters(characters):
print("Got client_show_characters")
GameEvents.show_characters.emit(characters)
func _on_player_disconnected(id):
if not multiplayer.is_server(): return

View file

@ -14,5 +14,5 @@ func _on_join_button_pressed():
# Hier findet später die Prüfung gegen den Server statt
# Im Moment simulieren wir einfach einen erfolgreichen Login
#TODO
GameEvents.join_requested.emit(ip_input.text)
GameEvents.join_requested.emit(ip_input.text, username, password)
hide()

View file

@ -67,7 +67,7 @@ offset_left = 122.0
offset_top = -72.0
offset_right = 231.0
offset_bottom = -41.0
text = "test"
text = "test_user"
[node name="PasswordLineEdit" type="LineEdit" parent="." unique_id=214865529]
layout_mode = 0
@ -75,7 +75,7 @@ offset_left = 121.0
offset_top = -38.0
offset_right = 230.0
offset_bottom = -7.0
text = "test"
text = "test_pw"
[connection signal="pressed" from="Join_Button" to="." method="_on_join_button_pressed"]
[connection signal="button_up" from="Host_Button" to="." method="_on_host_pressed"]

View file

@ -0,0 +1,21 @@
extends Control
@onready var name_line_edit: LineEdit = $NameLineEdit
func _ready():
GameEvents.create_character_screen.connect(show_creation_screen)
func show_creation_screen():
name_line_edit.text = ""
show()
func _on_create_button_pressed() -> void:
var new_character = CharacterData.new()
new_character.name = name_line_edit.text
GameEvents.character_created.emit(new_character)
hide()
func _on_cancel_button_pressed() -> void:
get_parent().get_node("CharacterSelect").show()
hide()

View file

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

View file

@ -0,0 +1,42 @@
[gd_scene format=3 uid="uid://cdwkmx452hc4k"]
[ext_resource type="Script" uid="uid://dx24rxnsd0eoj" path="res://ui/character_create/character_create.gd" id="1_mdh5q"]
[node name="CharacterCreate" type="Control" unique_id=2056198803]
layout_mode = 3
anchors_preset = 0
script = ExtResource("1_mdh5q")
[node name="NameLabel" type="Label" parent="." unique_id=1413425912]
layout_mode = 0
offset_left = 24.0
offset_top = 32.0
offset_right = 82.0
offset_bottom = 61.0
text = "Name:"
[node name="CreateButton" type="Button" parent="." unique_id=50672893]
layout_mode = 0
offset_left = 29.0
offset_top = 81.0
offset_right = 140.0
offset_bottom = 117.0
text = "Erstellen"
[node name="CancelButton" type="Button" parent="." unique_id=861690836]
layout_mode = 0
offset_left = 175.0
offset_top = 80.0
offset_right = 286.0
offset_bottom = 116.0
text = "Abbrechen"
[node name="NameLineEdit" type="LineEdit" parent="." unique_id=2114380893]
layout_mode = 0
offset_left = 89.0
offset_top = 29.0
offset_right = 288.0
offset_bottom = 60.0
[connection signal="pressed" from="CreateButton" to="." method="_on_create_button_pressed"]
[connection signal="pressed" from="CancelButton" to="." method="_on_cancel_button_pressed"]

View file

@ -1,33 +1,25 @@
extends Control
@onready var character_list = $ItemList # Oder Tree, je nachdem wie die Liste aussieht
@onready var character_item_list: ItemList = $CharacterItemList
var characters: Array[CharacterData] = []
func _ready():
# Vorhandene Charaktere laden
load_characters()
update_ui()
GameEvents.show_characters.connect(show_list)
GameEvents.character_created.connect(character_created)
func load_characters():
# (Hier kommt die Logik zum Durchsuchen des "user://" Ordners nach JSON-Dateien hin)
# (Für den Anfang können wir einfach einen Standard-Charakter erstellen)
#var data = SaveLoad.load_character()
var data = null
if data == null:
data = CharacterData.new()
data.id = "000001" # Eindeutige ID generieren (später)
characters = [data]
SaveLoad.save_character(data)
else:
characters = [data]
func character_created(character):
characters.append(character)
character_item_list.add_item(character.name)
show()
func show_list(characters: Array):
print("show_list triggered")
character_item_list.clear()
for character: CharacterData in characters:
character_item_list.add_item(character.name)
show()
func update_ui():
character_list.clear()
for char in characters:
character_list.add_item(char.name) # Hier später: Icons, Stats etc.
func _on_character_selected(index):
var selected_character = characters[index]
@ -35,15 +27,9 @@ func _on_character_selected(index):
# (Am Ende: StartGame.emit(selected_character))
pass
signal StartGame(character: CharacterData) # Ab hier wirds interessant.
func _on_start_game_pressed():
if characters.size() > 0:
StartGame.emit(characters[0]) # Einfachheitshalber: Ersten Charakter nehmen
# Aufräumen und die Spielwelt laden (später)
func _on_create_character_pressed():
var new_character = CharacterData.new()
new_character.id = characters.size() + 1 # Provisorische ID
characters.append(new_character)
SaveLoad.save_character(new_character)
update_ui()
func _on_create_character_button_pressed() -> void:
GameEvents.create_character_screen.emit()
hide()

View file

@ -7,7 +7,7 @@ layout_mode = 3
anchors_preset = 0
script = ExtResource("1_o7qwi")
[node name="ItemList" type="ItemList" parent="." unique_id=1442954519]
[node name="CharacterItemList" type="ItemList" parent="." unique_id=1442954519]
layout_mode = 0
offset_top = 32.0
offset_right = 368.0
@ -21,10 +21,12 @@ offset_right = 217.0
offset_bottom = 31.0
text = "Charaktere:"
[node name="Button" type="Button" parent="." unique_id=50672893]
[node name="CreateCharacterButton" type="Button" parent="." unique_id=50672893]
layout_mode = 0
offset_left = 113.0
offset_top = 585.0
offset_right = 224.0
offset_bottom = 621.0
text = "Start"
text = "Neu"
[connection signal="pressed" from="CreateCharacterButton" to="." method="_on_create_character_button_pressed"]

View file

@ -1,17 +0,0 @@
extends Control
@onready var ip_input: TextEdit = $IPInput
func _on_host_button_pressed() -> void:
print("host pressed")
GameEvents.host_requested.emit()
hide()
func _on_join_button_pressed():
var username = $UsernameLineEdit.text
var password = $PasswordLineEdit.text # TODO: Handle Password
# Hier findet später die Prüfung gegen den Server statt
# Im Moment simulieren wir einfach einen erfolgreichen Login
#TODO
GameEvents.join_requested.emit(ip_input.text)

View file

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

View file

@ -1,36 +0,0 @@
[gd_scene format=3 uid="uid://bhywhrlwjox6t"]
[ext_resource type="Script" uid="uid://bp7b3a25eh6dh" path="res://ui/menus/main_menu.gd" id="1_5oih7"]
[node name="MainMenu" type="Control" unique_id=1694671237]
layout_mode = 3
anchors_preset = 0
script = ExtResource("1_5oih7")
[node name="IPInput" type="TextEdit" parent="." unique_id=1340335140]
custom_minimum_size = Vector2(150, 40)
layout_mode = 0
offset_left = 8.0
offset_top = 7.0
offset_right = 158.0
offset_bottom = 47.0
text = "127.0.0.1"
[node name="Join_Button" type="Button" parent="." unique_id=811892478]
layout_mode = 0
offset_left = 13.0
offset_top = 58.0
offset_right = 51.0
offset_bottom = 89.0
text = "Join"
[node name="Host_Button" type="Button" parent="." unique_id=1465654892]
layout_mode = 0
offset_left = 111.0
offset_top = 58.0
offset_right = 155.0
offset_bottom = 89.0
text = "Host"
[connection signal="button_up" from="Join_Button" to="." method="_on_join_pressed"]
[connection signal="button_up" from="Host_Button" to="." method="_on_host_pressed"]