summaryrefslogtreecommitdiff
path: root/ui/login.gd
diff options
context:
space:
mode:
Diffstat (limited to 'ui/login.gd')
-rw-r--r--ui/login.gd120
1 files changed, 120 insertions, 0 deletions
diff --git a/ui/login.gd b/ui/login.gd
new file mode 100644
index 0000000..540355f
--- /dev/null
+++ b/ui/login.gd
@@ -0,0 +1,120 @@
+extends Control
+
+
+var account_information: LoginServerLoginSuccessPacket
+var character_server_information: Array
+
+var current_character_information: CharacterInformation
+
+
+func _ready() -> void:
+ switch_screen(%Login)
+ $BackgroundMusic.play()
+
+ %ChatWindow.visible = false
+
+
+func switch_screen(screen: Node):
+ for node in get_children():
+ if node is CenterContainer:
+ node.visible = false
+
+ screen.visible = true
+
+
+func _on_login_pressed() -> void:
+ $ButtonClickSound.play()
+ Network.login_server.login(%Username.text, %Password.text)
+
+ account_information = await Network.login_server.logged_in
+ character_server_information = account_information.character_server_information
+
+ Client.account.id = account_information.account_id
+
+ get_tree().root.add_child(Network.login_server.get_keep_alive_timer())
+
+ for node in %CharacterServerList.get_children():
+ node.queue_free()
+
+ for info: CharacterServerInformation in character_server_information:
+ var select_character_server = Button.new()
+ select_character_server.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ select_character_server.text = info.server_name
+ select_character_server.pressed.connect(_on_character_server_login_pressed.bind(info))
+ %CharacterServerList.add_child(select_character_server)
+
+ switch_screen(%CharacterServer)
+
+
+func _on_character_server_login_pressed(character_server_info: CharacterServerInformation) -> void:
+ $ButtonClickSound.play()
+ Network.character_server = CharacterServer.new(
+ character_server_info.get_server_ip(),
+ character_server_info.server_port
+ )
+
+ Network.character_server.login(
+ account_information.account_id,
+ account_information.login_id1,
+ account_information.login_id2,
+ account_information.gender
+ )
+
+ var response = await Network.character_server.received_packet
+ if response is CharacterSelectionFailedPacket:
+ print("character server login failed")
+ %ChatWindow.add_message("character server login failed")
+ return
+
+ get_tree().root.add_child(Network.character_server.get_keep_alive_timer())
+
+ var character_list: CharacterServerLoginSuccessCharacterListPacket = await Network.character_server.logged_in_character_list
+
+ for slot_idx in character_list.character_information.size():
+ var info: CharacterInformation = character_list.character_information[slot_idx]
+ var character = preload("res://ui/character_selection_item.tscn").instantiate()
+ character.initialize_with_info(info)
+ character.pressed.connect(func():
+ current_character_information = info
+ _on_character_selected_pressed(slot_idx)
+ )
+ %CharacterList.add_child(character)
+
+ switch_screen(%CharacterSelection)
+
+
+func _on_character_selected_pressed(slot_idx: int):
+ $ButtonClickSound.play()
+ Network.character_server.select_character(slot_idx)
+
+ var selected_character = await Network.character_server.selected_character
+
+ if selected_character is CharacterSelectionFailedPacket:
+ # TODO: show error
+ return
+
+ Client.character.name = current_character_information.name
+
+ Network.map_server = MapServer.new(
+ selected_character.get_map_server_ip(),
+ selected_character.map_server_port
+ )
+
+ Network.map_server.login(
+ account_information.account_id,
+ current_character_information.character_id,
+ account_information.login_id1,
+ account_information.gender
+ )
+ var _logged_in = await Network.map_server.logged_in
+
+ # TODO: switch to game :)
+
+ %ChatWindow.visible = true
+ %ChatWindow.initialize()
+
+ # TODO: load map
+ var map_loaded_packet := MapLoadedPacket.new()
+ Network.map_server.send(map_loaded_packet)
+
+ # TODO: check which map server packets to send next