diff --git a/weltenauge/PROJEKT_UEBERSICHT.md b/weltenauge/PROJEKT_UEBERSICHT.md index 0dbd8b4..5427075 100644 --- a/weltenauge/PROJEKT_UEBERSICHT.md +++ b/weltenauge/PROJEKT_UEBERSICHT.md @@ -124,3 +124,31 @@ Die Konfiguration des `MultiplayerSynchronizer` für wiederverwendbare Szenen (w - Handhabt nicht nur originäre Objekterzeugung in den Levels, sondern auch Objektaktualisierungen für "Late Joiner" - Generischer MultiplayerSpawner in Basis Level, von dem alle Level erben, so dass die Spawnliste nur 1x bearbeitet werden muss + +## Namenskonventionen +Signale: +Verwenden Sie einheitliche Präfixe, um die Quelle des Signals anzugeben (z.B. player_, ui_, network_). +Verwenden Sie Verben in der Vergangenheitsform, um anzuzeigen, dass ein Ereignis stattgefunden hat (z.B. player_moved, ui_buttonPressed, network_connected). + +RPCs: +An den Server gerichtet RPCs beginnen mit src_ und an den Client gerictete RPCs beginnen mit cl_ + +Variablen: +- snake_case für lokale Variablen und Funktionsnamen (z.B. player_health, calculate_damage). +- PascalCase für Klassennamen und Ressourcen (z.B. CharacterData, MyCustomShader). +- Konstanten in GROSSBUCHSTABEN (z.B. MAX_HEALTH, DEFAULT_SPEED). + +## 9. Reihenfolge rpc Methoden +- Programmstart: Autoload Singletons: NetworkManager, GameEvents und ChatManager werden instanziert. + -- Wenn der NetworkManager erkennt, dass er headless ist, startet er automatisch den Server +- Die Haupt Szene startet: game_root.tscn - in ihr sind alle UI Scenen eingebettet. Bis auf eine ( Login ) sind alle hidden. + -- Login beinhaltet eine UI, in der man Host oder Join anwählen kann. Zu join gehört auch noch Username und Passwort +- Es wird Join geklickt: + * GameEvents.ui_join_requested.emit(ip_input.text, username, password) + * Der NetworkManager des Clients hat das Signal abonniert und startet join_game, das den MultiplayerPeer instanziert. + * Der NetworkManager des Servers empfängt das Signal _on_player_connected aktiviert auf dem Client + => client_show_characters.rpc_id(id, []) , was auf dem Client die Charakterliste anzeigt( die aktuell leer ist). + In der Charakterliste kann über einen Button ein neuer Charakter angelegt werden. Der Button + löst aus: GameEvents.create_character_screen.emit() , der von CharacterCreate abonniert ist, und dort die + Methode show_creation_screen auslöst. + ** Wird das Formular ausgefüllt und Create angeklickt, löst dies die an den Server gerichtete rpc store_player_charakter aus. diff --git a/weltenauge/systems/core/game_events.gd b/weltenauge/systems/core/game_events.gd index 3a152c6..2d9e63e 100644 --- a/weltenauge/systems/core/game_events.gd +++ b/weltenauge/systems/core/game_events.gd @@ -1,28 +1,18 @@ extends Node @warning_ignore("unused_signal") - -# Spieler-bezogene Events -# signal player_health_changed(new_health, max_health) -# signal player_xp_gained(amount) - -# Welt-bezogene Events -# signal area_transition_started(area_name) -# signal area_loading_finished - -# Netzwerk-Events -# signal server_message_received(message, type) - -# UI-Events -signal join_requested(ip: String, username: String, password: String) +signal ui_join_requested(ip: String, username: String, password: String) @warning_ignore("unused_signal") -signal host_requested() +signal ui_host_requested() -signal area_join_requested() +signal player_area_join_requested(area_key: String) +signal ui_area_join_requested(area_key: String) -signal show_characters(characters:Array) +signal ui_show_characters(characters:Array) -signal character_created(character: CharacterData) +signal ui_show_character_create() -signal create_character_screen() +signal ui_character_created(character: CharacterData) + +signal ui_character_select() diff --git a/weltenauge/systems/network/network_manager.gd b/weltenauge/systems/network/network_manager.gd index 1cd23e8..5daddcd 100644 --- a/weltenauge/systems/network/network_manager.gd +++ b/weltenauge/systems/network/network_manager.gd @@ -16,8 +16,8 @@ var area_paths = { var player_worlds = {} func _ready(): - GameEvents.host_requested.connect(host_game) - GameEvents.join_requested.connect(join_game) + GameEvents.ui_host_requested.connect(host_game) + GameEvents.ui_join_requested.connect(join_game) if DisplayServer.get_name() == "headless" or OS.get_cmdline_args().has("--server"): host_game() diff --git a/weltenauge/ui/account/login.gd b/weltenauge/ui/account/login.gd index 238cb4f..61f41f1 100644 --- a/weltenauge/ui/account/login.gd +++ b/weltenauge/ui/account/login.gd @@ -4,12 +4,12 @@ extends Control func _on_host_button_pressed() -> void: print("host pressed") - GameEvents.host_requested.emit() + GameEvents.ui_host_requested.emit() hide() func _on_join_button_pressed(): var username = $UsernameLineEdit.text var password = $PasswordLineEdit.text # TODO: Handle Password - GameEvents.join_requested.emit(ip_input.text, username, password) + GameEvents.ui_join_requested.emit(ip_input.text, username, password) hide() diff --git a/weltenauge/ui/character_create/character_create.gd b/weltenauge/ui/character_create/character_create.gd index 0af4b6d..41e5ef3 100644 --- a/weltenauge/ui/character_create/character_create.gd +++ b/weltenauge/ui/character_create/character_create.gd @@ -3,7 +3,7 @@ extends Control @onready var name_line_edit: LineEdit = $NameLineEdit func _ready(): - GameEvents.create_character_screen.connect(show_creation_screen) + GameEvents.ui_show_character_create.connect(show_creation_screen) func show_creation_screen(): name_line_edit.text = "" @@ -12,7 +12,7 @@ func show_creation_screen(): func _on_create_button_pressed() -> void: var new_character = CharacterData.new() new_character.name = name_line_edit.text - GameEvents.character_created.emit(new_character) + GameEvents.ui_character_created.emit(new_character) hide() diff --git a/weltenauge/ui/character_select/character_select.gd b/weltenauge/ui/character_select/character_select.gd index c9599b1..197491a 100644 --- a/weltenauge/ui/character_select/character_select.gd +++ b/weltenauge/ui/character_select/character_select.gd @@ -5,8 +5,8 @@ extends Control var characters: Array[CharacterData] = [] func _ready(): - GameEvents.show_characters.connect(show_list) - GameEvents.character_created.connect(character_created) + GameEvents.ui_show_characters.connect(show_list) + GameEvents.ui_character_created.connect(character_created) func character_created(character): characters.append(character) @@ -28,8 +28,10 @@ func _on_character_selected(index): pass - - func _on_create_character_button_pressed() -> void: GameEvents.create_character_screen.emit() hide() + +# Doubleclick on Character should start area transition +func _on_character_item_list_item_activated(index: int) -> void: + pass # Replace with function body. diff --git a/weltenauge/ui/character_select/character_select.tscn b/weltenauge/ui/character_select/character_select.tscn index d6dc89c..6e4fdb9 100644 --- a/weltenauge/ui/character_select/character_select.tscn +++ b/weltenauge/ui/character_select/character_select.tscn @@ -29,4 +29,5 @@ offset_right = 224.0 offset_bottom = 621.0 text = "Neu" +[connection signal="item_activated" from="CharacterItemList" to="." method="_on_character_item_list_item_activated"] [connection signal="pressed" from="CreateCharacterButton" to="." method="_on_create_character_button_pressed"]