Add player names and account deletion

This commit is contained in:
Emporex committed 2026-10-04 08:09:52 +02:00
1 parent 32594c7f81
commit 1b5b8dc0a4
10 files changed
+299 -11

No files matched your search

+119 -2
View File
@@ -142,6 +142,14 @@ var room_code_input_rect := Rect2(510, 340, 580, 90)
var join_room_button := Rect2(625, 525, 350, 64)
var coop_side_button := Rect2(920, 18, 140, 54)
var room_code_input := ""
var profile_name_input := ""
var profile_message := ""
var profile_delete_armed := false
var profile_rename_button := Rect2(220, 305, 250, 48)
var profile_privacy_button := Rect2(840, 685, 250, 48)
var profile_delete_button := Rect2(1110, 685, 250, 48)
var profile_name_input_rect := Rect2(460, 330, 680, 82)
var profile_name_save_button := Rect2(625, 470, 350, 62)
@onready var ads_manager = $AdsManager
@onready var account_manager = $AccountManager
@@ -370,6 +378,21 @@ func _update_effects(delta: float) -> void:
func _unhandled_input(event: InputEvent) -> void:
if game_mode == "profile_name_entry" and event is InputEventKey and event.pressed and not event.echo:
if event.keycode == KEY_ESCAPE:
_hide_virtual_keyboard()
game_mode = "profile"
elif event.keycode == KEY_BACKSPACE:
profile_name_input = profile_name_input.left(maxi(0, profile_name_input.length() - 1))
elif event.keycode == KEY_ENTER:
_save_profile_name()
elif event.unicode > 0 and profile_name_input.length() < AccountManager.MAX_DISPLAY_NAME_LENGTH:
var character := char(event.unicode)
var allowed := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 _-ÄÖÜäöüß"
if allowed.contains(character):
profile_name_input += character
queue_redraw()
return
if game_mode == "room_code_entry" and event is InputEventKey and event.pressed and not event.echo:
if event.keycode == KEY_ESCAPE:
_hide_virtual_keyboard()
@@ -454,9 +477,32 @@ func _handle_pointer(position: Vector2, is_touch := false) -> void:
return
if game_mode == "profile":
if profile_back_button.has_point(position):
profile_delete_armed = false
game_mode = "menu"
elif profile_rename_button.has_point(position):
_open_profile_name_entry()
elif profile_privacy_button.has_point(position):
OS.shell_open("https://void-bastion.gergames.de/privacy.html")
elif profile_delete_button.has_point(position):
if not online_manager.is_authenticated():
profile_message = "Kontolöschung benötigt eine Verbindung zum GerGames-Server."
elif not profile_delete_armed:
profile_delete_armed = true
profile_message = "Noch einmal bestätigen: Online-Konto, Ranglisten und lokale Werte werden gelöscht."
else:
_delete_profile_account()
queue_redraw()
return
if game_mode == "profile_name_entry":
if profile_back_button.has_point(position):
_hide_virtual_keyboard()
game_mode = "profile"
elif profile_name_input_rect.has_point(position):
_show_profile_name_keyboard()
elif profile_name_save_button.has_point(position):
_save_profile_name()
queue_redraw()
return
if back_button.has_point(position):
_return_to_menu()
return
@@ -672,6 +718,56 @@ func _hide_virtual_keyboard() -> void:
DisplayServer.virtual_keyboard_hide()
func _open_profile_name_entry() -> void:
profile_name_input = account_manager.display_name
profile_message = ""
profile_delete_armed = false
game_mode = "profile_name_entry"
_show_profile_name_keyboard()
queue_redraw()
func _show_profile_name_keyboard() -> void:
if DisplayServer.has_feature(DisplayServer.FEATURE_VIRTUAL_KEYBOARD):
DisplayServer.virtual_keyboard_show(profile_name_input, profile_name_input_rect, DisplayServer.KEYBOARD_TYPE_DEFAULT, AccountManager.MAX_DISPLAY_NAME_LENGTH, profile_name_input.length(), profile_name_input.length())
func _save_profile_name() -> void:
var validation_error: String = account_manager.validate_display_name(profile_name_input)
if not validation_error.is_empty():
profile_message = validation_error
queue_redraw()
return
profile_message = "Spielername wird gespeichert …"
queue_redraw()
var result: Dictionary = await online_manager.update_display_name(profile_name_input)
if not bool(result.get("accepted", false)):
profile_message = str(result.get("error", "Der Spielername konnte nicht gespeichert werden."))
queue_redraw()
return
_hide_virtual_keyboard()
profile_message = "Spielername gespeichert%s." % (" und online synchronisiert" if bool(result.get("online", false)) else "")
game_mode = "profile"
queue_redraw()
func _delete_profile_account() -> void:
profile_delete_armed = false
profile_message = "Konto wird unwiderruflich gelöscht …"
queue_redraw()
var result: Dictionary = await online_manager.delete_online_account()
if not bool(result.get("accepted", false)):
profile_message = str(result.get("error", "Das Konto konnte nicht gelöscht werden."))
queue_redraw()
return
best_wave = 0
best_endless_wave = 0
core_crystals = 0
_save_progress()
profile_message = "Online-Konto und lokale Profildaten gelöscht. Ein neues Gastprofil wurde erstellt."
queue_redraw()
func _start_game() -> void:
coop_online_mode = false
credits = int(_difficulty().start_credits)
@@ -1178,13 +1274,15 @@ func _load_progress() -> void:
func _draw() -> void:
if game_mode in ["menu", "profile", "multiplayer_menu", "room_code_entry", "matchmaking"]:
if game_mode in ["menu", "profile", "profile_name_entry", "multiplayer_menu", "room_code_entry", "matchmaking"]:
draw_texture_rect(MAP_TEXTURES[selected_map], Rect2(Vector2.ZERO, SCREEN), false, Color("f3f6fb"))
draw_rect(Rect2(Vector2.ZERO, SCREEN), Color(0.01, 0.025, 0.055, 0.06))
if game_mode == "menu":
_draw_menu()
elif game_mode == "profile":
_draw_profile()
elif game_mode == "profile_name_entry":
_draw_profile_name_entry()
elif game_mode == "multiplayer_menu":
_draw_multiplayer_menu()
elif game_mode == "room_code_entry":
@@ -1619,6 +1717,7 @@ func _draw_profile() -> void:
draw_string(font, Vector2(220, 220), account_manager.display_name, HORIZONTAL_ALIGNMENT_LEFT, 520, 30, Color("8ff4ff"))
draw_string(font, Vector2(220, 258), account_manager.provider_label(), HORIZONTAL_ALIGNMENT_LEFT, 650, 16, Color("ffcf7a"))
draw_string(font, Vector2(220, 292), "SPIELER-ID %s" % account_manager.short_id(), HORIZONTAL_ALIGNMENT_LEFT, 650, 14, Color("91a8bc"))
_draw_button(profile_rename_button, "SPIELERNAME ÄNDERN", false, Color("24516a"))
draw_string(font, Vector2(840, 215), "KONTO & CLOUD", HORIZONTAL_ALIGNMENT_LEFT, 470, 18, Color("8feeff"))
var cloud_label := "GERGAMES ONLINE VERBUNDEN" if online_manager.is_authenticated() else "GERGAMES ONLINE OFFLINE"
var cloud_color := Color("83ffc8") if online_manager.is_authenticated() else Color("ffcf7a")
@@ -1639,7 +1738,25 @@ func _draw_profile() -> void:
draw_string(font, Vector2(930, y), "WELLE %02d" % account_manager.get_map_best_wave(index, true), HORIZONTAL_ALIGNMENT_CENTER, 180, 16, Color("ffcf7a"))
var score := maxi(account_manager.get_map_best_score(index, false), account_manager.get_map_best_score(index, true))
draw_string(font, Vector2(1160, y), "%07d" % score, HORIZONTAL_ALIGNMENT_CENTER, 180, 16, Color("8fffea"))
draw_string(font, Vector2(220, 710), "Das Gastprofil funktioniert bereits lokal. Plattform-Anmeldungen und globale Ranglisten werden nach Einrichtung der Store-Konten aktiviert.", HORIZONTAL_ALIGNMENT_CENTER, 1160, 14, Color("86c8d8"))
if not profile_message.is_empty():
draw_string(font, Vector2(220, 658), profile_message, HORIZONTAL_ALIGNMENT_CENTER, 1160, 14, Color("ffcf7a"))
_draw_button(profile_privacy_button, "DATENSCHUTZ", false, Color("24475b"))
_draw_button(profile_delete_button, "LÖSCHEN BESTÄTIGEN" if profile_delete_armed else "KONTO LÖSCHEN", profile_delete_armed, Color("6b2d3b"))
func _draw_profile_name_entry() -> void:
var font := ThemeDB.fallback_font
draw_rect(Rect2(Vector2.ZERO, SCREEN), Color(0.005, 0.015, 0.035, 0.82))
_draw_button(profile_back_button, "< ZURÜCK", false, Color("26394a"))
draw_string(font, Vector2(0, 190), "SPIELERNAME", HORIZONTAL_ALIGNMENT_CENTER, 1600, 44, Color("c7f5ff"))
draw_string(font, Vector2(0, 250), "Dieser Name ist für Mitspieler und in Ranglisten sichtbar.", HORIZONTAL_ALIGNMENT_CENTER, 1600, 18, Color("a9d8e5"))
draw_rect(profile_name_input_rect, Color(0.012, 0.035, 0.065, 0.96), true)
draw_rect(profile_name_input_rect, Color("65dfff"), false, 3.0)
draw_string(font, profile_name_input_rect.position + Vector2(24, 53), profile_name_input, HORIZONTAL_ALIGNMENT_CENTER, profile_name_input_rect.size.x - 48, 26, Color.WHITE)
draw_string(font, Vector2(0, 448), "3–20 Zeichen · Buchstaben, Zahlen, Leerzeichen, _ und -", HORIZONTAL_ALIGNMENT_CENTER, 1600, 15, Color("91a8bc"))
_draw_button(profile_name_save_button, "SPIELERNAME SPEICHERN", false, Color("185f68"))
if not profile_message.is_empty():
draw_string(font, Vector2(300, 585), profile_message, HORIZONTAL_ALIGNMENT_CENTER, 1000, 16, Color("ffcf7a"))
func _draw_overlay(title: String, subtitle: String) -> void: