about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Archipelago/client.gd46
-rw-r--r--Archipelago/load.gd87
-rw-r--r--Archipelago/mypainting.gd5
-rw-r--r--Archipelago/painting.gd10
-rw-r--r--Archipelago/painting_eye.gd16
-rw-r--r--Archipelago/painting_scenery.gd10
-rw-r--r--Archipelago/panel.gd4
-rw-r--r--Archipelago/pilgrimage_terminator.gd11
-rw-r--r--Archipelago/settings_screen.gd5
-rw-r--r--Archipelago/teleport.gd27
-rw-r--r--util/generate_gamedata.rb52
11 files changed, 266 insertions, 7 deletions
diff --git a/Archipelago/client.gd b/Archipelago/client.gd index 3541016..b3668d7 100644 --- a/Archipelago/client.gd +++ b/Archipelago/client.gd
@@ -7,6 +7,7 @@ var SCRIPT_multiplayer
7var SCRIPT_mypainting 7var SCRIPT_mypainting
8var SCRIPT_notifier 8var SCRIPT_notifier
9var SCRIPT_panel 9var SCRIPT_panel
10var SCRIPT_pilgrimage_terminator
10var SCRIPT_uuid 11var SCRIPT_uuid
11 12
12var ap_server = "" 13var ap_server = ""
@@ -40,7 +41,7 @@ const progressive_items = {
40 ], 41 ],
41 "Progressive Hallway Room": 42 "Progressive Hallway Room":
42 [ 43 [
43 {"item": "Outside The Agreeable - Hallway Door", "display": "First Door"}, 44 {"item": "Hallway Room (1) - Exit", "display": "First Door"},
44 {"item": "Hallway Room (2) - Exit", "display": "Second Door"}, 45 {"item": "Hallway Room (2) - Exit", "display": "Second Door"},
45 {"item": "Hallway Room (3) - Exit", "display": "Third Door"}, 46 {"item": "Hallway Room (3) - Exit", "display": "Third Door"},
46 {"item": "Hallway Room (4) - Exit", "display": "Fourth Door"}, 47 {"item": "Hallway Room (4) - Exit", "display": "Fourth Door"},
@@ -62,12 +63,22 @@ const progressive_items = {
62 {"item": "The Colorful - Green Door", "display": "Green"}, 63 {"item": "The Colorful - Green Door", "display": "Green"},
63 {"item": "The Colorful - Brown Door", "display": "Brown"}, 64 {"item": "The Colorful - Brown Door", "display": "Brown"},
64 {"item": "The Colorful - Gray Door", "display": "Gray"}, 65 {"item": "The Colorful - Gray Door", "display": "Gray"},
66 ],
67 "Progressive Pilgrimage":
68 [
69 {"item": "1 Sunwarp", "display": "1 Sunwarp"},
70 {"item": "2 Sunwarp", "display": "2 Sunwarp"},
71 {"item": "3 Sunwarp", "display": "3 Sunwarp"},
72 {"item": "4 Sunwarp", "display": "4 Sunwarp"},
73 {"item": "5 Sunwarp", "display": "5 Sunwarp"},
74 {"item": "6 Sunwarp", "display": "6 Sunwarp"},
65 ] 75 ]
66} 76}
67 77
68const kTHE_END = 0 78const kTHE_END = 0
69const kTHE_MASTER = 1 79const kTHE_MASTER = 1
70const kLEVEL_2 = 2 80const kLEVEL_2 = 2
81const kPILGRIMAGE = 3
71 82
72const kNO_PANEL_SHUFFLE = 0 83const kNO_PANEL_SHUFFLE = 0
73const kREARRANGE_PANELS = 1 84const kREARRANGE_PANELS = 1
@@ -80,6 +91,12 @@ const kCLASSIFICATION_REMOTE_NORMAL = 0
80const kCLASSIFICATION_REMOTE_REDUCED = 1 91const kCLASSIFICATION_REMOTE_REDUCED = 1
81const kCLASSIFICATION_REMOTE_INSANITY = 2 92const kCLASSIFICATION_REMOTE_INSANITY = 2
82 93
94const kSUNWARP_ACCESS_NORMAL = 0
95const kSUNWARP_ACCESS_DISABLED = 1
96const kSUNWARP_ACCESS_UNLOCK = 2
97const kSUNWARP_ACCESS_INDIVIDUAL = 3
98const kSUNWARP_ACCESS_PROGRESSIVE = 4
99
83var _client = WebSocketClient.new() 100var _client = WebSocketClient.new()
84var _should_process = false 101var _should_process = false
85var _initiated_disconnect = false 102var _initiated_disconnect = false
@@ -111,10 +128,16 @@ var _door_shuffle = false
111var _color_shuffle = false 128var _color_shuffle = false
112var _panel_shuffle = 0 # none, rearrange 129var _panel_shuffle = 0 # none, rearrange
113var _painting_shuffle = false 130var _painting_shuffle = false
131var _sunwarp_access = 0 # normal, disabled, unlock, progressive
114var _mastery_achievements = 21 132var _mastery_achievements = 21
115var _level_2_requirement = 223 133var _level_2_requirement = 223
116var _location_classification_bit = 0 134var _location_classification_bit = 0
117var _early_color_hallways = false 135var _early_color_hallways = false
136var _pilgrimage_enabled = false
137var _pilgrimage_allows_roof_access = false
138var _pilgrimage_allows_paintings = false
139var _sunwarp_shuffle = false
140var _sunwarp_mapping = []
118var _slot_seed = 0 141var _slot_seed = 0
119 142
120var _map_loaded = false 143var _map_loaded = false
@@ -276,6 +299,8 @@ func _on_data():
276 _painting_shuffle = _slot_data["shuffle_paintings"] 299 _painting_shuffle = _slot_data["shuffle_paintings"]
277 if _slot_data.has("shuffle_panels"): 300 if _slot_data.has("shuffle_panels"):
278 _panel_shuffle = _slot_data["shuffle_panels"] 301 _panel_shuffle = _slot_data["shuffle_panels"]
302 if _slot_data.has("sunwarp_access"):
303 _sunwarp_access = _slot_data["sunwarp_access"]
279 if _slot_data.has("seed"): 304 if _slot_data.has("seed"):
280 _slot_seed = _slot_data["seed"] 305 _slot_seed = _slot_data["seed"]
281 if _slot_data.has("painting_entrance_to_exit"): 306 if _slot_data.has("painting_entrance_to_exit"):
@@ -293,6 +318,16 @@ func _on_data():
293 _location_classification_bit = kCLASSIFICATION_LOCAL_INSANITY 318 _location_classification_bit = kCLASSIFICATION_LOCAL_INSANITY
294 if _slot_data.has("early_color_hallways"): 319 if _slot_data.has("early_color_hallways"):
295 _early_color_hallways = _slot_data["early_color_hallways"] 320 _early_color_hallways = _slot_data["early_color_hallways"]
321 if _slot_data.has("enable_pilgrimage"):
322 _pilgrimage_enabled = _slot_data["enable_pilgrimage"]
323 if _slot_data.has("pilgrimage_allows_roof_access"):
324 _pilgrimage_allows_roof_access = _slot_data["pilgrimage_allows_roof_access"]
325 if _slot_data.has("pilgrimage_allows_paintings"):
326 _pilgrimage_allows_paintings = _slot_data["pilgrimage_allows_paintings"]
327 if _slot_data.has("shuffle_sunwarps"):
328 _sunwarp_shuffle = _slot_data["shuffle_sunwarps"]
329 if _slot_data.has("sunwarp_permutation"):
330 _sunwarp_mapping = _slot_data["sunwarp_permutation"]
296 331
297 _puzzle_skips = 0 332 _puzzle_skips = 0
298 333
@@ -633,6 +668,11 @@ func processItem(item, index, from, flags):
633 if painting_node != null: 668 if painting_node != null:
634 painting_node.get_node("Script").movePainting() 669 painting_node.get_node("Script").movePainting()
635 670
671 if gamedata.warp_ids_by_item_id.has(int(item)):
672 var warpsNode = get_tree().get_root().get_node("Spatial/Warps")
673 for warp_id in gamedata.warp_ids_by_item_id[int(item)]:
674 warpsNode.get_node(warp_id).unlock_warp()
675
636 # Handle progressive items. 676 # Handle progressive items.
637 if item_name in progressive_items.keys(): 677 if item_name in progressive_items.keys():
638 if not item_name in _progressive_progress: 678 if not item_name in _progressive_progress:
@@ -693,6 +733,10 @@ func paintingIsVanilla(painting):
693 return !$Gamedata.mentioned_paintings.has(painting) 733 return !$Gamedata.mentioned_paintings.has(painting)
694 734
695 735
736func warpIsVanilla(warp):
737 return !$Gamedata.mentioned_warps.has(warp)
738
739
696func evaluateSolvability(): 740func evaluateSolvability():
697 emit_signal("evaluate_solvability") 741 emit_signal("evaluate_solvability")
698 742
diff --git a/Archipelago/load.gd b/Archipelago/load.gd index 2d5f7c6..0750247 100644 --- a/Archipelago/load.gd +++ b/Archipelago/load.gd
@@ -334,6 +334,8 @@ func _load():
334 victory_condition = "the master" 334 victory_condition = "the master"
335 elif apclient._victory_condition == apclient.kLEVEL_2: 335 elif apclient._victory_condition == apclient.kLEVEL_2:
336 victory_condition = "level 2" 336 victory_condition = "level 2"
337 elif apclient._victory_condition == apclient.kPILGRIMAGE:
338 victory_condition = "pilgrimage"
337 339
338 set_static_panel("Entry Room/Panel_this_this", victory_condition) 340 set_static_panel("Entry Room/Panel_this_this", victory_condition)
339 set_static_panel("Entry Room/Panel_hidden_hidden", "hewwo") 341 set_static_panel("Entry Room/Panel_hidden_hidden", "hewwo")
@@ -538,11 +540,84 @@ func _load():
538 level_2.get_node("Viewport/GUI/Panel/TextEdit").connect( 540 level_2.get_node("Viewport/GUI/Panel/TextEdit").connect(
539 "answer_correct", apclient, "completedGoal" 541 "answer_correct", apclient, "completedGoal"
540 ) 542 )
543 elif apclient._victory_condition == apclient.kPILGRIMAGE:
544 var pilgrim_panel = self.get_node("Panels/Lingo Room/Panel_pilgrim")
545 pilgrim_panel.get_node("Viewport/GUI/Panel/TextEdit").connect(
546 "answer_correct", apclient, "completedGoal"
547 )
541 else: 548 else:
542 var the_end = self.get_node("Decorations/EndPanel/Panel_end_end") 549 var the_end = self.get_node("Decorations/EndPanel/Panel_end_end")
543 the_end.get_node("Viewport/GUI/Panel/TextEdit").connect( 550 the_end.get_node("Viewport/GUI/Panel/TextEdit").connect(
544 "answer_correct", apclient, "completedGoal" 551 "answer_correct", apclient, "completedGoal"
545 ) 552 )
553
554 # If pilgrimage does not allow roof access, add a node on the Crossroads
555 # Roof Access stairs that disables it.
556 if !apclient._pilgrimage_allows_roof_access:
557 var terminator = apclient.SCRIPT_pilgrimage_terminator.new()
558 terminator.name = "RoofAccessPilgrimageTerminator"
559 terminator.translation.x = -36
560 terminator.translation.y = 3
561 terminator.translation.z = -35
562
563 var terminator_shape = CollisionShape.new()
564 terminator_shape.shape = BoxShape.new()
565 terminator_shape.shape.extents.x = 0.1
566
567 terminator.add_child(terminator_shape)
568 get_node("Decorations").add_child(terminator)
569
570 if apclient._sunwarp_shuffle:
571 # Sunwarps 1 and 6 are rotated differently from the rest, so we have to fix that.
572 get_node("Decorations/Teleporter Windows/localmap").rotation_degrees.y = 0
573 get_node("Decorations/Teleporter Windows/localmap2").rotation_degrees.y = 0
574 get_node("Decorations/Teleporter Windows/localmap11").rotation_degrees.y = 0
575 get_node("Decorations/Teleporter Windows/localmap12").rotation_degrees.y = 0
576 get_node("Decorations/Teleporter Windows/localmap13").rotation_degrees.y = -90
577
578 get_node("Warps/Teleporter Warps/Sunwarp_enter_1").translation.x = 19.5
579 get_node("Warps/Teleporter Warps/Sunwarp_exit_1").translation.x = -15.5
580 get_node("Warps/Teleporter Warps/Sunwarp_enter_6").translation.x = 4.5
581 get_node("Warps/Teleporter Warps/Sunwarp_exit_6").translation.x = -37.5
582 get_node("Warps/Teleporter Warps/Sunwarp_exit_7").translation.z = 23.5
583
584 # Change the sunwarps in accordance with the mapping.
585 var sw_orig_translations = []
586 var sw_text_translations = []
587 var sw_text_rotations = []
588 for i in range(1,7):
589 sw_orig_translations.append(get_node("Warps/Teleporter Warps/Sunwarp_enter_%d" % i).translation)
590 sw_text_translations.append(get_node("Decorations/Signs/Sunwarp Numbers/enter_%d" % i).translation)
591 sw_text_rotations.append(get_node("Decorations/Signs/Sunwarp Numbers/enter_%d" % i).rotation_degrees)
592 for i in range(1,7):
593 sw_orig_translations.append(get_node("Warps/Teleporter Warps/Sunwarp_exit_%d" % i).translation)
594 sw_text_translations.append(get_node("Decorations/Signs/Sunwarp Numbers/exit_%d" % i).translation)
595 sw_text_rotations.append(get_node("Decorations/Signs/Sunwarp Numbers/exit_%d" % i).rotation_degrees)
596
597 var sw_enter_indicators = [4, 5, 6, 12, 7, 10]
598 for i in range(1,7):
599 get_node("Warps/Teleporter Warps/Sunwarp_enter_%d" % i).translation = sw_orig_translations[apclient._sunwarp_mapping[i-1]]
600 get_node("Warps/Teleporter Warps/Sunwarp_exit_%d" % i).translation = sw_orig_translations[apclient._sunwarp_mapping[i+5]]
601
602 get_node("Decorations/Signs/Sunwarp Numbers/enter_%d" % i).translation = sw_text_translations[apclient._sunwarp_mapping[i-1]]
603 get_node("Decorations/Signs/Sunwarp Numbers/enter_%d" % i).rotation_degrees = sw_text_rotations[apclient._sunwarp_mapping[i-1]]
604
605 get_node("Decorations/Signs/Sunwarp Numbers/exit_%d" % i).translation = sw_text_translations[apclient._sunwarp_mapping[i+5]]
606 get_node("Decorations/Signs/Sunwarp Numbers/exit_%d" % i).rotation_degrees = sw_text_rotations[apclient._sunwarp_mapping[i+5]]
607
608 var enter_rot = _dir_to_int(gamedata.sunwarps[apclient._sunwarp_mapping[i-1]]["orientation"]) * 90
609 var exit_rot = _dir_to_int(gamedata.sunwarps[apclient._sunwarp_mapping[i+5]]["orientation"]) * 90
610 var final_rot = enter_rot - exit_rot
611 if final_rot < 0:
612 final_rot += 360
613 get_node("Warps/Teleporter Warps/Sunwarp_enter_%d" % i).rotate = str(final_rot)
614
615 var sw_enter_indicator_pos = gamedata.sunwarps[apclient._sunwarp_mapping[i-1]]["entrance_indicator_pos"]
616 var sw_enter_indicator = get_node("Decorations/Signs/Welcome Back Signs/Sign%d" % sw_enter_indicators[i-1])
617 sw_enter_indicator.translation.x = sw_enter_indicator_pos[0]
618 sw_enter_indicator.translation.y = sw_enter_indicator_pos[1]
619 sw_enter_indicator.translation.z = sw_enter_indicator_pos[2]
620 sw_enter_indicator.rotation_degrees.y = (enter_rot * -1) + 180
546 621
547 # Create the effects node. 622 # Create the effects node.
548 var effects_script = apclient.SCRIPT_effects 623 var effects_script = apclient.SCRIPT_effects
@@ -643,3 +718,15 @@ func set_small_gridmap_tile(x, y, z, tile):
643 718
644func archipelago_disconnected(reason): 719func archipelago_disconnected(reason):
645 messages.showMessage(reason) 720 messages.showMessage(reason)
721
722
723func _dir_to_int(dir):
724 if dir == "north":
725 return 0
726 elif dir == "west":
727 return 1
728 elif dir == "south":
729 return 2
730 elif dir == "east":
731 return 3
732 return 4
diff --git a/Archipelago/mypainting.gd b/Archipelago/mypainting.gd index 5e9c703..999b122 100644 --- a/Archipelago/mypainting.gd +++ b/Archipelago/mypainting.gd
@@ -86,6 +86,11 @@ func _looked_at(body, painting):
86 body.rotate_y(3 * PI / 2) 86 body.rotate_y(3 * PI / 2)
87 body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2) 87 body.velocity = body.velocity.rotated(Vector3(0, 1, 0), 3 * PI / 2)
88 88
89 var apclient = global.get_node("Archipelago")
90 if !apclient._pilgrimage_allows_paintings:
91 global.sunwarp = 1
92 body.get_node("pivot/camera/sunwarp_background").visible = false
93
89 94
90func _dir_to_int(dir): 95func _dir_to_int(dir):
91 if dir == "north": 96 if dir == "north":
diff --git a/Archipelago/painting.gd b/Archipelago/painting.gd new file mode 100644 index 0000000..adc8337 --- /dev/null +++ b/Archipelago/painting.gd
@@ -0,0 +1,10 @@
1extends "res://scripts/painting.gd"
2
3func _looked_at(var body, var painting):
4 ._looked_at(body, painting)
5
6 if body.is_in_group("player") && (painting.get_name() == self.get_name()):
7 var apclient = global.get_node("Archipelago")
8 if !apclient._pilgrimage_allows_paintings:
9 global.sunwarp = 1
10 body.get_node("pivot/camera/sunwarp_background").visible = false
diff --git a/Archipelago/painting_eye.gd b/Archipelago/painting_eye.gd index 53d42b5..c6994b1 100644 --- a/Archipelago/painting_eye.gd +++ b/Archipelago/painting_eye.gd
@@ -3,9 +3,23 @@ extends "res://scripts/painting_eye.gd"
3 3
4func _answer_correct(): 4func _answer_correct():
5 var apclient = global.get_node("Archipelago") 5 var apclient = global.get_node("Archipelago")
6 if not apclient._door_shuffle or apclient.paintingIsVanilla(self.name): 6 if get_name() == "pilgrim_painting2":
7 # When pilgrimage is enabled, the HOT CRUST panel should actually move the sun painting.
8 if apclient._pilgrimage_enabled:
9 movePainting()
10 elif not apclient._door_shuffle or apclient.paintingIsVanilla(self.name):
7 ._answer_correct() 11 ._answer_correct()
8 12
9 13
10func movePainting(): 14func movePainting():
11 ._answer_correct() 15 ._answer_correct()
16
17
18func _looked_at(var body, var painting):
19 ._looked_at(body, painting)
20
21 if body.is_in_group("player") && (painting.get_name() == self.get_name()):
22 var apclient = global.get_node("Archipelago")
23 if !apclient._pilgrimage_allows_paintings:
24 global.sunwarp = 1
25 body.get_node("pivot/camera/sunwarp_background").visible = false
diff --git a/Archipelago/painting_scenery.gd b/Archipelago/painting_scenery.gd index f49d602..1186e2f 100644 --- a/Archipelago/painting_scenery.gd +++ b/Archipelago/painting_scenery.gd
@@ -9,3 +9,13 @@ func _answer_correct():
9 9
10func movePainting(): 10func movePainting():
11 ._answer_correct() 11 ._answer_correct()
12
13
14func _looked_at(var body, var painting):
15 ._looked_at(body, painting)
16
17 if body.is_in_group("player") && (painting.get_name() == self.get_name()):
18 var apclient = global.get_node("Archipelago")
19 if !apclient._pilgrimage_allows_paintings:
20 global.sunwarp = 1
21 body.get_node("pivot/camera/sunwarp_background").visible = false
diff --git a/Archipelago/panel.gd b/Archipelago/panel.gd index da5b572..ce5a642 100644 --- a/Archipelago/panel.gd +++ b/Archipelago/panel.gd
@@ -22,10 +22,6 @@ func _ready():
22 else: 22 else:
23 atbash_text += old_char 23 atbash_text += old_char
24 24
25 self.get_parent().get_node("Viewport/GUI/Panel/TextEdit").connect(
26 "answer_correct", self, "answer_correct"
27 )
28
29 25
30func answer_correct(): 26func answer_correct():
31 var effects = get_tree().get_root().get_node("Spatial/AP_Effects") 27 var effects = get_tree().get_root().get_node("Spatial/AP_Effects")
diff --git a/Archipelago/pilgrimage_terminator.gd b/Archipelago/pilgrimage_terminator.gd new file mode 100644 index 0000000..29db2ee --- /dev/null +++ b/Archipelago/pilgrimage_terminator.gd
@@ -0,0 +1,11 @@
1extends Area
2
3
4func _ready():
5 var _connected = self.connect("body_entered", self, "_body_entered")
6
7
8func _body_entered(body):
9 if body.is_in_group("player"):
10 global.sunwarp = 1
11 body.get_node("pivot/camera/sunwarp_background").visible = false
diff --git a/Archipelago/settings_screen.gd b/Archipelago/settings_screen.gd index 2cabe09..1a1f5cc 100644 --- a/Archipelago/settings_screen.gd +++ b/Archipelago/settings_screen.gd
@@ -24,6 +24,9 @@ func _ready():
24 apclient_instance.SCRIPT_mypainting = load("user://maps/Archipelago/mypainting.gd") 24 apclient_instance.SCRIPT_mypainting = load("user://maps/Archipelago/mypainting.gd")
25 apclient_instance.SCRIPT_notifier = load("user://maps/Archipelago/notifier.gd") 25 apclient_instance.SCRIPT_notifier = load("user://maps/Archipelago/notifier.gd")
26 apclient_instance.SCRIPT_panel = load("user://maps/Archipelago/panel.gd") 26 apclient_instance.SCRIPT_panel = load("user://maps/Archipelago/panel.gd")
27 apclient_instance.SCRIPT_pilgrimage_terminator = load(
28 "user://maps/Archipelago/pilgrimage_terminator.gd"
29 )
27 apclient_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd") 30 apclient_instance.SCRIPT_uuid = load("user://maps/Archipelago/vendor/uuid.gd")
28 31
29 var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd") 32 var apdata = ResourceLoader.load("user://maps/Archipelago/gamedata.gd")
@@ -39,6 +42,7 @@ func _ready():
39 # Let's also inject any scripts we need to inject now. 42 # Let's also inject any scripts we need to inject now.
40 installScriptExtension(apclient_instance.SCRIPT_doorControl) 43 installScriptExtension(apclient_instance.SCRIPT_doorControl)
41 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/load.gd")) 44 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/load.gd"))
45 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting.gd"))
42 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting_eye.gd")) 46 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting_eye.gd"))
43 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting_scenery.gd")) 47 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/painting_scenery.gd"))
44 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/panelLevelSwitch.gd")) 48 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/panelLevelSwitch.gd"))
@@ -46,6 +50,7 @@ func _ready():
46 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/panelInput.gd")) 50 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/panelInput.gd"))
47 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/pause_menu.gd")) 51 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/pause_menu.gd"))
48 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/player.gd")) 52 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/player.gd"))
53 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/teleport.gd"))
49 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/worldTransporter.gd")) 54 installScriptExtension(ResourceLoader.load("user://maps/Archipelago/worldTransporter.gd"))
50 55
51 var apclient = global.get_node("Archipelago") 56 var apclient = global.get_node("Archipelago")
diff --git a/Archipelago/teleport.gd b/Archipelago/teleport.gd new file mode 100644 index 0000000..532f081 --- /dev/null +++ b/Archipelago/teleport.gd
@@ -0,0 +1,27 @@
1extends "res://scripts/teleport.gd"
2
3var _unlocked = true
4
5
6func _ready():
7 var apclient = global.get_node("Archipelago")
8 if self.get_parent().name == "Teleporter Warps":
9 if apclient._sunwarp_access != apclient.kSUNWARP_ACCESS_NORMAL:
10 _unlocked = false
11 elif apclient._door_shuffle and !apclient.warpIsVanilla(self.get_parent().name + "/" + self.name):
12 _unlocked = false
13
14
15func _body_entered(body):
16 if _unlocked:
17 ._body_entered(body)
18
19 if body.is_in_group("player"):
20 var apclient = global.get_node("Archipelago")
21 if !apclient._pilgrimage_enabled:
22 global.sunwarp = 1
23 body.get_node("pivot/camera/sunwarp_background").visible = false
24
25
26func unlock_warp():
27 _unlocked = true
diff --git a/util/generate_gamedata.rb b/util/generate_gamedata.rb index 5e03655..7674277 100644 --- a/util/generate_gamedata.rb +++ b/util/generate_gamedata.rb
@@ -11,14 +11,18 @@ CLASSIFICATION_INSANITY = 4
11 11
12panel_to_id = {} 12panel_to_id = {}
13door_groups = {} 13door_groups = {}
14warp_groups = {}
14 15
15panel_output = [] 16panel_output = []
16door_ids_by_item_id = {} 17door_ids_by_item_id = {}
17painting_ids_by_item_id = {} 18painting_ids_by_item_id = {}
19warp_ids_by_item_id = {}
18panel_ids_by_location_id = {} 20panel_ids_by_location_id = {}
19classification_by_location_id = {} 21classification_by_location_id = {}
22sunwarps = Array.new(12) {Hash.new}
20mentioned_doors = Set[] 23mentioned_doors = Set[]
21mentioned_paintings = Set[] 24mentioned_paintings = Set[]
25mentioned_warps = Set[]
22painting_output = {} 26painting_output = {}
23 27
24ids_config = YAML.load_file(idspath) 28ids_config = YAML.load_file(idspath)
@@ -88,6 +92,16 @@ config.each do |room_name, room_data|
88 painting_output[painting["id"]] = painting 92 painting_output[painting["id"]] = painting
89 end 93 end
90 end 94 end
95
96 if room_data.include? "sunwarps"
97 room_data["sunwarps"].each do |sunwarp|
98 index = sunwarp["dots"] - 1
99 if sunwarp["direction"] == "exit" then
100 index += 6
101 end
102 sunwarps[index] = sunwarp
103 end
104 end
91end 105end
92 106
93config.each do |room_name, room_data| 107config.each do |room_name, room_data|
@@ -152,6 +166,23 @@ config.each do |room_name, room_data|
152 painting_ids_by_item_id[item_id] = internal_painting_ids 166 painting_ids_by_item_id[item_id] = internal_painting_ids
153 mentioned_paintings.merge(internal_painting_ids) 167 mentioned_paintings.merge(internal_painting_ids)
154 end 168 end
169
170 if door.include? "warp_id"
171 internal_warp_ids = []
172 if door["warp_id"].kind_of? String
173 internal_warp_ids = [door["warp_id"]]
174 else
175 internal_warp_ids = door["warp_id"]
176 end
177
178 if door.include? "group"
179 warp_groups[door["group"]] ||= Set[]
180 warp_groups[door["group"]].merge(internal_warp_ids)
181 end
182
183 warp_ids_by_item_id[item_id] = internal_warp_ids
184 mentioned_warps.merge(internal_warp_ids)
185 end
155 end 186 end
156 end 187 end
157 end 188 end
@@ -162,6 +193,11 @@ door_groups.each do |group_name, door_ids|
162 door_ids_by_item_id[item_id] = door_ids.to_a 193 door_ids_by_item_id[item_id] = door_ids.to_a
163end 194end
164 195
196warp_groups.each do |group_name, warp_ids|
197 item_id = ids_config["door_groups"][group_name]
198 warp_ids_by_item_id[item_id] = warp_ids.to_a
199end
200
165File.open(outputpath, "w") do |f| 201File.open(outputpath, "w") do |f|
166 f.write "extends Node\n\nvar panels = [" 202 f.write "extends Node\n\nvar panels = ["
167 f.write(panel_output.map do |panel| 203 f.write(panel_output.map do |panel|
@@ -181,6 +217,12 @@ File.open(outputpath, "w") do |f|
181 "\"#{painting_id}\"" 217 "\"#{painting_id}\""
182 end.join(",") + "]" 218 end.join(",") + "]"
183 end.join(",")) 219 end.join(","))
220 f.write "}\nvar warp_ids_by_item_id = {"
221 f.write(warp_ids_by_item_id.map do |item_id, warp_ids|
222 "#{item_id}:[" + warp_ids.map do |warp_id|
223 "\"#{warp_id}\""
224 end.join(",") + "]"
225 end.join(","))
184 f.write "}\nvar panel_ids_by_location_id = {" 226 f.write "}\nvar panel_ids_by_location_id = {"
185 f.write(panel_ids_by_location_id.map do |location_id, panel_ids| 227 f.write(panel_ids_by_location_id.map do |location_id, panel_ids|
186 "#{location_id}:[" + panel_ids.map do |panel_id| 228 "#{location_id}:[" + panel_ids.map do |panel_id|
@@ -195,6 +237,10 @@ File.open(outputpath, "w") do |f|
195 f.write(mentioned_paintings.map do |painting_id| 237 f.write(mentioned_paintings.map do |painting_id|
196 "\"#{painting_id}\"" 238 "\"#{painting_id}\""
197 end.join(",")) 239 end.join(","))
240 f.write "]\nvar mentioned_warps = ["
241 f.write(mentioned_warps.map do |warp_id|
242 "\"#{warp_id}\""
243 end.join(","))
198 f.write "]\nvar paintings = {" 244 f.write "]\nvar paintings = {"
199 f.write(painting_output.map do |painting_id, painting| 245 f.write(painting_output.map do |painting_id, painting|
200 "\"#{painting_id}\":{\"orientation\":\"#{painting["orientation"]}\",\"move\":#{painting.include? "move" and painting["move"]}}" 246 "\"#{painting_id}\":{\"orientation\":\"#{painting["orientation"]}\",\"move\":#{painting.include? "move" and painting["move"]}}"
@@ -203,5 +249,9 @@ File.open(outputpath, "w") do |f|
203 f.write(classification_by_location_id.map do |location_id, classification| 249 f.write(classification_by_location_id.map do |location_id, classification|
204 "#{location_id}:#{classification}" 250 "#{location_id}:#{classification}"
205 end.join(",")) 251 end.join(","))
206 f.write "}" 252 f.write "}\nvar sunwarps = ["
253 f.write(sunwarps.map do |sunwarp|
254 "{\"orientation\":\"#{sunwarp["orientation"]}\",\"entrance_indicator_pos\":#{sunwarp["entrance_indicator_pos"].to_s}}"
255 end.join(","))
256 f.write "]"
207end 257end