Add player names and account deletion
This commit is contained in:
1 parent
32594c7f81
commit
1b5b8dc0a4
10 files changed
+299
-11
No files matched your search
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user