about summary refs log tree commit diff stats
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/Archipelago/gamedata.gd19
-rw-r--r--client/Archipelago/manager.gd60
-rw-r--r--client/Archipelago/messages.gd3
-rw-r--r--client/Archipelago/rainbowText.gd10
-rw-r--r--client/Archipelago/settings_screen.gd6
-rw-r--r--client/Archipelago/textclient.gd10
-rw-r--r--client/Archipelago/worldport.gd45
7 files changed, 134 insertions, 19 deletions
diff --git a/client/Archipelago/gamedata.gd b/client/Archipelago/gamedata.gd index 41d966a..9eeec3b 100644 --- a/client/Archipelago/gamedata.gd +++ b/client/Archipelago/gamedata.gd
@@ -6,6 +6,7 @@ var objects
6var door_id_by_map_node_path = {} 6var door_id_by_map_node_path = {}
7var painting_id_by_map_node_path = {} 7var painting_id_by_map_node_path = {}
8var panel_id_by_map_node_path = {} 8var panel_id_by_map_node_path = {}
9var port_id_by_map_node_path = {}
9var door_id_by_ap_id = {} 10var door_id_by_ap_id = {}
10var map_id_by_name = {} 11var map_id_by_name = {}
11var progressive_id_by_ap_id = {} 12var progressive_id_by_ap_id = {}
@@ -79,6 +80,16 @@ func load(data_bytes):
79 80
80 var _map_data = painting_id_by_map_node_path[map.get_name()] 81 var _map_data = painting_id_by_map_node_path[map.get_name()]
81 82
83 for port in objects.get_ports():
84 var room = objects.get_rooms()[port.get_room_id()]
85 var map = objects.get_maps()[room.get_map_id()]
86
87 if not map.get_name() in port_id_by_map_node_path:
88 port_id_by_map_node_path[map.get_name()] = {}
89
90 var map_data = port_id_by_map_node_path[map.get_name()]
91 map_data[port.get_path()] = port.get_id()
92
82 for progressive in objects.get_progressives(): 93 for progressive in objects.get_progressives():
83 progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() 94 progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id()
84 95
@@ -121,6 +132,14 @@ func get_panel_for_map_node_path(map_name, node_path):
121 return map_data.get(node_path, null) 132 return map_data.get(node_path, null)
122 133
123 134
135func get_port_for_map_node_path(map_name, node_path):
136 if not port_id_by_map_node_path.has(map_name):
137 return null
138
139 var map_data = port_id_by_map_node_path[map_name]
140 return map_data.get(node_path, null)
141
142
124func get_door_ap_id(door_id): 143func get_door_ap_id(door_id):
125 var door = objects.get_doors()[door_id] 144 var door = objects.get_doors()[door_id]
126 if door.has_ap_id(): 145 if door.has_ap_id():
diff --git a/client/Archipelago/manager.gd b/client/Archipelago/manager.gd index 218870c..608a106 100644 --- a/client/Archipelago/manager.gd +++ b/client/Archipelago/manager.gd
@@ -46,11 +46,13 @@ var apworld_version = [0, 0]
46var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 46var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
47var daedalus_roof_access = false 47var daedalus_roof_access = false
48var keyholder_sanity = false 48var keyholder_sanity = false
49var port_pairings = {}
49var shuffle_control_center_colors = false 50var shuffle_control_center_colors = false
50var shuffle_doors = false 51var shuffle_doors = false
51var shuffle_gallery_paintings = false 52var shuffle_gallery_paintings = false
52var shuffle_letters = kSHUFFLE_LETTERS_VANILLA 53var shuffle_letters = kSHUFFLE_LETTERS_VANILLA
53var shuffle_symbols = false 54var shuffle_symbols = false
55var shuffle_worldports = false
54var strict_cyan_ending = false 56var strict_cyan_ending = false
55var strict_purple_ending = false 57var strict_purple_ending = false
56var victory_condition = -1 58var victory_condition = -1
@@ -207,8 +209,6 @@ func _process_item(item, index, from, flags, amount):
207 if client._player_name_by_slot.has(float(from)): 209 if client._player_name_by_slot.has(float(from)):
208 player_name = client._player_name_by_slot[float(from)] 210 player_name = client._player_name_by_slot[float(from)]
209 211
210 var item_color = colorForItemType(flags)
211
212 var full_item_name = item_name 212 var full_item_name = item_name
213 if prog_id != null: 213 if prog_id != null:
214 var door = gamedata.objects.get_doors()[prog_id] 214 var door = gamedata.objects.get_doors()[prog_id]
@@ -216,10 +216,10 @@ func _process_item(item, index, from, flags, amount):
216 216
217 var message 217 var message
218 if from == client._slot: 218 if from == client._slot:
219 message = "Found [color=%s]%s[/color]" % [item_color, full_item_name] 219 message = "Found %s" % wrapInItemColorTags(full_item_name, flags)
220 else: 220 else:
221 message = ( 221 message = (
222 "Received [color=%s]%s[/color] from %s" % [item_color, full_item_name, player_name] 222 "Received %s from %s" % [wrapInItemColorTags(full_item_name, flags), player_name]
223 ) 223 )
224 224
225 if gamedata.anti_trap_ids.has(item): 225 if gamedata.anti_trap_ids.has(item):
@@ -265,13 +265,20 @@ func _process_message(message):
265 if !message.has("found") || !message["found"]: 265 if !message.has("found") || !message["found"]:
266 global.get_node("Messages").showMessage( 266 global.get_node("Messages").showMessage(
267 ( 267 (
268 "Hint: [color=%s]%s[/color]%s is on %s" 268 "Hint: %s%s is on %s"
269 % [item_color, item_name, is_for, location_name] 269 % [
270 wrapInItemColorTags(item_name, message["item"]["flags"]),
271 is_for,
272 location_name
273 ]
270 ) 274 )
271 ) 275 )
272 else: 276 else:
273 if message["receiving"] != client._slot: 277 if message["receiving"] != client._slot:
274 var sentMsg = "Sent [color=%s]%s[/color] to %s" % [item_color, item_name, player_name] 278 var sentMsg = (
279 "Sent %s to %s"
280 % [wrapInItemColorTags(item_name, message["item"]["flags"]), player_name]
281 )
275 #if _hinted_locations.has(message["item"]["location"]): 282 #if _hinted_locations.has(message["item"]["location"]):
276 # sentMsg += " ([color=#fafad2]Hinted![/color])" 283 # sentMsg += " ([color=#fafad2]Hinted![/color])"
277 global.get_node("Messages").showMessage(sentMsg) 284 global.get_node("Messages").showMessage(sentMsg)
@@ -296,9 +303,7 @@ func parse_printjson_for_textclient(message):
296 if client._item_id_to_name[item_player_game].has(int(message_part["text"])): 303 if client._item_id_to_name[item_player_game].has(int(message_part["text"])):
297 item_name = client._item_id_to_name[item_player_game][int(message_part["text"])] 304 item_name = client._item_id_to_name[item_player_game][int(message_part["text"])]
298 305
299 parts.append( 306 parts.append(wrapInItemColorTags(item_name, message_part["flags"]))
300 "[color=%s]%s[/color]" % [colorForItemType(message_part["flags"]), item_name]
301 )
302 elif message_part["type"] == "location_id": 307 elif message_part["type"] == "location_id":
303 var location_name = "Unknown" 308 var location_name = "Unknown"
304 var location_player_game = client._game_by_player[message_part["player"]] 309 var location_player_game = client._game_by_player[message_part["player"]]
@@ -380,6 +385,7 @@ func _client_connected(slot_data):
380 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false)) 385 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false))
381 shuffle_letters = int(slot_data.get("shuffle_letters", 0)) 386 shuffle_letters = int(slot_data.get("shuffle_letters", 0))
382 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false)) 387 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false))
388 shuffle_worldports = bool(slot_data.get("shuffle_worldports", false))
383 strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false)) 389 strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false))
384 strict_purple_ending = bool(slot_data.get("strict_purple_ending", false)) 390 strict_purple_ending = bool(slot_data.get("strict_purple_ending", false))
385 victory_condition = int(slot_data.get("victory_condition", 0)) 391 victory_condition = int(slot_data.get("victory_condition", 0))
@@ -387,6 +393,13 @@ func _client_connected(slot_data):
387 if slot_data.has("version"): 393 if slot_data.has("version"):
388 apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])] 394 apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])]
389 395
396 port_pairings.clear()
397 if slot_data.has("port_pairings"):
398 var raw_pp = slot_data.get("port_pairings")
399
400 for p1 in raw_pp.keys():
401 port_pairings[int(p1)] = int(raw_pp[p1])
402
390 # Set up item locks. 403 # Set up item locks.
391 _item_locks = {} 404 _item_locks = {}
392 405
@@ -404,12 +417,14 @@ func _client_connected(slot_data):
404 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] 417 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1]
405 418
406 for door_group in gamedata.objects.get_door_groups(): 419 for door_group in gamedata.objects.get_door_groups():
407 if ( 420 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR:
408 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR 421 if shuffle_worldports:
409 or door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP 422 continue
410 ): 423 elif door_group.get_type() != gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP:
411 for door in door_group.get_doors(): 424 continue
412 _item_locks[door] = [door_group.get_ap_id(), 1] 425
426 for door in door_group.get_doors():
427 _item_locks[door] = [door_group.get_ap_id(), 1]
413 428
414 if shuffle_control_center_colors: 429 if shuffle_control_center_colors:
415 for door in gamedata.objects.get_doors(): 430 for door in gamedata.objects.get_doors():
@@ -417,7 +432,10 @@ func _client_connected(slot_data):
417 _item_locks[door.get_id()] = [door.get_ap_id(), 1] 432 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
418 433
419 for door_group in gamedata.objects.get_door_groups(): 434 for door_group in gamedata.objects.get_door_groups():
420 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR: 435 if (
436 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR
437 and not shuffle_worldports
438 ):
421 for door in door_group.get_doors(): 439 for door in door_group.get_doors():
422 _item_locks[door] = [door_group.get_ap_id(), 1] 440 _item_locks[door] = [door_group.get_ap_id(), 1]
423 441
@@ -497,6 +515,14 @@ func colorForItemType(flags):
497 return "#14de9e" 515 return "#14de9e"
498 516
499 517
518func wrapInItemColorTags(text, flags):
519 var int_flags = int(flags)
520 if int_flags & 1 and int_flags & 2: # proguseful
521 return "[rainbow]%s[/rainbow]" % text
522 else:
523 return "[color=%s]%s[/color]" % [colorForItemType(flags), text]
524
525
500func get_letter_behavior(key, level2): 526func get_letter_behavior(key, level2):
501 if shuffle_letters == kSHUFFLE_LETTERS_UNLOCKED: 527 if shuffle_letters == kSHUFFLE_LETTERS_UNLOCKED:
502 return kLETTER_BEHAVIOR_UNLOCKED 528 return kLETTER_BEHAVIOR_UNLOCKED
diff --git a/client/Archipelago/messages.gd b/client/Archipelago/messages.gd index 82fdbc4..ab4f071 100644 --- a/client/Archipelago/messages.gd +++ b/client/Archipelago/messages.gd
@@ -1,5 +1,7 @@
1extends CanvasLayer 1extends CanvasLayer
2 2
3var SCRIPT_rainbowText
4
3var _message_queue = [] 5var _message_queue = []
4var _font 6var _font
5var _container 7var _container
@@ -23,6 +25,7 @@ func _ready():
23 25
24func _add_message(text): 26func _add_message(text):
25 var new_label = RichTextLabel.new() 27 var new_label = RichTextLabel.new()
28 new_label.install_effect(SCRIPT_rainbowText.new())
26 new_label.push_font(_font) 29 new_label.push_font(_font)
27 new_label.push_font_size(36) 30 new_label.push_font_size(36)
28 new_label.push_outline_color(Color(0, 0, 0, 1)) 31 new_label.push_outline_color(Color(0, 0, 0, 1))
diff --git a/client/Archipelago/rainbowText.gd b/client/Archipelago/rainbowText.gd new file mode 100644 index 0000000..9a4c1d0 --- /dev/null +++ b/client/Archipelago/rainbowText.gd
@@ -0,0 +1,10 @@
1extends RichTextEffect
2
3var bbcode = "rainbow"
4
5
6func _process_custom_fx(char_fx: CharFXTransform):
7 char_fx.color = Color.from_hsv(
8 char_fx.elapsed_time - floor(char_fx.elapsed_time), 1.0, 1.0, 1.0
9 )
10 return true
diff --git a/client/Archipelago/settings_screen.gd b/client/Archipelago/settings_screen.gd index b7bfacf..b29fb19 100644 --- a/client/Archipelago/settings_screen.gd +++ b/client/Archipelago/settings_screen.gd
@@ -62,6 +62,7 @@ func _ready():
62 var messages_script = load("user://maps/Archipelago/messages.gd") 62 var messages_script = load("user://maps/Archipelago/messages.gd")
63 var messages_instance = messages_script.new() 63 var messages_instance = messages_script.new()
64 messages_instance.name = "Messages" 64 messages_instance.name = "Messages"
65 messages_instance.SCRIPT_rainbowText = load("user://maps/Archipelago/rainbowText.gd")
65 global.add_child(messages_instance) 66 global.add_child(messages_instance)
66 67
67 var textclient_script = load("user://maps/Archipelago/textclient.gd") 68 var textclient_script = load("user://maps/Archipelago/textclient.gd")
@@ -192,6 +193,11 @@ func startGame():
192 unlocks.loadData() 193 unlocks.loadData()
193 unlocks.unlockKey("capslock", 1) 194 unlocks.unlockKey("capslock", 1)
194 195
196 if ap.shuffle_worldports:
197 settings.worldport_fades = "default"
198 else:
199 settings.worldport_fades = "never"
200
195 clearResourceCache("res://objects/meshes/gridDoor.tscn") 201 clearResourceCache("res://objects/meshes/gridDoor.tscn")
196 clearResourceCache("res://objects/nodes/collectable.tscn") 202 clearResourceCache("res://objects/nodes/collectable.tscn")
197 clearResourceCache("res://objects/nodes/door.tscn") 203 clearResourceCache("res://objects/nodes/door.tscn")
diff --git a/client/Archipelago/textclient.gd b/client/Archipelago/textclient.gd index 85cc6d2..5e648f2 100644 --- a/client/Archipelago/textclient.gd +++ b/client/Archipelago/textclient.gd
@@ -82,5 +82,13 @@ func parse_printjson(text):
82func text_entered(text): 82func text_entered(text):
83 var ap = global.get_node("Archipelago") 83 var ap = global.get_node("Archipelago")
84 var cmd = text.trim_suffix("\n") 84 var cmd = text.trim_suffix("\n")
85 ap.client.say(cmd)
86 entry.text = "" 85 entry.text = ""
86 if OS.is_debug_build():
87 if cmd.begins_with("/tp_map "):
88 var new_map = cmd.substr(8)
89 global.map = new_map
90 global.sets_entry_point = false
91 switcher.switch_map("res://objects/scenes/%s.tscn" % new_map)
92 return
93
94 ap.client.say(cmd)
diff --git a/client/Archipelago/worldport.gd b/client/Archipelago/worldport.gd index d0fb6c9..cdca248 100644 --- a/client/Archipelago/worldport.gd +++ b/client/Archipelago/worldport.gd
@@ -1,10 +1,53 @@
1extends "res://scripts/nodes/worldport.gd" 1extends "res://scripts/nodes/worldport.gd"
2 2
3var absolute_rotation = false
4var target_rotation = 0
5
3 6
4func _ready(): 7func _ready():
8 var node_path = String(
9 get_tree().get_root().get_node("scene").get_path_to(self).get_concatenated_names()
10 )
11
12 var ap = global.get_node("Archipelago")
13
14 if ap.shuffle_worldports:
15 var gamedata = global.get_node("Gamedata")
16 var port_id = gamedata.get_port_for_map_node_path(global.map, node_path)
17 if port_id != null:
18 if port_id in ap.port_pairings:
19 var target_port = gamedata.objects.get_ports()[ap.port_pairings[port_id]]
20 var target_room = gamedata.objects.get_rooms()[target_port.get_room_id()]
21 var target_map = gamedata.objects.get_maps()[target_room.get_map_id()]
22
23 exit = target_map.get_name()
24 entry_point.x = target_port.get_destination().get_x()
25 entry_point.y = target_port.get_destination().get_y()
26 entry_point.z = target_port.get_destination().get_z()
27 absolute_rotation = true
28 target_rotation = target_port.get_rotation()
29 sets_entry_point = true
30 invisible = false
31 fades = true
32
5 if global.map == "icarus" and exit == "daedalus": 33 if global.map == "icarus" and exit == "daedalus":
6 var ap = global.get_node("Archipelago")
7 if not ap.daedalus_roof_access: 34 if not ap.daedalus_roof_access:
8 entry_point = Vector3(58, 10, 0) 35 entry_point = Vector3(58, 10, 0)
9 36
10 super._ready() 37 super._ready()
38
39
40func bodyEntered(body):
41 if body.is_in_group("player"):
42 if absolute_rotation:
43 entry_rotate.y = target_rotation - body.rotation_degrees.y
44
45 super.bodyEntered(body)
46
47
48func changeScene():
49 var player = get_tree().get_root().get_node("scene/player")
50 if player != null:
51 player.playable = false
52
53 super.changeScene()