summaryrefslogtreecommitdiff
path: root/ui/login.gd
blob: 73b294cbcb8fb32fd9452856a12e356225f9b087 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
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)
	
	 # TODO: if setting is true to skip character server selection when only one server is available
	#if character_server_information.size() == 1:
		#(%CharacterServerList.get_child(0) as Button).pressed.emit()
	#else:
		#switch_screen(%CharacterServer)
	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", ChatMessageFormat.new())
		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 node in %CharacterList.get_children():
		node.queue_free()
	
	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.activated.connect(func():
			$CharacterSelection/VBoxContainer/HBoxContainer/CharacterInfo/Label.text = info.name
			$CharacterSelection/VBoxContainer/HBoxContainer/CharacterInfo/HBoxContainer/Label2.text = str(info.level)
			$CharacterSelection/VBoxContainer/HBoxContainer/CharacterInfo/HBoxContainer2/Label2.text = str(info.job_level)
			$CharacterSelection/VBoxContainer/HBoxContainer/CharacterInfo/HBoxContainer4/Label2.text = Constants.Job.find_key(info.job)
			$CharacterSelection/VBoxContainer/HBoxContainer/CharacterInfo/HBoxContainer3/Label2.text = str(info.strength)
		)
		character.selected.connect(func():
			current_character_information = info
			_on_character_selected_pressed(slot_idx)
		)
		%CharacterList.add_child(character)
		
		# pre-select first character
		if slot_idx == 0:
			character.activated.emit()
	
	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


func _on_character_server_back_button_pressed() -> void:
	$ButtonClickSound.play()
	switch_screen(%Login)


func _on_character_selection_back_button_pressed() -> void:
	$ButtonClickSound.play()
	switch_screen(%CharacterServer)