about summary refs log tree commit diff stats
path: root/apworld
diff options
context:
space:
mode:
Diffstat (limited to 'apworld')
-rw-r--r--apworld/client/manager.gd2
-rw-r--r--apworld/client/player.gd115
-rw-r--r--apworld/options.py15
-rw-r--r--apworld/player_logic.py4
4 files changed, 130 insertions, 6 deletions
diff --git a/apworld/client/manager.gd b/apworld/client/manager.gd index 91797b2..41ab648 100644 --- a/apworld/client/manager.gd +++ b/apworld/client/manager.gd
@@ -64,6 +64,7 @@ var apworld_version = [0, 0, 0]
64var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2 64var cyan_door_behavior = kCYAN_DOOR_BEHAVIOR_H2
65var daedalus_roof_access = false 65var daedalus_roof_access = false
66var enable_gift_maps = [] 66var enable_gift_maps = []
67var enable_icarus = false
67var keyholder_sanity = false 68var keyholder_sanity = false
68var port_pairings = {} 69var port_pairings = {}
69var shuffle_control_center_colors = false 70var shuffle_control_center_colors = false
@@ -441,6 +442,7 @@ func _client_connected(slot_data):
441 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0)) 442 cyan_door_behavior = int(slot_data.get("cyan_door_behavior", 0))
442 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false)) 443 daedalus_roof_access = bool(slot_data.get("daedalus_roof_access", false))
443 enable_gift_maps = slot_data.get("enable_gift_maps", []) 444 enable_gift_maps = slot_data.get("enable_gift_maps", [])
445 enable_icarus = bool(slot_data.get("enable_icarus", false))
444 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false)) 446 keyholder_sanity = bool(slot_data.get("keyholder_sanity", false))
445 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false)) 447 shuffle_control_center_colors = bool(slot_data.get("shuffle_control_center_colors", false))
446 shuffle_doors = bool(slot_data.get("shuffle_doors", false)) 448 shuffle_doors = bool(slot_data.get("shuffle_doors", false))
diff --git a/apworld/client/player.gd b/apworld/client/player.gd index 43bf758..8aee21a 100644 --- a/apworld/client/player.gd +++ b/apworld/client/player.gd
@@ -78,6 +78,7 @@ func _ready():
78 # Add the gift map entry panel if needed. 78 # Add the gift map entry panel if needed.
79 if not ap.enable_gift_maps.is_empty(): 79 if not ap.enable_gift_maps.is_empty():
80 var panel_prefab = preload("res://objects/nodes/panel.tscn") 80 var panel_prefab = preload("res://objects/nodes/panel.tscn")
81 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
81 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn") 82 var wpl_prefab = preload("res://objects/nodes/listeners/worldportListener.tscn")
82 83
83 var giftmap_parent = Node.new() 84 var giftmap_parent = Node.new()
@@ -93,7 +94,7 @@ func _ready():
93 94
94 var giftmap_panel = panel_prefab.instantiate() 95 var giftmap_panel = panel_prefab.instantiate()
95 giftmap_panel.name = "Panel" 96 giftmap_panel.name = "Panel"
96 giftmap_panel.position = Vector3(33.5, 1, 5.5) 97 giftmap_panel.position = Vector3(33.5, -190, 5.5)
97 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0) 98 giftmap_panel.rotation_degrees = Vector3(-45, 0, 0)
98 giftmap_panel.clue = "player" 99 giftmap_panel.clue = "player"
99 giftmap_panel.answer = symbolless_player 100 giftmap_panel.answer = symbolless_player
@@ -112,8 +113,46 @@ func _ready():
112 icely_wpl.senders.append(NodePath("../IcelyPanel")) 113 icely_wpl.senders.append(NodePath("../IcelyPanel"))
113 giftmap_parent.add_child.call_deferred(icely_wpl) 114 giftmap_parent.add_child.call_deferred(icely_wpl)
114 115
116 if ap.enable_gift_maps.has("The Charismatic"):
117 var souvey_panel = panel_prefab.instantiate()
118 souvey_panel.name = "SouveyPanel"
119 souvey_panel.answer = "souvey"
120 souvey_panel.position = Vector3(33.5, -210, 5.5)
121 giftmap_panel.proxies.append(NodePath("../SouveyPanel"))
122 giftmap_parent.add_child.call_deferred(souvey_panel)
123
124 var souvey_wpl = wpl_prefab.instantiate()
125 souvey_wpl.name = "SouveyWpl"
126 souvey_wpl.exit = "the_charismatic"
127 souvey_wpl.senders.append(NodePath("../SouveyPanel"))
128 giftmap_parent.add_child.call_deferred(souvey_wpl)
129
130 if ap.enable_gift_maps.has("The Crystalline"):
131 var q_panel = panel_prefab.instantiate()
132 q_panel.name = "QPanel"
133 q_panel.answer = "q"
134 q_panel.position = Vector3(33.5, -220, 5.5)
135 giftmap_panel.proxies.append(NodePath("../QPanel"))
136 giftmap_parent.add_child.call_deferred(q_panel)
137
138 var q_wpl = wpl_prefab.instantiate()
139 q_wpl.name = "QWpl"
140 q_wpl.exit = "the_crystalline"
141 q_wpl.senders.append(NodePath("../QPanel"))
142 giftmap_parent.add_child.call_deferred(q_wpl)
143
115 giftmap_parent.add_child.call_deferred(giftmap_panel) 144 giftmap_parent.add_child.call_deferred(giftmap_panel)
116 145
146 var giftmap_tpl = tpl_prefab.instantiate()
147 giftmap_tpl.name = "PanelTeleporter"
148 giftmap_tpl.teleport_point = Vector3(33.5, 1, 5.5)
149 giftmap_tpl.teleport_rotate = Vector3(-45, 0, 0)
150 giftmap_tpl.target_path = giftmap_panel
151 giftmap_tpl.senders.append(
152 NodePath("/root/scene/Components/Listeners/unlockReaderListenerDoubles")
153 )
154 giftmap_parent.add_child.call_deferred(giftmap_tpl)
155
117 # Add the strict purple ending validation. 156 # Add the strict purple ending validation.
118 if global.map == "the_sun_temple" and ap.strict_purple_ending: 157 if global.map == "the_sun_temple" and ap.strict_purple_ending:
119 var panel_prefab = preload("res://objects/nodes/panel.tscn") 158 var panel_prefab = preload("res://objects/nodes/panel.tscn")
@@ -222,6 +261,34 @@ func _ready():
222 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea") 261 var rte_trigger = get_node("/root/scene/Components/Warps/triggerArea")
223 rte_trigger.position.z = 0 262 rte_trigger.position.z = 0
224 263
264 # Add the mastery to Icarus.
265 if global.map == "icarus" and ap.enable_icarus:
266 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
267 var saver_prefab = preload("res://objects/nodes/saver.tscn")
268 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
269
270 var mastery = collectable_prefab.instantiate()
271 mastery.name = "collectable"
272 mastery.position = Vector3(0, -2000, 0)
273 mastery.unlock_type = "smiley"
274 mastery.material_override = load("res://assets/materials/gold.material")
275 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
276
277 var tpl = tpl_prefab.instantiate()
278 tpl.teleport_point = Vector3(56.25, 0, -5.5)
279 tpl.teleport_rotate = Vector3(0, 0, 0)
280 tpl.target_path = mastery
281 tpl.name = "Teleport"
282 tpl.senderGroup.append(NodePath("/root/scene/Panels"))
283 tpl.nested = true
284 mastery.add_child.call_deferred(tpl)
285
286 var saver = saver_prefab.instantiate()
287 saver.name = "saver_collectables"
288 saver.type = "collectables"
289 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
290 get_node("/root/scene").add_child.call_deferred(saver)
291
225 # Add the mastery to The Advanced. 292 # Add the mastery to The Advanced.
226 if global.map == "the_advanced": 293 if global.map == "the_advanced":
227 var collectable_prefab = preload("res://objects/nodes/collectable.tscn") 294 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
@@ -251,6 +318,52 @@ func _ready():
251 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables")) 318 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
252 get_node("/root/scene").add_child.call_deferred(saver) 319 get_node("/root/scene").add_child.call_deferred(saver)
253 320
321 # Add the mastery to The Charismatic.
322 if global.map == "the_charismatic":
323 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
324 var saver_prefab = preload("res://objects/nodes/saver.tscn")
325
326 var mastery = collectable_prefab.instantiate()
327 mastery.name = "collectable"
328 mastery.position = Vector3(-17, 2, -29)
329 mastery.rotation_degrees = Vector3(0, 45, 0)
330 mastery.unlock_type = "smiley"
331 mastery.material_override = load("res://assets/materials/gold.material")
332 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
333
334 var saver = saver_prefab.instantiate()
335 saver.name = "saver_collectables"
336 saver.type = "collectables"
337 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
338 get_node("/root/scene").add_child.call_deferred(saver)
339
340 # Add the mastery to The Crystalline.
341 if global.map == "the_crystalline":
342 var collectable_prefab = preload("res://objects/nodes/collectable.tscn")
343 var saver_prefab = preload("res://objects/nodes/saver.tscn")
344 var tpl_prefab = preload("res://objects/nodes/listeners/teleportListener.tscn")
345
346 var mastery = collectable_prefab.instantiate()
347 mastery.name = "collectable"
348 mastery.position = Vector3(0, 13, 37)
349 mastery.unlock_type = "smiley"
350 mastery.material_override = load("res://assets/materials/gold.material")
351 get_node("/root/scene/Components/Collectables").add_child.call_deferred(mastery)
352
353 var tpl = tpl_prefab.instantiate()
354 tpl.teleport_point = Vector3(0, 11.5, -20)
355 tpl.teleport_rotate = Vector3(0, 0, 180)
356 tpl.target_path = mastery
357 tpl.name = "Teleport"
358 tpl.senders.append(NodePath("/root/scene/Panels/Room_1/panel_3"))
359 mastery.add_child.call_deferred(tpl)
360
361 var saver = saver_prefab.instantiate()
362 saver.name = "saver_collectables"
363 saver.type = "collectables"
364 saver.senderGroup.append(NodePath("/root/scene/Components/Collectables"))
365 get_node("/root/scene").add_child.call_deferred(saver)
366
254 ap.update_job_well_done_sign() 367 ap.update_job_well_done_sign()
255 368
256 # Set up door locations. 369 # Set up door locations.
diff --git a/apworld/options.py b/apworld/options.py index 4d9c3aa..7577e0c 100644 --- a/apworld/options.py +++ b/apworld/options.py
@@ -102,15 +102,20 @@ class EnableIcarus(Toggle):
102class EnableGiftMaps(OptionSet): 102class EnableGiftMaps(OptionSet):
103 """ 103 """
104 Controls whether the beta tester gift maps are randomized. By default, these are not accessible at all from within 104 Controls whether the beta tester gift maps are randomized. By default, these are not accessible at all from within
105 the randomizer. Enabling at least one gift map will cause a panel to appear in The Entry's Starting Room. Gift maps 105 the randomizer. This option allows you to enter the maps, and creates items and locations for them. If worldport
106 can be accessed by taking a player name that would ordinarily cause the game to load into a gift map, and entering 106 shuffle is on, their worldports will be included in the randomization.
107 it into this panel. 107
108 The gift maps are accessed via a panel in The Entry's Starting Room, which only appears if at least one gift map is
109 enabled. It is also treated like a cyan door, and will not appear until the condition specified in the Cyan Door
110 Behavior option is satisfied. Solving this panel with the name of one of the beta testers will teleport you to their
111 corresponding gift map.
108 112
109 In the base game, nothing happens once you complete a gift map. Masteries have been added to the gift maps in the 113 In the base game, nothing happens once you complete a gift map. Masteries have been added to the gift maps in the
110 randomizer so that the player can be rewarded for completing them. 114 randomizer so that the player can be rewarded for completing them.
111 115
112 Note that the gift maps are intended only for specific people, and as a result may be frustrating or require 116 Note that the gift maps were originally only intended to be played by specific people, and as a result may be
113 knowledge of inside jokes. The Crystalline is particularly difficult as it requires completing a parkour course. 117 frustrating or require knowledge of inside jokes. The Crystalline is particularly difficult as it requires
118 completing a parkour course.
114 """ 119 """
115 display_name = "Enable Gift Maps" 120 display_name = "Enable Gift Maps"
116 valid_keys = ["The Advanced", "The Charismatic", "The Crystalline", "The Fuzzy", "The Stellar"] 121 valid_keys = ["The Advanced", "The Charismatic", "The Crystalline", "The Fuzzy", "The Stellar"]
diff --git a/apworld/player_logic.py b/apworld/player_logic.py index 4f825b9..5f4f1d7 100644 --- a/apworld/player_logic.py +++ b/apworld/player_logic.py
@@ -237,6 +237,10 @@ class Lingo2PlayerLogic:
237 elif game_map.type == data_pb2.MapType.GIFT_MAP: 237 elif game_map.type == data_pb2.MapType.GIFT_MAP:
238 if game_map.name == "the_advanced": 238 if game_map.name == "the_advanced":
239 return "The Advanced" in world.options.enable_gift_maps.value 239 return "The Advanced" in world.options.enable_gift_maps.value
240 elif game_map.name == "the_charismatic":
241 return "The Charismatic" in world.options.enable_gift_maps.value
242 elif game_map.name == "the_crystalline":
243 return "The Crystalline" in world.options.enable_gift_maps.value
240 244
241 return False 245 return False
242 246