diff --git a/BreakableWallRandomizer.cs b/BreakableWallRandomizer.cs index cd3708d..3be4651 100644 --- a/BreakableWallRandomizer.cs +++ b/BreakableWallRandomizer.cs @@ -9,7 +9,7 @@ namespace BreakableWallRandomizer public class BreakableWallRandomizer : Mod, IGlobalSettings { new public string GetName() => "Breakable Wall Randomizer"; - public override string GetVersion() => "3.0.4.4"; + public override string GetVersion() => "4.0.0.0"; public BWR_Settings GS { get; set; } = new(); private static BreakableWallRandomizer _instance; public BreakableWallRandomizer() : base() diff --git a/BreakableWallRandomizer.csproj b/BreakableWallRandomizer.csproj index c6d5877..2ac1c1b 100644 --- a/BreakableWallRandomizer.csproj +++ b/BreakableWallRandomizer.csproj @@ -8,8 +8,8 @@ BreakableWallRandomizer A Randomizer add-on for wall and floor objects. Copyright ©2023 - 3.0.4.4 - 3.0.4.4 + 4.0.0.0 + 4.0.0.0 bin\$(Configuration)\ latest diff --git a/Changelog.md b/Changelog.md new file mode 100644 index 0000000..aac3a92 --- /dev/null +++ b/Changelog.md @@ -0,0 +1,10 @@ +# Breakable Wall Randomizer 4.0 + +Changelog: +- Introducing *Collapsers*: These represent *60?* new items that can be included into the randomized pool. Much like Walls, Planks and Dive Floors, they can have their own group set. (18/60) 30% +- Reworked Wall Groups: As of previous patch, Wall Groups were a bit arbitrary. With the introduction of Collapsers, these need some clearer definition. Now, if this setting is enabled, all objects will be replaced by room walls. A room wall will destroy all randomized breakables in a given room, much like how Wall Groups behaved before, but with the consistency that there will be one wall item/location per room. (0%) +- Rebuilt FStats integration. Half / Total remain the same, but instead of using individual groups, walls by Map Area are selected instead. (0%) +- Removed the Softlock setting: It was rarely used, not maintained, didn't keep track of other connection interops and with the introduction of yet another wall type, whichever walls were defined under these settings are potentially more outdated. Plus, the connection menu was already big enough and we still are introducing new options. (100%) +- Restored shop descriptions: They were a thing on BWR 2+, got dropped on BWR 3.0 as an oversight and I see no reason to impede their return - with some extra new descriptions too. (100%) +- Added a new wall: Wall-QG_Glass, which is the glass window that leads to the Queen's Gardens top Grub. This is a standard wall in every aspect, except it breaks in one hit instead of four. (100%) +- Added Extra Walls: There are three groups of these - walls such as the King's Pass breakables, Ancestral Mound planks and Hive Pillars. (0%) \ No newline at end of file diff --git a/FSM/CustomCollide.cs b/FSM/CustomCollide.cs new file mode 100644 index 0000000..686ff43 --- /dev/null +++ b/FSM/CustomCollide.cs @@ -0,0 +1,22 @@ +using UnityEngine; +using HutongGames.PlayMaker; + +namespace BreakableWallRandomizer.Fsm +{ + internal class SetTriggerCollider : FsmStateAction + { + private Collider2D thisCollider; + public override void OnEnter() + { + thisCollider = Owner.GetComponent(); + thisCollider.isTrigger = false; + Rigidbody2D rb = Owner.GetComponent(); + if (rb == null) + { + rb = Owner.AddComponent(); + rb.bodyType = RigidbodyType2D.Kinematic; + } + Finish(); + } + } +} \ No newline at end of file diff --git a/IC/BreakableWallItem.cs b/IC/BreakableWallItem.cs index d9ef77b..a2bcc09 100644 --- a/IC/BreakableWallItem.cs +++ b/IC/BreakableWallItem.cs @@ -11,14 +11,15 @@ namespace BreakableWallRandomizer.IC [Serializable] public class BreakableWallItem : AbstractItem { - public string sceneName; public string gameObject; public string fsmType; + public string sceneName; public string persistentBool; + public bool extra; public List groupWalls; public BreakableWallItem( string name, string sceneName, string gameObject, string fsmType, string persistentBool, - string sprite, List groupWalls + string sprite, bool extra, List groupWalls ) { this.name = name; @@ -26,11 +27,12 @@ public BreakableWallItem( this.gameObject = gameObject; this.fsmType = fsmType; this.persistentBool = persistentBool; + this.extra = extra; this.groupWalls = groupWalls; UIDef = new MsgUIDef() { name = new BoxedString(name.Replace("_", " ").Replace("-", " - ")), - shopDesc = new BoxedString(""), + shopDesc = GenerateShopDescription(), sprite = new WallSprite(sprite) }; tags = [BreakableWallItemTag()]; @@ -46,6 +48,8 @@ private InteropTag BreakableWallItemTag() sprite = "wood_plank_02"; if (name.StartsWith("Dive_Floor-") || name.StartsWith("Dive_Group")) sprite = "break_floor_glass"; + if (name.StartsWith("Collapser-") || name.StartsWith("Collapser_Group")) + sprite = "collapser_short_0deg"; InteropTag tag = new(); tag.Properties["ModSource"] = "BreakableWallRandomizer"; @@ -55,21 +59,80 @@ private InteropTag BreakableWallItemTag() return tag; } + public BoxedString GenerateShopDescription() + { + string[] descriptions = { + "What am I supposed to put in this description? It's a wall.", + "Truly one of the walls of all time.", + "Quite possibly my most favouritest wall in the game.", + "Quite possibly my least favouritest wall in the game.", + "Call in Bob the Builder. He won't fix it, he'll break it.", + "Donate to Menderbug so that he can have a day off and break a wall instead of fixing one.", + "This is probably the most important wall in the game.", + "This is probably just another useless shortcut wall. Still...", + "Fun fact: this mod adds exactly X breakable wall checks, and even more dive floor checks!", + "Yes, you might need to do four Pantheons to break that one wall.", + "Writing shop descriptions for these things is kinda hard.", + "Vague and non-specific description somehow tangentially related to walls goes here.", + "I bet you don't even know where this one is, do you?", + "Wall is love, baby don't hurt me, don't hurt me, no more.", + "This wall is begging to be shattered. Do it for the thrill.", + "Behind this wall lies a mystery waiting to be uncovered. Unless there isn't.", + "I'm pretty sure the wall won't see this one coming.", + "This wall was asking for it. I just answered the call.", + "Rumour has it that breaking this wall will bring good luck. Worth a shot, right?", + "This wall is a roadblock on the path to victory. It's time to remove it.", + "Maybe, if you run really fast at this wall, it'll just let you through instead?", + "Hey kid, wanna buy some cracks?", + "This one's definitely the one you've been looking for. Trust me, I checked.", + "All craftsmanship is of the lowest quality.", + "Menderbug has been trying to get his hands on this one for years!", + "I'm sure this is the one wall you need for Myla's shop.", + "Is this even a wall? Or is it a plank? Or is it a dive floor? Or is it a collapser? You know, I do not.", + "Don't look at me, I'm just a description.", + "There are 56 rock walls in the game.", + "There are 51 wooden planks in the game.", + "There are 45 dive floors in the game.", + "There are many collapsers in the game.", + + "Dearest Homothety (AKA \"Moth\") (AKA \"Randoman\"): I am writing to inform you of a glaring error in your randomization algorithm for the game Hollow Knight. Though I was assured that the item locations were random, and indeed was swayed by your very name, there was not one but TWO so-called \"vanilla\" locations. Please, I implore you, fix your game.", + "I'll cast some Bad Magic to break this wall for ya -- for a small fee.", + "Bring in a Sock Mower to mow down this wall. What even *is* a Sockmower?", + "FlibberZERO this wall.", + "You Onrywon't be seeing this wall any more after you purchase this product.", + "You can thank Bentechy66 for this wall even being a thing by breaking it.", + "Broken walls are no longer hard as a GlowSTONEtrees. They're transparent.", + "The road to Roma 337 walls contains.", + "Nerthul salutes you and encourages you to spend geo on this and hope for the best.", + + "Hot Loading Screen Tip: Walls which you've unlocked, but haven't checked, will be transparent. You can walk through them!", + "Hot Loading Screen Tip: If Group Walls are enabled, you can walk through any walls in that room if the item's obtained.", + "Hot Loading Screen Tip: If Group Walls are enabled, breaking any wall in that room will grant you the group's check.", + "Hot Loading Screen Tip: Breakable Walls in the white palace follow the WP Rando setting.", + "Hot Loading Screen Tip: There's a miner, looking for shiny stuff behind walls and will reward you for breaking them.", + "Hot Loading Screen Tip: They say a fluke thing who sells junk might accept your wall credit card.", + "Hot Loading Screen Tip: Breakable Walls in the Abyssal Temple follow the Abyssal Temple Rando setting." + }; + + System.Random rng = new(); + return new BoxedString(descriptions[rng.Next(0, descriptions.Length)]); + } + public override void GiveImmediate(GiveInfo info) { // Set data in the save to indicate we got the wall - if (name.StartsWith("Wall_Group") || name.StartsWith("Plank_Group") || name.StartsWith("Dive_Group")) + if (name.StartsWith("Wall_Group") || name.StartsWith("Plank_Group") || name.StartsWith("Dive_Group") || name.StartsWith("Collapser_Group")) { foreach (CondensedWallObject wall in groupWalls) { - if (!BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(wall.name)) - BreakableWallModule.Instance.UnlockedBreakableWalls.Add(wall.name); if (wall.name.StartsWith("Wall") && !BreakableWallModule.Instance.UnlockedWalls.Contains(name)) BreakableWallModule.Instance.UnlockedWalls.Add(wall.name); if (wall.name.StartsWith("Plank") && !BreakableWallModule.Instance.UnlockedPlanks.Contains(name)) BreakableWallModule.Instance.UnlockedPlanks.Add(wall.name); if (wall.name.StartsWith("Dive_Floor") && !BreakableWallModule.Instance.UnlockedDives.Contains(name)) BreakableWallModule.Instance.UnlockedDives.Add(wall.name); + if (name.StartsWith("Collapser") && !BreakableWallModule.Instance.UnlockedCollapsers.Contains(name)) + BreakableWallModule.Instance.UnlockedCollapsers.Add(name); // If we're already in the same scene as the wall, break it. if (GameManager.instance.sceneName == wall.sceneName) @@ -78,23 +141,29 @@ public override void GiveImmediate(GiveInfo info) } else { - if (!BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(name)) - BreakableWallModule.Instance.UnlockedBreakableWalls.Add(name); if (name.StartsWith("Wall") && !BreakableWallModule.Instance.UnlockedWalls.Contains(name)) BreakableWallModule.Instance.UnlockedWalls.Add(name); if (name.StartsWith("Plank") && !BreakableWallModule.Instance.UnlockedPlanks.Contains(name)) BreakableWallModule.Instance.UnlockedPlanks.Add(name); if (name.StartsWith("Dive_Floor") && !BreakableWallModule.Instance.UnlockedDives.Contains(name)) BreakableWallModule.Instance.UnlockedDives.Add(name); - - // If we're already in the same scene as the wall, break it. - if (GameManager.instance.sceneName == sceneName) - GameObject.Find(gameObject).LocateMyFSM(fsmType).SetState("BreakSameScene"); + if (name.StartsWith("Collapser") && !BreakableWallModule.Instance.UnlockedCollapsers.Contains(name)) + BreakableWallModule.Instance.UnlockedCollapsers.Add(name); } - if (persistentBool != "") - PlayerData.instance.SetBool(persistentBool, true); - BreakableWallModule.Instance.CompletedChallenges(); + foreach (CondensedWallObject wall in groupWalls) + { + if (!BreakableWallModule.Instance.UnlockedBreakables.Contains(wall.name)) + BreakableWallModule.Instance.UnlockedBreakables.Add(wall.name); + if (GameManager.instance.sceneName == wall.sceneName) + GameObject.Find(wall.gameObject).LocateMyFSM(wall.fsmType).SetState("BreakSameScene"); + } + if (!BreakableWallModule.Instance.UnlockedBreakables.Contains(name)) + BreakableWallModule.Instance.UnlockedBreakables.Add(name); + if (persistentBool != "") + PlayerData.instance.SetBool(persistentBool, true); + + BreakableWallModule.Instance.CompletedChallenges(); } } } diff --git a/IC/Shop/BreakableCost.cs b/IC/Shop/BreakableCost.cs index 32b7c3a..0b254f1 100644 --- a/IC/Shop/BreakableCost.cs +++ b/IC/Shop/BreakableCost.cs @@ -26,4 +26,12 @@ public override void OnPay() { } public override bool HasPayEffects() => false; public override string GetCostText() => $"{amount} dive floors"; } + + public sealed record CollapserCost(int amount) : Cost + { + public override bool CanPay() => BreakableWallModule.Instance.UnlockedCollapsers.Count >= amount; + public override void OnPay() { } + public override bool HasPayEffects() => false; + public override string GetCostText() => $"{amount} collapser floors"; + } } \ No newline at end of file diff --git a/IC/Shop/BreakableCostDisplayer.cs b/IC/Shop/BreakableCostDisplayer.cs index 07d8157..699d9bd 100644 --- a/IC/Shop/BreakableCostDisplayer.cs +++ b/IC/Shop/BreakableCostDisplayer.cs @@ -16,6 +16,8 @@ protected override bool SupportsCost(Cost c) return c is PlankCost; if (cost == "Dive") return c is DiveCost; + if (cost == "Collapser") + return c is CollapserCost; return false; } protected override int GetSingleCostDisplayAmount(Cost c) @@ -26,6 +28,8 @@ protected override int GetSingleCostDisplayAmount(Cost c) return ((PlankCost)c).amount; if (cost == "Dive") return ((DiveCost)c).amount; + if (cost == "Collapser") + return ((CollapserCost)c).amount; return 0; } } diff --git a/IC/Shop/CostSupport.cs b/IC/Shop/CostSupport.cs index 7a319fa..0bf2c1e 100644 --- a/IC/Shop/CostSupport.cs +++ b/IC/Shop/CostSupport.cs @@ -11,7 +11,7 @@ public CostDisplayer GetDisplayer(Cost c) public bool MatchesCost(Cost c) { - return c is WallCost && displayer == "Wall" || c is PlankCost && displayer == "Plank" || c is DiveCost && displayer == "Dive"; + return c is WallCost && displayer == "Wall" || c is PlankCost && displayer == "Plank" || c is DiveCost && displayer == "Dive" || c is CollapserCost && displayer == "Collapser"; } } } \ No newline at end of file diff --git a/IC/ShopLocation.cs b/IC/ShopLocation.cs index 5ac64a2..38596fd 100644 --- a/IC/ShopLocation.cs +++ b/IC/ShopLocation.cs @@ -22,7 +22,8 @@ public WallShop() Displayers = [ new WallCostSupport("Wall", "mine_break_wall_03_0deg"), new WallCostSupport("Plank", "wood_plank_02"), - new WallCostSupport("Dive", "break_floor_glass") + new WallCostSupport("Dive", "break_floor_glass"), + new WallCostSupport("Collapser", "collapser_short_0deg") ] }; tags = [ShopTag()]; diff --git a/IC/BreakableWallLocation.cs b/IC/WallLocation.cs similarity index 85% rename from IC/BreakableWallLocation.cs rename to IC/WallLocation.cs index 7ebca5d..3d3e77a 100644 --- a/IC/BreakableWallLocation.cs +++ b/IC/WallLocation.cs @@ -18,11 +18,11 @@ public class BreakableWallLocation : AutoLocation public string objectName; public string fsmType; public List alsoDestroy; - public bool exit; public List groupWalls; + public string pinType; public BreakableWallLocation( string name, string sceneName, string objectName, string fsmType, List alsoDestroy, - float x, float y, bool exit, List groupWalls + float x, float y, List groupWalls, string pinType = "Map" ) { this.name = name; @@ -30,8 +30,8 @@ public BreakableWallLocation( this.objectName = objectName; this.fsmType = fsmType; this.alsoDestroy = alsoDestroy; - this.exit = exit; this.groupWalls = groupWalls; + this.pinType = pinType; flingType = FlingType.DirectDeposit; tags = [BreakableWallLocationTag(x, y)]; } @@ -46,9 +46,9 @@ private InteropTag BreakableWallLocationTag(float x, float y) sprite = "wood_plank_02"; if (name.StartsWith("Dive_Floor-") || name.StartsWith("Dive_Group")) sprite = "break_floor_glass"; - - // Replace map name for pinless-maps - string mapSceneName = sceneName; + if (name.StartsWith("Collapser-") || name.StartsWith("Collapser_Group")) + sprite = "collapser_short_0deg"; + Dictionary sceneOverride = []; sceneOverride.Add("Deepnest_45_v02", "Deepnest_39"); sceneOverride.Add("Deepnest_Spider_Town", "Deepnest_10"); @@ -60,20 +60,22 @@ private InteropTag BreakableWallLocationTag(float x, float y) sceneOverride.Add("Room_Colosseum_Spectate", "Deepnest_East_09"); sceneOverride.Add("Room_Fungus_Shaman", "Fungus3_44"); sceneOverride.Add("Room_GG_Shortcut", "GG_Waterways"); + sceneOverride.Add("White_Palace_02", "Abyss_05"); sceneOverride.Add("White_Palace_06", "Abyss_05"); sceneOverride.Add("White_Palace_09", "Abyss_05"); sceneOverride.Add("White_Palace_12", "Abyss_05"); sceneOverride.Add("White_Palace_15", "Abyss_05"); - - if (sceneOverride.ContainsKey(sceneName)) - mapSceneName = sceneOverride[sceneName]; + sceneOverride.Add("White_Palace_17", "Abyss_05"); InteropTag tag = new(); tag.Properties["ModSource"] = "BreakableWallRandomizer"; tag.Properties["PoolGroup"] = $"{name.Split('-')[0].Replace('_', ' ')}s"; tag.Properties["PinSprite"] = new WallSprite(sprite); tag.Properties["VanillaItem"] = name; - tag.Properties["MapLocations"] = new (string, float, float)[] {(mapSceneName, x, y)}; + string mapSceneName = sceneName; + if (sceneOverride.ContainsKey(sceneName)) + mapSceneName = sceneOverride[sceneName]; + tag.Properties[pinType == "World" ? "WorldMapLocations" : "MapLocations"] = new (string, float, float)[] {(mapSceneName, x, y)}; tag.Message = "RandoSupplementalMetadata"; return tag; } @@ -111,68 +113,16 @@ protected override void OnUnload() } } - private void MakeWallPassable(GameObject go, bool destroy) - { - foreach (var objectName in alsoDestroy) - { - try - { - var obj = GameObject.Find(objectName); - GameObject.Destroy(obj); - } catch - { - BreakableWallRandomizer.Instance.LogWarn($"{objectName} not found."); - } - } - Recursive_MakeWallPassable(go, destroy); - } - - // Recursively set all colliders as triggers on a given gameObject. - // Also recursively set any SpriteRenderers on a given gameObject to 0.5 alpha. - // Also remove any object called "Camera lock" or any textures beginning with msk_. - private void Recursive_MakeWallPassable(GameObject go, bool destroy) + private void ModifyWallBehaviour(PlayMakerFSM fsm) { - foreach (var collider in go.GetComponents()) - { - // Triggers can still be hit by a nail, but won't impede player movement. - collider.isTrigger = true; - } - - // Make sprites transparent - foreach (var sprite in go.GetComponents()) + try { - Color tmp = sprite.color; - if (fsmType == "Detect Quake" || fsmType == "quake_floor") - { - tmp.a = 0.4f; - } else - { - tmp.a = 0.5f; - } - sprite.color = tmp; - - if (sprite.sprite && sprite.sprite.name.StartsWith("msk")) - { - sprite.enabled = false; - } - } - if (go.name.Contains("Camera") || go.name.Contains("Mask")) - { - GameObject.Destroy(go); + Vector3 coordinates = GameObject.Find(objectName).transform.position; + BreakableWallRandomizer.Instance.Log($"{name} - ({coordinates.x}, {coordinates.y})"); } - - for (var i = 0; i < go.transform.childCount; i++) - { - MakeWallPassable(go.transform.GetChild(i).gameObject, destroy); - if (destroy) - GameObject.Destroy(go); - } - } - - private void ModifyWallBehaviour(PlayMakerFSM fsm) - { + catch + {} List wallList = []; - if (groupWalls.Count > 0) { foreach (CondensedWallObject wallObject in groupWalls) @@ -194,6 +144,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) "Detect Quake" => "Detect", + "Break" => "Detect", + _ => "Idle" }; @@ -223,7 +175,7 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) // Shade Soul Shortcut is the only example of a two-way wall that can be accessed from both sides but // destroyed only from one of them. TC made stuff happen to prevent players from destroying it from // the left end - behaviour we'll preserve but only if the item isn't obtained. - if (wall.name == "Wall-Shade_Soul_Shortcut" && BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(wall.name)) + if (wall.name == "Wall-Shade_Soul_Shortcut" && BreakableWallModule.Instance.UnlockedBreakables.Contains(wall.name)) { fsm.ChangeTransition("Activated?", "ACTIVATE", "Initiate"); fsm.ChangeTransition("Activated?", "FINISHED", "Initiate"); @@ -245,9 +197,13 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) var newCollider = fsm.gameObject.AddComponent(); newCollider.offset = collider.offset; newCollider.size = collider.size; - } else if (wall.fsmType == "Detect Quake") + } else if (wall.fsmType == "Detect Quake" || wall.name == "Collapser-Deepnest_Entrance_Trap") { fsm.ChangeTransition("Init", "ACTIVATE", "Detect"); + } else if (wall.fsmType == "collapse small") + { + // Ensure the "Idle" state has the correct transition for BREAK + fsm.RemoveTransition("Idle", "ACTIVATE"); } // If the wall item had been obtained when calling GiveItem, destroy the wall on trigger. @@ -271,14 +227,17 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) Placement.AddVisitFlag(VisitState.Opened); }); fsm.AddAction("GiveItem", new CustomFsmBooleanCheck( - BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(wall.name), "OBTAINED", "" + BreakableWallModule.Instance.UnlockedBreakables.Contains(wall.name), "OBTAINED", "" )); fsm.AddTransition("GiveItem", "OBTAINED", originalBreakStateName); // If we already unlocked this wall, make it passable or destroy it. - if (BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(wall.name)) + if (BreakableWallModule.Instance.UnlockedBreakables.Contains(wall.name)) { - MakeWallPassable(fsm.gameObject, Placement.AllObtained()); + if (wall.fsmType == "collapse small") + fsm.AddFirstAction("Idle", new SetTriggerCollider()); + if (wall.fsmType != "Break") + MakeWallPassable(fsm.gameObject, Placement.AllObtained()); } else // If we didn't unlock this door yet... @@ -305,6 +264,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) fsm.AddState("BreakSameScene"); // In any of the cases, the wall is expected to become passable. + if (wall.fsmType == "collapse small") + fsm.AddAction("BreakSameScene", new SetTriggerCollider()); fsm.AddCustomAction("BreakSameScene", () => { MakeWallPassable(fsm.gameObject, Placement.AllObtained()); @@ -327,13 +288,14 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) fsm.ChangeTransition("Idle", "WALL BREAKER", "GiveItem"); fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); - } - else if (wall.fsmType == "FSM") + } else if (wall.fsmType == "FSM" && wall.name != "Wall-QG_Glass") { fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); - } - else if (wall.fsmType == "break_floor") + } else if (wall.name == "Wall-QG_Glass") + { + fsm.ChangeTransition("No Rotate Check", "FINISHED", "GiveItem"); + } else if (wall.fsmType == "break_floor") { fsm.ChangeTransition("Hit", "HIT 3", "GiveItem"); } else if (wall.fsmType == "quake_floor") @@ -342,13 +304,75 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) } else if (wall.fsmType == "Detect Quake") { fsm.ChangeTransition("Quake Hit", "FINISHED", "GiveItem"); + } else if (wall.fsmType == "collapse small") { + fsm.ChangeTransition("Split", "FINISHED", "GiveItem"); + } else if (wall.fsmType == "Break") { + fsm.ChangeTransition("Check", "FINISHED", "GiveItem"); } } } + public void MakeWallPassable(GameObject go, bool destroy) + { + foreach (var objectName in alsoDestroy) + { + try + { + var obj = GameObject.Find(objectName); + GameObject.Destroy(obj); + } catch + { + BreakableWallRandomizer.Instance.LogWarn($"{objectName} not found."); + } + } + MakeChildrenPassable(go, destroy); + } + + // Recursively set all colliders as triggers on a given gameObject. + // Also recursively set any SpriteRenderers on a given gameObject to 0.5 alpha. + // Also remove any object called "Camera lock" or any textures beginning with msk_. + private void MakeChildrenPassable(GameObject go, bool destroy) + { + // Make sprites transparent + foreach (var sprite in go.GetComponents()) + { + Color tmp = sprite.color; + if (fsmType == "Detect Quake" || fsmType == "quake_floor" || fsmType == "collapse small") + { + tmp.a = 0.4f; + } else + { + tmp.a = 0.5f; + } + sprite.color = tmp; + + if (sprite.sprite && sprite.sprite.name.StartsWith("msk")) + { + sprite.enabled = false; + } + } + if (go.name.Contains("Camera") || go.name.Contains("Mask")) + { + GameObject.Destroy(go); + } + + for (var i = 0; i < go.transform.childCount; i++) + { + MakeWallPassable(go.transform.GetChild(i).gameObject, destroy); + if (destroy) + GameObject.Destroy(go); + } + + foreach (var collider in go.GetComponents()) + { + // Triggers can still be hit by a nail, but won't impede player movement. + collider.isTrigger = true; + } + } + private void ManageKPCollapse(PlayMakerFSM fsm) { - if (BreakableWallModule.Instance.UnlockedBreakableWalls.Contains(name)) + if (BreakableWallModule.Instance.UnlockedBreakables.Contains(name)) { fsm.ChangeTransition("Init", "FINISHED", "Activate"); } diff --git a/IC/WallObject.cs b/IC/WallObject.cs index 1c59c1c..307e202 100644 --- a/IC/WallObject.cs +++ b/IC/WallObject.cs @@ -15,9 +15,10 @@ public class WallObject public string persistentBool; public string sprite; public List alsoDestroy; - public bool exit; + public bool extra; public string group; public List groupWalls; + public string pinType; public string logic; public Dictionary logicOverrides; public Dictionary> logicSubstitutions; @@ -45,4 +46,4 @@ public class ConnectionLogicObject public string logicOverride; public Dictionary logicSubstitutions; } -} +} \ No newline at end of file diff --git a/Interop/FStats.cs b/Interop/FStats.cs index 2560d6d..6a7b076 100644 --- a/Interop/FStats.cs +++ b/Interop/FStats.cs @@ -34,9 +34,9 @@ private static void GenerateStats(Action generateStats) using Stream stream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.BreakableWallObjects.json"); StreamReader reader = new(stream); - List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); + List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); BreakableWallModule module = BreakableWallModule.Instance; - foreach (WallObject wall in wallList) + foreach (BreakableWallItem wall in wallList) module.vanillaWalls.Add(new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType)); } } diff --git a/Interop/MoreLocations.cs b/Interop/MoreLocations.cs index 002e847..e32fa72 100644 --- a/Interop/MoreLocations.cs +++ b/Interop/MoreLocations.cs @@ -14,6 +14,7 @@ public static void Hook() ConnectionInterop.AddRandoCostProviderToJunkShop(IncludeWalls, WallCostProvider); ConnectionInterop.AddRandoCostProviderToJunkShop(IncludePlanks, PlankCostProvider); ConnectionInterop.AddRandoCostProviderToJunkShop(IncludeDives, DiveCostProvider); + ConnectionInterop.AddRandoCostProviderToJunkShop(IncludeCollapsers, CollapserCostProvider); } private static bool IncludeWalls() { bool include = BWR_Manager.Settings.Enabled && BWR_Manager.Settings.MylaShop.Enabled && BWR_Manager.Settings.MylaShop.IncludeInJunkShop; @@ -27,9 +28,14 @@ private static bool IncludeDives() { bool include = BWR_Manager.Settings.Enabled && BWR_Manager.Settings.MylaShop.Enabled && BWR_Manager.Settings.MylaShop.IncludeInJunkShop; return include && (BWR_Manager.Settings.MylaShop.IncludeVanillaItems || BWR_Manager.Settings.DiveFloors); } + private static bool IncludeCollapsers() { + bool include = BWR_Manager.Settings.Enabled && BWR_Manager.Settings.MylaShop.Enabled && BWR_Manager.Settings.MylaShop.IncludeInJunkShop; + return include && (BWR_Manager.Settings.MylaShop.IncludeVanillaItems || BWR_Manager.Settings.Collapsers); + } private static WallCostProvider WallCostProvider() => new(); private static PlankCostProvider PlankCostProvider() => new(); private static DiveCostProvider DiveCostProvider() => new(); + private static CollapserCostProvider CollapserCostProvider() => new(); } public class WallCostProvider : ICostProvider @@ -76,4 +82,19 @@ public LogicCost Next(LogicManager lm, Random rng) public void PreRandomize(Random rng) { } } + + internal class CollapserCostProvider : ICostProvider + { + public bool HasNonFreeCostsAvailable => true; + + public LogicCost Next(LogicManager lm, Random rng) + { + int wallCount = BWR_Manager.TotalCollapsers; + int minCost = (int)(wallCount * BWR_Manager.Settings.MylaShop.MinimumCost); + int maxCost = (int)(wallCount * BWR_Manager.Settings.MylaShop.MaximumCost); + return new WallLogicCost(lm.GetTermStrict("Broken_Collapsers"), rng.Next(minCost, maxCost), amount => new CollapserCost(amount)); + } + + public void PreRandomize(Random rng) { } + } } \ No newline at end of file diff --git a/Manager/ItemHandler.cs b/Manager/ItemHandler.cs index d1ae77c..840fe0c 100644 --- a/Manager/ItemHandler.cs +++ b/Manager/ItemHandler.cs @@ -37,6 +37,7 @@ private static void DefineGroups(RequestBuilder rb) int wallSettings = BWR_Manager.Settings.RockWallGroup; int plankSettings = BWR_Manager.Settings.WoodenPlankWallGroup; int diveSettings = BWR_Manager.Settings.DiveFloorGroup; + int collapserSettings = BWR_Manager.Settings.CollapserGroup; if (rb.gs.SplitGroupSettings.RandomizeOnStart && wallSettings >= 0 && wallSettings <= 2) { @@ -50,10 +51,15 @@ private static void DefineGroups(RequestBuilder rb) { diveSettings = rb.rng.Next(3); } + if (rb.gs.SplitGroupSettings.RandomizeOnStart && collapserSettings >= 0 && collapserSettings <= 2) + { + collapserSettings = rb.rng.Next(3); + } ItemGroupBuilder wallGroup = null; ItemGroupBuilder plankGroup = null; ItemGroupBuilder diveGroup = null; + ItemGroupBuilder collapserGroup = null; if (wallSettings > 0) { @@ -76,12 +82,21 @@ private static void DefineGroups(RequestBuilder rb) if (diveSettings > 0) { try - { + { diveGroup = rb.MainItemStage.AddItemGroup(RBConsts.SplitGroupPrefix + diveSettings); } catch (ArgumentException) {} } + if (collapserSettings > 0) + { + try + { + collapserGroup = rb.MainItemStage.AddItemGroup(RBConsts.SplitGroupPrefix + collapserSettings); + } + catch (ArgumentException) {} + } + foreach (ItemGroupBuilder igb in rb.EnumerateItemGroups()) { if (igb.label == RBConsts.SplitGroupPrefix + wallSettings) @@ -125,6 +140,12 @@ bool ResolveGroups(RequestBuilder rb, string item, RequestBuilder.ElementType ty return true; } + if ((item.StartsWith("Collapser-") || item.StartsWith("Collapser_Group-")) && collapserGroup != null) + { + gb = collapserGroup; + return true; + } + gb = default; return false; } @@ -177,6 +198,8 @@ private static void RandomizeShopCost(RequestBuilder builder) availableTerms.Add("Planks"); if (BWR_Manager.Settings.MylaShop.IncludeVanillaItems || BWR_Manager.Settings.DiveFloors) availableTerms.Add("Dives"); + if (BWR_Manager.Settings.MylaShop.IncludeVanillaItems || BWR_Manager.Settings.Collapsers) + availableTerms.Add("Collapsers"); for (int i = 0; i < rng.Next(1, 1 + availableTerms.Count); i++) { int termNo = rng.Next(availableTerms.Count); @@ -206,6 +229,15 @@ private static void RandomizeShopCost(RequestBuilder builder) usedTerms.Add("Dives"); rl.AddCost(new WallLogicCost(lm.GetTermStrict("Broken_Dive_Floors"), rng.Next(minCost, maxCost), amount => new DiveCost(amount))); } + + if (availableTerms.IndexOf("Collapsers") == termNo && !usedTerms.Contains("Collapsers")) // Collapsers + { + int wallCount = BWR_Manager.TotalCollapsers; + int minCost = Math.Max((int)(wallCount * BWR_Manager.Settings.MylaShop.MinimumCost), 1); + int maxCost = Math.Max((int)(wallCount * BWR_Manager.Settings.MylaShop.MaximumCost), 1); + usedTerms.Add("Collapsers"); + rl.AddCost(new WallLogicCost(lm.GetTermStrict("Broken_Collapsers"), rng.Next(minCost, maxCost), amount => new CollapserCost(amount))); + } } }; }); @@ -242,17 +274,16 @@ private static void AddWalls(RequestBuilder rb) using Stream stream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.BreakableWallObjects.json"); StreamReader reader = new(stream); List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); - bool useGroups = BWR_Manager.Settings.GroupTogetherNearbyWalls; + bool useGroups = BWR_Manager.Settings.GroupWalls; foreach (WallObject wall in wallList) { bool include = wall.name.StartsWith("Wall") && BWR_Manager.Settings.RockWalls; - include = include || (wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks); - include = include || (wall.name.StartsWith("Dive_Floor") && BWR_Manager.Settings.DiveFloors); + include |= wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks; + include |= wall.name.StartsWith("Dive_Floor") && BWR_Manager.Settings.DiveFloors; + include |= wall.name.StartsWith("Collapser") && BWR_Manager.Settings.Collapsers; if (wall.name.Contains("White_Palace") || wall.name.Contains("Path_of_Pain")) include = include && rb.gs.LongLocationSettings.WhitePalaceRando != LongLocationSettings.WPSetting.ExcludeWhitePalace; - if (wall.name.Contains("King's_Pass")) - include = BWR_Manager.Settings.KingsPass; - include = include && !(wall.exit && BWR_Manager.Settings.ExcludeWallsWhichMaySoftlockYou); + //include = include && (!wall.extra || BWR_Manager.Settings.ExtraWalls); include = include && (!(wall.name.Contains("Godhome") || wall.name.Contains("Eternal_Ordeal")) || BWR_Manager.Settings.GodhomeWalls); if (include) @@ -301,13 +332,12 @@ private static void AddWalls(RequestBuilder rb) if (wall.group == group.name.Split('-')[1]) { bool include = wall.name.StartsWith("Wall") && BWR_Manager.Settings.RockWalls; - include = include || (wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks); - include = include || (wall.name.StartsWith("Dive_Floor") && BWR_Manager.Settings.DiveFloors); + include |= wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks; + include |= wall.name.StartsWith("Dive_Floor") && BWR_Manager.Settings.DiveFloors; + include |= wall.name.StartsWith("Collapser") && BWR_Manager.Settings.Collapsers; if (wall.name.Contains("White_Palace") || wall.name.Contains("Path_of_Pain")) include = include && rb.gs.LongLocationSettings.WhitePalaceRando != LongLocationSettings.WPSetting.ExcludeWhitePalace; - if (wall.name.Contains("Tutorial")) - include = include && BWR_Manager.Settings.KingsPass; - include = include && !(wall.exit && BWR_Manager.Settings.ExcludeWallsWhichMaySoftlockYou); + //include = include && (!wall.extra || BWR_Manager.Settings.ExtraWalls); if (include) group.groupWalls.Add(new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType)); } @@ -315,8 +345,8 @@ private static void AddWalls(RequestBuilder rb) if (group.groupWalls.Count > 0) { - BreakableWallItem groupItem = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.persistentBool, group.sprite, group.groupWalls); - BreakableWallLocation groupLocation = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.alsoDestroy, group.x, group.y, group.exit, group.groupWalls); + BreakableWallItem groupItem = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.persistentBool, group.sprite, group.extra, group.groupWalls); + BreakableWallLocation groupLocation = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.alsoDestroy, group.x, group.y, group.groupWalls); // By default, the items are defined with empty group walls, so they need to be redefined. Finder.UndefineCustomItem(group.name); @@ -370,6 +400,11 @@ private static void AddTolerance(LogicManager lm, GenerationSettings gs, Progres int diveCost = Math.Max((int)(diveCount * BWR_Manager.Settings.MylaShop.MaximumCost), 1); int diveTolerance = Math.Min((int)(diveCost * BWR_Manager.Settings.MylaShop.Tolerance), diveCount - diveCost); pi.Setters.Add(new RandomizerCore.TermValue(lm.GetTermStrict("Broken_Dive_Floors"), -diveTolerance)); + + int collapserCount = BWR_Manager.TotalCollapsers; + int collapserCost = Math.Max((int)(collapserCount * BWR_Manager.Settings.MylaShop.MaximumCost), 1); + int collapserTolerance = Math.Min((int)(collapserCost * BWR_Manager.Settings.MylaShop.Tolerance), collapserCount - collapserCost); + pi.Setters.Add(new RandomizerCore.TermValue(lm.GetTermStrict("Broken_Collapsers"), -collapserTolerance)); } private static void AddFileSettings(LogArguments args, TextWriter tw) diff --git a/Manager/LogicHandler.cs b/Manager/LogicHandler.cs index 3d2692a..74cfdc2 100644 --- a/Manager/LogicHandler.cs +++ b/Manager/LogicHandler.cs @@ -2,10 +2,12 @@ using System.IO; using System.Reflection; using BreakableWallRandomizer.IC; +using ItemChanger; using Newtonsoft.Json; using RandomizerCore.Json; using RandomizerCore.Logic; using RandomizerCore.StringItems; +using RandomizerMod.Menu; using RandomizerMod.RC; using RandomizerMod.Settings; @@ -15,10 +17,32 @@ internal static class LogicHandler { internal static void Hook() { + RandomizerMenuAPI.OnGenerateStartLocationDict += FixStartLogic; RCData.RuntimeLogicOverride.Subscribe(1f, ApplyLogic); RCData.RuntimeLogicOverride.Subscribe(99999f, LogicPatch); } - + private static void FixStartLogic(Dictionary startDefs) + { + List keys = new (startDefs.Keys); + bool planks = BWR_Manager.Settings.Enabled && BWR_Manager.Settings.WoodenPlanks; + bool collapsers = BWR_Manager.Settings.Enabled && BWR_Manager.Settings.Collapsers; + foreach (var startName in keys) + { + var start = startDefs[startName]; + // Mawlek start with collapsers requires Shade Skips. + if (start.SceneName == SceneNames.Crossroads_36 && collapsers) + startDefs[startName] = start with {RandoLogic = "SHADESKIPS"}; + // Blue Lake start with Planks has two reachable checks (Salubra). Remove unless transition rando is on. + if (start.SceneName == SceneNames.Crossroads_50 && planks) + startDefs[startName] = start with {RandoLogic = "MAPAREARANDO | FULLAREARANDO | ROOMRANDO"}; + // East Fog Canyon with Planks is a terrible spot with only 1 available check four rooms away. Remove unless Room Rando. + if (start.SceneName == SceneNames.Fungus3_25) + startDefs[startName] = start with {RandoLogic = "ROOMRANDO"}; + // West Waterways is impossible if Collapsers are on + if (start.SceneName == SceneNames.Waterways_09 && collapsers) + startDefs[startName] = start with {RandoLogic = "FALSE"}; + } + } private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) { if (!BWR_Manager.Settings.Enabled) @@ -37,13 +61,19 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) lmb.GetOrAddTerm("Broken_Walls"); lmb.GetOrAddTerm("Broken_Planks"); lmb.GetOrAddTerm("Broken_Dive_Floors"); + lmb.GetOrAddTerm("Broken_Collapsers"); lmb.AddLogicDef(new("Myla_Shop", "(Crossroads_45[left1] | Crossroads_45[right1]) + LISTEN?TRUE")); + // Iterate twice - once to define all items, next to add their logic defs. foreach (WallObject wall in wallList) { lmb.GetOrAddTerm(wall.name); lmb.AddItem(new StringItemTemplate(wall.name, $"Broken_{wall.name.Split('-')[0]}s++ >> {wall.name}++")); + } + + foreach (WallObject wall in wallList) + { lmb.AddLogicDef(new(wall.name, wall.logic)); foreach(var logicOverride in wall.logicOverrides) @@ -76,6 +106,7 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) int wallCount = 0; int plankCount = 0; int floorCount = 0; + int collapserCount = 0; foreach (WallObject wall in wallList) { if (wall.group == groupName) @@ -86,6 +117,8 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) plankCount++; if (wall.name.StartsWith("Dive_Floor")) floorCount++; + if (wall.name.StartsWith("Collapser")) + collapserCount++; wallTerms += $"{wall.name}++ >> "; } } @@ -94,7 +127,9 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) if (plankCount > 0) effect += $"Broken_Planks+{(plankCount > 1 ? $"={plankCount}" : '+')} >> "; if (floorCount > 0) - effect += $"Broken_Dive_Floors+{(floorCount > 1 ? $"={floorCount}" : '+')} >> "; + effect += $"Broken_Dive_Floors+{(floorCount > 1 ? $"={floorCount}" : '+')} >> "; + if (collapserCount > 0) + effect += $"Broken_Collapsers+{(floorCount > 1 ? $"={floorCount}" : '+')} >> "; effect += wallTerms; effect = effect.Remove(effect.Length - 4); diff --git a/Manager/Manager.cs b/Manager/Manager.cs index d403652..5d41af8 100644 --- a/Manager/Manager.cs +++ b/Manager/Manager.cs @@ -15,6 +15,7 @@ internal static class BWR_Manager public static int TotalWalls = 56; public static int TotalPlanks = 51; public static int TotalDives = 45; + public static int TotalCollapsers = 58; public static void Hook() { DefineObjects(); @@ -37,8 +38,8 @@ private static void DefineObjects() foreach (WallObject wall in wallList) { - BreakableWallItem wallItem = new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType, wall.persistentBool, wall.sprite, wall.groupWalls); - BreakableWallLocation wallLocation = new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType, wall.alsoDestroy, wall.x, wall.y, wall.exit, wall.groupWalls); + BreakableWallItem wallItem = new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType, wall.persistentBool, wall.sprite, wall.extra, wall.groupWalls); + BreakableWallLocation wallLocation = new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType, wall.alsoDestroy, wall.x, wall.y, wall.groupWalls, wall.pinType); Finder.DefineCustomItem(wallItem); Finder.DefineCustomLocation(wallLocation); } @@ -49,8 +50,8 @@ private static void DefineObjects() foreach (WallObject group in groupList) { - BreakableWallItem groupItem = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.persistentBool, group.sprite, group.groupWalls); - BreakableWallLocation groupLocation = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.alsoDestroy, group.x, group.y, group.exit, group.groupWalls); + BreakableWallItem groupItem = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.persistentBool, group.sprite, group.extra, group.groupWalls); + BreakableWallLocation groupLocation = new(group.name, group.sceneName, group.gameObject, group.fsmType, group.alsoDestroy, group.x, group.y, group.groupWalls); Finder.DefineCustomItem(groupItem); Finder.DefineCustomLocation(groupLocation); } diff --git a/Modules/BreakableWallModule.cs b/Modules/BreakableWallModule.cs index 5bab8df..753f552 100644 --- a/Modules/BreakableWallModule.cs +++ b/Modules/BreakableWallModule.cs @@ -15,13 +15,13 @@ public class BreakableWallModule : Module public static BreakableWallModule Instance => ItemChangerMod.Modules.GetOrAdd(); public List vanillaWalls = []; // Module properties - public List UnlockedBreakableWalls = []; + public List UnlockedBreakables = []; public List UnlockedWalls = []; public List UnlockedPlanks = []; public List UnlockedDives = []; + public List UnlockedCollapsers = []; public override void Initialize() { - BreakableWallRandomizer.Instance.Log("BWR Module Init"); On.HutongGames.PlayMaker.Actions.ActivateGameObject.OnEnter += VanillaTracker; if (ItemChangerMod.Modules?.Get() is InventoryTracker it) it.OnGenerateFocusDesc += AddWallProgress; @@ -39,6 +39,7 @@ private void AddWallProgress(StringBuilder builder) builder.AppendLine($"Broken walls: {UnlockedWalls.Count}"); builder.AppendLine($"Broken planks: {UnlockedPlanks.Count}"); builder.AppendLine($"Broken dives: {UnlockedDives.Count}"); + builder.AppendLine($"Broken collapsers: {UnlockedCollapsers.Count}"); } private void VanillaTracker(On.HutongGames.PlayMaker.Actions.ActivateGameObject.orig_OnEnter orig, HutongGames.PlayMaker.Actions.ActivateGameObject self) @@ -66,6 +67,8 @@ private void VanillaState(PersistentBoolData data) UnlockedPlanks.Add(wall.name); if (wallType == "Dive_Floor" && !UnlockedDives.Contains(wall.name)) UnlockedDives.Add(wall.name); + if (wallType == "Collapser" && !UnlockedCollapsers.Contains(wall.name)) + UnlockedCollapsers.Add(wall.name); } CompletedChallenges(); } @@ -137,9 +140,11 @@ public void CompletedChallenges() completed.Add("All Planks broken."); if (UnlockedDives.Count == BWR_Manager.TotalDives) completed.Add("All Dive Floors broken."); - if (UnlockedBreakableWalls.Count >= (BWR_Manager.TotalWalls + BWR_Manager.TotalPlanks + BWR_Manager.TotalDives) / 2) + if (UnlockedCollapsers.Count == BWR_Manager.TotalCollapsers) + completed.Add("All Collapsers broken."); + if (UnlockedBreakables.Count >= (BWR_Manager.TotalWalls + BWR_Manager.TotalPlanks + BWR_Manager.TotalDives + BWR_Manager.TotalCollapsers) / 2) completed.Add("Half broken breakables."); - if (UnlockedBreakableWalls.Count == BWR_Manager.TotalWalls + BWR_Manager.TotalPlanks + BWR_Manager.TotalDives) + if (UnlockedBreakables.Count == BWR_Manager.TotalWalls + BWR_Manager.TotalPlanks + BWR_Manager.TotalDives + BWR_Manager.TotalCollapsers) completed.Add("All broken breakables."); OnAchievedBreakableWall?.Invoke(completed); diff --git a/ReadMe.md b/ReadMe.md index 90c10cc..7a25e45 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -10,8 +10,9 @@ Currently randomizes: - Any wall with FSM breakable_wall_v2 or "FSM". These are labeled as "Wall", and are mostly placed in the map hiding scenes or items. - Any wall with FSM break_floor. These are labaled as "Plank", and are mostly placed in the map as shortcut openers. They always have a wooden plank in the map. - Any floor broken by Dive / Descending Dark in the game. These are labeled as "Dive Floor". + - Any collapsing floor, like the trap floors in Deepnest/Beast's Den. These are labeled as "Collapser". -Hitting a wall won't result in it breaking; you'll get an item instead. In order to break the wall, you'll need to find its corresponding item. If you find a wall's item but haven't collected its check yet, it will become translucent and you will be able to walk through it, but still hit it. +Hitting a wall won't result in it breaking; you'll get an item instead. In order to break the wall, you'll need to find its corresponding item. If you find a wall's item but haven't collected its check yet, it will become translucent and you will be able to walk through it, but still hit it. As for collapsers, if the item's obtained, they will be hittable from below and it will break them. There are, however, a few exceptions to the rule: @@ -27,10 +28,9 @@ This setting will include the two walls in the Hall of Gods (both leading to the - Wooden Planks --> Boolean to define if one-way walls should be randomized or not. - Rock Walls --> Boolean to define if standard walls should be randomized or not. - Dive Floors --> Boolean to define if Dive breakable floors should be randomized or not. -- King's Pass --> Boolean to define if King's Pass should be included or not. - Godhome Walls --> Boolean to define if Godhome walls are included or not. -- Exclude walls that might softlock --> This will remove some objects from the pool to avoid forcing benchwarps. -- Group nearby walls --> Transforms a couple breakables into one single check. Obtaining the check makes them all passable, and destroying any of them will grant a single location item. For groups with multiple wall types (mainly Walls + Planks), the vanilla objects will behave normally, and only the randomized objects will follow the group rules. +- Extra Walls --> Boolean to define if additional, small and numerous walls like Ancestral Mound Planks or Hive pillars should be included or not. +- Group Walls --> Transforms all breakable items in all rooms into a single check. For groups with multiple wall types (mainly Walls + Planks or Walls + Collapsers), the vanilla objects will behave normally, and only the randomized objects will follow the group rules. ### Myla Shop - Enabled --> Boolean to define if the Wall Shop should appear or not. @@ -51,4 +51,4 @@ This setting will include the two walls in the Hall of Gods (both leading to the ## Acknowledgements -This is but the tweaking of an already amazing existing mod. So all acknowledgements go to the original author **Bentechy66**, but I'd like to make a special mention to **glowstonetrees** for their Logic Fix injector, which resolved several logic complications the mod originally had and made its reimplementation a lot easier. \ No newline at end of file +This is but the tweaking of an already amazing existing mod. So all acknowledgements go to the original author **Bentechy66**, but I'd like to make a special mention to **glowstonetrees** for their Logic Fix injector, which resolved several logic complications the mod originally had and made its reimplementation a lot easier. Also shoutout to **Roma 337** who has been collaborating with the Collapser definition, interop with Bench Rando and some other logic issues reporting. \ No newline at end of file diff --git a/Resources/Data/BreakableWallObjects.json b/Resources/Data/BreakableWallObjects.json index f36ea81..170206d 100644 --- a/Resources/Data/BreakableWallObjects.json +++ b/Resources/Data/BreakableWallObjects.json @@ -13,7 +13,7 @@ "/Hunter Entry/Blocker", "/Hunter Entry/CameraLockArea B" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_08[left1] + (Plank-Hunter_Upper | Plank-Hunter_Lower + (LEFTCLAW | RIGHTCLAW + WINGS) + HUNTERNOTES>144?FALSE)", @@ -33,7 +33,7 @@ "/Hunter Entry/Blocker", "/Hunter Entry/CameraLockArea B" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_08[left1] + (Plank-Hunter_Upper + Plank-Hunter_Lower | HUNTERNOTES>144?FALSE)", @@ -50,7 +50,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Abyss_03_c[right1] | Abyss_03_c", @@ -68,14 +68,15 @@ "gameObject": "/Breakable Wall", "fsmType": "breakable_wall_v2", "sceneName": "Abyss_05", - "x": 1.5, - "y": -0.4, + "x": 182.95, + "y": 17.93, "persistentBool": "", "sprite": "abyss_break_wall_palace_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "Abyss_05[right1] | Abyss_05", "logicOverrides": { "Abyss_05[right1]": "Abyss_05[right1] | (ORIG) + Wall-Hidden_Station" @@ -98,7 +99,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Abyss_08[right1] + (PRECISEMOVEMENT | LEFTDASH) + (RIGHTSUPERDASH + (RIGHTCLAW | WINGS))) | (Abyss_08[right1] + (PRECISEMOVEMENT | FULLDASH + WINGS) + Plank-Lifeblood_Core)", @@ -120,7 +121,7 @@ "alsoDestroy": [ "/Secret Mask (1)" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Abyss_17[top1] + (ANYCLAW | WINGS | DAMAGEBOOSTS + $TAKEDAMAGE)) + (LEFTCLAW + RIGHTDASH + BACKGROUNDPOGOS + DAMAGEBOOSTS + $TAKEDAMAGE[2] | RIGHTCLAW | WINGS) | (Abyss_17[top1] + Plank-Basin_Pale_Ore)", @@ -139,7 +140,7 @@ "persistentBool": "", "sprite": "infected_knight_break_wall_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Abyss_19[bot1] + (ANYCLAW | WINGS) | Abyss_19[right1] + Plank-Broken_Vessel_Shortcut", @@ -169,7 +170,7 @@ "alsoDestroy": [ "/Breakable Wall/Masks" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "Grimm_Walls", "logic": "(Cliffs_01[right1] | Cliffs_01[right2]) + (Plank-Grimm_Exit | Wall-Grimm_Outer) | Cliffs_01[right4] + Wall-Grimm_Inner", @@ -188,7 +189,7 @@ "alsoDestroy": [ "/Breakable Wall/Masks" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "Grimm_Walls", "logic": "(Cliffs_01[right1] | Cliffs_01[right2] | Cliffs_01[right3] + (ANYCLAW | WINGS | (FULLDASH + ENEMYPOGOS))) + (Plank-Grimm_Exit | Wall-Grimm_Outer) | Cliffs_01[right4]", @@ -207,7 +208,7 @@ "alsoDestroy": [ "/Breakable Wall/Masks" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "Grimm_Walls", "logic": "(Cliffs_01[right1] | Cliffs_01[right2] | Cliffs_01[right3] + (ANYCLAW | WINGS | (FULLDASH + ENEMYPOGOS))) | Cliffs_01[right4] + Wall-Grimm_Inner + (ANYCLAW | Plank-Grimm_Exit + (WINGS | LEFTDASH + ENEMYPOGOS))", @@ -226,7 +227,7 @@ "alsoDestroy": [ "Secret Mask (2)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Cliffs_02[bot1] + (ANYCLAW | WINGS) | (Cliffs_02 + Plank-Cliff's_Pass)", @@ -250,7 +251,7 @@ "persistentBool": "", "sprite": "gg_break_wall_nailsmith_269deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins1_04[bot1] | Ruins1_04[right1] + Plank-Nailsmith", @@ -271,16 +272,17 @@ "gameObject": "/_Scenery/Break Floor 1", "fsmType": "break_floor", "sceneName": "Crossroads_04", - "x": 0.0, - "y": 0.0, + "x": 66.19, + "y": 14.02, "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_0deg", "alsoDestroy": [ "/Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "((Crossroads_04[top1] | Crossroads_04[left1]) + (Plank-Sly | Defeated_Gruz_Mother)) | Crossroads_04[right1] | Crossroads_04[door_Mender_House] | Crossroads_04[door1] | Crossroads_04[door_charmshop]", "logicOverrides": {}, "logicSubstitutions": { @@ -322,7 +324,7 @@ "alsoDestroy": [ "_Scenery/crossroads_03_mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_03", @@ -343,7 +345,7 @@ "alsoDestroy": [ "break_wall_masks" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_08", @@ -362,7 +364,7 @@ "persistentBool": "", "sprite": "sil_break_wall_01_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_07 + ((RIGHTCLAW | WINGS) + (UPWALLBREAK | Wall-Crossroads_Tall_Room) | MARKOFPRIDE + UPSLASH + OBSCURESKIPS | SCREAM)", @@ -382,7 +384,7 @@ "persistentBool": "", "sprite": "gg_grate_break_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_GG_Shortcut + (SWIM | FULLCLAW + RIGHTSUPERDASH + ACIDSKIPS) | Bench-Hermit's_Approach?FALSE", @@ -399,7 +401,7 @@ "persistentBool": "crossroadsMawlekWall", "sprite": "ancient_wall_pieces_0000_a_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_09[right1] | Crossroads_09[left1] + Defeated_Brooding_Mawlek", @@ -423,7 +425,7 @@ "persistentBool": "", "sprite": "cr10_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Crossroads_10[left1] | Crossroads_10[right1]) + Defeated_False_Knight + (ANYCLAW | WINGS + INFECTED | $SHRIEKPOGO[2,before:AREASOUL])", @@ -443,7 +445,7 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_270deg", "alsoDestroy": [], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Crossroads_13[left1] | Crossroads_13[right1]) + (ANYCLAW | WINGS | ENEMYPOGOS)", @@ -460,7 +462,7 @@ "persistentBool": "", "sprite": "break_wall_ancient_variant_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_18", @@ -474,23 +476,25 @@ "gameObject": "/Breakable Wall", "fsmType": "breakable_wall_v2", "sceneName": "Crossroads_21", - "x": 0.0, - "y": 0.0, + "x": 53.89, + "y": 8.28, "persistentBool": "", "sprite": "cr21_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "pinType": "World", + "logic": "Crossroads_21[top1] + (Collapser-Glowing_Womb_Tunnel | RIGHTSUPERDASH + SPIKETUNNELS + RIGHTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL])) | Crossroads_21[left1] | Crossroads_21[right1]", "logicOverrides": { - "Crossroads_21[left1]": "Crossroads_21[left1] | Crossroads_21[right1] | (Crossroads_21[top1] + Wall-Glowing_Womb)", - "Crossroads_21[right1]": "Crossroads_21[right1] | Crossroads_21[left1] | (Crossroads_21[top1] + Wall-Glowing_Womb)" + "Crossroads_21[left1]": "Crossroads_21[left1] | Crossroads_21[right1] | Crossroads_21 + Wall-Glowing_Womb", + "Crossroads_21[right1]": "Crossroads_21[right1] | Crossroads_21[left1] | Crossroads_21 + Wall-Glowing_Womb" }, "logicSubstitutions": { "Crossroads_21": { "Crossroads_21[left1]": "Crossroads_21[left1] + Wall-Glowing_Womb", - "Crossroads_21[right1]": "Crossroads_21[right1] + Wall-Glowing_Womb" + "Crossroads_21[right1]": "Crossroads_21[right1] + Wall-Glowing_Womb", + "Crossroads_21[top1]": "Crossroads_21[top1] + (Collapser-Glowing_Womb_Tunnel | RIGHTSUPERDASH + SPIKETUNNELS + RIGHTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL]))" } } }, @@ -507,7 +511,7 @@ "Mask Bottom", "Mask Bottom 2" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_37[right1]", @@ -526,7 +530,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_01[bot1] | (Deepnest_01[left1] | Deepnest_01[right1]) + Plank-Deepnest_Exit", @@ -549,7 +553,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_01b[right1] | Deepnest_01b[top2] + Plank-Upper_Deepnest", @@ -573,10 +577,10 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Deepnest_02[left1] | (Deepnest_02[left2] + ANYCLAW) | (Deepnest_02[right1] + Wall-Deepnest_Mimics)", + "logic": "Deepnest_02[left1] | Deepnest_02[left2] + (ANYCLAW | WINGS | ENEMYPOGOS) | Deepnest_02[right1] + Wall-Deepnest_Mimics", "logicOverrides": { "Deepnest_02[right1]": "Deepnest_02[right1] | (ORIG) + Wall-Deepnest_Mimics" }, @@ -596,7 +600,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_03[left2] | Deepnest_03 + (LEFTSUPERDASH | WINGS | LEFTCLAW + ($SHADESKIP | $SLOPEBALL[before:ROOMSOUL]))", @@ -622,7 +626,7 @@ "/Secret Mask", "/Secret Mask (1)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "Nosk_Walls", "logic": "Deepnest_31[right1] + Plank-Nosk_Exit | Deepnest_31[right2] + (RIGHTCLAW | LEFTCLAW + (WINGS | BACKGROUNDPOGOS) | (ANYCLAW | WINGS) + Wall-Nosk_Outer + Wall-Nosk_Inner)", @@ -643,7 +647,7 @@ "Secret Mask (1)", "Secret Mask (2)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "Nosk_Walls", "logic": "Deepnest_31[right1] + (LEFTSLASH | UPSLASH | SCREAM | LEFTFIREBALL | ANYCLAW | WINGS | LEFTDASH | (FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM)) + $CASTSPELL[3]) | Deepnest_31[right2] + ((RIGHTCLAW | LEFTCLAW + (WINGS | BACKGROUNDPOGOS)) + Plank-Nosk_Exit | (ANYCLAW | WINGS) + Wall-Nosk_Inner)", @@ -664,7 +668,7 @@ "Secret Mask (1)", "Secret Mask (2)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "Nosk_Walls", "logic": "Deepnest_31[right1] + (ANYCLAW | WINGS | LEFTDASH | (FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM)) + $CASTSPELL[3]) + Wall-Nosk_Outer | Deepnest_31[right1] + Plank-Nosk_Exit + (ANYCLAW | WINGS) | Deepnest_31[right2] + (ANYCLAW | WINGS)", @@ -681,7 +685,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)", @@ -700,10 +704,10 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Deepnest_39[door1] | (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[right1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + (ANYCLAW | WINGS))) + ((LANTERN | (NOLANTERN ? FALSE)) | DARKROOMS) + (RIGHTDASH | WINGS | RIGHTCLAW + (RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL,after:ROOMSOUL]))", + "logic": "Deepnest_39[door1] | (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[right1] + (FULLCLAW | WINGS + ANYCLAW | ENEMYPOGOS + (ANYCLAW | WINGS))) + (LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (RIGHTDASH | WINGS | RIGHTCLAW + (RIGHTSUPERDASH | SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL,after:ROOMSOUL]))", "logicOverrides": { "Deepnest_39[door1]": "Deepnest_39[door1] | (ORIG) + Wall-Weaver's_Den_Entrance" }, @@ -726,7 +730,7 @@ } }, { - "name": "Plank-Deepnest_Dark_Room_Egg", + "name": "Plank-Dark_Deepnest_Egg", "gameObject": "/One Way Wall (1)", "fsmType": "break_floor", "sceneName": "Deepnest_39", @@ -735,17 +739,17 @@ "persistentBool": "", "sprite": "collapser_very_short_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "(LANTERN | NOLANTERN?FALSE | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] + Wall-Weaver's_Den_Entrance | Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | (WINGS | RIGHTCLAW) + ENEMYPOGOS | Plank-Deepnest_Dark_Room_Egg))", + "logic": "(LANTERN | NOLANTERN?FALSE | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] + Wall-Weaver's_Den_Entrance | Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | (WINGS | RIGHTCLAW) + ENEMYPOGOS | Plank-Dark_Deepnest_Egg))", "logicOverrides": { - "Rancid_Egg-Dark_Deepnest": "(ORIG) | Deepnest_39[right1] + Plank-Deepnest_Dark_Room_Egg + (LANTERN | NOLANTERN?FALSE | DARKROOMS)" + "Rancid_Egg-Dark_Deepnest": "(ORIG) | Deepnest_39[right1] + Plank-Dark_Deepnest_Egg + (LANTERN | NOLANTERN?FALSE | DARKROOMS)" }, "logicSubstitutions": {} }, { - "name": "Plank-Deepnest_Dark_Room_Geo", + "name": "Plank-Dark_Deepnest_Geo", "gameObject": "/One Way Wall", "fsmType": "break_floor", "sceneName": "Deepnest_39", @@ -754,10 +758,10 @@ "persistentBool": "", "sprite": "collapser_very_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "((LANTERN | (NOLANTERN ? FALSE)) | DARKROOMS) + ((Deepnest_39 + (RIGHTCLAW | (WINGS + (LEFTCLAW | ENEMYPOGOS)))) | Deepnest_39[top1] | (Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH)))", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + ((Deepnest_39 + (RIGHTCLAW | (WINGS + (LEFTCLAW | ENEMYPOGOS)))) | Deepnest_39[top1] | (Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH))) + (Plank-Dark_Deepnest_Geo | Collapser-Dark_Deepnest_Geo)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -773,7 +777,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "Village_Walls", "logic": "(Deepnest_41[left1] | Deepnest_41[right1] + (WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS) | LEFTCLAW) | Deepnest_41 + Plank-Village_Middle) + (LANTERN | NOLANTERN?FALSE | DARKROOMS)", @@ -792,7 +796,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "Village_Walls", "logic": "(Deepnest_41 + (WINGS + (SIDESLASH | UPSLASH | LEFTCLAW) | RIGHTCLAW | LEFTCLAW + ENEMYPOGOS) | Deepnest_41[right1] + ANYCLAW + Plank-Village_Upper) + (LANTERN | NOLANTERN?FALSE | DARKROOMS)", @@ -811,7 +815,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "Village_Walls", "logic": "(Deepnest_41[left2] + (FULLCLAW | WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS)) | Deepnest_41 + Plank-Village_Lower + ANYCLAW) + (LANTERN | NOLANTERN?FALSE | DARKROOMS)", @@ -828,7 +832,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": true, + "extra": false, "groupWalls": [], "group": "Village_Walls", "logic": "Deepnest_41[left2] + (LANTERN | NOLANTERN?FALSE | DARKROOMS)", @@ -847,7 +851,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_44[top1] + Plank-Sharp_Shadow | Deepnest_44[top1] + RIGHTSHADOWDASH + (LEFTSHADOWDASH | DAMAGEBOOSTS + ($TAKEDAMAGE + $TAKEDAMAGE + $TAKEDAMAGE | LEFTDASH + $TAKEDAMAGE + $TAKEDAMAGE | QUAKE + $CASTSPELL[2] + $TAKEDAMAGE))", @@ -866,7 +870,7 @@ "persistentBool": "", "sprite": "break_wall_loom_355deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)) + (LEFTDASH + WINGS | LEFTSUPERDASH | $SHRIEKPOGO[3,before:AREASOUL]) + (ANYCLAW | LEFTSLASH | UPSLASH | (FIREBALL | SCREAM) + $CASTSPELL[before:ROOMSOUL])", @@ -885,7 +889,7 @@ "persistentBool": "", "sprite": "Loom_wall_0003_1_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)) + (LEFTDASH + WINGS | LEFTSUPERDASH | $SHRIEKPOGO[3,before:AREASOUL]) + (LEFTDASH | SPIKETUNNELS) + Wall-Weaver's_Den", @@ -902,7 +906,7 @@ "persistentBool": "", "sprite": "waterway_break_wall_acid_02_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_12[bot1] + (RIGHTCLAW + LEFTSUPERDASH | Lever-Palace_Final?FALSE + WINGS + ANYCLAW + DIFFICULTSKIPS + (Plank-White_Palace_Shortcut_Exit | LEFTDASH))", @@ -919,7 +923,7 @@ "persistentBool": "", "sprite": "collapser_short_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_12[bot1] + (RIGHTCLAW + LEFTSUPERDASH + Wall-White_Palace_Shortcut | Lever-Palace_Final?FALSE + WINGS + ANYCLAW + DIFFICULTSKIPS + (Plank-White_Palace_Shortcut_Exit | LEFTDASH + Wall-White_Palace_Shortcut))", @@ -936,7 +940,7 @@ "persistentBool": "", "sprite": "collapser_short_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_06[bot1] | White_Palace_06[left1] | White_Palace_06[top1]", @@ -962,7 +966,7 @@ "persistentBool": "", "sprite": "ancient_one_way_wall_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_09[right1] + (LEFTSUPERDASH + (FULLCLAW | WINGS) | RIGHTCLAW + LEFTDASH + OBSCURESKIPS + PRECISEMOVEMENT + ($SHRIEKPOGO[1,1,1,1,1] | LEFTSHARPSHADOW + $SHRIEKPOGO[1,1,1,1]))", @@ -981,7 +985,7 @@ "persistentBool": "", "sprite": "ext_0002_hive_break_1_12deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_01[right1] | Deepnest_East_01[top1] + Plank-Hive_Exit | Deepnest_East_01[bot1] + (LEFTCLAW | WINGS | ENEMYPOGOS | RIGHTCLAW + OBSCURESKIPS) + Plank-Hive_Exit", @@ -1003,6 +1007,9 @@ }, "Soul_Totem-Lower_Kingdom's_Edge_1": { "Deepnest_East_01[right1]": "Deepnest_East_01[right1] + Plank-Hive_Exit" + }, + "Deepnest_East_01": { + "Deepnest_East_01[right1]": "Deepnest_East_01[right1] + Plank-Hive_Exit" } } }, @@ -1016,7 +1023,7 @@ "persistentBool": "outskirtsWall", "sprite": "ancient_wall_pieces_0000_a_deep_quake_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_02", @@ -1046,7 +1053,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_04 | Bench-Bardoon's_Tail?FALSE", @@ -1065,7 +1072,7 @@ "alsoDestroy": [ "/Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_06[bot1] | Plank-Quickslash_Exit + ((Deepnest_East_06[door1] + LEFTCLAW) | (Deepnest_East_06[left1] + RIGHTCLAW) | Deepnest_East_06[top1])", @@ -1103,7 +1110,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_08[top1] | Deepnest_East_08[right1]", @@ -1124,7 +1131,7 @@ "alsoDestroy": [ "/Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_09[right1] | (Deepnest_East_09[left1] + Plank-Colo_Shortcut) | (Deepnest_East_09[bot1] + (ANYCLAW | WINGS))", @@ -1145,7 +1152,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_11", @@ -1164,7 +1171,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_11[top1] + (SIDESLASH | CYCLONE | GREATSLASH | (FIREBALL | QUAKE) + $CASTSPELL) | Deepnest_East_11[right1] + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + UPWALLBREAK | (Deepnest_East_11[left1] | Deepnest_East_11[bot1]) + (WINGS | FULLCLAW + $SHADESKIP | ENEMYPOGOS + DANGEROUSSKIPS) + (LEFTCLAW | WINGS + BACKGROUNDPOGOS) + UPWALLBREAK", @@ -1183,7 +1190,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_14[door1] | Deepnest_East_14[top2] + Broke_Oro_Quake_Floor_2 + Broke_Oro_Quake_Floor_3 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS | LEFTDASH + RIGHTDASH + DAMAGEBOOSTS + ENEMYPOGOS + COMPLEXSKIPS + $TAKEDAMAGE + $TAKEDAMAGE) + (RIGHTDASH | PRECISEMOVEMENT) | Deepnest_East_14[left1] + (RIGHTDASH | SPIKETUNNELS)", @@ -1204,10 +1211,10 @@ "alsoDestroy": [ "masking_set/one way permanent" ], - "exit": false, + "extra": false, "groupWalls": [], - "group": "", - "logic": "Deepnest_Spider_Town[left1] + WINGS + (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM) + $CASTSPELL[1]) | LEFTCLAW + RIGHTSUPERDASH) | Bench-Beast's_Den + ANYCLAW + Plank-Den_Secret_Entrance | Deepnest_Spider_Town[left1] + Trap_Bench?TRUE + (WINGS + ANYCLAW | FULLCLAW + (COMBAT[Left_Devout] | COMBAT[Any_Devout])) + Plank-Den_Secret_Entrance", + "group": "Den_Walls", + "logic": "Deepnest_Spider_Town[left1] + WINGS + (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM) + $CASTSPELL[1]) | LEFTCLAW + RIGHTSUPERDASH) | Bench-Beast's_Den + ANYCLAW + Plank-Den_Secret_Entrance | Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | FULLCLAW + COMBAT[Left_Devout]) + Plank-Den_Secret_Entrance", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1216,14 +1223,15 @@ "gameObject": "/Break Floor 1", "fsmType": "break_floor", "sceneName": "Fungus1_04", - "x": 0.0, - "y": 0.0, + "x": 51.84, + "y": 30.0, "persistentBool": "", "sprite": "crumble_floor_fungus_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "(Fungus1_04[right1] + Defeated_Hornet_1 + (FULLDASH | WINGS)) | (Fungus1_04[right1] + Plank-Hornet_Exit) | (Fungus1_04[left1] + (FULLDASH | WINGS))", "logicOverrides": { "Fungus1_04[left1]": "(ORIG) | Fungus1_04[right1] + Plank-Hornet_Exit + (WINGS | LEFTDASH | ACID | SPELLAIRSTALL + $CASTSPELL[1,1])", @@ -1241,7 +1249,7 @@ "persistentBool": "", "sprite": "grass_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_22[left1] | Fungus1_22[top1]", @@ -1262,7 +1270,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus2_29[right1] + Plank-Fungal_Core | Fungus2_29[bot1] + (ANYCLAW | WINGS | (LONGNAIL | MARKOFPRIDE) + ENEMYPOGOS)", @@ -1288,7 +1296,7 @@ "mask_01", "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Fungus1_28[left1] | Fungus1_28[left2] + (FULLCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | $SHADESKIP)) + LEFTBALDURS | (Fungus1_28[left1] | Fungus1_28[left2]) + Plank-Baldur_Shell", @@ -1308,7 +1316,7 @@ "mask_01", "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Fungus1_28[left1] | Fungus1_28[left2] + (FULLCLAW | WINGS | RIGHTDASH | RIGHTSUPERDASH | $SHADESKIP)) + Defeated_Right_Cliffs_Baldur + (WINGS + ANYCLAW | FULLCLAW) | Fungus1_28[left1] + Plank-Baldur_Shell_Upper", @@ -1334,7 +1342,7 @@ "persistentBool": "", "sprite": "grass_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_31[top1] | Fungus1_31[bot1] | Fungus1_31[right1]", @@ -1353,7 +1361,7 @@ "persistentBool": "", "sprite": "grass_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_32[bot1] | Fungus1_32[top1] | Fungus1_32[left1]", @@ -1367,16 +1375,17 @@ "gameObject": "/One Way Wall", "fsmType": "break_floor", "sceneName": "Fungus1_Slug", - "x": -0.52, - "y": -0.05, + "x": 8.44, + "y": 49.87, "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_mushroom_270deg", "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "Fungus1_Slug[right1] + (ACID | FULLSKIPACID) + (ANYCLAW | Plank-Unn_Shortcut)", "logicOverrides": {}, "logicSubstitutions": {} @@ -1386,16 +1395,17 @@ "gameObject": "/One Way Wall (1)", "fsmType": "break_floor", "sceneName": "Fungus1_Slug", - "x": -0.05, - "y": -0.3, + "x": 38.73, + "y": 41.8, "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_mushroom_270deg", "alsoDestroy": [ "Secret Mask (1)" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "Fungus1_Slug[right1] + (ACID | FULLSKIPACID) + (ANYCLAW | Plank-Unn_Exit)", "logicOverrides": {}, "logicSubstitutions": {} @@ -1412,7 +1422,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus2_10[right2] | Fungus2_10[right1] | Fungus2_10[bot1]", @@ -1429,7 +1439,7 @@ "persistentBool": "", "sprite": "fung_break_wall_02_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Fungus2_15[top3] | Fungus2_15[right1] | Fungus2_15[left1]) + (LEFTCLAW + WINGS | RIGHTCLAW + LEFTSUPERDASH)", @@ -1450,14 +1460,18 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Fungus2_20[left1] + Wall-Deepnest_Fungal | Fungus2_20[right1]) + (Plank-Spore_Shroom | (RIGHTCLAW | WINGS) + (ACID | RIGHTDASH | (LEFTCLAW + RIGHTSUPERDASH)) + ANYCLAW)", "logicOverrides": { - "Spore_Shroom": "(ORIG) | ((Fungus2_20[left1] + Wall-Deepnest_Fungal | Fungus2_20[right1]) + Plank-Spore_Shroom)" + "Spore_Shroom": "(ORIG) | ((Fungus2_20[left1] | Fungus2_20[right1]) + Plank-Spore_Shroom)" }, - "logicSubstitutions": {} + "logicSubstitutions": { + "Spore_Shroom": { + "Fungus2_20[left1]": "(Fungus2_20[left1] + Wall-Deepnest_Fungal)" + } + } }, { "name": "Wall-Deepnest_Fungal", @@ -1469,14 +1483,13 @@ "persistentBool": "deepnestWall", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_01[right1] + Wall-Deepnest_Fungal | (Deepnest_01[left1] | Deepnest_01[bot1]) + Plank-Deepnest_Exit | Fungus2_20", "logicOverrides": { "Fungus2_20[left1]": "Fungus2_20[left1] | (ORIG) + Wall-Deepnest_Fungal", - "Deepnest_01[right1]": "Deepnest_01[right1] | (ORIG) + Wall-Deepnest_Fungal", - "Spore_Shroom": "Fungus2_20 + ((ORIG) | (RIGHTCLAW | WINGS) + (ACID | RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH) | WINGS + (RIGHTCLAW | SPELLAIRSTALL + $CASTSPELL[1,before:AREASOUL] | COMPLEXSKIPS + OBSCURESKIPS + $SHADESKIP + DAMAGEBOOSTS + $TAKEDAMAGE | OBSCURESKIPS + PRECISEMOVEMENT | $SHRIEKPOGO[2,before:AREASOUL]) | Plank-Spore_Shroom)" + "Deepnest_01[right1]": "Deepnest_01[right1] | (ORIG) + Wall-Deepnest_Fungal" }, "logicSubstitutions": { "Fungus2_20": { @@ -1505,7 +1518,7 @@ "alsoDestroy": [ "/Secret Mask (1)" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Fungus3_05[left1] | Fungus3_05[right1]) + ((WINGS | (LEFTDASH | RIGHTCLAW + LEFTSUPERDASH | FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM) + $CASTSPELL[2,before:ROOMSOUL,after:ROOMSOUL]) + (RIGHTDASH | RIGHTSUPERDASH | FIREBALLSKIPS + (LEFTFIREBALL | SCREAM) + (LEFTCLAW + $CASTSPELL[1] | $CASTSPELL[2,1]))) + (RIGHTCLAW | LEFTCLAW + WINGS) | Plank-Petra_Arena)", @@ -1522,7 +1535,7 @@ "persistentBool": "", "sprite": "one_way_fung_266deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_39[left1] | (Fungus3_39[right1] + Plank-Moss_Prophet)", @@ -1551,7 +1564,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_44[door1]", @@ -1574,7 +1587,7 @@ "persistentBool": "oneWayArchive", "sprite": "ancient_wall_pieces_0000_a_mushroom_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_47", @@ -1598,7 +1611,7 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_hive_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Hive_03_c[right2] | (Hive_03_c + Plank-Hive_Mask + WINGS)", @@ -1621,7 +1634,7 @@ "persistentBool": "", "sprite": "mine_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_05", @@ -1644,7 +1657,7 @@ "persistentBool": "", "sprite": "mine_break_wall_02_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_16[top1]", @@ -1665,7 +1678,7 @@ "alsoDestroy": [ "/Breakable Wall/Masks" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW) | Mines_25[top1] + (ANYCLAW | (FIREBALL | SCREAM) + $CASTSPELL[before:ROOMSOUL] | CYCLONE)", @@ -1689,7 +1702,7 @@ "Quake Floor/Active/msk_generic (1)", "Quake Floor/Active/msk_generic (2)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Mines_25[top1] | Mines_25[left1] + (LEFTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS | WINGS) | RIGHTCLAW + WINGS | ENEMYPOGOS + BACKGROUNDPOGOS + $SHRIEKPOGO[5])) + Broke_Hallownest's_Crown_Quake_Floor | (Mines_25[left1] + (LEFTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS | WINGS) | RIGHTCLAW | WINGS + ENEMYPOGOS) | Mines_25[top1]) + Plank-Crystal_Crown", @@ -1709,12 +1722,12 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_cave_270deg", "alsoDestroy": [], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "(Mines_33[left1] | Mines_33[right1]) + (LANTERN | NOLANTERN?NONE) | Mines_33[right1] + Plank-Peak_Toll + DARKROOMS", "logicOverrides": { - "Geo_Rock-Crystal_Peak_Entrance": "(ORIG) | Mines_33[right1] + Plank-Peak_Toll + (DARKROOMS | (LANTERN | (NOLANTERN ? FALSE)))" + "Geo_Rock-Crystal_Peak_Entrance": "(ORIG) | Mines_33[right1] + Plank-Peak_Toll + (LANTERN | (NOLANTERN ? FALSE) | DARKROOMS)" }, "logicSubstitutions": {} }, @@ -1728,7 +1741,7 @@ "persistentBool": "", "sprite": "shaman_one_way_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "((Mines_35[left1] + Dive_Floor-Crystallized_Mound | Bench-Crystallized_Mound?FALSE) + (LEFTCLAW | RIGHTCLAW + PRECISEMOVEMENT + (RIGHTDASH | OBSCURESKIPS + DIFFICULTSKIPS) | WINGS + OBSCURESKIPS)) | Mines_35[left1] + (RIGHTDASH | RIGHTSUPERDASH | RIGHTCLAW | WINGS | (FIREBALLSKIPS + (LEFTFIREBALL | SCREAM)) + $CASTSPELL[3]) + Plank-Crystallized_Mound", @@ -1749,7 +1762,7 @@ "persistentBool": "", "sprite": "rg_wall_break_02_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "RestingGrounds_06[left1] | RestingGrounds_06[right1] | RestingGrounds_06[top1]", @@ -1764,11 +1777,11 @@ "fsmType": "breakable_wall_v2", "sceneName": "RestingGrounds_10", "x": 1.1, - "y": 0.15, + "y": 1.5, "persistentBool": "", "sprite": "rest_grounds_break_wall_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", "logic": "RestingGrounds_10 | RestingGrounds_10[top2]", @@ -1785,10 +1798,10 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "RestingGrounds_10[top1] | RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner | RestingGrounds_10[left1] + Plank-Catacombs_Elevator", + "logic": "RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner | RestingGrounds_10[left1] + Plank-Catacombs_Elevator", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1802,7 +1815,7 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", "logic": "RestingGrounds_10", @@ -1819,10 +1832,10 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + Wall-Catacombs_Left_1", + "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + (Wall-Catacombs_Left_1 | Collapser-Catacombs_Geo | Wall-Catacombs_Seal + Collapser-Catacombs_Seal)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1836,10 +1849,10 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_91deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "RestingGrounds_10 + (LEFTCLAW | WINGS) + UPWALLBREAK", + "logic": "RestingGrounds_10 + (LEFTCLAW | WINGS) + (UPWALLBREAK | Wall-Catacombs_Grub)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1853,10 +1866,10 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2", + "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + ((Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 | Collapser-Catacombs_Geo) | Collapser-Catacombs_Seal)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1870,10 +1883,10 @@ "persistentBool": "restingGroundsCryptWall", "sprite": "rock__break_floor_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "RestingGrounds_10 | RestingGrounds_10[top1] | RestingGrounds_10[left1]", + "logic": "RestingGrounds_10 | RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[left1]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1883,14 +1896,14 @@ "fsmType": "breakable_wall_v2", "sceneName": "RestingGrounds_10", "x": 2.15, - "y": -0.15, + "y": 0.0, "persistentBool": "", "sprite": "rest_grounds_break_wall_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", - "logic": "(RestingGrounds_10 | RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner) + (ANYCLAW | WINGS) + UPWALLBREAK + Wall-Catacombs_Right_2", + "logic": "RestingGrounds_10 + (ANYCLAW | WINGS) + UPWALLBREAK + Wall-Catacombs_Right_2", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -1904,7 +1917,7 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + UPWALLBREAK", @@ -1921,7 +1934,7 @@ "persistentBool": "", "sprite": "col_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Colosseum_02[top1] | Room_Colosseum_02[top2]", @@ -1940,7 +1953,7 @@ "persistentBool": "", "sprite": "col_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Colosseum_Spectate[bot1]", @@ -1965,7 +1978,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Fungus_Shaman[left1]", @@ -1982,7 +1995,7 @@ "persistentBool": "", "sprite": "break_wall_unique_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins1_31", @@ -2011,7 +2024,7 @@ "persistentBool": "", "sprite": "ruin_break_roof_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins2_03[bot1] + (((SCREAM | QUAKE>1 + PRECISEMOVEMENT + OBSCURESKIPS + DANGEROUSSKIPS) + $CASTSPELL) | (ANYCLAW | WINGS) + UPWALLBREAK)", @@ -2028,7 +2041,7 @@ "persistentBool": "bathHouseWall", "sprite": "bath_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins_Bathhouse[door1] | Ruins_Bathhouse[right1]", @@ -2061,7 +2074,7 @@ "persistentBool": "", "sprite": "one way wall_elev_270deg", "alsoDestroy": [], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]", @@ -2078,7 +2091,7 @@ "persistentBool": "", "sprite": "waterways_break_wall_01_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_01[right1] + Wall-Tuk | Waterways_01 + (RIGHTCLAW | WINGS | LEFTCLAW + RIGHTSUPERDASH | ENEMYPOGOS) | Waterways_01[top1] + RIGHTDASH", @@ -2110,10 +2123,10 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_294deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "(Waterways_02[top3] + Dive_Floor-Above_Waterways_Bench | Waterways_02[top1] + Plank-Waterways_Bench | Waterways_02 + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + DANGEROUSSKIPS + (WINGS | RIGHTCLAW)))", + "logic": "(Waterways_02[top3] + Dive_Floor-Above_Waterways_Bench | Waterways_02[top1] + Plank-Waterways_Bench | Bench-Waterways | Waterways_02 + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + DANGEROUSSKIPS + (WINGS | RIGHTCLAW)))", "logicOverrides": {}, "logicSubstitutions": { "Rancid_Egg-Waterways_Main": { @@ -2132,7 +2145,7 @@ "persistentBool": "", "sprite": "waterways_break_wall_01_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_04 + (RIGHTCLAW | SWIM | CYCLONE | (RIGHTFIREBALL | SCREAM) + $CASTSPELL[before:ROOMSOUL]) | Waterways_04[left2] + (SWIM | RIGHTSKIPACID | LEFTDASH + LEFTCLAW + RIGHTSUPERDASH + ACIDSKIPS + SCREAM + $CASTSPELL[1])", @@ -2151,7 +2164,7 @@ "persistentBool": "dungDefenderWallBroken", "sprite": "ancient_wall_pieces_0000_a_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender | Waterways_05[bot2] | Waterways_05[right1] + Plank-Dung_Defender", @@ -2165,6 +2178,9 @@ }, "Lever-Dung_Defender": { "Waterways_05[right1]":"Waterways_05[right1] + Plank-Dung_Defender" + }, + "Waterways_05[bot2]": { + "Waterways_05[right1]":"Waterways_05[right1] + Plank-Dung_Defender" } } }, @@ -2178,7 +2194,7 @@ "persistentBool": "", "sprite": "waterway_break_wall_acid_02_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_07[top1] | Waterways_07 + Plank-Isma's_Grove", @@ -2211,7 +2227,7 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_08[left2] + Wall-Junk_Pit_Entrance | Waterways_08[left1] + (LEFTCLAW | WINGS) | Waterways_08[top1] + (Plank-Junk_Pit_Exit | WINGS + ENEMYPOGOS | WINGS + ANYCLAW | FULLCLAW)", @@ -2228,7 +2244,7 @@ "persistentBool": "", "sprite": "_0017_waterway_arch_break wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Waterways_08[left2] | Waterways_08[left1] + (LEFTCLAW | WINGS) + UPWALLBREAK | Waterways_08[top1] + (Plank-Junk_Pit_Exit | WINGS + ENEMYPOGOS | WINGS + ANYCLAW | FULLCLAW) + UPWALLBREAK", @@ -2262,7 +2278,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Abyss_17[top1] + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2281,10 +2297,10 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Cliffs_04[right1] + (DARKROOMS | (LANTERN | (NOLANTERN ? FALSE))) + QUAKE + $CASTSPELL[before:ROOMSOUL]", + "logic": "Cliffs_04[right1] + (LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + QUAKE + $CASTSPELL[before:ROOMSOUL]", "logicOverrides": { "Broke_Cliffs_Dark_Room_Quake_Floor": "Dive_Floor-Joni" }, @@ -2300,7 +2316,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_52[left1] + QUAKE + $CASTSPELL[before:ITEMSOUL]", @@ -2319,7 +2335,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_02 + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2338,7 +2354,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_14[top2] + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2358,7 +2374,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_14[top2] + Dive_Floor-Oro_2 + (RIGHTCLAW | WINGS | LEFTCLAW + ENEMYPOGOS) + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2377,7 +2393,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Deepnest_East_16[left1] | Deepnest_East_16[bot1]) + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2400,7 +2416,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2419,7 +2435,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2438,7 +2454,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2457,7 +2473,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2476,7 +2492,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2495,7 +2511,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2514,7 +2530,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + Dive_Floor-420_Rock_6 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2533,7 +2549,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + Dive_Floor-420_Rock_6 + Dive_Floor-420_Rock_7 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2552,7 +2568,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + Dive_Floor-420_Rock_6 + Dive_Floor-420_Rock_7 + Dive_Floor-420_Rock_8 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2571,7 +2587,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + Dive_Floor-420_Rock_6 + Dive_Floor-420_Rock_7 + Dive_Floor-420_Rock_8 + Dive_Floor-420_Rock_9 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2590,7 +2606,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + Dive_Floor-420_Rock_1 + Dive_Floor-420_Rock_2 + Dive_Floor-420_Rock_3 + Dive_Floor-420_Rock_4 + Dive_Floor-420_Rock_5 + Dive_Floor-420_Rock_6 + Dive_Floor-420_Rock_7 + Dive_Floor-420_Rock_8 + Dive_Floor-420_Rock_9 + Dive_Floor-420_Rock_10 + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2611,7 +2627,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Deepnest_East_18[top1] + $CASTSPELL[1] | Deepnest_East_18 + (ANYCLAW | WINGS) + $CASTSPELL[1,before:ROOMSOUL]) + Dive_Floor-Edge_Journal + QUAKE | Deepnest_East_18 + Dive_Floor-Edge_Journal_Exit + (LEFTCLAW | WINGS + RIGHTCLAW) + QUAKE + $CASTSPELL[1,before:ROOMSOUL]", @@ -2630,7 +2646,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Deepnest_East_18 + (ANYCLAW | WINGS) | Deepnest_East_18[top1]) + QUAKE + $CASTSPELL", @@ -2649,7 +2665,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus2_21[right1] + (FULLCLAW + (LEFTDASH | LEFTSUPERDASH) | ANYCLAW + WINGS) + QUAKE + $CASTSPELL[before:ITEMSOUL]", @@ -2669,7 +2685,7 @@ "persistentBool": "", "sprite": "roof_05_351deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_01[left1] + QUAKE + $CASTSPELL", @@ -2688,7 +2704,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_20 + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2707,7 +2723,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Mines_25[left1] + (FULLCLAW | WINGS + ANYCLAW) | Mines_25[top1]) + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2726,7 +2742,7 @@ "persistentBool": "", "sprite": "roof_05_351deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_35[left1] + QUAKE + $CASTSPELL", @@ -2740,14 +2756,15 @@ "gameObject": "/Quake Floor", "fsmType": "quake_floor", "sceneName": "RestingGrounds_05", - "x": 0.27, - "y": -0.55, + "x": 34.41, + "y": 3.28, "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", + "pinType": "World", "logic": "RestingGrounds_05 + QUAKE + $CASTSPELL", "logicOverrides": { "Broke_Resting_Grounds_Quake_Floor": "Dive_Floor-Broken_Coffin" @@ -2768,7 +2785,7 @@ "persistentBool": "brokenMageWindow", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins1_30 + QUAKE + $CASTSPELL[1,before:ROOMSOUL]", @@ -2792,7 +2809,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Ruins1_30[left2] + (LEFTCLAW | (RIGHTCLAW | WINGS) + BACKGROUNDPOGOS | RIGHTCLAW + WINGS) | Ruins1_30 + Dive_Floor-Sanctum_Escape_1 + Dive_Floor-Sanctum_Escape_2 + (ANYCLAW | WINGS + $SHADESKIP)) + QUAKE + $CASTSPELL[1,before:ROOMSOUL]", @@ -2813,7 +2830,7 @@ "alsoDestroy": [ "Secret Mask (1)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Ruins1_30[left2] + Dive_Floor-Sanctum_Escape_1 + (LEFTCLAW | (RIGHTCLAW | WINGS) + BACKGROUNDPOGOS | RIGHTCLAW + WINGS) | Ruins1_30 + Dive_Floor-Sanctum_Escape_2 + (ANYCLAW | WINGS | $SHADESKIP)) + QUAKE + $CASTSPELL[1,before:ROOMSOUL]", @@ -2837,7 +2854,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "Ruins1_32[right1] + QUAKE + $CASTSPELL[before:AREASOUL] + (ANYCLAW | $SHRIEKPOGO[before:AREASOUL] | Lever-Sanctum_West_Upper?FALSE + Dive_Floor-Inner_Sanctum_1 + WINGS + ENEMYPOGOS)", @@ -2854,7 +2871,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "(Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + (Lever-Sanctum_West_Upper?FALSE | ANYCLAW + Dive_Floor-Inner_Sanctum_1)) | (Ruins1_32[right2] + QUAKE + $CASTSPELL[before:ROOMSOUL] + Dive_Floor-Inner_Sanctum_2 + (Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Seal + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS))) | (WINGS + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom + Dive_Floor-Inner_Sanctum_Grub))", @@ -2871,7 +2888,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "(Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + ANYCLAW + Dive_Floor-Inner_Sanctum_1 + Dive_Floor-Inner_Sanctum_2) | (Ruins1_32[right2] + QUAKE + $CASTSPELL[before:ROOMSOUL] + Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Seal + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS)) | (WINGS + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom + Dive_Floor-Inner_Sanctum_Grub))", @@ -2888,7 +2905,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "(Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + ANYCLAW + Dive_Floor-Inner_Sanctum_1 + Dive_Floor-Inner_Sanctum_2) | (Ruins1_32[right2] + QUAKE + $CASTSPELL[before:ROOMSOUL] + Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS)) | (WINGS + ANYCLAW + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom + Dive_Floor-Inner_Sanctum_Grub))", @@ -2905,7 +2922,7 @@ "persistentBool": "", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "(Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + ANYCLAW + Dive_Floor-Inner_Sanctum_Grub + Dive_Floor-Inner_Sanctum_1 + Dive_Floor-Inner_Sanctum_2) | (Ruins1_32[right2] + QUAKE + $CASTSPELL[before:ROOMSOUL] + (Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Grub + Dive_Floor-Inner_Sanctum_Seal + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS)) | (WINGS + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom)))", @@ -2913,7 +2930,7 @@ "logicSubstitutions": {} }, { - "name": "Dive_Floor-Inner_Sanctum_Cenda", + "name": "Dive_Floor-Inner_Sanctum_Lore", "gameObject": "/Quake Floor", "fsmType": "quake_floor", "sceneName": "Ruins1_32", @@ -2922,7 +2939,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + (ANYCLAW | Lever-Sanctum_West_Upper?FALSE + Dive_Floor-Inner_Sanctum_1 + WINGS + ENEMYPOGOS)", @@ -2939,7 +2956,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Inner_Sanctum", "logic": "(Ruins1_32[right1] + QUAKE + $CASTSPELL[before:ROOMSOUL] + ANYCLAW + Dive_Floor-Inner_Sanctum_1 + Dive_Floor-Inner_Sanctum_2) | (Ruins1_32[right2] + QUAKE + $CASTSPELL[before:ROOMSOUL] + (Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Seal + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS)) | (WINGS + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom + Dive_Floor-Inner_Sanctum_Grub)))", @@ -2956,7 +2973,7 @@ "persistentBool": "", "sprite": "mage_lord_room_0003_floor_wing_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins2_01_b + QUAKE + $CASTSPELL", @@ -2973,7 +2990,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Waterways_02[top3] | Waterways_02 + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + DANGEROUSSKIPS + (WINGS | RIGHTCLAW)) + Dive_Floor-Above_Waterways_Bench) + QUAKE + $CASTSPELL", @@ -2996,7 +3013,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Waterways_04[right1] | Waterways_04[left1] + (RIGHTCLAW | WINGS | ENEMYPOGOS) | Waterways_04[left2] + (RIGHTCLAW | WINGS + ENEMYPOGOS) + (SWIM | RIGHTSKIPACID)) + QUAKE + $CASTSPELL", @@ -3016,7 +3033,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Waterways_04[bot1] | (Waterways_04[right1] | Waterways_04[left1] + (RIGHTCLAW | WINGS | ENEMYPOGOS) | Waterways_04[left2] + (RIGHTCLAW | WINGS + ENEMYPOGOS) + (SWIM | RIGHTSKIPACID)) + Dive_Floor-Waterways_Bench_1) + QUAKE + $CASTSPELL", @@ -3039,7 +3056,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Waterways_02[bot1] | Waterways_02[top1] | Waterways_02[top2] + (ANYCLAW | WINGS | SWIM) | Waterways_02[top3] + Broke_Waterways_Bench_Quake_Floor_3 | Waterways_02[bot2] + (ANYCLAW | WINGS | SWIM)) + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -3062,7 +3079,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Waterways_05[bot2] | Waterways_05[right1] + Plank-Dung_Defender | Waterways_05[bot1] + (ANYCLAW | WINGS) + Defeated_Dung_Defender) + QUAKE + $CASTSPELL", @@ -3085,7 +3102,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "*Soul_Totem-White_Palace_Final + QUAKE + $CASTSPELL", @@ -3102,7 +3119,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_15[right1] + QUAKE + $CASTSPELL", @@ -3119,7 +3136,7 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Tutorial_01", @@ -3141,7 +3158,7 @@ "persistentBool": "", "sprite": "sil_break_wall_01_90deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "GG_Workshop + UPWALLBREAK + RIGHTCLAW + WINGS + (LEFTSUPERDASH | LEFTSHARPSHADOW | LEFTDASH + SCREAM + $CASTSPELL)", @@ -3158,7 +3175,7 @@ "persistentBool": "zoteStatueWallBroken", "sprite": "gg_metal_wall_0001_180deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "GG_Workshop + Wall-Godhome_Workshop + RIGHTCLAW + WINGS + (LEFTSUPERDASH | LEFTSHARPSHADOW)", @@ -3175,7 +3192,7 @@ "persistentBool": "", "sprite": "gg_metal_wall_0001_180deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "GG_Atrium_Roof + (WINGS + ANYCLAW | Wall-Godhome_Roof)", @@ -3192,11 +3209,1125 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(GG_Pipeway[left1] | GG_Pipeway[right1]) + (ANYCLAW | WINGS) + QUAKE + $CASTSPELL", "logicOverrides": {}, "logicSubstitutions": {} + }, + { + "name": "Wall-QG_Glass", + "gameObject": "ruind_dressing_light_01", + "fsmType": "FSM", + "sceneName": "Fungus3_22", + "x": 1.35, + "y": 0.6, + "persistentBool": "", + "sprite": "royal_garden_break_window", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Fungus3_22[right1] | Fungus3_22 + (RIGHTCLAW | WINGS | LEFTCLAW + BACKGROUNDPOGOS)", + "logicOverrides": { + "Grub-Queen's_Gardens_Top": "(ORIG) + Wall-QG_Glass" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Trap_Entrance", + "gameObject": "Fungus Break Floor", + "fsmType": "Break", + "sceneName": "Deepnest_01", + "x": 32.86, + "y": 18.24, + "persistentBool": "deepnestBridgeCollapsed", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_01", + "logicOverrides": { + "Deepnest_01[bot2]": "ORIG + Collapser-Deepnest_Trap_Entrance" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Glowing_Womb_Tunnel", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Crossroads_21", + "x": 26.27, + "y": 21.13, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Crossroads_21[top1] | (Crossroads_21[left1] | Crossroads_21[right1]) + Wall-Glowing_Womb + ((LEFTSUPERDASH | SPIKETUNNELS + LEFTDASH + (DASHMASTER | SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL,after:ROOMSOUL])) | Collapser-Glowing_Womb_Tunnel)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Mawlek_Lower", + "gameObject": "Collapser Small", + "fsmType": "collapse small", + "sceneName": "Crossroads_36", + "x": 0.0, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_36[right1]", + "logicOverrides": { + "Crossroads_36[right1]": "Crossroads_36[right1] | Crossroads_36[right2] + (Collapser-Mawlek_Lower + (ANYCLAW | WINGS | $SHADESKIP) | Collapser-Mawlek_Upper)", + "Crossroads_36[right2]": "Crossroads_36[right2] | Crossroads_36[right1] + (Collapser-Mawlek_Upper + (ANYCLAW | WINGS | $SHADESKIP) | Collapser-Mawlek_Lower)" + }, + "logicSubstitutions": { + "Soul_Totem-Crossroads_Mawlek_Lower": { + "Crossroads_36[right1]": "Crossroads_36[right1] + (Collapser-Mawlek_Upper + (ANYCLAW | WINGS | $SHADESKIP) | Collapser-Mawlek_Lower)" + }, + "Geo_Rock-Crossroads_Above_Mawlek": { + "Crossroads_36[right1]": "Crossroads_36[right1] + (Collapser-Mawlek_Upper + (ANYCLAW | WINGS | $SHADESKIP) | Collapser-Mawlek_Lower)" + } + } + }, + { + "name": "Collapser-Mawlek_Upper", + "gameObject": "Collapser Small 1", + "fsmType": "collapse small", + "sceneName": "Crossroads_36", + "x": 0.0, + "y": 0.35, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_36[right1] + (Collapser-Mawlek_Lower | Collapser-Mawlek_Upper) | Crossroads_36[right2]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Mimics", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_02", + "x": 18.87, + "y": 52.15, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_02[left1] | Deepnest_02[left2] + (WINGS | ANYCLAW) | Deepnest_02[right1] + Wall-Deepnest_Mimics + (WINGS | ANYCLAW)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Below_Spike_Grub", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_03", + "x": 3.28, + "y": 99.06, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_03[left1] | Deepnest_03[top1] | Deepnest_03 + (LEFTCLAW | WINGS | RIGHTCLAW + OBSCURESKIPS)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Failed_Tramway_Bench", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_14", + "x": 69.3, + "y": 9.24, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_14[left1] | Deepnest_14[right1] + Collapser-Failed_Tramway_Bench + (ANYCLAW | WINGS) | Deepnest_14 + (RIGHTDASH | LEFTCLAW + RIGHTSUPERDASH | RIGHTCLAW | WINGS)", + "logicOverrides": { + "Deepnest_14[right1]": "Deepnest_14[right1] | (ORIG) + Collapser-Failed_Tramway_Bench", + "Deepnest_14": "ORIG | Deepnest_14[right1] + Collapser-Failed_Tramway_Bench + (ANYCLAW | WINGS)" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_By_Mantis_Lords_Path", + "gameObject": "/Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "Deepnest_16", + "x": 99.33, + "y": 11.12, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_16[left1] + ANYCLAW + Collapser-Deepnest_By_Mantis_Lords_Path | Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])", + "logicOverrides": { + "Deepnest_16[bot1]": "ORIG | Deepnest_16[left1] + ANYCLAW + Collapser-Deepnest_By_Mantis_Lords_Path" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_By_Mantis_Lords_Bottom", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_16", + "x": 85.24, + "y": 11.12, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_16[left1] + ANYCLAW + Collapser-Deepnest_By_Mantis_Lords_Path | Deepnest_16[bot1] + (LEFTCLAW | RIGHTCLAW + WINGS | $SHRIEKPOGO[6])", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Hot_Springs_Left", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": 3.28, + "y": 99.06, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Top", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Hot_Springs_Top", + "gameObject": "Collapser Small top", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": 7.13, + "y": 109.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + "Secret Mask" + ], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_30[top1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Hot_Springs_Final", + "gameObject": "Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": 35.82, + "y": 82.17, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Path + Collapser-Deepnest_Hot_Springs_Path_2", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Hot_Springs_Path", + "gameObject": "Collapser Small (3)", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": 47.85, + "y": 113.49, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + "/Secret Mask (1)" + ], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_30[top1]", + "logicOverrides": {}, + "logicSubstitutions": { + "Deepnest_30[left1]": { + "Deepnest_30[top1]": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Path + Collapser-Deepnest_Hot_Springs_Path_2" + }, + "Deepnest_30[right1]": { + "Deepnest_30[top1]": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Path + Collapser-Deepnest_Hot_Springs_Path_2" + } + } + }, + { + "name": "Collapser-Deepnest_Hot_Springs_Path_2", + "gameObject": "Collapser Small (2)", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": 36.09, + "y": 107.04, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + "/Secret Mask" + ], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Path", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Zote", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_33", + "x": -0.45, + "y": -0.15, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + + ], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Deepnest_33[top1] | (Deepnest_33[top2] | Deepnest_33[bot1]) + Collapser-Deepnest_Zote", + "logicOverrides": { + "King's_Idol-Deepnest": "ORIG | (Deepnest_33[top2] | Deepnest_33[bot1]) + Collapser-Deepnest_Zote", + "Rescued_Deepnest_Zote": "ORIG | (Deepnest_33[top2] | Deepnest_33[bot1]) + Collapser-Deepnest_Zote" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Garpede_Pogo_Room", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_38", + "x": 0.0, + "y": 0.0, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Egg_Trap_Left", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 40.66, + "y": 22.4, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] + Wall-Weaver's_Den_Entrance | (Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS)))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Egg_Trap_Middle", + "gameObject": "/Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 69.51, + "y": 22.4, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] + Wall-Weaver's_Den_Entrance | (Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS)))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Egg_Trap_Right", + "gameObject": "/Collapser Small (2)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 77.7, + "y": 22.4, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39[door1] + Wall-Weaver's_Den_Entrance | (Deepnest_39[right1] + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS)))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Root_Trap_Right", + "gameObject": "/Collapser Small (3)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 49.38, + "y": 35.11, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39 + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Root_Trap_Middle", + "gameObject": "/Collapser Small (4)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 36.4, + "y": 35.11, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39 + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Root_Trap_Left", + "gameObject": "/Collapser Small (5)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 27.38, + "y": 35.11, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[left1] | Deepnest_39[top1] | Deepnest_39 + (LEFTCLAW | WINGS + RIGHTCLAW | WINGS + ENEMYPOGOS | RIGHTCLAW + ENEMYPOGOS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Geo", + "gameObject": "/Collapser Small (6)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 75.24, + "y": 60.14, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39[top1] | Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH) | Deepnest_39 + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)))", + "logicOverrides": { + "Geo_Rock-Dark_Deepnest_Above_Grub_1": "ORIG + (Collapser-Dark_Deepnest_Geo | Plank-Dark_Deepnest_Geo)" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Grub", + "gameObject": "/Collapser Small (7)", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": 115.3, + "y": 45.21, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_39 + (RIGHTCLAW | WINGS + (LEFTCLAW | ENEMYPOGOS)) | Deepnest_39[top1] | Deepnest_39[left1] + (RIGHTCLAW | WINGS | RIGHTDASH))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Distant_Village_Fall", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_41", + "x": 40.66, + "y": 87.11, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_41[left1] | Deepnest_41[right1] + Collapser-Distant_Village_Path + (LANTERN | NOLANTERN?FALSE | DARKROOMS) + (LEFTCLAW | WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + ENEMYPOGOS) | Deepnest_41)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Distant_Village_Right_Trap", + "gameObject": "/Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "Deepnest_41", + "x": 69.51, + "y": 85.09, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + Deepnest_41", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Distant_Village_Path", + "gameObject": "/Collapser Small (2)", + "fsmType": "collapse small", + "sceneName": "Deepnest_41", + "x": 47.24, + "y": 98.16, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + Deepnest_41", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Distant_Village_Final_Trap", + "gameObject": "/Collapser Small (4)", + "fsmType": "collapse small", + "sceneName": "Deepnest_41", + "x": 13.56, + "y": 88.21, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(LANTERN | (NOLANTERN ? FALSE) | DARKROOMS) + (Deepnest_41[left1] | Deepnest_41[right1] + Collapser-Distant_Village_Path + (LANTERN | NOLANTERN?FALSE | DARKROOMS) + (LEFTCLAW | WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + ENEMYPOGOS) | Deepnest_41)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Weaver's_Den", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_45_v02", + "x": 1.8, + "y": 0.75, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Deepnest_45_v02[left1] + (SPIKETUNNELS | LEFTDASH) + (LANTERN | (NOLANTERN ? FALSE) | DARKROOMS)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Above_Egg_Trap", + "gameObject": "Collapser Small (3)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.95, + "y": 0.9, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "(Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut)) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Herrah", + "gameObject": "Collapser Small (4)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.65, + "y": 1.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) | Beast_Den_Secret_Entrance + (LEFTCLAW + WINGS + (Herrah | COMBAT[Right_Devout]) | RIGHTCLAW + WINGS + Collapser-Beast's_Den_Herrah | FULLCLAW + (Herrah | COMBAT[Right_Devout] | Collapser-Beast's_Den_Herrah))) + (Herrah | COMBAT[Right_Devout] | Collapser-Beast's_Den_Herrah)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Grub_Trap", + "gameObject": "Collapser Small (5)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.95, + "y": 1.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Seal", + "gameObject": "Collapser Small (6)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.65, + "y": 0.6, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "Beast_Den_Trap_Entrance", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Bottom", + "gameObject": "Collapser Small (7)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.95, + "y": 0.6, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "Beast_Den_Trap_Entrance", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Shortcut", + "gameObject": "Collapser Small (8)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 1.25, + "y": 0.6, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + (COMBAT[Left_Devout] + (LEFTCLAW | WINGS) | RIGHTCLAW + Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Above_Egg", + "gameObject": "Collapser Small (9)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 0.95, + "y": 0.9, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut)) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Below_Egg", + "gameObject": "Collapser Small (10)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 1.25, + "y": 0.9, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut)) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + (Collapser-Beast's_Den_Above_Egg | Collapser-Beast's_Den_Below_Egg)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Bench", + "gameObject": "Collapser Small (11)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": -0.25, + "y": 0.6, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "Beast_Den_Secret_Entrance", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den_Grub", + "gameObject": "Collapser Small (12)", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": 1.25, + "y": 1.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "(Beast_Den_Trap_Entrance + (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS))", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Garden_Map", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus1_24", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + "/CameraLockArea (3)" + ], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS | $SHADESKIP + Collapser-Garden_Map)", + "logicOverrides": {}, + "logicSubstitutions": { + "Bench-Gardens_Cornifer": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" + }, + "Queen's_Gardens_Map": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" + } + } + }, + { + "name": "Collapser-Bretta", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus2_23", + "x": 68.34, + "y": 55.08, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Fungus2_23[right1] + ((ANYCLAW | WINGS + Collapser-Bretta) | (FULLCLAW + FULLDASH | FULLCLAW + FULLSUPERDASH | LEFTCLAW + WINGS | RIGHTCLAW + ENEMYPOGOS + WINGS | COMPLEXSKIPS + FULLCLAW + $SHADESKIP[2HITS] + SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL] + $TAKEDAMAGE[2]))", + "logicOverrides": { + "Rescued_Bretta": "ORIG | Fungus2_23[right1] + (ANYCLAW | WINGS) + Collapser-Bretta" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Mask_Shard_Left", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus2_25", + "x": 85.24, + "y": 11.12, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Fungus2_25[top2] | (Fungus2_25[top1] | Fungus2_25[right1]) + (Collapser-Deepnest_Mask_Shard_Left | Collapser-Deepnest_Mask_Shard_Right + (WINGS | ANYCLAW))", + "logicOverrides": { + "Mask_Shard-Deepnest": "ORIG | (Fungus2_25[top1] | Fungus2_25[right1]) + (Collapser-Deepnest_Mask_Shard_Left | Collapser-Deepnest_Mask_Shard_Right) + (WINGS | ANYCLAW)" + }, + "logicSubstitutions": { + "Fungus2_25[right1]": { + "Fungus2_25[top2]": "Fungus2_25[top2] + (Collapser-Deepnest_Mask_Shard_Left | Collapser-Deepnest_Mask_Shard_Right)" + }, + "Fungus2_25[top1]": { + "Fungus2_25[top2]": "Fungus2_25[top2] + (Collapser-Deepnest_Mask_Shard_Left | Collapser-Deepnest_Mask_Shard_Right)" + } + } + }, + { + "name": "Collapser-Deepnest_Mask_Shard_Right", + "gameObject": "/Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "Fungus2_25", + "x": 99.33, + "y": 11.12, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Fungus2_25[top2] | (Fungus2_25[top1] | Fungus2_25[right1]) + (Collapser-Deepnest_Mask_Shard_Left + (WINGS | ANYCLAW) | Collapser-Deepnest_Mask_Shard_Right)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Fog_Canyon_Charm_Notch", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus3_28", + "x": 29.16, + "y": 11.01, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Fungus3_28[right1] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH)) + (Collapser-Fog_Canyon_Charm_Notch | (RIGHTCLAW | LEFTCLAW + WINGS | LEFTCLAW + ENEMYPOGOS))", + "logicOverrides": { + "Charm_Notch-Fog_Canyon": "ORIG | Fungus3_28[right1] + Collapser-Fog_Canyon_Charm_Notch + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH))" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Flukemungas", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "GG_Pipeway", + "x": 0.9, + "y": 20.62, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(GG_Pipeway[left1] | GG_Pipeway[right1]) + (ANYCLAW | WINGS)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deep_Focus", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Mines_06", + "x": 138.42, + "y": 20.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Mines_06[left1] | Mines_06[right1] + (Collapser-Deep_Focus | (LEFTSUPERDASH + (ANYCLAW | WINGS) | WINGS + LEFTDASH + BACKGROUNDPOGOS + (LEFTCLAW | PRECISEMOVEMENT | DAMAGEBOOSTS + $TAKEDAMAGE | SPELLAIRSTALL + $CASTSPELL) | BACKGROUNDPOGOS + $SHRIEKPOGO[1,2,NOSTALL]))", + "logicOverrides": { + "Mines_06[left1]": "(ORIG) | Mines_06[right1] + Collapser-Deep_Focus + (BACKGROUNDPOGOS + (WINGS | RIGHTCLAW) | WINGS + ANYCLAW)" + }, + "logicSubstitutions": { + "Mines_06[right1]": { + "Mines_06[left1]": "Mines_06[left1] + (Collapser-Deep_Focus | BACKGROUNDPOGOS + (RIGHTSUPERDASH + WINGS | RIGHTSUPERDASH + (RIGHTDASH + RIGHTCLAW | (DIFFICULTSKIPS + DANGEROUSSKIPS + DAMAGEBOOSTS + $TAKEDAMAGE + (RIGHTDASH | RIGHTCLAW))) | WINGS + (RIGHTDASH | DANGEROUSSKIPS + SPELLAIRSTALL + $CASTSPELL[2,before:ROOMSOUL] + RIGHTCLAW)))" + } + } + }, + { + "name": "Collapser-Catacombs_Trap_Left", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 164.3, + "y": 2.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_Middle", + "gameObject": "/Collapser Small (1)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 172.45, + "y": 2.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_Right", + "gameObject": "/Collapser Small (2)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 178.42, + "y": 2.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_Right_Dupe", + "gameObject": "/Collapser Small (3)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 178.64, + "y": 2.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_Final", + "gameObject": "/Collapser Small (4)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 194.29, + "y": 3.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2 + (ANYCLAW | WINGS)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Entrance", + "gameObject": "Collapser Small (5)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 72.79, + "y": 12.88, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "RestingGrounds_10[top1] | (RestingGrounds_10[left1] + Plank-Catacombs_Elevator | RestingGrounds_10) + Collapser-Catacombs_Entrance", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Seal", + "gameObject": "Collapser Small (6)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 57.66, + "y": 12.92, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + ((Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 | Collapser-Catacombs_Geo) + Wall-Catacombs_Seal | Collapser-Catacombs_Seal)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Geo", + "gameObject": "Collapser Small (7)", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": 47.93, + "y": 12.87, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(RestingGrounds_10 | RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10[left1] + Plank-Catacombs_Elevator) + (Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 | Collapser-Catacombs_Geo | Wall-Catacombs_Seal + Collapser-Catacombs_Seal)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Waterways_Map", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Waterways_09", + "x": 43.21, + "y": 28.94, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "(Waterways_09[left1] | Waterways_09[right1]) + (LEFTCLAW | ((LEFTDASH | LEFTSUPERDASH) + RIGHTCLAW) | WINGS) | $StartLocation[West Waterways]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Waterways_Tram_Grub", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Waterways_14", + "x": 238.19, + "y": 35.72, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "pinType": "World", + "logic": "Waterways_14[bot1] + (ANYCLAW | $SHRIEKPOGO[2]) + ((RIGHTSUPERDASH | ACID) + (RIGHTCLAW | LEFTCLAW + WINGS) + Collapser-Waterways_Tram_Grub | RIGHTSUPERDASH + WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | ENEMYPOGOS + DANGEROUSSKIPS) | ACID + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS + DANGEROUSSKIPS)) | Waterways_14[bot2] + (RIGHTCLAW | WINGS + LEFTCLAW | $SHRIEKPOGO[before:ITEMSOUL]) + ((RIGHTCLAW | WINGS + LEFTCLAW) + Collapser-Waterways_Tram_Grub | LEFTSUPERDASH + WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | ENEMYPOGOS + DANGEROUSSKIPS) | ACID + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS + DANGEROUSSKIPS))", + "logicOverrides": { + "Grub-Waterways_Requires_Tram": "ORIG | Waterways_14[bot1] + (ANYCLAW | $SHRIEKPOGO[2]) + (RIGHTSUPERDASH | ACID) + (RIGHTCLAW | LEFTCLAW + WINGS) + Collapser-Waterways_Tram_Grub | Waterways_14[bot2] + (RIGHTCLAW | WINGS + LEFTCLAW) + Collapser-Waterways_Tram_Grub" + }, + "logicSubstitutions": {} + }, + { + "name": "Collapser-White_Palace_Entrance_Orb", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "White_Palace_02", + "x": 0.5, + "y": -0.9, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "White_Palace_02[left1] + LEFTCLAW + (WINGS | RIGHTSUPERDASH + Collapser-White_Palace_Entrance_Orb)", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Path_of_Pain", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "White_Palace_17", + "x": 0.8, + "y": -0.9, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "extra": false, + "groupWalls": [], + "group": "", + "logic": "White_Palace_17[bot1] + (FULLDASH + FULLCLAW + WINGS | FULLDASH + (LEFTCLAW + $SHRIEKPOGO[1,2,NOSTALL] | RIGHTCLAW + $SHRIEKPOGO[2,NOSTALL]) | ANYCLAW + WINGS + Collapser-Path_of_Pain) | White_Palace_17[right1] + Lever-Path_of_Pain + Collapser-Path_of_Pain + WINGS + ANYCLAW", + "logicOverrides": { + "Lever-Path_of_Pain": "(ORIG) | (White_Palace_17[bot1] | White_Palace_17[right1] + Lever-Path_of_Pain) + ANYCLAW + WINGS + Collapser-Path_of_Pain" + }, + "logicSubstitutions": {} } ] \ No newline at end of file diff --git a/Resources/Data/WallGroups.json b/Resources/Data/WallGroups.json index ae1809f..2357804 100644 --- a/Resources/Data/WallGroups.json +++ b/Resources/Data/WallGroups.json @@ -83,18 +83,47 @@ "group": "Village_Walls", "logic": "((Deepnest_41 + (Plank-Village_Middle | WINGS + (SIDESLASH | UPSLASH | LEFTCLAW) | RIGHTCLAW | LEFTCLAW + ENEMYPOGOS)) | Deepnest_41[left2] | (Deepnest_41[right1] + (WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS) | ANYCLAW + Plank-Village_Upper))) + (LANTERN | NOLANTERN?FALSE | DARKROOMS)", "logicOverrides": { - "Deepnest_41": "(LANTERN | NOLANTERN?NONE | DARKROOMS) + (Deepnest_41[left1] + Plank-Village_Middle | Deepnest_41[left2] + (FULLCLAW | WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | DIFFICULTSKIPS + COMPLEXSKIPS + ENEMYPOGOS + ANYDASH + $SHADESKIP)) + Plank-Village_Lower | Deepnest_41[right1] + ((WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS) | LEFTCLAW) + Plank-Village_Middle | Plank-Village_Upper))" + "Deepnest_41": "(LANTERN | NOLANTERN?NONE | DARKROOMS) + (Deepnest_41[left1] + Collapser-Distant_Village_Fall + Plank-Village_Middle | Deepnest_41[left2] + (FULLCLAW | WINGS + (RIGHTCLAW | LEFTCLAW + ENEMYPOGOS | DIFFICULTSKIPS + COMPLEXSKIPS + ENEMYPOGOS + ANYDASH + $SHADESKIP)) + Plank-Village_Lower | Deepnest_41[right1] + (WINGS + (RIGHTCLAW | ENEMYPOGOS) | RIGHTCLAW + (ENEMYPOGOS | BACKGROUNDPOGOS) | LEFTCLAW) + (Collapser-Distant_Village_Fall + Plank-Village_Middle | Collapser-Distant_Village_Path + Plank-Village_Upper))", + "Deepnest_41[left2]": "ORIG | (LANTERN | NOLANTERN?NONE | DARKROOMS) + Deepnest_41 + Plank-Village_Lower" }, "logicSubstitutions": { "Deepnest_41[left1]": { - "Deepnest_41[left2]": "(Deepnest_41[left2] + Plank-Village_Upper + Plank-Village_Lower)" + "Deepnest_41[left2]": "(Deepnest_41[left2] + (Plank-Village_Upper + Collapser-Distant_Village_Path | Plank-Village_Middle + Collapser-Distant_Village_Fall) + Plank-Village_Lower)" }, "Deepnest_41[right1]": { - "Deepnest_41[left1]": "(Deepnest_41[left1] + Plank-Village_Upper + Plank-Village_Middle)", - "Deepnest_41[left2]": "(Deepnest_41[left2] + Plank-Village_Upper + Plank-Village_Lower)" + "Deepnest_41[left1]": "(Deepnest_41[left1] + (Collapser-Distant_Village_Fall + Plank-Village_Upper + Plank-Village_Middle | Collapser-Distant_Village_Path))", + "Deepnest_41[left2]": "(Deepnest_41[left2] + (Plank-Village_Upper | Collapser-Distant_Village_Fall + Collapser-Distant_Village_Path + Plank-Village_Middle) + Plank-Village_Lower)" } } }, + { + "name": "Collapser_Group-Den_Walls", + "gameObject": "", + "fsmType": "", + "sceneName": "Deepnest_Spider_Town", + "x": 0.35, + "y": 0.6, + "persistentBool": "", + "sprite": "rest_grounds_break_wall_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "Den_Walls", + "logic": "Beast_Den_Trap_Entrance | Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS)", + "logicOverrides": { + "Geo_Rock-Beast's_Den_Above_Trilobite": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS))", + "Geo_Rock-Beast's_Den_After_Herrah": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) | Beast_Den_Secret_Entrance + (LEFTCLAW + WINGS + (Herrah | COMBAT[Right_Devout]) | RIGHTCLAW + WINGS + Collapser-Beast's_Den_Herrah | FULLCLAW + (Herrah | COMBAT[Right_Devout] | Collapser-Beast's_Den_Herrah)))", + "Geo_Rock-Beast's_Den_Below_Herrah": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) | Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS))", + "Geo_Rock-Beast's_Den_Below_Egg": "(Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut)) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + (Collapser-Beast's_Den_Above_Egg | Collapser-Beast's_Den_Below_Egg)", + "Geo_Rock-Beast's_Den_Bottom": "(Beast_Den_Trap_Entrance | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + Collapser-Beast's_Den_Bottom", + "Grub-Beast's_Den": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + (FULLCLAW | WINGS + ANYCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS))", + "Hallownest_Seal-Beast's_Den": "(Beast_Den_Trap_Entrance | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + Collapser-Beast's_Den_Seal", + "Herrah": "(Beast_Den_Trap_Entrance + Collapser-Beast's_Den_Grub + ((Herrah | Collapser-Beast's_Den_Herrah) + COMBAT[Left_Devout] | COMBAT[Any_Devout]) + (FULLCLAW | ENEMYPOGOS + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[3,before:ROOMSOUL]) | Beast_Den_Secret_Entrance + (LEFTCLAW + WINGS + (Herrah | COMBAT[Right_Devout]) | RIGHTCLAW + WINGS + Collapser-Beast's_Den_Herrah | FULLCLAW + (Herrah | COMBAT[Right_Devout] | Collapser-Beast's_Den_Herrah))) + DREAMNAIL", + "Rancid_Egg-Beast's_Den": "(Beast_Den_Trap_Entrance + (WINGS + ANYCLAW | (FULLCLAW | WINGS + COMPLEXSKIPS + $SHADESKIP[2HITS] | $SHRIEKPOGO[2,before:ROOMSOUL] + $SHRIEKPOGO[2,before:ROOMSOUL]) + (COMBAT[Left_Devout] | Collapser-Beast's_Den_Shortcut)) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + (Collapser-Beast's_Den_Above_Egg | Collapser-Beast's_Den_Below_Egg)", + "Soul_Totem-Beast's_Den": "(Beast_Den_Trap_Entrance + (LEFTCLAW | WINGS | RIGHTCLAW + Collapser-Beast's_Den_Shortcut) | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)) + COMBAT[Left_Devout]" + }, + "logicSubstitutions": {} + }, { "name": "Wall_Group-Catacombs_Walls", "gameObject": "", @@ -110,10 +139,12 @@ "group": "Catacombs_Walls", "logic": "RestingGrounds_10[left1] | RestingGrounds_10[top1] | RestingGrounds_10[top2]", "logicOverrides": { - "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe": "(RestingGrounds_10[top1] | RestingGrounds_10) + Wall-Catacombs_Left_1", - "Hallownest_Seal-Resting_Grounds_Catacombs": "(RestingGrounds_10[top1] | RestingGrounds_10) + Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 + Wall-Catacombs_Seal", + "Geo_Rock-Resting_Grounds_Catacombs_Left": "(RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10) + (Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 | Collapser-Catacombs_Geo | Collapser-Catacombs_Seal + Wall-Catacombs_Seal)", + "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe": "(RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10) + (Wall-Catacombs_Left_1 | Wall-Catacombs_Left_2 + (Collapser-Catacombs_Geo | Collapser-Catacombs_Seal + Wall-Catacombs_Seal))", + "Hallownest_Seal-Resting_Grounds_Catacombs": "(RestingGrounds_10[top1] + Collapser-Catacombs_Entrance | RestingGrounds_10) + ((Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2 | Collapser-Catacombs_Geo) + Wall-Catacombs_Seal | Collapser-Catacombs_Seal)", "Opened_Resting_Grounds_Catacombs_Wall": "Plank-Catacombs_Elevator", "RestingGrounds_10[left1]": "RestingGrounds_10[left1] | (ORIG) + Plank-Catacombs_Elevator", + "RestingGrounds_10[top1]": "RestingGrounds_10[top1] + (ANYCLAW | WINGS + PRECISEMOVEMENT) | (ORIG) + Collapser-Catacombs_Entrance", "RestingGrounds_10[top2]": "RestingGrounds_10[top2] + (LEFTCLAW | WINGS + PRECISEMOVEMENT | RIGHTCLAW) | (ORIG) + Wall-Catacombs_Right_1 + Wall-Catacombs_Grey_Mourner", "Wanderer's_Journal-Resting_Grounds_Catacombs": "(ORIG) + Wall-Catacombs_Right_2" }, @@ -123,11 +154,6 @@ "RestingGrounds_10": "(RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner | RestingGrounds_10)", "UPWALLBREAK": "Wall-Catacombs_Right_1 + Wall-Catacombs_Grub" }, - "Geo_Rock-Resting_Grounds_Catacombs_Left": - { - "RestingGrounds_10": "(RestingGrounds_10[left1] + Plank-Catacombs_Elevator | RestingGrounds_10[top1] | RestingGrounds_10)", - "UPWALLBREAK": "Wall-Catacombs_Left_1 + Wall-Catacombs_Left_2" - }, "Grub-Resting_Grounds": { "RestingGrounds_10": "(RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner | RestingGrounds_10)", @@ -135,7 +161,7 @@ }, "RestingGrounds_10": { "RestingGrounds_10[left1]": "RestingGrounds_10[left1] + Plank-Catacombs_Elevator + Wall-Catacombs_Right_1", - "RestingGrounds_10[top1]": "RestingGrounds_10[top1] + Wall-Catacombs_Right_1", + "RestingGrounds_10[top1]": "RestingGrounds_10[top1] + Collapser-Catacombs_Entrance + Wall-Catacombs_Right_1", "RestingGrounds_10[top2]": "RestingGrounds_10[top2] + Wall-Catacombs_Right_1 + Wall-Catacombs_Grey_Mourner" }, "Ruins2_10[right1]": { @@ -186,7 +212,7 @@ "Broke_Quake_Floor_After_Soul_Master_2": "Dive_Floor-Inner_Sanctum_2", "Broke_Quake_Floor_After_Soul_Master_3": "Dive_Floor-Inner_Sanctum_Grub", "Broke_Quake_Floor_After_Soul_Master_4": "Dive_Floor-Inner_Sanctum_Bottom", - "Broke_Sanctum_Geo_Rock_Quake_Floor": "Dive_Floor-Inner_Sanctum_Cenda", + "Broke_Sanctum_Geo_Rock_Quake_Floor": "Dive_Floor-Inner_Sanctum_Lore", "Hallownest_Seal-Soul_Sanctum": "(ORIG + Dive_Floor-Inner_Sanctum_Seal) | Ruins1_32[right2] + Lever-Sanctum_West_Upper?TRUE + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS))", "Ruins1_32[right1]": "(ORIG) | (Ruins1_32[right2] + Dive_Floor-Inner_Sanctum_2 + ((RIGHTCLAW | ENEMYPOGOS) + Lever-Sanctum_West_Upper?TRUE | (RIGHTCLAW + (WINGS | ENEMYPOGOS)) + Dive_Floor-Inner_Sanctum_1) + (Lever-Sanctum_West_Lower?TRUE + Dive_Floor-Inner_Sanctum_Seal + Dive_Floor-Inner_Sanctum_Lever + (LEFTCLAW | RIGHTCLAW + (ENEMYPOGOS | WINGS) | (WINGS + ENEMYPOGOS)) | (WINGS + ENEMYPOGOS + Dive_Floor-Inner_Sanctum_Bottom + Dive_Floor-Inner_Sanctum_Grub)))" }, diff --git a/Resources/Logic/ConnectionOverrides.json b/Resources/Logic/ConnectionOverrides.json index 3ad3dba..04590f9 100644 --- a/Resources/Logic/ConnectionOverrides.json +++ b/Resources/Logic/ConnectionOverrides.json @@ -6,22 +6,30 @@ "Ruins_Bathhouse[right1]": "Ruins_Bathhouse[right1] + Wall-Pleasure_House" } }, + { + "name": "Beast_Den_Altar", + "logicOverride": "Deepnest_Spider_Town[left1] + (Beast_Den_Secret_Entrance + (LEFTCLAW | RIGHTCLAW + WINGS) | Beast_Den_Trap_Entrance + FALSE) + COMBAT[Right_Devout]", + "logicSubstitutions": {} + }, { "name": "Bench-Crystallized_Mound", "logicOverride": "(ORIG) | Mines_35[left1] + (UPWALLBREAK | (((LEFTSUPERDASH + RIGHTCLAW) | (RIGHTSUPERDASH + LEFTCLAW + WINGS + BACKGROUNDPOGOS)) + OBSCURESKIPS)) + (RIGHTDASH | RIGHTSUPERDASH | RIGHTCLAW | WINGS | (FIREBALLSKIPS + (LEFTFIREBALL | SCREAM)) + $CASTSPELL[3]) + Plank-Crystallized_Mound + (RIGHTCLAW | WINGS + LEFTCLAW + BACKGROUNDPOGOS)", "logicSubstitutions": {} }, { - "name": "Chandelier-Watcher_Knights", - "logicOverride": "ORIG + Wall-Chandelier", + "name": "Bench-Mimic's_Secret", + "logicOverride": "(ORIG) | Mines_35[left1] + (UPWALLBREAK | (((LEFTSUPERDASH + RIGHTCLAW) | (RIGHTSUPERDASH + LEFTCLAW + WINGS + BACKGROUNDPOGOS)) + OBSCURESKIPS)) + (RIGHTDASH | RIGHTSUPERDASH | RIGHTCLAW | WINGS | (FIREBALLSKIPS + (LEFTFIREBALL | SCREAM)) + $CASTSPELL[3]) + Plank-Crystallized_Mound + (RIGHTCLAW | WINGS + LEFTCLAW + BACKGROUNDPOGOS)", "logicSubstitutions": {} }, { - "name": "Deepnest_East_01", - "logicOverride": "", - "logicSubstitutions": { - "Deepnest_East_01[right1]": "Deepnest_East_01[right1] + Plank-Hive_Exit" - } + "name": "Bretta_Key", + "logicOverride": "(ORIG) | Fungus2_23[right1] + (ANYCLAW | WINGS + Collapser-Bretta)", + "logicSubstitutions": {} + }, + { + "name": "Chandelier-Watcher_Knights", + "logicOverride": "ORIG + Wall-Chandelier", + "logicSubstitutions": {} }, { "name": "Deepnest_East_04", @@ -51,6 +59,13 @@ "RestingGrounds_10": "(RestingGrounds_10 | RestingGrounds_10[left1] + Plank-Catacombs_Elevator | RestingGrounds_10[top1] | RestingGrounds_10[top2] + Wall-Catacombs_Grey_Mourner)" } }, + { + "name": "Geo_Rock-Crystal_Peak_Mimic_Grub", + "logicOverride": "", + "logicSubstitutions": { + "Bench-Mimic's_Secret": "Bench-Mimic's_Secret + Wall-Peak_Mimic" + } + }, { "name": "Ghost_Essence-Marissa", "logicOverride": "", @@ -65,6 +80,20 @@ "Cliffs_02[bot1]": "Cliffs_02[bot1] + Plank-Cliff's_Pass" } }, + { + "name": "Grub-Crystal_Peak_Mimic", + "logicOverride": "", + "logicSubstitutions": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" + } + }, + { + "name": "Mimic_Grub-Crystal_Peak", + "logicOverride": "", + "logicSubstitutions": { + "Bench-Mimic's_Secret": "Bench-Mimic's_Secret + Wall-Peak_Mimic" + } + }, { "name": "Journal_Entry-Weathered_Mask", "logicOverride": "", @@ -111,6 +140,20 @@ "Ruins_Bathhouse[right1]": "Ruins_Bathhouse[right1] + Wall-Pleasure_House" } }, + { + "name": "Mimic_Grub-Crystal_Peak", + "logicOverride": "", + "logicSubstitutions": { + "Bench-Mimic's_Secret": "Bench-Mimic's_Secret + Wall-Peak_Mimic" + } + }, + { + "name": "Mines_16[top1]", + "logicOverride": "", + "logicSubstitutions": { + "Bench-Mimic's_Secret": "Bench-Mimic's_Secret + Wall-Peak_Mimic" + } + }, { "name": "Mines_35[left1]", "logicOverride": "", @@ -124,5 +167,12 @@ "logicSubstitutions": { "Deepnest_East_01[right1]": "Deepnest_East_01[right1] + Plank-Hive_Exit" } + }, + { + "name": "Quirrel_Deepnest", + "logicOverride": "", + "logicSubstitutions": { + "Deepnest_30[top1]": "Deepnest_30[top1] + Collapser-Deepnest_Hot_Springs_Path + Collapser-Deepnest_Hot_Springs_Path_2" + } } ] \ No newline at end of file diff --git a/Resources/Logic/Waypoints.json b/Resources/Logic/Waypoints.json index af108a4..5a8a2d8 100644 --- a/Resources/Logic/Waypoints.json +++ b/Resources/Logic/Waypoints.json @@ -1,4 +1,14 @@ [ + { + "name": "Beast_Den_Secret_Entrance", + "logic": "Deepnest_Spider_Town[left1] + (LEFTCLAW + Collapser-Beast's_Den_Bench | WINGS + (RIGHTCLAW + (LEFTDASH | LEFTSUPERDASH | FIREBALLSKIPS + (RIGHTFIREBALL | SCREAM) + $CASTSPELL[1]) | LEFTCLAW + RIGHTSUPERDASH) + Plank-Den_Secret_Entrance) | WARPSTARTTOBENCH + Bench-Beast's_Den/", + "Stateless": false + }, + { + "name": "Beast_Den_Trap_Entrance", + "logic": "Deepnest_Spider_Town[left1] + Trap_Bench?TRUE | Beast_Den_Secret_Entrance + Collapser-Beast's_Den_Grub + (LEFTCLAW | RIGHTCLAW + WINGS)", + "Stateless": false + }, { "name": "Opened_Pantheon_1", "logic": "GG_Atrium + ((Defeated_Gruz_Mother + Defeated_False_Knight + Defeated_Massive_Moss_Charger + Defeated_Hornet_1 + Defeated_Gorb + Defeated_Dung_Defender + Defeated_Soul_Warrior + Defeated_Brooding_Mawlek) | (PANTHEON_KEY_1 ? FALSE))", diff --git a/Resources/Sprites/royal_garden_break_window.png b/Resources/Sprites/royal_garden_break_window.png new file mode 100644 index 0000000..2368f5b Binary files /dev/null and b/Resources/Sprites/royal_garden_break_window.png differ diff --git a/Settings/BWR_Settings.cs b/Settings/BWR_Settings.cs index 4f83fcd..d2bd060 100644 --- a/Settings/BWR_Settings.cs +++ b/Settings/BWR_Settings.cs @@ -6,7 +6,9 @@ public class BWR_Settings public bool WoodenPlanks = false; public bool RockWalls = false; public bool DiveFloors = false; - public bool KingsPass = false; + public bool Collapsers = false; + // Extra Walls are not yet implemented on this patch + //public bool ExtraWalls = false; public bool GodhomeWalls = false; [MenuChanger.Attributes.MenuRange(-1, 99)] @@ -16,9 +18,11 @@ public class BWR_Settings public int RockWallGroup = -1; [MenuChanger.Attributes.MenuRange(-1, 99)] - public int DiveFloorGroup = -1; - public bool GroupTogetherNearbyWalls = false; - public bool ExcludeWallsWhichMaySoftlockYou = false; + public int DiveFloorGroup = -1; + [MenuChanger.Attributes.MenuRange(-1, 99)] + public int CollapserGroup = -1; + public bool GroupWalls = false; + public MylaShopSettings MylaShop = new(); } } \ No newline at end of file diff --git a/Settings/ConnectionMenu.cs b/Settings/ConnectionMenu.cs index cb62eec..8c4b5f3 100644 --- a/Settings/ConnectionMenu.cs +++ b/Settings/ConnectionMenu.cs @@ -89,6 +89,7 @@ private static bool HandleButton(MenuPage landingPage, out SmallButton button) private void SetButtonColor(SmallButton target, Func condition) { + RandomizerMenuAPI.GenerateStartLocationDict(); target.Parent.BeforeShow += () => { target.Text.color = condition() ? Colors.TRUE_COLOR : Colors.DEFAULT_COLOR;