diff options
Diffstat (limited to 'ui/login.gd')
-rw-r--r-- | ui/login.gd | 120 |
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 |