summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorStar Rauchenberger <fefferburbia@gmail.com>2025-03-01 10:26:49 -0500
committerStar Rauchenberger <fefferburbia@gmail.com>2025-03-01 10:26:49 -0500
commit1dbfd6c6731eda35b6aa2dfd89642d0a1df8b748 (patch)
treee9b3f52da6f7f0a72e44c0a3ecb89bf661a0b737
parent1a5383e84e84faefa009ffb72cd725e66812bc6c (diff)
downloadmanifold-garden-archipelago-1dbfd6c6731eda35b6aa2dfd89642d0a1df8b748.tar.gz
manifold-garden-archipelago-1dbfd6c6731eda35b6aa2dfd89642d0a1df8b748.tar.bz2
manifold-garden-archipelago-1dbfd6c6731eda35b6aa2dfd89642d0a1df8b748.zip
Entrance randomizer stuff
-rw-r--r--ArchipelagoManager.cs22
-rw-r--r--GameData.cs33
-rw-r--r--GameplayPatches.cs56
-rw-r--r--game_data.yaml430
4 files changed, 541 insertions, 0 deletions
diff --git a/ArchipelagoManager.cs b/ArchipelagoManager.cs index 5aebffa..d96bd05 100644 --- a/ArchipelagoManager.cs +++ b/ArchipelagoManager.cs
@@ -3,6 +3,7 @@ using Archipelago.MultiClient.Net.Enums;
3using Archipelago.MultiClient.Net.MessageLog.Messages; 3using Archipelago.MultiClient.Net.MessageLog.Messages;
4using Archipelago.MultiClient.Net.Models; 4using Archipelago.MultiClient.Net.Models;
5using Archipelago.MultiClient.Net.Packets; 5using Archipelago.MultiClient.Net.Packets;
6using Newtonsoft.Json.Linq;
6using System; 7using System;
7using System.Collections.Generic; 8using System.Collections.Generic;
8using System.Threading.Tasks; 9using System.Threading.Tasks;
@@ -17,6 +18,11 @@ namespace ManifoldGardenArchipelago
17 private HashSet<string> _items = []; 18 private HashSet<string> _items = [];
18 private HashSet<string> _locations = []; 19 private HashSet<string> _locations = [];
19 20
21 private bool _roomShuffle = false;
22 public bool RoomShuffle => _roomShuffle;
23
24 public Dictionary<EntranceIdentifier, EntranceIdentifier> EntranceMapping = [];
25
20 public async Task<LoginResult> Connect(string url, string slotName, string password) 26 public async Task<LoginResult> Connect(string url, string slotName, string password)
21 { 27 {
22 LoginResult result; 28 LoginResult result;
@@ -35,6 +41,22 @@ namespace ManifoldGardenArchipelago
35 return new LoginFailure(ex.GetBaseException().Message); 41 return new LoginFailure(ex.GetBaseException().Message);
36 } 42 }
37 43
44 LoginSuccessful login = result as LoginSuccessful;
45 if (login.SlotData.ContainsKey("connections"))
46 {
47 _roomShuffle = true;
48
49 foreach (var connection in (JArray)login.SlotData["connections"])
50 {
51 var connList = (JArray)connection;
52 EntranceIdentifier ei1 = new((string)connList[0], (string)connList[1]);
53 EntranceIdentifier ei2 = new((string)connList[2], (string)connList[3]);
54
55 EntranceMapping[ei1] = ei2;
56 EntranceMapping[ei2] = ei1;
57 }
58 }
59
38 return result; 60 return result;
39 } 61 }
40 62
diff --git a/GameData.cs b/GameData.cs index a111b6a..107b408 100644 --- a/GameData.cs +++ b/GameData.cs
@@ -15,12 +15,29 @@ namespace ManifoldGardenArchipelago
15 } 15 }
16 } 16 }
17 17
18 public readonly struct EntranceIdentifier(string region, string name)
19 {
20 public readonly string region = region;
21 public readonly string name = name;
22
23 public override string ToString()
24 {
25 return $"Entrance({region},{name})";
26 }
27 }
28
18 public readonly struct LocationDescription(string name_arg, Requirement requirement_arg) 29 public readonly struct LocationDescription(string name_arg, Requirement requirement_arg)
19 { 30 {
20 public readonly string name = name_arg; 31 public readonly string name = name_arg;
21 public readonly Requirement requirement = requirement_arg; 32 public readonly Requirement requirement = requirement_arg;
22 } 33 }
23 34
35 public readonly struct PortalDescription(string scene, string name)
36 {
37 public readonly string scene = scene;
38 public readonly string name = name;
39 }
40
24 public class SceneDescription 41 public class SceneDescription
25 { 42 {
26 public readonly List<LocationDescription> locations = []; 43 public readonly List<LocationDescription> locations = [];
@@ -28,6 +45,7 @@ namespace ManifoldGardenArchipelago
28 public readonly Dictionary<int, Requirement> smokeWalls = []; 45 public readonly Dictionary<int, Requirement> smokeWalls = [];
29 public readonly Dictionary<int, Requirement> worldGrows = []; 46 public readonly Dictionary<int, Requirement> worldGrows = [];
30 public readonly Dictionary<int, Requirement> lasers = []; 47 public readonly Dictionary<int, Requirement> lasers = [];
48 public readonly Dictionary<string, EntranceIdentifier> portals = [];
31 } 49 }
32 50
33 public class GameStateListeners 51 public class GameStateListeners
@@ -51,6 +69,8 @@ namespace ManifoldGardenArchipelago
51 public static readonly Dictionary<SceneItemReference, GameStateListeners> listenersBySphere = []; 69 public static readonly Dictionary<SceneItemReference, GameStateListeners> listenersBySphere = [];
52 public static readonly Dictionary<string, GameStateListeners> listenersByItem = []; 70 public static readonly Dictionary<string, GameStateListeners> listenersByItem = [];
53 71
72 public static readonly Dictionary<EntranceIdentifier, PortalDescription> portal_by_entrance = [];
73
54 public static Requirement ParseRequirement(string scene, Dictionary<object, object> yamlReq) 74 public static Requirement ParseRequirement(string scene, Dictionary<object, object> yamlReq)
55 { 75 {
56 List<Requirement> reqs = []; 76 List<Requirement> reqs = [];
@@ -512,6 +532,19 @@ namespace ManifoldGardenArchipelago
512 } 532 }
513 } 533 }
514 534
535 if (sceneDetails.ContainsKey("portals"))
536 {
537 foreach (var portalPair in (Dictionary<object, object>)sceneDetails["portals"])
538 {
539 string portalName = (string)portalPair.Key;
540 var portalData = (Dictionary<object, object>)portalPair.Value;
541 EntranceIdentifier entranceIdentifier = new((string)portalData["region"], (string)portalData["connection"]);
542
543 sceneDescription.portals[portalName] = entranceIdentifier;
544 portal_by_entrance[entranceIdentifier] = new(scenePair.Key, portalName);
545 }
546 }
547
515 scenes[scenePair.Key] = sceneDescription; 548 scenes[scenePair.Key] = sceneDescription;
516 } 549 }
517 } 550 }
diff --git a/GameplayPatches.cs b/GameplayPatches.cs index 03e3f13..5e551ea 100644 --- a/GameplayPatches.cs +++ b/GameplayPatches.cs
@@ -453,4 +453,60 @@ namespace ManifoldGardenArchipelago
453 return true; 453 return true;
454 } 454 }
455 } 455 }
456
457 [HarmonyPatch(typeof(LevelSystems), nameof(LevelSystems.InitializeAndLoadLevel))]
458 static class LevelSystemsInitializeAndLoadLevelPatch
459 {
460 static void Prefix(LevelSystems __instance)
461 {
462 if (Plugin.archipelagoManager.RoomShuffle)
463 {
464 if (GameData.scenes.TryGetValue(__instance.levelName, out SceneDescription sceneDescription))
465 {
466 foreach (var portal in __instance.LevelInfo.portalList)
467 {
468 if (sceneDescription.portals.TryGetValue(portal.portalName, out EntranceIdentifier exitId) &&
469 Plugin.archipelagoManager.EntranceMapping.TryGetValue(exitId, out EntranceIdentifier enterId) &&
470 GameData.portal_by_entrance.TryGetValue(enterId, out PortalDescription pairedPortalDescription))
471 {
472 SceneLink secondLink = new()
473 {
474 portalName = pairedPortalDescription.name,
475 sceneName = pairedPortalDescription.scene.Substring(0, pairedPortalDescription.scene.Length - 10),
476 gravity = GravityDirection.DownBlue,
477 targetScene = portal,
478 };
479 portal.targetScene = secondLink;
480 }
481 }
482 }
483 }
484
485 /*if (__instance.gameObject.scene.name == "World_000_Optimized")
486 {
487 // 0: Portal_W001
488 SceneLink sceneLink = __instance.LevelInfo.portalList[0];
489 SceneLink secondLink = new()
490 {
491 portalName = "Portal_W063",
492 sceneName = "Hallway_W045_W073",
493 gravity = GravityDirection.DownBlue,
494 targetScene = sceneLink
495 };
496 sceneLink.targetScene = secondLink;
497 }
498 else if (__instance.gameObject.scene.name == "Hallway_W045_W073_Optimized")
499 {
500 SceneLink sceneLink = __instance.LevelInfo.portalList[3];
501 SceneLink secondLink = new()
502 {
503 portalName = "Portal_W001",
504 sceneName = "World_000",
505 gravity = GravityDirection.DownBlue,
506 targetScene = sceneLink
507 };
508 sceneLink.targetScene = secondLink;
509 }*/
510 }
511 }
456} 512}
diff --git a/game_data.yaml b/game_data.yaml index 7ca4d4a..29709a2 100644 --- a/game_data.yaml +++ b/game_data.yaml
@@ -10,6 +10,34 @@ World_000_Optimized:
10 - button: 10 - button:
11 scene: Hallway_W000_W052_Optimized 11 scene: Hallway_W000_W052_Optimized
12 index: 0 12 index: 0
13 portals:
14 Portal_W001:
15 region: "000"
16 connection: A
17 Portal_W052:
18 region: "000"
19 connection: B
20Hallway_W000_W001_Optimized:
21 portals:
22 Portal_W000:
23 region: "000_001"
24 connection: A
25 Portal_W001:
26 region: "000_001"
27 connection: B
28 Portal_W900:
29 region: "000_001"
30 connection: C
31World_900_Garnier_Optimized:
32 portals:
33 Portal_W000:
34 region: "900"
35 connection: A
36Hallway_W062_W900_Optimized:
37 portals:
38 Portal_W062:
39 region: "900"
40 connection: B
13World_062_LargeGap_Optimized: 41World_062_LargeGap_Optimized:
14 locations: 42 locations:
15 Large Gap Puzzle Solved: 43 Large Gap Puzzle Solved:
@@ -65,6 +93,22 @@ World_062_LargeGap_Optimized:
65 - button: 93 - button:
66 scene: Hallway_W062_W063_Optimized 94 scene: Hallway_W062_W063_Optimized
67 index: 0 95 index: 0
96 portals:
97 Portal_W052:
98 region: "062/Outside"
99 connection: A
100 Portal_W073:
101 region: "062/Inside"
102 connection: B
103 Portal_W026:
104 region: "062/Inside"
105 connection: C
106 Portal_W604:
107 region: "062/SecretHub"
108 connection: A
109 Portal_W900:
110 region: "062/SecretHub"
111 connection: C
68Hallway_W062_W063_Optimized: 112Hallway_W062_W063_Optimized:
69 doors: 113 doors:
70 0: 114 0:
@@ -74,6 +118,10 @@ Hallway_W062_W063_Optimized:
74 - socket: 118 - socket:
75 scene: World_063_TowerX_Optimized 119 scene: World_063_TowerX_Optimized
76 index: 0 120 index: 0
121 portals:
122 Portal_W063:
123 region: "062/SecretHub"
124 connection: B
77World_001_Optimized: 125World_001_Optimized:
78 locations: 126 locations:
79 Blue - Red Laser Activated: 127 Blue - Red Laser Activated:
@@ -95,6 +143,15 @@ World_001_Optimized:
95 149: 143 149:
96 item: Blue - Red Laser 144 item: Blue - Red Laser
97 socket: 5 145 socket: 5
146 portals:
147 Portal_To_W000:
148 region: "001"
149 connection: A
150Hallway_W044_W001A_Optimized:
151 portals:
152 Portal_W044:
153 region: "001"
154 connection: B
98World_044_CubicSpaceDivision_Optimized: 155World_044_CubicSpaceDivision_Optimized:
99 locations: 156 locations:
100 Blue God Cube Planted: 157 Blue God Cube Planted:
@@ -126,6 +183,25 @@ World_044_CubicSpaceDivision_Optimized:
126 doors: 183 doors:
127 12: 184 12:
128 item: Orange Garden 185 item: Orange Garden
186 portals:
187 Portal_W001:
188 region: "044"
189 connection: A
190 Portal_W003:
191 region: "044"
192 connection: C
193 Portal_W053:
194 region: "044"
195 connection: E
196 Portal_W002:
197 region: "044"
198 connection: G
199 Portal_W051:
200 region: "044"
201 connection: I
202 Portal_W063:
203 region: "044"
204 connection: K
129World_044B_CubicSpaceDivision_Optimized: 205World_044B_CubicSpaceDivision_Optimized:
130 doors: 206 doors:
131 0: 207 0:
@@ -135,6 +211,10 @@ World_044B_CubicSpaceDivision_Optimized:
135 - button: 211 - button:
136 scene: Hallway_W044_W015_Optimized 212 scene: Hallway_W044_W015_Optimized
137 index: 1 213 index: 1
214 portals:
215 Portal_W015:
216 region: "044"
217 connection: B
138Hallway_W044_W015_Optimized: 218Hallway_W044_W015_Optimized:
139 locations: 219 locations:
140 Tower Orange Tree Puzzle Solved: 220 Tower Orange Tree Puzzle Solved:
@@ -151,6 +231,13 @@ Hallway_W044_W015_Optimized:
151 - button: 231 - button:
152 scene: World_015_Stepwell_Optimized 232 scene: World_015_Stepwell_Optimized
153 index: 1 233 index: 1
234 portals:
235 Portal_W045:
236 region: "044_014"
237 connection: A
238 Portal_W613:
239 region: "044_014"
240 connection: C
154World_613_LongBridgeLongTower_Optimized: 241World_613_LongBridgeLongTower_Optimized:
155 locations: 242 locations:
156 Long Bridge Long Tower Puzzle Solved: 243 Long Bridge Long Tower Puzzle Solved:
@@ -169,6 +256,13 @@ World_613_LongBridgeLongTower_Optimized:
169 or: 256 or:
170 - button: 0 257 - button: 0
171 - pad: 0 258 - pad: 0
259 portals:
260 Portal_W026:
261 region: "613"
262 connection: A
263 Portal_W015:
264 region: "613"
265 connection: B
172World_015_Stepwell_Optimized: 266World_015_Stepwell_Optimized:
173 doors: 267 doors:
174 1: 268 1:
@@ -198,6 +292,10 @@ Hallway_W015_W041_Optimized:
198 - button: 292 - button:
199 scene: World_045_FirstHub_Optimized 293 scene: World_045_FirstHub_Optimized
200 index: 0 294 index: 0
295 portals:
296 Portal_W041:
297 region: "PathToPyramid"
298 connection: B
201World_045_FirstHub_Optimized: 299World_045_FirstHub_Optimized:
202 locations: 300 locations:
203 Pyramid First Exit Opened: 301 Pyramid First Exit Opened:
@@ -249,6 +347,25 @@ World_045_FirstHub_Optimized:
249 - button: 0 347 - button: 0
250 - inverted: 348 - inverted:
251 pad: 1 349 pad: 1
350 portals:
351 Portal_W015:
352 region: "045"
353 connection: A
354 Portal_W018:
355 region: "045"
356 connection: B
357 Portal_W053:
358 region: "045"
359 connection: D
360 Portal_W037:
361 region: "045"
362 connection: F
363 Portal_W044:
364 region: "045/RedExit"
365 connection: A
366 Portal_W057:
367 region: "045/GreenExit"
368 connection: A
252Hallway_W045_W018_Optimized: 369Hallway_W045_W018_Optimized:
253 locations: 370 locations:
254 Purple/Orange Tree Puzzle Solved: 371 Purple/Orange Tree Puzzle Solved:
@@ -260,6 +377,13 @@ Hallway_W045_W018_Optimized:
260 - button: 377 - button:
261 scene: Hallway_W041_W018_Optimized 378 scene: Hallway_W041_W018_Optimized
262 index: 0 379 index: 0
380 portals:
381 Portal_W045:
382 region: "045_018"
383 connection: A
384 Portal_W018:
385 region: "045_018"
386 connection: B
263Hallway_W041_W018_Optimized: 387Hallway_W041_W018_Optimized:
264 doors: 388 doors:
265 0: 389 0:
@@ -268,6 +392,13 @@ Hallway_W041_W018_Optimized:
268 - button: 392 - button:
269 scene: World_018_PastaTile_Optimized 393 scene: World_018_PastaTile_Optimized
270 index: 0 394 index: 0
395 portals:
396 Portal_W041:
397 region: "041_018"
398 connection: A
399 Portal_W018:
400 region: "041_018"
401 connection: B
271World_612_BlindSpherePuzzle_Optimized: 402World_612_BlindSpherePuzzle_Optimized:
272 locations: 403 locations:
273 Blind Sphere Puzzle Solved: 404 Blind Sphere Puzzle Solved:
@@ -283,6 +414,10 @@ World_612_BlindSpherePuzzle_Optimized:
283 - button: 414 - button:
284 scene: Hallway_W612_W057_Optimized 415 scene: Hallway_W612_W057_Optimized
285 index: 0 416 index: 0
417 portals:
418 Portal_W057:
419 region: "041_018"
420 connection: C
286World_018_PastaTile_Optimized: 421World_018_PastaTile_Optimized:
287 doors: 422 doors:
288 0: 423 0:
@@ -303,6 +438,19 @@ World_018_PastaTile_Optimized:
303 index: 0 438 index: 0
304 - scene: Hallway_W018_W063_Optimized 439 - scene: Hallway_W018_W063_Optimized
305 index: 1 440 index: 1
441 portals:
442 Portal_W041:
443 region: "018/Inside"
444 connection: A
445 Portal_W003:
446 region: "018/Outside"
447 connection: B
448 Portal_W073:
449 region: "018/Secret"
450 connection: A
451 Portal_W063:
452 region: "018/Secret"
453 connection: B
306Hallway_W018_W003B_Optimized: 454Hallway_W018_W003B_Optimized:
307 locations: 455 locations:
308 Mini Sphere Puzzle Solved: 456 Mini Sphere Puzzle Solved:
@@ -317,10 +465,26 @@ Hallway_W018_W003B_Optimized:
317 or: 465 or:
318 - button: 1 466 - button: 1
319 - entry: World_003_SpherePipe_Optimized 467 - entry: World_003_SpherePipe_Optimized
468 portals:
469 Portal_W018:
470 region: "018_003B"
471 connection: A
472 Portal_W003:
473 region: "018_003B"
474 connection: B
320World_003_SpherePipe_Optimized: 475World_003_SpherePipe_Optimized:
321 locations: 476 locations:
322 Red - Tree Purified: 477 Red - Tree Purified:
323 entry: AudioVisual_003_Optimized 478 entry: AudioVisual_003_Optimized
479 portals:
480 Portal_W018:
481 region: "003"
482 connection: A
483Hallway_W044_W003_Optimized:
484 portals:
485 Portal_W044:
486 region: "003"
487 connection: B
324World_044C_CubicSpaceDivision_Optimized: 488World_044C_CubicSpaceDivision_Optimized:
325 doors: 489 doors:
326 1: 490 1:
@@ -330,6 +494,10 @@ World_044C_CubicSpaceDivision_Optimized:
330 - button: 494 - button:
331 scene: Hallway_W044_W045_Optimized 495 scene: Hallway_W044_W045_Optimized
332 index: 0 496 index: 0
497 portals:
498 Portal_W045-053:
499 region: "044"
500 connection: D
333Hallway_W044_W045_Optimized: 501Hallway_W044_W045_Optimized:
334 locations: 502 locations:
335 Final Test Puzzle Solved: 503 Final Test Puzzle Solved:
@@ -350,6 +518,16 @@ Hallway_W044_W045_Optimized:
350 pad: 518 pad:
351 scene: World_045_FirstHub_Optimized 519 scene: World_045_FirstHub_Optimized
352 index: 0 520 index: 0
521 portals:
522 Portal_W044:
523 region: "044_045"
524 connection: A
525 Portal_W045:
526 region: "044_045"
527 connection: B
528 Portal_W804:
529 region: "044_045"
530 connection: D
353Hallway_W045_W053_Optimized: 531Hallway_W045_W053_Optimized:
354 doors: 532 doors:
355 1: 533 1:
@@ -357,6 +535,13 @@ Hallway_W045_W053_Optimized:
357 or: 535 or:
358 - button: 0 536 - button: 0
359 - entry: World_053_WaterTechingPuzzle_Optimized 537 - entry: World_053_WaterTechingPuzzle_Optimized
538 portals:
539 Portal_W041:
540 region: "045_053"
541 connection: A
542 Portal_053:
543 region: "045_053"
544 connection: B
360World_053_WaterTechingPuzzle_Optimized: 545World_053_WaterTechingPuzzle_Optimized:
361 locations: 546 locations:
362 Green - Blue Waterwheel Activated: 547 Green - Blue Waterwheel Activated:
@@ -366,6 +551,15 @@ World_053_WaterTechingPuzzle_Optimized:
366 doors: 551 doors:
367 4: 552 4:
368 item: Green - Water Room Entrance 553 item: Green - Water Room Entrance
554 portals:
555 Portal_W045A:
556 region: "053"
557 connection: A
558Hallway_W044_W053_Optimized:
559 portals:
560 Portal_W044:
561 region: "053"
562 connection: B
369World_044E_CubicSpaceDivision_Optimized: 563World_044E_CubicSpaceDivision_Optimized:
370 doors: 564 doors:
371 1: 565 1:
@@ -375,6 +569,10 @@ World_044E_CubicSpaceDivision_Optimized:
375 - socket: 569 - socket:
376 scene: Hallway_W044_W057_Optimized 570 scene: Hallway_W044_W057_Optimized
377 index: 0 571 index: 0
572 portals:
573 Portal_W057:
574 region: "044"
575 connection: F
378Hallway_W044_W057_Optimized: 576Hallway_W044_W057_Optimized:
379 doors: 577 doors:
380 1: 578 1:
@@ -383,6 +581,13 @@ Hallway_W044_W057_Optimized:
383 - waterwheel: 581 - waterwheel:
384 scene: World_057_WaterAndPortals_Optimized 582 scene: World_057_WaterAndPortals_Optimized
385 index: 0 583 index: 0
584 portals:
585 Portal_W044:
586 region: "044_057"
587 connection: A
588 Portal_W057:
589 region: "044_057"
590 connection: B
386Hallway_W612_W057_Optimized: 591Hallway_W612_W057_Optimized:
387 doors: 592 doors:
388 2: 593 2:
@@ -391,6 +596,13 @@ Hallway_W612_W057_Optimized:
391 - button: 596 - button:
392 scene: World_057_WaterAndPortals_Optimized 597 scene: World_057_WaterAndPortals_Optimized
393 index: 0 598 index: 0
599 portals:
600 Portal_W612:
601 region: "612_057"
602 connection: A
603 Portal_W015:
604 region: "612_057"
605 connection: B
394World_057_WaterAndPortals_Optimized: 606World_057_WaterAndPortals_Optimized:
395 locations: 607 locations:
396 Water Through Portals Puzzle Solved: 608 Water Through Portals Puzzle Solved:
@@ -407,6 +619,13 @@ World_057_WaterAndPortals_Optimized:
407 or: 619 or:
408 - waterwheel: 0 620 - waterwheel: 0
409 - button: 0 621 - button: 0
622 portals:
623 Portal_W044:
624 region: "057"
625 connection: A
626 Portal_W612:
627 region: "057"
628 connection: B
410Hallway_W057_W045_Optimized: 629Hallway_W057_W045_Optimized:
411 doors: 630 doors:
412 1: 631 1:
@@ -416,6 +635,10 @@ Hallway_W057_W045_Optimized:
416 pad: 635 pad:
417 scene: World_045_FirstHub_Optimized 636 scene: World_045_FirstHub_Optimized
418 index: 1 637 index: 1
638 portals:
639 Portal_W045:
640 region: "057"
641 connection: C
419Hallway_W045_W073_Optimized: 642Hallway_W045_W073_Optimized:
420 locations: 643 locations:
421 Apartments Waterwheel Activated: 644 Apartments Waterwheel Activated:
@@ -436,6 +659,19 @@ Hallway_W045_W073_Optimized:
436 - button: 659 - button:
437 scene: Hallway_W073_W018_Optimized 660 scene: Hallway_W073_W018_Optimized
438 index: 0 661 index: 0
662 portals:
663 Portal_W045:
664 region: "045_073"
665 connection: A
666 Portal_W073:
667 region: "045_073"
668 connection: B
669 Portal_W018:
670 region: "045_073"
671 connection: C
672 Portal_W063:
673 region: "045_073"
674 connection: D
439Hallway_W073_W018_Optimized: 675Hallway_W073_W018_Optimized:
440 doors: 676 doors:
441 1: 677 1:
@@ -444,6 +680,13 @@ Hallway_W073_W018_Optimized:
444 - button: 680 - button:
445 scene: World_018_PastaTile_Optimized 681 scene: World_018_PastaTile_Optimized
446 index: 1 682 index: 1
683 portals:
684 Portal_W073:
685 region: "073_018"
686 connection: A
687 Portal_W018:
688 region: "073_018"
689 connection: B
447Hallway_W018_W063_Optimized: 690Hallway_W018_W063_Optimized:
448 doors: 691 doors:
449 0: 692 0:
@@ -453,6 +696,16 @@ Hallway_W018_W063_Optimized:
453 or: 696 or:
454 - button: [0, 1] 697 - button: [0, 1]
455 - entry: World_063_TowerX_Optimized 698 - entry: World_063_TowerX_Optimized
699 portals:
700 Portal_W018:
701 region: "018_063"
702 connection: A
703 Portal_H044-073:
704 region: "018_063"
705 connection: B
706 Portal_W063:
707 region: "018_063"
708 connection: C
456World_073_WaterThruStairs_Optimized: 709World_073_WaterThruStairs_Optimized:
457 locations: 710 locations:
458 Skylight Room Waterwheel Activated: 711 Skylight Room Waterwheel Activated:
@@ -487,6 +740,16 @@ World_073_WaterThruStairs_Optimized:
487 - button: 740 - button:
488 scene: Hallway_W044_W045_Optimized 741 scene: Hallway_W044_W045_Optimized
489 index: 0 742 index: 0
743 portals:
744 Portal_W045:
745 region: "073"
746 connection: A
747 Portal_W062:
748 region: "073"
749 connection: B
750 Portal_W026:
751 region: "073"
752 connection: C
490Hallway_W073_W062_Optimized: 753Hallway_W073_W062_Optimized:
491 doors: 754 doors:
492 1: 755 1:
@@ -496,6 +759,13 @@ Hallway_W073_W062_Optimized:
496 - socket: 759 - socket:
497 scene: World_062_LargeGap_Optimized 760 scene: World_062_LargeGap_Optimized
498 index: 0 761 index: 0
762 portals:
763 Portal_W073:
764 region: "073_062"
765 connection: A
766 Portal_W062:
767 region: "073_062"
768 connection: B
499Hallway_W000_W052_Optimized: 769Hallway_W000_W052_Optimized:
500 doors: 770 doors:
501 2: 771 2:
@@ -504,6 +774,13 @@ Hallway_W000_W052_Optimized:
504 - button: 774 - button:
505 scene: World_052_JerryMcGuirePuzzle_Optimized 775 scene: World_052_JerryMcGuirePuzzle_Optimized
506 index: 1 776 index: 1
777 portals:
778 Portal_W000:
779 region: "000_052"
780 connection: A
781 Portal_W052:
782 region: "000_052"
783 connection: B
507World_052_JerryMcGuirePuzzle_Optimized: 784World_052_JerryMcGuirePuzzle_Optimized:
508 locations: 785 locations:
509 Jerry McGuire Puzzle Solved: 786 Jerry McGuire Puzzle Solved:
@@ -527,6 +804,13 @@ World_052_JerryMcGuirePuzzle_Optimized:
527 - button: 804 - button:
528 scene: Hallway_W052_W062_Optimized 805 scene: Hallway_W052_W062_Optimized
529 index: 0 806 index: 0
807 portals:
808 Portal_W000:
809 region: "052"
810 connection: A
811 Portal_W062:
812 region: "052"
813 connection: B
530Hallway_W052_W062_Optimized: 814Hallway_W052_W062_Optimized:
531 doors: 815 doors:
532 2: 816 2:
@@ -536,6 +820,13 @@ Hallway_W052_W062_Optimized:
536 - button: 820 - button:
537 scene: World_062_LargeGap_Optimized 821 scene: World_062_LargeGap_Optimized
538 index: 0 822 index: 0
823 portals:
824 Portal_W052:
825 region: "052_062"
826 connection: A
827 Portal_W062:
828 region: "052_062"
829 connection: B
539Hallway_W062_W026_Optimized: 830Hallway_W062_W026_Optimized:
540 doors: 831 doors:
541 1: 832 1:
@@ -543,6 +834,13 @@ Hallway_W062_W026_Optimized:
543 or: 834 or:
544 - button: 0 835 - button: 0
545 - entry: World_026_Library_Optimized 836 - entry: World_026_Library_Optimized
837 portals:
838 Portal_W062:
839 region: "062_026"
840 connection: A
841 Portal_W026:
842 region: "062_026"
843 connection: B
546World_026_Library_Optimized: 844World_026_Library_Optimized:
547 locations: 845 locations:
548 Single Socket Puzzle Solved: 846 Single Socket Puzzle Solved:
@@ -566,6 +864,19 @@ World_026_Library_Optimized:
566 3: 864 3:
567 item: Library - Yellow Smoke Wall 865 item: Library - Yellow Smoke Wall
568 entry: World_026_Library_Optimized 866 entry: World_026_Library_Optimized
867 portals:
868 Portal_W062:
869 region: "026"
870 connection: A
871 Portal_W002:
872 region: "026"
873 connection: B
874 Portal_W051:
875 region: "026"
876 connection: D
877 Portal_W044 (051):
878 region: "026/YellowExit"
879 connection: A
569Hallway_W026_W002_Optimized: 880Hallway_W026_W002_Optimized:
570 locations: 881 locations:
571 Yellow Cube Fetch Quest Completed: 882 Yellow Cube Fetch Quest Completed:
@@ -578,6 +889,13 @@ Hallway_W026_W002_Optimized:
578 - button: 889 - button:
579 scene: Hallway_W026_W015_Optimized 890 scene: Hallway_W026_W015_Optimized
580 index: 0 891 index: 0
892 portals:
893 Portal_W26:
894 region: "026_002"
895 connection: A
896 Portal_W015:
897 region: "026_002"
898 connection: C
581Hallway_W026_W015_Optimized: 899Hallway_W026_W015_Optimized:
582 doors: 900 doors:
583 0: 901 0:
@@ -586,6 +904,13 @@ Hallway_W026_W015_Optimized:
586 - pad: 904 - pad:
587 scene: World_613_LongBridgeLongTower_Optimized 905 scene: World_613_LongBridgeLongTower_Optimized
588 index: 0 906 index: 0
907 portals:
908 Portal_W026:
909 region: "026_015"
910 connection: A
911 Portal_W613:
912 region: "026_015"
913 connection: B
589Hallway_W026_W002_PuzzleRoom_Optimized: 914Hallway_W026_W002_PuzzleRoom_Optimized:
590 locations: 915 locations:
591 Yellow Entrance Puzzle Solved: 916 Yellow Entrance Puzzle Solved:
@@ -596,6 +921,10 @@ Hallway_W026_W002_PuzzleRoom_Optimized:
596 or: 921 or:
597 - socket: [0, 1] 922 - socket: [0, 1]
598 - entry: World_002_Optimized 923 - entry: World_002_Optimized
924 portals:
925 Portal_W002:
926 region: "026_002/PuzzleRoom"
927 connection: B
599World_002_Optimized: 928World_002_Optimized:
600 locations: 929 locations:
601 Yellow - Blue Tower Solved: 930 Yellow - Blue Tower Solved:
@@ -606,6 +935,15 @@ World_002_Optimized:
606 socket: 4 935 socket: 4
607 Yellow - Tree Purified: 936 Yellow - Tree Purified:
608 entry: AudioVisual_002_Optimized 937 entry: AudioVisual_002_Optimized
938 portals:
939 Portal_W026:
940 region: "002"
941 connection: A
942Hallway_W044_W002_Optimized:
943 portals:
944 Portal_W044:
945 region: "002"
946 connection: B
609World_044D_CubicSpaceDivision_Optimized: 947World_044D_CubicSpaceDivision_Optimized:
610 doors: 948 doors:
611 0: 949 0:
@@ -615,6 +953,10 @@ World_044D_CubicSpaceDivision_Optimized:
615 - button: 953 - button:
616 scene: Hallway_W044_W026_Optimized 954 scene: Hallway_W044_W026_Optimized
617 index: 0 955 index: 0
956 portals:
957 Portal_W026:
958 region: "044"
959 connection: H
618Hallway_W044_W026_Optimized: 960Hallway_W044_W026_Optimized:
619 doors: 961 doors:
620 2: 962 2:
@@ -628,6 +970,16 @@ Hallway_W044_W026_Optimized:
628 or: 970 or:
629 - button: 0 971 - button: 0
630 - button: 1 972 - button: 1
973 portals:
974 Portal_W044:
975 region: "044_026"
976 connection: A
977 Portal_W026:
978 region: "044_026"
979 connection: B
980 Portal_W073:
981 region: "044_026"
982 connection: C
631Hallway_W073_W026_Optimized: 983Hallway_W073_W026_Optimized:
632 doors: 984 doors:
633 1: 985 1:
@@ -636,6 +988,13 @@ Hallway_W073_W026_Optimized:
636 - button: 988 - button:
637 scene: Hallway_W044_W026_Optimized 989 scene: Hallway_W044_W026_Optimized
638 index: 1 990 index: 1
991 portals:
992 Portal_W073:
993 region: "073_026"
994 connection: A
995 Portal_W026:
996 region: "073_026"
997 connection: B
639Hallway_W026_W051_Optimized: 998Hallway_W026_W051_Optimized:
640 doors: 999 doors:
641 0: 1000 0:
@@ -643,10 +1002,26 @@ Hallway_W026_W051_Optimized:
643 or: 1002 or:
644 - button: 0 1003 - button: 0
645 - entry: World_051_CeilingSuspendPuzzle_Optimized 1004 - entry: World_051_CeilingSuspendPuzzle_Optimized
1005 portals:
1006 Portal_W026:
1007 region: "026_051"
1008 connection: A
1009 Portal_W051:
1010 region: "026_051"
1011 connection: B
646World_051_CeilingSuspendPuzzle_Optimized: 1012World_051_CeilingSuspendPuzzle_Optimized:
647 locations: 1013 locations:
648 Purple - Tree Purified: 1014 Purple - Tree Purified:
649 entry: AudioVisual_051_Optimized 1015 entry: AudioVisual_051_Optimized
1016 portals:
1017 Portal_W026:
1018 region: "051"
1019 connection: A
1020Hallway_W044_W051A_Optimized:
1021 portals:
1022 Portal_W044:
1023 region: "051"
1024 connection: B
650World_044G_CubicSpaceDivision_Optimized: 1025World_044G_CubicSpaceDivision_Optimized:
651 doors: 1026 doors:
652 1: 1027 1:
@@ -656,6 +1031,10 @@ World_044G_CubicSpaceDivision_Optimized:
656 - button: 1031 - button:
657 scene: Hallway_W033_W063_Optimized 1032 scene: Hallway_W033_W063_Optimized
658 index: 0 1033 index: 0
1034 portals:
1035 Portal_W051:
1036 region: "044"
1037 connection: J
659Hallway_W033_W063_Optimized: 1038Hallway_W033_W063_Optimized:
660 locations: 1039 locations:
661 Shattered Bridges Puzzle Solved: 1040 Shattered Bridges Puzzle Solved:
@@ -672,6 +1051,13 @@ Hallway_W033_W063_Optimized:
672 - socket: 1051 - socket:
673 scene: World_063_TowerX_Optimized 1052 scene: World_063_TowerX_Optimized
674 index: 0 1053 index: 0
1054 portals:
1055 Portal_W044:
1056 region: "033_063"
1057 connection: A
1058 Portal_W063:
1059 region: "033_063"
1060 connection: B
675World_611_SecretRoom1_Optimized: 1061World_611_SecretRoom1_Optimized:
676 locations: 1062 locations:
677 Shattered Bridges Secret Puzzle Solved: 1063 Shattered Bridges Secret Puzzle Solved:
@@ -688,6 +1074,10 @@ World_611_SecretRoom1_Optimized:
688 - socket: 1074 - socket:
689 scene: World_604_TetrominoNonEuclidean_Optimized 1075 scene: World_604_TetrominoNonEuclidean_Optimized
690 index: 0 1076 index: 0
1077 portals:
1078 Portal_W604:
1079 region: "611"
1080 connection: B
691World_604_TetrominoNonEuclidean_Optimized: 1081World_604_TetrominoNonEuclidean_Optimized:
692 locations: 1082 locations:
693 Non-Euclidean Tetromino Puzzle Solved: 1083 Non-Euclidean Tetromino Puzzle Solved:
@@ -703,6 +1093,13 @@ World_604_TetrominoNonEuclidean_Optimized:
703 - button: 1093 - button:
704 scene: Hallway_W604_W062_Optimized 1094 scene: Hallway_W604_W062_Optimized
705 index: 0 1095 index: 0
1096 portals:
1097 Portal_W611:
1098 region: "604"
1099 connection: A
1100 Portal_W062:
1101 region: "604"
1102 connection: B
706Hallway_W604_W062_Optimized: 1103Hallway_W604_W062_Optimized:
707 doors: 1104 doors:
708 0: 1105 0:
@@ -721,6 +1118,13 @@ Hallway_W604_W062_Optimized:
721 - button: 1118 - button:
722 scene: World_062_LargeGap_Optimized 1119 scene: World_062_LargeGap_Optimized
723 index: 4 1120 index: 4
1121 portals:
1122 Portal_W604:
1123 region: "604_062"
1124 connection: A
1125 Portal_W062:
1126 region: "604_062"
1127 connection: B
724World_063_TowerX_Optimized: 1128World_063_TowerX_Optimized:
725 locations: 1129 locations:
726 Orange - Inside Puzzle Solved: 1130 Orange - Inside Puzzle Solved:
@@ -733,6 +1137,21 @@ World_063_TowerX_Optimized:
733 or: 1137 or:
734 - socket: 0 1138 - socket: 0
735 - socket: 1 1139 - socket: 1
1140 portals:
1141 Portal_W044B:
1142 region: "063/Inside"
1143 connection: A
1144 Portal_W062:
1145 region: "063/Inside"
1146 connection: B
1147 Portal_W018:
1148 region: "063/Outside"
1149 connection: B
1150Hallway_W044_W063_Optimized:
1151 portals:
1152 Portal_W044:
1153 region: "063/Inside"
1154 connection: D
736Hallway_W045_W804_Optimized: 1155Hallway_W045_W804_Optimized:
737 doors: 1156 doors:
738 0: 1157 0:
@@ -740,6 +1159,13 @@ Hallway_W045_W804_Optimized:
740 or: 1159 or:
741 - button: 0 1160 - button: 0
742 - entry: World_804_Optimized 1161 - entry: World_804_Optimized
1162 portals:
1163 Portal_W045:
1164 region: "045_804"
1165 connection: A
1166 Portal_W804:
1167 region: "045_804"
1168 connection: B
743World_801_Optimized: 1169World_801_Optimized:
744 locations: 1170 locations:
745 Rainbow - Orange Tree Puzzle Solved: 1171 Rainbow - Orange Tree Puzzle Solved:
@@ -760,6 +1186,10 @@ World_804_Optimized:
760 locations: 1186 locations:
761 Rainbow - Double Gravity Puzzle Solved: 1187 Rainbow - Double Gravity Puzzle Solved:
762 socket: [0, 1] 1188 socket: [0, 1]
1189 portals:
1190 Portal_W045:
1191 region: "804"
1192 connection: B
763World_807_TetrominoWaterAndGears_Optimized: 1193World_807_TetrominoWaterAndGears_Optimized:
764 locations: 1194 locations:
765 Rainbow - First Water Tetromino Puzzle Solved: 1195 Rainbow - First Water Tetromino Puzzle Solved: