diff options
Diffstat (limited to 'apworld/client')
| -rw-r--r-- | apworld/client/gamedata.gd | 4 | ||||
| -rw-r--r-- | apworld/client/manager.gd | 4 | ||||
| -rw-r--r-- | apworld/client/player.gd | 113 |
3 files changed, 85 insertions, 36 deletions
| diff --git a/apworld/client/gamedata.gd b/apworld/client/gamedata.gd index 3a35125..d7e3136 100644 --- a/apworld/client/gamedata.gd +++ b/apworld/client/gamedata.gd | |||
| @@ -15,6 +15,7 @@ var symbol_item_ids = [] | |||
| 15 | var anti_trap_ids = {} | 15 | var anti_trap_ids = {} |
| 16 | var location_name_by_id = {} | 16 | var location_name_by_id = {} |
| 17 | var ending_display_name_by_name = {} | 17 | var ending_display_name_by_name = {} |
| 18 | var port_id_by_ap_id = {} | ||
| 18 | 19 | ||
| 19 | var kSYMBOL_ITEMS | 20 | var kSYMBOL_ITEMS |
| 20 | 21 | ||
| @@ -99,6 +100,9 @@ func load(data_bytes): | |||
| 99 | var map_data = port_id_by_map_node_path[map.get_name()] | 100 | var map_data = port_id_by_map_node_path[map.get_name()] |
| 100 | map_data[port.get_path()] = port.get_id() | 101 | map_data[port.get_path()] = port.get_id() |
| 101 | 102 | ||
| 103 | if port.has_ap_id(): | ||
| 104 | port_id_by_ap_id[port.get_ap_id()] = port.get_id() | ||
| 105 | |||
| 102 | for progressive in objects.get_progressives(): | 106 | for progressive in objects.get_progressives(): |
| 103 | progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() | 107 | progressive_id_by_ap_id[progressive.get_ap_id()] = progressive.get_id() |
| 104 | 108 | ||
| diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index aa07559..727d17a 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd | |||
| @@ -472,7 +472,9 @@ func _client_connected(slot_data): | |||
| 472 | var raw_pp = slot_data.get("port_pairings") | 472 | var raw_pp = slot_data.get("port_pairings") |
| 473 | 473 | ||
| 474 | for p1 in raw_pp.keys(): | 474 | for p1 in raw_pp.keys(): |
| 475 | port_pairings[int(p1)] = int(raw_pp[p1]) | 475 | port_pairings[gamedata.port_id_by_ap_id[int(p1)]] = gamedata.port_id_by_ap_id[int( |
| 476 | raw_pp[p1] | ||
| 477 | )] | ||
| 476 | 478 | ||
| 477 | # Set up item locks. | 479 | # Set up item locks. |
| 478 | _item_locks = {} | 480 | _item_locks = {} |
| diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 712a59b..65bf54e 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd | |||
| @@ -98,38 +98,72 @@ func _ready(): | |||
| 98 | old_door.queue_free() | 98 | old_door.queue_free() |
| 99 | get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) | 99 | get_node("/root/scene/Components/Doors").add_child.call_deferred(new_door) |
| 100 | 100 | ||
| 101 | # Block off roof access in Daedalus. | 101 | if global.map == "daedalus": |
| 102 | if global.map == "daedalus" and not ap.daedalus_roof_access: | 102 | # Teleport the direction panels when the stairs are there. |
| 103 | _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) | 103 | var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn") |
| 104 | _set_up_invis_wall(51.5, 11, -17, 16, 10, 1) | 104 | |
| 105 | _set_up_invis_wall(46, 10, -9.5, 1, 10, 10) | 105 | var dir1 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_1") |
| 106 | _set_up_invis_wall(67.5, 11, 17, 16, 10, 1) | 106 | var dir1_tpl = tpl_prefab.instantiate() |
| 107 | _set_up_invis_wall(50.5, 11, 14, 10, 10, 1) | 107 | dir1_tpl.target_path = dir1 |
| 108 | _set_up_invis_wall(39, 10, 18.5, 1, 10, 22) | 108 | dir1_tpl.teleport_point = Vector3(59.5, 8, -6.5) |
| 109 | _set_up_invis_wall(20, 15, 18.5, 1, 10, 16) | 109 | dir1_tpl.teleport_rotate = Vector3(-45, 0, 0) |
| 110 | _set_up_invis_wall(11.5, 15, 3, 32, 10, 1) | 110 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 111 | _set_up_invis_wall(11.5, 16, -20, 14, 20, 1) | 111 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 112 | _set_up_invis_wall(14, 16, -26.5, 1, 20, 4) | 112 | dir1_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 113 | _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25) | 113 | dir1.add_child.call_deferred(dir1_tpl) |
| 114 | _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1) | 114 | |
| 115 | _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1) | 115 | var dir2 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_2") |
| 116 | _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11) | 116 | var dir2_tpl = tpl_prefab.instantiate() |
| 117 | _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11) | 117 | dir2_tpl.target_path = dir2 |
| 118 | 118 | dir2_tpl.teleport_point = Vector3(59.5, 8, 6.5) | |
| 119 | var warp_exit_prefab = preload("res://objects/nodes/exit.tscn") | 119 | dir2_tpl.teleport_rotate = Vector3(-45, -180, 0) |
| 120 | var warp_exit = warp_exit_prefab.instantiate() | 120 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 121 | warp_exit.name = "roof_access_blocker_warp_exit" | 121 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 122 | warp_exit.position = Vector3(58, 10, 0) | 122 | dir2_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 123 | warp_exit.rotation_degrees.y = 90 | 123 | dir2.add_child.call_deferred(dir2_tpl) |
| 124 | get_parent().add_child.call_deferred(warp_exit) | 124 | |
| 125 | 125 | var dir3 = get_node("/root/scene/Panels/Castle Entrance/castle_direction_3") | |
| 126 | var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn") | 126 | var dir3_tpl = tpl_prefab.instantiate() |
| 127 | var warp_enter = warp_enter_prefab.instantiate() | 127 | dir3_tpl.target_path = dir3 |
| 128 | warp_enter.target = warp_exit | 128 | dir3_tpl.teleport_point = Vector3(54, 8, 0) |
| 129 | warp_enter.position = Vector3(76.5, 30, 1) | 129 | dir3_tpl.teleport_rotate = Vector3(-45, 90, 0) |
| 130 | warp_enter.scale = Vector3(4, 1.5, 1) | 130 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_south")) |
| 131 | warp_enter.rotation_degrees.y = 90 | 131 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_north")) |
| 132 | get_parent().add_child.call_deferred(warp_enter) | 132 | dir3_tpl.senders.append(NodePath("/root/scene/Panels/Castle Entrance/castle_west")) |
| 133 | dir3.add_child.call_deferred(dir3_tpl) | ||
| 134 | |||
| 135 | # Block off roof access in Daedalus. | ||
| 136 | if not ap.daedalus_roof_access: | ||
| 137 | _set_up_invis_wall(75.5, 11, -24.5, 1, 10, 49) | ||
| 138 | _set_up_invis_wall(51.5, 11, -17, 16, 10, 1) | ||
| 139 | _set_up_invis_wall(46, 10, -9.5, 1, 10, 10) | ||
| 140 | _set_up_invis_wall(67.5, 11, 17, 16, 10, 1) | ||
| 141 | _set_up_invis_wall(50.5, 11, 14, 10, 10, 1) | ||
| 142 | _set_up_invis_wall(39, 10, 18.5, 1, 10, 22) | ||
| 143 | _set_up_invis_wall(20, 15, 18.5, 1, 10, 16) | ||
| 144 | _set_up_invis_wall(11.5, 15, 3, 32, 10, 1) | ||
| 145 | _set_up_invis_wall(11.5, 16, -20, 14, 20, 1) | ||
| 146 | _set_up_invis_wall(14, 16, -26.5, 1, 20, 4) | ||
| 147 | _set_up_invis_wall(28.5, 20.5, -26.5, 1, 15, 25) | ||
| 148 | _set_up_invis_wall(40.5, 20.5, -11, 30, 15, 1) | ||
| 149 | _set_up_invis_wall(50.5, 15, 5.5, 7, 10, 1) | ||
| 150 | _set_up_invis_wall(83.5, 33.5, 5.5, 1, 7, 11) | ||
| 151 | _set_up_invis_wall(83.5, 33.5, -5.5, 1, 7, 11) | ||
| 152 | |||
| 153 | var warp_exit_prefab = preload("res://objects/nodes/exit.tscn") | ||
| 154 | var warp_exit = warp_exit_prefab.instantiate() | ||
| 155 | warp_exit.name = "roof_access_blocker_warp_exit" | ||
| 156 | warp_exit.position = Vector3(58, 10, 0) | ||
| 157 | warp_exit.rotation_degrees.y = 90 | ||
| 158 | get_parent().add_child.call_deferred(warp_exit) | ||
| 159 | |||
| 160 | var warp_enter_prefab = preload("res://objects/nodes/teleportAuto.tscn") | ||
| 161 | var warp_enter = warp_enter_prefab.instantiate() | ||
| 162 | warp_enter.target = warp_exit | ||
| 163 | warp_enter.position = Vector3(76.5, 30, 1) | ||
| 164 | warp_enter.scale = Vector3(4, 1.5, 1) | ||
| 165 | warp_enter.rotation_degrees.y = 90 | ||
| 166 | get_parent().add_child.call_deferred(warp_enter) | ||
| 133 | 167 | ||
| 134 | if global.map == "the_entry": | 168 | if global.map == "the_entry": |
| 135 | # Remove door behind X1. | 169 | # Remove door behind X1. |
| @@ -586,6 +620,12 @@ func _ready(): | |||
| 586 | saver.senderGroup.append(NodePath("/root/scene/Components/Collectables")) | 620 | saver.senderGroup.append(NodePath("/root/scene/Components/Collectables")) |
| 587 | get_node("/root/scene").add_child.call_deferred(saver) | 621 | get_node("/root/scene").add_child.call_deferred(saver) |
| 588 | 622 | ||
| 623 | # Shrink the painting trigger in The Unyielding. | ||
| 624 | if global.map == "the_unyielding": | ||
| 625 | var trigger_area = get_node("/root/scene/Components/PaintingUnlocker/triggerArea") | ||
| 626 | trigger_area.position = Vector3(0, 0, -6) | ||
| 627 | trigger_area.scale = Vector3(6, 1, 6) | ||
| 628 | |||
| 589 | ap.update_job_well_done_sign() | 629 | ap.update_job_well_done_sign() |
| 590 | 630 | ||
| 591 | # Set up door locations. | 631 | # Set up door locations. |
| @@ -598,9 +638,12 @@ func _ready(): | |||
| 598 | continue | 638 | continue |
| 599 | 639 | ||
| 600 | if ( | 640 | if ( |
| 601 | door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY | 641 | not (door.has_legacy_location() and door.get_legacy_location()) |
| 602 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING | 642 | and ( |
| 603 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR | 643 | door.get_type() == gamedata.SCRIPT_proto.DoorType.ITEM_ONLY |
| 644 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.GALLERY_PAINTING | ||
| 645 | or door.get_type() == gamedata.SCRIPT_proto.DoorType.CONTROL_CENTER_COLOR | ||
| 646 | ) | ||
| 604 | ): | 647 | ): |
| 605 | continue | 648 | continue |
| 606 | 649 | ||
