about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--client/Archipelago/gamedata.gd19
-rw-r--r--client/Archipelago/manager.gd29
-rw-r--r--client/Archipelago/settings_screen.gd5
-rw-r--r--client/Archipelago/worldport.gd45
4 files changed, 90 insertions, 8 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..c804109 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
@@ -380,6 +382,7 @@ func _client_connected(slot_data):
380 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false)) 382 shuffle_gallery_paintings = bool(slot_data.get("shuffle_gallery_paintings", false))
381 shuffle_letters = int(slot_data.get("shuffle_letters", 0)) 383 shuffle_letters = int(slot_data.get("shuffle_letters", 0))
382 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false)) 384 shuffle_symbols = bool(slot_data.get("shuffle_symbols", false))
385 shuffle_worldports = bool(slot_data.get("shuffle_worldports", false))
383 strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false)) 386 strict_cyan_ending = bool(slot_data.get("strict_cyan_ending", false))
384 strict_purple_ending = bool(slot_data.get("strict_purple_ending", false)) 387 strict_purple_ending = bool(slot_data.get("strict_purple_ending", false))
385 victory_condition = int(slot_data.get("victory_condition", 0)) 388 victory_condition = int(slot_data.get("victory_condition", 0))
@@ -387,6 +390,13 @@ func _client_connected(slot_data):
387 if slot_data.has("version"): 390 if slot_data.has("version"):
388 apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])] 391 apworld_version = [int(slot_data["version"][0]), int(slot_data["version"][1])]
389 392
393 port_pairings.clear()
394 if slot_data.has("port_pairings"):
395 var raw_pp = slot_data.get("port_pairings")
396
397 for p1 in raw_pp.keys():
398 port_pairings[int(p1)] = int(raw_pp[p1])
399
390 # Set up item locks. 400 # Set up item locks.
391 _item_locks = {} 401 _item_locks = {}
392 402
@@ -404,12 +414,14 @@ func _client_connected(slot_data):
404 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1] 414 _item_locks[door.get_id()] = [progressive.get_ap_id(), i + 1]
405 415
406 for door_group in gamedata.objects.get_door_groups(): 416 for door_group in gamedata.objects.get_door_groups():
407 if ( 417 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR:
408 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.CONNECTOR 418 if shuffle_worldports:
409 or door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP 419 continue
410 ): 420 elif door_group.get_type() != gamedata.SCRIPT_proto.DoorGroupType.SHUFFLE_GROUP:
411 for door in door_group.get_doors(): 421 continue
412 _item_locks[door] = [door_group.get_ap_id(), 1] 422
423 for door in door_group.get_doors():
424 _item_locks[door] = [door_group.get_ap_id(), 1]
413 425
414 if shuffle_control_center_colors: 426 if shuffle_control_center_colors:
415 for door in gamedata.objects.get_doors(): 427 for door in gamedata.objects.get_doors():
@@ -417,7 +429,10 @@ func _client_connected(slot_data):
417 _item_locks[door.get_id()] = [door.get_ap_id(), 1] 429 _item_locks[door.get_id()] = [door.get_ap_id(), 1]
418 430
419 for door_group in gamedata.objects.get_door_groups(): 431 for door_group in gamedata.objects.get_door_groups():
420 if door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR: 432 if (
433 door_group.get_type() == gamedata.SCRIPT_proto.DoorGroupType.COLOR_CONNECTOR
434 and not shuffle_worldports
435 ):
421 for door in door_group.get_doors(): 436 for door in door_group.get_doors():
422 _item_locks[door] = [door_group.get_ap_id(), 1] 437 _item_locks[door] = [door_group.get_ap_id(), 1]
423 438
diff --git a/client/Archipelago/settings_screen.gd b/client/Archipelago/settings_screen.gd index b7bfacf..44c614a 100644 --- a/client/Archipelago/settings_screen.gd +++ b/client/Archipelago/settings_screen.gd
@@ -192,6 +192,11 @@ func startGame():
192 unlocks.loadData() 192 unlocks.loadData()
193 unlocks.unlockKey("capslock", 1) 193 unlocks.unlockKey("capslock", 1)
194 194
195 if ap.shuffle_worldports:
196 settings.worldport_fades = "default"
197 else:
198 settings.worldport_fades = "never"
199
195 clearResourceCache("res://objects/meshes/gridDoor.tscn") 200 clearResourceCache("res://objects/meshes/gridDoor.tscn")
196 clearResourceCache("res://objects/nodes/collectable.tscn") 201 clearResourceCache("res://objects/nodes/collectable.tscn")
197 clearResourceCache("res://objects/nodes/door.tscn") 202 clearResourceCache("res://objects/nodes/door.tscn")
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()