From 99691f5efdf621ab339fd6349de08dad8eca0921 Mon Sep 17 00:00:00 2001 From: nerthul11 Date: Thu, 6 Feb 2025 13:35:36 -0300 Subject: [PATCH 1/4] BWR 4.0 prep --- IC/{WallObject.cs => AbstractWallItem.cs} | 23 +- IC/AbstractWallLocation.cs | 78 +++++ IC/BreakableWallItem.cs | 25 +- ...akableWallLocation.cs => PlankLocation.cs} | 78 +---- IC/Shop/BreakableCost.cs | 8 + IC/Shop/BreakableCostDisplayer.cs | 4 + IC/Shop/CostSupport.cs | 2 +- IC/WallLocation.cs | 296 ++++++++++++++++++ Interop/FStats.cs | 4 +- Manager/ItemHandler.cs | 43 ++- Manager/LogicHandler.cs | 18 +- Manager/Manager.cs | 9 +- Modules/BreakableWallModule.cs | 10 +- Settings/BWR_Settings.cs | 5 +- 14 files changed, 489 insertions(+), 114 deletions(-) rename IC/{WallObject.cs => AbstractWallItem.cs} (56%) create mode 100644 IC/AbstractWallLocation.cs rename IC/{BreakableWallLocation.cs => PlankLocation.cs} (84%) create mode 100644 IC/WallLocation.cs diff --git a/IC/WallObject.cs b/IC/AbstractWallItem.cs similarity index 56% rename from IC/WallObject.cs rename to IC/AbstractWallItem.cs index 1c59c1c..e2f4a0b 100644 --- a/IC/WallObject.cs +++ b/IC/AbstractWallItem.cs @@ -1,12 +1,14 @@ using System; using System.Collections.Generic; +using BreakableWallRandomizer.Modules; +using ItemChanger; +using UnityEngine; namespace BreakableWallRandomizer.IC { [Serializable] - public class WallObject + public class AbstractWallItem : AbstractItem { - public string name; public string gameObject; public string fsmType; public string sceneName; @@ -21,6 +23,23 @@ public class WallObject public string logic; public Dictionary logicOverrides; public Dictionary> logicSubstitutions; + + public override void GiveImmediate(GiveInfo info) + { + 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(); + } } [Serializable] diff --git a/IC/AbstractWallLocation.cs b/IC/AbstractWallLocation.cs new file mode 100644 index 0000000..e449719 --- /dev/null +++ b/IC/AbstractWallLocation.cs @@ -0,0 +1,78 @@ +using ItemChanger.Locations; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BreakableWallRandomizer.IC +{ + [Serializable] + public class AbstractWallLocation : AutoLocation + { + public string objectName; + public string fsmType; + public List alsoDestroy; + public bool exit; + public List groupWalls; + protected override void OnLoad() {} + + protected override void OnUnload() {} + + 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) + { + 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()) + { + 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); + } + + for (var i = 0; i < go.transform.childCount; i++) + { + MakeWallPassable(go.transform.GetChild(i).gameObject, destroy); + if (destroy) + GameObject.Destroy(go); + } + } + } +} \ No newline at end of file diff --git a/IC/BreakableWallItem.cs b/IC/BreakableWallItem.cs index d9ef77b..cf5e1f3 100644 --- a/IC/BreakableWallItem.cs +++ b/IC/BreakableWallItem.cs @@ -9,13 +9,8 @@ namespace BreakableWallRandomizer.IC { [Serializable] - public class BreakableWallItem : AbstractItem + public class BreakableWallItem : AbstractWallItem { - public string sceneName; - public string gameObject; - public string fsmType; - public string persistentBool; - public List groupWalls; public BreakableWallItem( string name, string sceneName, string gameObject, string fsmType, string persistentBool, string sprite, List groupWalls @@ -58,18 +53,18 @@ private InteropTag BreakableWallItemTag() 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 +73,15 @@ 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(); } } } diff --git a/IC/BreakableWallLocation.cs b/IC/PlankLocation.cs similarity index 84% rename from IC/BreakableWallLocation.cs rename to IC/PlankLocation.cs index 7ebca5d..33337e2 100644 --- a/IC/BreakableWallLocation.cs +++ b/IC/PlankLocation.cs @@ -2,7 +2,6 @@ using BreakableWallRandomizer.Modules; using HutongGames.PlayMaker.Actions; using ItemChanger; -using ItemChanger.Locations; using ItemChanger.Tags; using ItemChanger.Util; using Satchel; @@ -13,14 +12,9 @@ namespace BreakableWallRandomizer.IC { [Serializable] - public class BreakableWallLocation : AutoLocation + public class PlankLocation : AbstractWallLocation { - public string objectName; - public string fsmType; - public List alsoDestroy; - public bool exit; - public List groupWalls; - public BreakableWallLocation( + public PlankLocation( string name, string sceneName, string objectName, string fsmType, List alsoDestroy, float x, float y, bool exit, List groupWalls ) @@ -111,68 +105,10 @@ 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) - { - 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()) - { - 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); - } - - 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) { + // This edit will affect all individual walls, so we list them to iterate List wallList = []; - if (groupWalls.Count > 0) { foreach (CondensedWallObject wallObject in groupWalls) @@ -223,7 +159,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"); @@ -271,12 +207,12 @@ 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()); } @@ -348,7 +284,7 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) 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/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/WallLocation.cs b/IC/WallLocation.cs new file mode 100644 index 0000000..84407ed --- /dev/null +++ b/IC/WallLocation.cs @@ -0,0 +1,296 @@ +using BreakableWallRandomizer.Fsm; +using BreakableWallRandomizer.Modules; +using HutongGames.PlayMaker.Actions; +using ItemChanger; +using ItemChanger.Tags; +using ItemChanger.Util; +using Satchel; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BreakableWallRandomizer.IC +{ + [Serializable] + public class WallLocation : AbstractWallLocation + { + public WallLocation( + string name, string sceneName, string objectName, string fsmType, List alsoDestroy, + float x, float y, bool exit, List groupWalls + ) + { + this.name = name; + this.sceneName = sceneName; + this.objectName = objectName; + this.fsmType = fsmType; + this.alsoDestroy = alsoDestroy; + this.exit = exit; + this.groupWalls = groupWalls; + flingType = FlingType.DirectDeposit; + tags = [BreakableWallLocationTag(x, y)]; + } + + private InteropTag BreakableWallLocationTag(float x, float y) + { + // Define sprite by location type + string sprite = ""; + if (name.StartsWith("Wall-") || name.StartsWith("Wall_Group")) + sprite = "mine_break_wall_03_0deg"; + if (name.StartsWith("Plank-") || name.StartsWith("Plank_Group")) + 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; + Dictionary sceneOverride = []; + sceneOverride.Add("Deepnest_45_v02", "Deepnest_39"); + sceneOverride.Add("Deepnest_Spider_Town", "Deepnest_10"); + sceneOverride.Add("Deepnest_East_17", "Deepnest_East_14"); + sceneOverride.Add("GG_Workshop", "GG_Waterways"); + sceneOverride.Add("GG_Atrium_Roof", "GG_Waterways"); + sceneOverride.Add("Mines_35", "Mines_28"); + sceneOverride.Add("Room_Colosseum_02", "Deepnest_East_09"); + 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_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]; + + 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)}; + tag.Message = "RandoSupplementalMetadata"; + return tag; + } + protected override void OnLoad() + { + if (groupWalls.Count > 0) + { + foreach (CondensedWallObject wall in groupWalls) + Events.AddFsmEdit(wall.sceneName, new(wall.gameObject, wall.fsmType), ModifyWallBehaviour); + } + else + { + Events.AddFsmEdit(sceneName, new(objectName, fsmType), ModifyWallBehaviour); + if (name == "Wall-Deepnest_Fungal") + Events.AddFsmEdit(SceneNames.Fungus2_20, new("/Breakable Wall Waterways", fsmType), ModifyWallBehaviour); + if (name == "Plank-King's_Pass") + Events.AddFsmEdit(sceneName, new("Collapser Tute 01", "collapse tute"), ManageKPCollapse); + } + } + + protected override void OnUnload() + { + if (groupWalls.Count > 0) + { + foreach (CondensedWallObject wall in groupWalls) + Events.RemoveFsmEdit(wall.sceneName, new(wall.gameObject, wall.fsmType), ModifyWallBehaviour); + } + else + { + Events.RemoveFsmEdit(sceneName, new(objectName, fsmType), ModifyWallBehaviour); + if (name == "Wall-Fungal_Deepnest_Two_Way") + Events.RemoveFsmEdit(SceneNames.Fungus2_20, new("/Breakable Wall Waterways", fsmType), ModifyWallBehaviour); + if (name == "Plank-King's_Pass") + Events.RemoveFsmEdit(sceneName, new("Collapser Tute 01", "collapse tute"), ManageKPCollapse); + } + } + + private void ModifyWallBehaviour(PlayMakerFSM fsm) + { + // This edit will affect all individual walls, so we list them to iterate + List wallList = []; + if (groupWalls.Count > 0) + { + foreach (CondensedWallObject wallObject in groupWalls) + wallList.Add(wallObject); + } + else + { + wallList.Add(new(name, sceneName, objectName, fsmType)); + } + + foreach (CondensedWallObject wall in wallList) + { + if (wall.fsmType != fsm.FsmName) + continue; + + // If a location is present, it means that it's not vanilla + BreakableWallModule.Instance.vanillaWalls.RemoveAll(wall => wall.name == name); + + // This particular mask should be destroyed regardless of wall state + if (wall.name == "Wall-Shade_Soul_Shortcut") + GameObject.Destroy(GameObject.Find("/Breakable Wall Ruin Lift/Masks")); + + // The wall will delete itself based on its state if we don't do this. + if (wall.fsmType == "break_floor" || wall.fsmType == "FSM") + { + fsm.ChangeTransition("Initiate", "ACTIVATE", "Idle"); + } + else if (wall.fsmType == "breakable_wall_v2") + { + // 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.UnlockedBreakables.Contains(wall.name)) + { + fsm.ChangeTransition("Activated?", "ACTIVATE", "Initiate"); + fsm.ChangeTransition("Activated?", "FINISHED", "Initiate"); + } + else + fsm.ChangeTransition("Activated?", "ACTIVATE", "Ruin Lift?"); + } else if (wall.fsmType == "quake_floor") + { + fsm.ChangeTransition("Init", "ACTIVATE", "Solid"); + if (fsm.GetValidState("Transient").GetActions().Length >= 1) + fsm.RemoveAction("Transient", 0); + if (fsm.GetValidState("Solid").GetActions().Length >= 1) + fsm.RemoveAction("Solid", 0); + + var collider = fsm.gameObject.GetComponent(); + collider.isTrigger = true; // Make the first collider always a trigger + + // Add our own collider for physics collision. + var newCollider = fsm.gameObject.AddComponent(); + newCollider.offset = collider.offset; + newCollider.size = collider.size; + } else if (wall.fsmType == "Detect Quake") + { + fsm.ChangeTransition("Init", "ACTIVATE", "Detect"); + } + + // If the wall item had been obtained when calling GiveItem, destroy the wall on trigger. + fsm.AddState("DeleteWall"); + fsm.AddCustomAction("DeleteWall", () => MakeWallPassable(fsm.gameObject, true)); + if (fsm.GetTransition(originalBreakStateName, "FINISHED") is not null) + fsm.ChangeTransition(originalBreakStateName, "FINISHED", "DeleteWall"); + else + fsm.AddTransition(originalBreakStateName, "FINISHED", "DeleteWall"); + + // Add GiveItem state + fsm.AddState("GiveItem"); + fsm.AddCustomAction("GiveItem", () => + { + ItemUtility.GiveSequentially(Placement.Items, Placement, new GiveInfo() + { + FlingType = FlingType.Everywhere, + MessageType = MessageType.Corner, + }); + + Placement.AddVisitFlag(VisitState.Opened); + }); + fsm.AddAction("GiveItem", new CustomFsmBooleanCheck( + 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.UnlockedBreakables.Contains(wall.name)) + { + MakeWallPassable(fsm.gameObject, Placement.AllObtained()); + } + else + // If we didn't unlock this door yet... + { + // ...and we already obtained the item at this location, set the wall to an unhittable state: + if (Placement.AllObtained()) + { + fsm.SetState("GiveItem"); + } + // ...and there are items left to collect: + else + { + foreach (var action in fsm.GetValidState(originalBreakStateName).Actions) + { + if (action is AudioPlayerOneShotSingle or PlayParticleEmitter or AudioPlayerOneShot) + { + fsm.AddAction("GiveItem", action); + } + } + + // In case we're in the same scene when it breaks, check if there are items left, + // and then set states accordingly + + fsm.AddState("BreakSameScene"); + + // In any of the cases, the wall is expected to become passable. + fsm.AddCustomAction("BreakSameScene", () => + { + MakeWallPassable(fsm.gameObject, Placement.AllObtained()); + Placement.AddVisitFlag(VisitState.Opened); + }); + + // If placement is cleared, make the wall disappear. Otherwise, set to hittable state. + fsm.AddAction("BreakSameScene", new CustomFsmBooleanCheck( + Placement.AllObtained(), + "CLEARED", + "UNCLEARED" + )); + fsm.AddTransition("BreakSameScene", "UNCLEARED", originalIdleStateName); + fsm.AddTransition("BreakSameScene", "CLEARED", originalBreakStateName); + } + } + + if (wall.fsmType == "breakable_wall_v2") + { + fsm.ChangeTransition("Idle", "WALL BREAKER", "GiveItem"); + fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); + fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); + } + else if (wall.fsmType == "FSM") + { + fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); + fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); + } + else if (wall.fsmType == "break_floor") + { + fsm.ChangeTransition("Hit", "HIT 3", "GiveItem"); + } else if (wall.fsmType == "quake_floor") + { + fsm.ChangeTransition("Transient", "DESTROY", "GiveItem"); + } else if (wall.fsmType == "Detect Quake") + { + fsm.ChangeTransition("Quake Hit", "FINISHED", "GiveItem"); + } + } + } + + private void ManageKPCollapse(PlayMakerFSM fsm) + { + if (BreakableWallModule.Instance.UnlockedBreakables.Contains(name)) + { + fsm.ChangeTransition("Init", "FINISHED", "Activate"); + } + else + { + fsm.ChangeTransition("Init", "ACTIVATE", "Idle"); + fsm.AddState("Give item"); + fsm.AddCustomAction("Give item", () => { + ItemUtility.GiveSequentially(Placement.Items, Placement, new GiveInfo() + { + FlingType = FlingType.DirectDeposit, + MessageType = MessageType.Corner, + }); + }); + fsm.ChangeTransition("Crumble", "BREAK", "Give item"); + if (Placement.GetUIName() == name.Replace("_", " ").Replace("-", " - ")) + { + fsm.AddCustomAction("Give item", () => { + var obj = GameObject.Find(objectName); + GameObject.Destroy(obj); + }); + fsm.AddTransition("Give item", "FINISHED", "Break"); + } + } + } + } +} \ No newline at end of file diff --git a/Interop/FStats.cs b/Interop/FStats.cs index 2560d6d..012b062 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 (AbstractWallItem wall in wallList) module.vanillaWalls.Add(new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType)); } } diff --git a/Manager/ItemHandler.cs b/Manager/ItemHandler.cs index d1ae77c..1dbf19f 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) + { + diveSettings = rb.rng.Next(3); + } ItemGroupBuilder wallGroup = null; ItemGroupBuilder plankGroup = null; ItemGroupBuilder diveGroup = null; + ItemGroupBuilder collapserGroup = null; if (wallSettings > 0) { @@ -82,6 +88,15 @@ private static void DefineGroups(RequestBuilder rb) 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.DiveFloors) + 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")) // Dives + { + 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("Dives"); + rl.AddCost(new WallLogicCost(lm.GetTermStrict("Broken_Collapsers"), rng.Next(minCost, maxCost), amount => new DiveCost(amount))); + } } }; }); @@ -241,9 +273,9 @@ 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)); + List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); bool useGroups = BWR_Manager.Settings.GroupTogetherNearbyWalls; - foreach (WallObject wall in wallList) + foreach (AbstractWallItem wall in wallList) { bool include = wall.name.StartsWith("Wall") && BWR_Manager.Settings.RockWalls; include = include || (wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks); @@ -292,17 +324,18 @@ private static void AddWalls(RequestBuilder rb) { using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (WallObject group in groupList) + foreach (AbstractWallItem group in groupList) { - foreach (WallObject wall in wallList) + foreach (AbstractWallItem wall in wallList) { 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 = 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")) diff --git a/Manager/LogicHandler.cs b/Manager/LogicHandler.cs index 3d2692a..95fb83f 100644 --- a/Manager/LogicHandler.cs +++ b/Manager/LogicHandler.cs @@ -32,15 +32,16 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) 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)); 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")); - foreach (WallObject wall in wallList) + foreach (AbstractWallItem wall in wallList) { lmb.GetOrAddTerm(wall.name); lmb.AddItem(new StringItemTemplate(wall.name, $"Broken_{wall.name.Split('-')[0]}s++ >> {wall.name}++")); @@ -66,9 +67,9 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (WallObject g in groupList) + foreach (AbstractWallItem g in groupList) { string groupName = g.name.Split('-')[1]; string effect = ""; @@ -76,7 +77,8 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) int wallCount = 0; int plankCount = 0; int floorCount = 0; - foreach (WallObject wall in wallList) + int collapserCount = 0; + foreach (AbstractWallItem wall in wallList) { if (wall.group == groupName) { @@ -86,6 +88,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 +98,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..15198f5 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 = 0; public static void Hook() { DefineObjects(); @@ -33,9 +34,9 @@ private static void DefineObjects() 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)); - foreach (WallObject wall in wallList) + foreach (AbstractWallItem 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); @@ -45,9 +46,9 @@ private static void DefineObjects() using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (WallObject group in groupList) + foreach (AbstractWallItem 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); diff --git a/Modules/BreakableWallModule.cs b/Modules/BreakableWallModule.cs index 5bab8df..4f241da 100644 --- a/Modules/BreakableWallModule.cs +++ b/Modules/BreakableWallModule.cs @@ -15,10 +15,11 @@ 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"); @@ -39,6 +40,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) @@ -137,9 +139,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/Settings/BWR_Settings.cs b/Settings/BWR_Settings.cs index 4f83fcd..e5b4242 100644 --- a/Settings/BWR_Settings.cs +++ b/Settings/BWR_Settings.cs @@ -6,6 +6,7 @@ public class BWR_Settings public bool WoodenPlanks = false; public bool RockWalls = false; public bool DiveFloors = false; + public bool Collapsers = false; public bool KingsPass = false; public bool GodhomeWalls = false; @@ -16,7 +17,9 @@ public class BWR_Settings public int RockWallGroup = -1; [MenuChanger.Attributes.MenuRange(-1, 99)] - public int DiveFloorGroup = -1; + public int DiveFloorGroup = -1; + [MenuChanger.Attributes.MenuRange(-1, 99)] + public int CollapserGroup = -1; public bool GroupTogetherNearbyWalls = false; public bool ExcludeWallsWhichMaySoftlockYou = false; public MylaShopSettings MylaShop = new(); From 658163394e2f25a83de4a907e07711869b58d6ff Mon Sep 17 00:00:00 2001 From: nerthul11 Date: Sat, 15 Feb 2025 12:11:01 -0300 Subject: [PATCH 2/4] Collapsers partly defined --- BreakableWallRandomizer.cs | 2 +- BreakableWallRandomizer.csproj | 4 +- FSM/CustomCollide.cs | 22 ++ IC/AbstractWallLocation.cs | 78 ---- IC/BreakableWallItem.cs | 5 +- IC/PlankLocation.cs | 314 --------------- IC/WallLocation.cs | 102 ++++- Manager/ItemHandler.cs | 21 +- Manager/LogicHandler.cs | 5 + Modules/BreakableWallModule.cs | 3 +- Resources/Data/BreakableWallObjects.json | 472 ++++++++++++++++++++++- Resources/Logic/ConnectionOverrides.json | 7 + 12 files changed, 619 insertions(+), 416 deletions(-) create mode 100644 FSM/CustomCollide.cs delete mode 100644 IC/AbstractWallLocation.cs delete mode 100644 IC/PlankLocation.cs diff --git a/BreakableWallRandomizer.cs b/BreakableWallRandomizer.cs index 0130dd9..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.2"; + 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 d44751f..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.2 - 3.0.4.2 + 4.0.0.0 + 4.0.0.0 bin\$(Configuration)\ latest 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/AbstractWallLocation.cs b/IC/AbstractWallLocation.cs deleted file mode 100644 index e449719..0000000 --- a/IC/AbstractWallLocation.cs +++ /dev/null @@ -1,78 +0,0 @@ -using ItemChanger.Locations; -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BreakableWallRandomizer.IC -{ - [Serializable] - public class AbstractWallLocation : AutoLocation - { - public string objectName; - public string fsmType; - public List alsoDestroy; - public bool exit; - public List groupWalls; - protected override void OnLoad() {} - - protected override void OnUnload() {} - - 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) - { - 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()) - { - 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); - } - - for (var i = 0; i < go.transform.childCount; i++) - { - MakeWallPassable(go.transform.GetChild(i).gameObject, destroy); - if (destroy) - GameObject.Destroy(go); - } - } - } -} \ No newline at end of file diff --git a/IC/BreakableWallItem.cs b/IC/BreakableWallItem.cs index cf5e1f3..1dc5a26 100644 --- a/IC/BreakableWallItem.cs +++ b/IC/BreakableWallItem.cs @@ -41,6 +41,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"; @@ -64,7 +66,7 @@ public override void GiveImmediate(GiveInfo info) 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); + BreakableWallModule.Instance.UnlockedCollapsers.Add(name); // If we're already in the same scene as the wall, break it. if (GameManager.instance.sceneName == wall.sceneName) @@ -82,6 +84,7 @@ public override void GiveImmediate(GiveInfo info) if (name.StartsWith("Collapser") && !BreakableWallModule.Instance.UnlockedCollapsers.Contains(name)) BreakableWallModule.Instance.UnlockedCollapsers.Add(name); } + base.GiveImmediate(info); } } } diff --git a/IC/PlankLocation.cs b/IC/PlankLocation.cs deleted file mode 100644 index 33337e2..0000000 --- a/IC/PlankLocation.cs +++ /dev/null @@ -1,314 +0,0 @@ -using BreakableWallRandomizer.Fsm; -using BreakableWallRandomizer.Modules; -using HutongGames.PlayMaker.Actions; -using ItemChanger; -using ItemChanger.Tags; -using ItemChanger.Util; -using Satchel; -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace BreakableWallRandomizer.IC -{ - [Serializable] - public class PlankLocation : AbstractWallLocation - { - public PlankLocation( - string name, string sceneName, string objectName, string fsmType, List alsoDestroy, - float x, float y, bool exit, List groupWalls - ) - { - this.name = name; - this.sceneName = sceneName; - this.objectName = objectName; - this.fsmType = fsmType; - this.alsoDestroy = alsoDestroy; - this.exit = exit; - this.groupWalls = groupWalls; - flingType = FlingType.DirectDeposit; - tags = [BreakableWallLocationTag(x, y)]; - } - - private InteropTag BreakableWallLocationTag(float x, float y) - { - // Define sprite by location type - string sprite = ""; - if (name.StartsWith("Wall-") || name.StartsWith("Wall_Group")) - sprite = "mine_break_wall_03_0deg"; - if (name.StartsWith("Plank-") || name.StartsWith("Plank_Group")) - 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; - Dictionary sceneOverride = []; - sceneOverride.Add("Deepnest_45_v02", "Deepnest_39"); - sceneOverride.Add("Deepnest_Spider_Town", "Deepnest_10"); - sceneOverride.Add("Deepnest_East_17", "Deepnest_East_14"); - sceneOverride.Add("GG_Workshop", "GG_Waterways"); - sceneOverride.Add("GG_Atrium_Roof", "GG_Waterways"); - sceneOverride.Add("Mines_35", "Mines_28"); - sceneOverride.Add("Room_Colosseum_02", "Deepnest_East_09"); - 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_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]; - - 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)}; - tag.Message = "RandoSupplementalMetadata"; - return tag; - } - protected override void OnLoad() - { - if (groupWalls.Count > 0) - { - foreach (CondensedWallObject wall in groupWalls) - Events.AddFsmEdit(wall.sceneName, new(wall.gameObject, wall.fsmType), ModifyWallBehaviour); - } - else - { - Events.AddFsmEdit(sceneName, new(objectName, fsmType), ModifyWallBehaviour); - if (name == "Wall-Deepnest_Fungal") - Events.AddFsmEdit(SceneNames.Fungus2_20, new("/Breakable Wall Waterways", fsmType), ModifyWallBehaviour); - if (name == "Plank-King's_Pass") - Events.AddFsmEdit(sceneName, new("Collapser Tute 01", "collapse tute"), ManageKPCollapse); - } - } - - protected override void OnUnload() - { - if (groupWalls.Count > 0) - { - foreach (CondensedWallObject wall in groupWalls) - Events.RemoveFsmEdit(wall.sceneName, new(wall.gameObject, wall.fsmType), ModifyWallBehaviour); - } - else - { - Events.RemoveFsmEdit(sceneName, new(objectName, fsmType), ModifyWallBehaviour); - if (name == "Wall-Fungal_Deepnest_Two_Way") - Events.RemoveFsmEdit(SceneNames.Fungus2_20, new("/Breakable Wall Waterways", fsmType), ModifyWallBehaviour); - if (name == "Plank-King's_Pass") - Events.RemoveFsmEdit(sceneName, new("Collapser Tute 01", "collapse tute"), ManageKPCollapse); - } - } - - private void ModifyWallBehaviour(PlayMakerFSM fsm) - { - // This edit will affect all individual walls, so we list them to iterate - List wallList = []; - if (groupWalls.Count > 0) - { - foreach (CondensedWallObject wallObject in groupWalls) - wallList.Add(wallObject); - } - else - { - wallList.Add(new(name, sceneName, objectName, fsmType)); - } - - foreach (CondensedWallObject wall in wallList) - { - if (wall.fsmType != fsm.FsmName) - continue; - - var originalIdleStateName = wall.fsmType switch - { - "quake_floor" => "Solid", - - "Detect Quake" => "Detect", - - _ => "Idle" - }; - - // Copy sound and particles from original - var originalBreakStateName = wall.fsmType switch - { - "quake_floor" => "Glass", - - "Detect Quake" => "Break 2", - - _ => "Break" - }; - - // If a location is present, it means that it's not vanilla - BreakableWallModule.Instance.vanillaWalls.RemoveAll(wall => wall.name == name); - - if (wall.name == "Wall-Shade_Soul_Shortcut") - GameObject.Destroy(GameObject.Find("/Breakable Wall Ruin Lift/Masks")); - - // The wall will delete itself based on its state if we don't do this. - if (wall.fsmType == "break_floor" || wall.fsmType == "FSM") - { - fsm.ChangeTransition("Initiate", "ACTIVATE", "Idle"); - } - else if (wall.fsmType == "breakable_wall_v2") - { - // 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.UnlockedBreakables.Contains(wall.name)) - { - fsm.ChangeTransition("Activated?", "ACTIVATE", "Initiate"); - fsm.ChangeTransition("Activated?", "FINISHED", "Initiate"); - } - else - fsm.ChangeTransition("Activated?", "ACTIVATE", "Ruin Lift?"); - } else if (wall.fsmType == "quake_floor") - { - fsm.ChangeTransition("Init", "ACTIVATE", "Solid"); - if (fsm.GetValidState("Transient").GetActions().Length >= 1) - fsm.RemoveAction("Transient", 0); - if (fsm.GetValidState("Solid").GetActions().Length >= 1) - fsm.RemoveAction("Solid", 0); - - var collider = fsm.gameObject.GetComponent(); - collider.isTrigger = true; // Make the first collider always a trigger - - // Add our own collider for physics collision. - var newCollider = fsm.gameObject.AddComponent(); - newCollider.offset = collider.offset; - newCollider.size = collider.size; - } else if (wall.fsmType == "Detect Quake") - { - fsm.ChangeTransition("Init", "ACTIVATE", "Detect"); - } - - // If the wall item had been obtained when calling GiveItem, destroy the wall on trigger. - fsm.AddState("DeleteWall"); - fsm.AddCustomAction("DeleteWall", () => MakeWallPassable(fsm.gameObject, true)); - if (fsm.GetTransition(originalBreakStateName, "FINISHED") is not null) - fsm.ChangeTransition(originalBreakStateName, "FINISHED", "DeleteWall"); - else - fsm.AddTransition(originalBreakStateName, "FINISHED", "DeleteWall"); - - // Add GiveItem state - fsm.AddState("GiveItem"); - fsm.AddCustomAction("GiveItem", () => - { - ItemUtility.GiveSequentially(Placement.Items, Placement, new GiveInfo() - { - FlingType = FlingType.Everywhere, - MessageType = MessageType.Corner, - }); - - Placement.AddVisitFlag(VisitState.Opened); - }); - fsm.AddAction("GiveItem", new CustomFsmBooleanCheck( - 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.UnlockedBreakables.Contains(wall.name)) - { - MakeWallPassable(fsm.gameObject, Placement.AllObtained()); - } - else - // If we didn't unlock this door yet... - { - // ...and we already obtained the item at this location, set the wall to an unhittable state: - if (Placement.AllObtained()) - { - fsm.SetState("GiveItem"); - } - // ...and there are items left to collect: - else - { - foreach (var action in fsm.GetValidState(originalBreakStateName).Actions) - { - if (action is AudioPlayerOneShotSingle or PlayParticleEmitter or AudioPlayerOneShot) - { - fsm.AddAction("GiveItem", action); - } - } - - // In case we're in the same scene when it breaks, check if there are items left, - // and then set states accordingly - - fsm.AddState("BreakSameScene"); - - // In any of the cases, the wall is expected to become passable. - fsm.AddCustomAction("BreakSameScene", () => - { - MakeWallPassable(fsm.gameObject, Placement.AllObtained()); - Placement.AddVisitFlag(VisitState.Opened); - }); - - // If placement is cleared, make the wall disappear. Otherwise, set to hittable state. - fsm.AddAction("BreakSameScene", new CustomFsmBooleanCheck( - Placement.AllObtained(), - "CLEARED", - "UNCLEARED" - )); - fsm.AddTransition("BreakSameScene", "UNCLEARED", originalIdleStateName); - fsm.AddTransition("BreakSameScene", "CLEARED", originalBreakStateName); - } - } - - if (wall.fsmType == "breakable_wall_v2") - { - fsm.ChangeTransition("Idle", "WALL BREAKER", "GiveItem"); - fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); - fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); - } - else if (wall.fsmType == "FSM") - { - fsm.ChangeTransition("Pause Frame", "FINISHED", "GiveItem"); - fsm.ChangeTransition("Spell Destroy", "FINISHED", "GiveItem"); - } - else if (wall.fsmType == "break_floor") - { - fsm.ChangeTransition("Hit", "HIT 3", "GiveItem"); - } else if (wall.fsmType == "quake_floor") - { - fsm.ChangeTransition("Transient", "DESTROY", "GiveItem"); - } else if (wall.fsmType == "Detect Quake") - { - fsm.ChangeTransition("Quake Hit", "FINISHED", "GiveItem"); - } - } - } - - private void ManageKPCollapse(PlayMakerFSM fsm) - { - if (BreakableWallModule.Instance.UnlockedBreakables.Contains(name)) - { - fsm.ChangeTransition("Init", "FINISHED", "Activate"); - } - else - { - fsm.ChangeTransition("Init", "ACTIVATE", "Idle"); - fsm.AddState("Give item"); - fsm.AddCustomAction("Give item", () => { - ItemUtility.GiveSequentially(Placement.Items, Placement, new GiveInfo() - { - FlingType = FlingType.DirectDeposit, - MessageType = MessageType.Corner, - }); - }); - fsm.ChangeTransition("Crumble", "BREAK", "Give item"); - if (Placement.GetUIName() == name.Replace("_", " ").Replace("-", " - ")) - { - fsm.AddCustomAction("Give item", () => { - var obj = GameObject.Find(objectName); - GameObject.Destroy(obj); - }); - fsm.AddTransition("Give item", "FINISHED", "Break"); - } - } - } - } -} \ No newline at end of file diff --git a/IC/WallLocation.cs b/IC/WallLocation.cs index 84407ed..a654965 100644 --- a/IC/WallLocation.cs +++ b/IC/WallLocation.cs @@ -1,7 +1,9 @@ using BreakableWallRandomizer.Fsm; using BreakableWallRandomizer.Modules; +using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using ItemChanger; +using ItemChanger.Locations; using ItemChanger.Tags; using ItemChanger.Util; using Satchel; @@ -12,9 +14,14 @@ namespace BreakableWallRandomizer.IC { [Serializable] - public class WallLocation : AbstractWallLocation + public class BreakableWallLocation : AutoLocation { - public WallLocation( + public string objectName; + public string fsmType; + public List alsoDestroy; + public bool exit; + public List groupWalls; + public BreakableWallLocation( string name, string sceneName, string objectName, string fsmType, List alsoDestroy, float x, float y, bool exit, List groupWalls ) @@ -40,6 +47,8 @@ private InteropTag BreakableWallLocationTag(float x, float y) 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"; // Replace map name for pinless-maps string mapSceneName = sceneName; @@ -54,10 +63,12 @@ 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"); + sceneOverride.Add("White_Palace_17", "Abyss_05"); if (sceneOverride.ContainsKey(sceneName)) mapSceneName = sceneOverride[sceneName]; @@ -107,7 +118,6 @@ protected override void OnUnload() private void ModifyWallBehaviour(PlayMakerFSM fsm) { - // This edit will affect all individual walls, so we list them to iterate List wallList = []; if (groupWalls.Count > 0) { @@ -124,10 +134,28 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) if (wall.fsmType != fsm.FsmName) continue; + var originalIdleStateName = wall.fsmType switch + { + "quake_floor" => "Solid", + + "Detect Quake" => "Detect", + + _ => "Idle" + }; + + // Copy sound and particles from original + var originalBreakStateName = wall.fsmType switch + { + "quake_floor" => "Glass", + + "Detect Quake" => "Break 2", + + _ => "Break" + }; + // If a location is present, it means that it's not vanilla BreakableWallModule.Instance.vanillaWalls.RemoveAll(wall => wall.name == name); - // This particular mask should be destroyed regardless of wall state if (wall.name == "Wall-Shade_Soul_Shortcut") GameObject.Destroy(GameObject.Find("/Breakable Wall Ruin Lift/Masks")); @@ -166,6 +194,12 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) } else if (wall.fsmType == "Detect Quake") { fsm.ChangeTransition("Init", "ACTIVATE", "Detect"); + } else if (wall.fsmType == "collapse small") + { + fsm.AddFirstAction("Idle", new SetTriggerCollider()); + + // 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. @@ -260,8 +294,68 @@ 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"); + } + } + } + + 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) diff --git a/Manager/ItemHandler.cs b/Manager/ItemHandler.cs index 1dbf19f..d0a0b06 100644 --- a/Manager/ItemHandler.cs +++ b/Manager/ItemHandler.cs @@ -53,7 +53,7 @@ private static void DefineGroups(RequestBuilder rb) } if (rb.gs.SplitGroupSettings.RandomizeOnStart && collapserSettings >= 0 && collapserSettings <= 2) { - diveSettings = rb.rng.Next(3); + collapserSettings = rb.rng.Next(3); } ItemGroupBuilder wallGroup = null; @@ -82,7 +82,7 @@ private static void DefineGroups(RequestBuilder rb) if (diveSettings > 0) { try - { + { diveGroup = rb.MainItemStage.AddItemGroup(RBConsts.SplitGroupPrefix + diveSettings); } catch (ArgumentException) {} @@ -91,7 +91,7 @@ private static void DefineGroups(RequestBuilder rb) if (collapserSettings > 0) { try - { + { collapserGroup = rb.MainItemStage.AddItemGroup(RBConsts.SplitGroupPrefix + collapserSettings); } catch (ArgumentException) {} @@ -198,7 +198,7 @@ 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.DiveFloors) + 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++) { @@ -235,7 +235,7 @@ private static void RandomizeShopCost(RequestBuilder builder) 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("Dives"); + usedTerms.Add("Collapsers"); rl.AddCost(new WallLogicCost(lm.GetTermStrict("Broken_Collapsers"), rng.Next(minCost, maxCost), amount => new DiveCost(amount))); } } @@ -278,8 +278,9 @@ private static void AddWalls(RequestBuilder rb) foreach (AbstractWallItem 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")) @@ -333,9 +334,9 @@ 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 = include || (wall.name.StartsWith("Collapser") && BWR_Manager.Settings.Collapsers); + 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")) diff --git a/Manager/LogicHandler.cs b/Manager/LogicHandler.cs index 95fb83f..c8fd89a 100644 --- a/Manager/LogicHandler.cs +++ b/Manager/LogicHandler.cs @@ -41,10 +41,15 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) 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 (AbstractWallItem wall in wallList) { lmb.GetOrAddTerm(wall.name); lmb.AddItem(new StringItemTemplate(wall.name, $"Broken_{wall.name.Split('-')[0]}s++ >> {wall.name}++")); + } + + foreach (AbstractWallItem wall in wallList) + { lmb.AddLogicDef(new(wall.name, wall.logic)); foreach(var logicOverride in wall.logicOverrides) diff --git a/Modules/BreakableWallModule.cs b/Modules/BreakableWallModule.cs index 4f241da..753f552 100644 --- a/Modules/BreakableWallModule.cs +++ b/Modules/BreakableWallModule.cs @@ -22,7 +22,6 @@ public class BreakableWallModule : Module 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; @@ -68,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(); } diff --git a/Resources/Data/BreakableWallObjects.json b/Resources/Data/BreakableWallObjects.json index 4a6bad2..6332283 100644 --- a/Resources/Data/BreakableWallObjects.json +++ b/Resources/Data/BreakableWallObjects.json @@ -482,15 +482,16 @@ "exit": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "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]))" } } }, @@ -2113,7 +2114,7 @@ "exit": 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": { @@ -3198,5 +3199,466 @@ "logic": "(GG_Pipeway[left1] | GG_Pipeway[right1]) + (ANYCLAW | WINGS) + QUAKE + $CASTSPELL", "logicOverrides": {}, "logicSubstitutions": {} + }, + { + "name": "Collapser-Glowing_Womb_Tunnel", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Crossroads_21", + "x": -0.4, + "y": 0.25, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "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.2, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": 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[right1] + Collapser-Mawlek_Lower | Crossroads_36[right2]", + "x": 0.0, + "y": 0.5, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_36[right2]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Mimics", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_02", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Below_Spike_Grub", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_03", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Failed_Tramway_Bench", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_14", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Super_Secret_Seal_1", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_16", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Super_Secret_Seal_2", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_16", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Above_Hot_Springs_1", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_30", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Zote", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_33", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Garpede_Pogos", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_38", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Dark_Deepnest_Trap_1", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_39", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Distant_Village_Path", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_41", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Weaver's_Den", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_45_v02", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Beast's_Den", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Deepnest_Spider_Town", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Garden_Cornifer", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus1_24", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [ + "/CameraLockArea (3)" + ], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS | $SHADESKIP + Collapser-Garden_Cornifer)", + "logicOverrides": {}, + "logicSubstitutions": { + "Bench-Gardens_Cornifer": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + }, + "Queen's_Gardens_Map": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + } + } + }, + { + "name": "Collapser-Bretta", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus2_23", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Entrance_Mask_Shard_1", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus2_25", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deepnest_Entrance_Mask_Shard_2", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus2_25", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Fog_Canyon_Charm_Notch", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Fungus3_28", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Flukemungas", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "GG_Pipeway", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Deep_Focus", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Mines_06", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "RestingGrounds_10", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Waterways_Tram_Grub", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Waterways_14", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-White_Palace_Entrance_Orb", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "White_Palace_02", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Path_of_Pain_Lever", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "White_Palace_17", + "x": -1.38, + "y": -0.1, + "persistentBool": "", + "sprite": "collapser_short_0deg", + "alsoDestroy": [], + "exit": false, + "groupWalls": [], + "group": "", + "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logicOverrides": {}, + "logicSubstitutions": {} } ] \ No newline at end of file diff --git a/Resources/Logic/ConnectionOverrides.json b/Resources/Logic/ConnectionOverrides.json index 3ad3dba..38e0970 100644 --- a/Resources/Logic/ConnectionOverrides.json +++ b/Resources/Logic/ConnectionOverrides.json @@ -65,6 +65,13 @@ "Cliffs_02[bot1]": "Cliffs_02[bot1] + Plank-Cliff's_Pass" } }, + { + "name": "Grasshopper", + "logicOverride": "", + "logicSubstitutions": { + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + } + }, { "name": "Journal_Entry-Weathered_Mask", "logicOverride": "", From 18bd745f2f7a751c22bd852cc85d675210dc783b Mon Sep 17 00:00:00 2001 From: nerthul11 Date: Fri, 4 Apr 2025 16:03:43 -0300 Subject: [PATCH 3/4] Wall 4.0 update --- Changelog.md | 10 + IC/AbstractWallItem.cs | 3 +- IC/BreakableWallItem.cs | 62 +- IC/ShopLocation.cs | 3 +- IC/WallLocation.cs | 43 +- Interop/MoreLocations.cs | 21 + Manager/ItemHandler.cs | 23 +- Manager/LogicHandler.cs | 23 +- Manager/Manager.cs | 10 +- ReadMe.md | 12 +- Resources/Data/BreakableWallObjects.json | 835 ++++++++++++------ Resources/Data/WallGroups.json | 15 +- Resources/Logic/ConnectionOverrides.json | 51 +- .../Sprites/royal_garden_break_window.png | Bin 0 -> 18854 bytes Settings/BWR_Settings.cs | 6 +- Settings/ConnectionMenu.cs | 1 + 16 files changed, 777 insertions(+), 341 deletions(-) create mode 100644 Changelog.md create mode 100644 Resources/Sprites/royal_garden_break_window.png 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/IC/AbstractWallItem.cs b/IC/AbstractWallItem.cs index e2f4a0b..9fac739 100644 --- a/IC/AbstractWallItem.cs +++ b/IC/AbstractWallItem.cs @@ -17,8 +17,9 @@ public class AbstractWallItem : AbstractItem public string persistentBool; public string sprite; public List alsoDestroy; - public bool exit; + public bool extra; public string group; + public string pinType; public List groupWalls; public string logic; public Dictionary logicOverrides; diff --git a/IC/BreakableWallItem.cs b/IC/BreakableWallItem.cs index 1dc5a26..da2bf1c 100644 --- a/IC/BreakableWallItem.cs +++ b/IC/BreakableWallItem.cs @@ -13,7 +13,7 @@ public class BreakableWallItem : AbstractWallItem { 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; @@ -21,11 +21,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()]; @@ -52,6 +53,63 @@ 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 100 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. Although King's Pass' one doesn't count.", + + "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 Glowstonetrees. They're transparent.", + "El camino a Roma 337 muros tiene.", + "Nerthul thinks this one is a scam, but you'll buy it regardless.", + + "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 wlal credit card." + }; + + 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 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/WallLocation.cs b/IC/WallLocation.cs index a654965..6933a19 100644 --- a/IC/WallLocation.cs +++ b/IC/WallLocation.cs @@ -1,6 +1,5 @@ using BreakableWallRandomizer.Fsm; using BreakableWallRandomizer.Modules; -using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using ItemChanger; using ItemChanger.Locations; @@ -19,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; @@ -31,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)]; } @@ -49,9 +48,7 @@ private InteropTag BreakableWallLocationTag(float x, float y) sprite = "break_floor_glass"; if (name.StartsWith("Collapser-") || name.StartsWith("Collapser_Group")) sprite = "collapser_short_0deg"; - - // Replace map name for pinless-maps - string mapSceneName = sceneName; + Dictionary sceneOverride = []; sceneOverride.Add("Deepnest_45_v02", "Deepnest_39"); sceneOverride.Add("Deepnest_Spider_Town", "Deepnest_10"); @@ -70,15 +67,15 @@ private InteropTag BreakableWallLocationTag(float x, float y) sceneOverride.Add("White_Palace_15", "Abyss_05"); sceneOverride.Add("White_Palace_17", "Abyss_05"); - if (sceneOverride.ContainsKey(sceneName)) - mapSceneName = sceneOverride[sceneName]; - 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; } @@ -118,6 +115,13 @@ protected override void OnUnload() private void ModifyWallBehaviour(PlayMakerFSM fsm) { + try + { + Vector3 coordinates = GameObject.Find(objectName).transform.position; + BreakableWallRandomizer.Instance.Log($"{name} - ({coordinates.x}, {coordinates.y})"); + } + catch + {} List wallList = []; if (groupWalls.Count > 0) { @@ -195,9 +199,7 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) { fsm.ChangeTransition("Init", "ACTIVATE", "Detect"); } else if (wall.fsmType == "collapse small") - { - fsm.AddFirstAction("Idle", new SetTriggerCollider()); - + { // Ensure the "Idle" state has the correct transition for BREAK fsm.RemoveTransition("Idle", "ACTIVATE"); } @@ -230,6 +232,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) // If we already unlocked this wall, make it passable or destroy it. if (BreakableWallModule.Instance.UnlockedBreakables.Contains(wall.name)) { + if (wall.fsmType == "collapse small") + fsm.AddFirstAction("Idle", new SetTriggerCollider()); MakeWallPassable(fsm.gameObject, Placement.AllObtained()); } else @@ -257,6 +261,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()); @@ -279,13 +285,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") 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 d0a0b06..5952077 100644 --- a/Manager/ItemHandler.cs +++ b/Manager/ItemHandler.cs @@ -230,13 +230,13 @@ private static void RandomizeShopCost(RequestBuilder builder) 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")) // Dives + 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 DiveCost(amount))); + rl.AddCost(new WallLogicCost(lm.GetTermStrict("Broken_Collapsers"), rng.Next(minCost, maxCost), amount => new CollapserCost(amount))); } } }; @@ -274,7 +274,7 @@ 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 (AbstractWallItem wall in wallList) { bool include = wall.name.StartsWith("Wall") && BWR_Manager.Settings.RockWalls; @@ -283,9 +283,7 @@ private static void AddWalls(RequestBuilder rb) 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) @@ -339,9 +337,7 @@ private static void AddWalls(RequestBuilder rb) 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)); } @@ -349,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); @@ -404,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 c8fd89a..39253bc 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,29 @@ 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) + startDefs[startName] = start with {RandoLogic = collapsers ? "SHADESKIPS" : "ANY"}; + // Blue Lake start has two reachable checks (Salubra). Remove unless transition rando is on. + if (start.SceneName == SceneNames.Crossroads_50) + startDefs[startName] = start with {RandoLogic = planks ? "MAPAREARANDO | FULLAREARANDO | ROOMRANDO" : "ANY"}; + // East Fog Canyon 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 = planks ? "ROOMRANDO" : "ANY"}; + } + } private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) { if (!BWR_Manager.Settings.Enabled) diff --git a/Manager/Manager.cs b/Manager/Manager.cs index 15198f5..df01e61 100644 --- a/Manager/Manager.cs +++ b/Manager/Manager.cs @@ -15,7 +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 = 0; + public static int TotalCollapsers = 30; public static void Hook() { DefineObjects(); @@ -38,8 +38,8 @@ private static void DefineObjects() foreach (AbstractWallItem 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); } @@ -50,8 +50,8 @@ private static void DefineObjects() foreach (AbstractWallItem 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/ReadMe.md b/ReadMe.md index c4ff008..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,13 +28,12 @@ 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 Godhome Shop should appear or not. +- Enabled --> Boolean to define if the Wall Shop should appear or not. - Minimum/Maximum Cost --> A range from 0 to 1, where 0 is 0% and 1 is 100% of all available wall objects. Default is 25% to 75%. - Include In Junk Shop --> Allows the defined costs to appear as currency in More Locations' Junk Shop, regardless of if Myla's Shop is enabled or not. - Tolerance --> A range from 0 to 1, where 0 is no tolerance and 1 is 100% of the used maximum cost. If maximum cost + tolerance should be over the total existing walls, the tolerance will automatically be capped. For reference, most mods have tolerance be a 10-25% of the maximum costs. @@ -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 6332283..b35a253 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,10 +121,10 @@ "alsoDestroy": [ "/Secret Mask (1)" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", - "logic": "(Abyss_17[top1] + (ANYCLAW | WINGS | DAMAGEBOOSTS + $TAKEDAMAGE)) | (Abyss_17[top1] + Plank-Basin_Pale_Ore)", + "logic": "(Abyss_17[top1] + (ANYCLAW | WINGS | DAMAGEBOOSTS + $TAKEDAMAGE)) + (LEFTCLAW + RIGHTDASH + BACKGROUNDPOGOS + DAMAGEBOOSTS + $TAKEDAMAGE[2] | RIGHTCLAW | WINGS) | (Abyss_17[top1] + Plank-Basin_Pale_Ore)", "logicOverrides": { "Pale_Ore-Basin": "(ORIG) | (Abyss_17[top1] + Plank-Basin_Pale_Ore) + (LEFTCLAW | WINGS)" }, @@ -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,12 +345,12 @@ "alsoDestroy": [ "break_wall_masks" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_08", "logicOverrides": { - "Geo_Rock-Crossroads_Aspid_Arena_Hidden": "(ORIG) + (Wall-Crossroads_Aspid_Arena | (RIGHTCLAW | OBSCURESKIPS) + WINGS)" + "Geo_Rock-Crossroads_Aspid_Arena_Hidden": "(ORIG) + (Wall-Crossroads_Aspid_Arena | (OBSCURESKIPS + (RIGHTCLAW | $SHADESKIP) + WINGS)" }, "logicSubstitutions": {} }, @@ -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,14 +476,15 @@ "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": "", + "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 + Wall-Glowing_Womb", @@ -508,7 +511,7 @@ "Mask Bottom", "Mask Bottom 2" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_37[right1]", @@ -527,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", @@ -550,7 +553,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_01b[right1] | Deepnest_01b[top2] + Plank-Upper_Deepnest", @@ -574,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" }, @@ -597,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]))", @@ -623,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)", @@ -644,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)", @@ -665,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)", @@ -682,7 +685,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)", @@ -701,7 +704,7 @@ "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]))", @@ -736,7 +739,7 @@ "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))", @@ -755,7 +758,7 @@ "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)))", @@ -774,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)", @@ -793,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)", @@ -812,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)", @@ -829,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)", @@ -848,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))", @@ -867,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])", @@ -886,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", @@ -903,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))", @@ -920,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))", @@ -937,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]", @@ -963,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]))", @@ -982,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", @@ -1004,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" } } }, @@ -1017,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", @@ -1047,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", @@ -1066,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])", @@ -1104,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]", @@ -1125,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))", @@ -1146,7 +1152,7 @@ "persistentBool": "", "sprite": "break_wall_deepnest_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_11", @@ -1165,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", @@ -1184,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)", @@ -1205,7 +1211,7 @@ "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", @@ -1217,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])", @@ -1242,7 +1249,7 @@ "persistentBool": "", "sprite": "grass_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus1_22[left1] | Fungus1_22[top1]", @@ -1263,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)", @@ -1289,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", @@ -1309,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", @@ -1335,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]", @@ -1354,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]", @@ -1368,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": {} @@ -1387,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": {} @@ -1413,7 +1422,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus2_10[right2] | Fungus2_10[right1] | Fungus2_10[bot1]", @@ -1430,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)", @@ -1451,10 +1460,10 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", - "logic": "(Fungus2_20[left1] + Wall-Deepnest_Fungal | Fungus2_20[right1]) + (RIGHTCLAW | WINGS) + (ACID | RIGHTDASH | (LEFTCLAW + RIGHTSUPERDASH)) + ANYCLAW", + "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)" }, @@ -1470,7 +1479,7 @@ "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", @@ -1506,7 +1515,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)", @@ -1523,7 +1532,7 @@ "persistentBool": "", "sprite": "one_way_fung_266deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_39[left1] | (Fungus3_39[right1] + Plank-Moss_Prophet)", @@ -1552,7 +1561,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_44[door1]", @@ -1575,7 +1584,7 @@ "persistentBool": "oneWayArchive", "sprite": "ancient_wall_pieces_0000_a_mushroom_270deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Fungus3_47", @@ -1599,7 +1608,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)", @@ -1622,7 +1631,7 @@ "persistentBool": "", "sprite": "mine_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_05", @@ -1645,7 +1654,7 @@ "persistentBool": "", "sprite": "mine_break_wall_02_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_16[top1]", @@ -1666,7 +1675,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)", @@ -1690,7 +1699,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", @@ -1710,7 +1719,7 @@ "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", @@ -1729,7 +1738,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", @@ -1750,7 +1759,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]", @@ -1765,11 +1774,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]", @@ -1786,10 +1795,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": {} }, @@ -1803,7 +1812,7 @@ "persistentBool": "", "sprite": "rest_grounds_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "Catacombs_Walls", "logic": "RestingGrounds_10", @@ -1820,10 +1829,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": {} }, @@ -1837,10 +1846,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": {} }, @@ -1854,10 +1863,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": {} }, @@ -1871,10 +1880,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": {} }, @@ -1884,11 +1893,11 @@ "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", @@ -1905,7 +1914,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", @@ -1922,7 +1931,7 @@ "persistentBool": "", "sprite": "col_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Colosseum_02[top1] | Room_Colosseum_02[top2]", @@ -1941,7 +1950,7 @@ "persistentBool": "", "sprite": "col_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Colosseum_Spectate[bot1]", @@ -1966,7 +1975,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "Room_Fungus_Shaman[left1]", @@ -1983,7 +1992,7 @@ "persistentBool": "", "sprite": "break_wall_unique_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins1_31", @@ -2012,7 +2021,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)", @@ -2029,7 +2038,7 @@ "persistentBool": "bathHouseWall", "sprite": "bath_break_wall_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins_Bathhouse[door1] | Ruins_Bathhouse[right1]", @@ -2062,7 +2071,7 @@ "persistentBool": "", "sprite": "one way wall_elev_270deg", "alsoDestroy": [], - "exit": true, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins_Elevator[left1] | Ruins_Elevator[left2]", @@ -2079,7 +2088,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", @@ -2111,7 +2120,7 @@ "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 | Bench-Waterways | Waterways_02 + (LEFTCLAW | WINGS + RIGHTCLAW | ENEMYPOGOS + DANGEROUSSKIPS + (WINGS | RIGHTCLAW)))", @@ -2133,7 +2142,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])", @@ -2152,7 +2161,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", @@ -2166,6 +2175,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" } } }, @@ -2179,7 +2191,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", @@ -2212,7 +2224,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)", @@ -2229,7 +2241,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", @@ -2263,7 +2275,7 @@ "alsoDestroy": [ "Secret Mask" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Abyss_17[top1] + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2282,7 +2294,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Cliffs_04[right1] + (DARKROOMS | (LANTERN | (NOLANTERN ? FALSE))) + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2301,7 +2313,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_52[left1] + QUAKE + $CASTSPELL[before:ITEMSOUL]", @@ -2320,7 +2332,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_02 + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2339,7 +2351,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Deepnest_East_14[top2] + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2359,7 +2371,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]", @@ -2378,7 +2390,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]", @@ -2401,7 +2413,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "420_Rock", "logic": "Deepnest_East_17[left1] + QUAKE + $CASTSPELL[before:AREASOUL]", @@ -2420,7 +2432,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]", @@ -2439,7 +2451,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]", @@ -2458,7 +2470,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]", @@ -2477,7 +2489,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]", @@ -2496,7 +2508,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]", @@ -2515,7 +2527,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]", @@ -2534,7 +2546,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]", @@ -2553,7 +2565,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]", @@ -2572,7 +2584,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]", @@ -2591,7 +2603,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]", @@ -2612,7 +2624,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]", @@ -2631,7 +2643,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "(Deepnest_East_18 + (ANYCLAW | WINGS) | Deepnest_East_18[top1]) + QUAKE + $CASTSPELL", @@ -2650,7 +2662,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]", @@ -2670,7 +2682,7 @@ "persistentBool": "", "sprite": "roof_05_351deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_01[left1] + QUAKE + $CASTSPELL", @@ -2689,7 +2701,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_20 + QUAKE + $CASTSPELL[before:ROOMSOUL]", @@ -2708,7 +2720,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]", @@ -2727,7 +2739,7 @@ "persistentBool": "", "sprite": "roof_05_351deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Mines_35[left1] + QUAKE + $CASTSPELL", @@ -2741,14 +2753,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" @@ -2769,7 +2782,7 @@ "persistentBool": "brokenMageWindow", "sprite": "break_floor_glass", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins1_30 + QUAKE + $CASTSPELL[1,before:ROOMSOUL]", @@ -2793,7 +2806,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]", @@ -2814,7 +2827,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]", @@ -2838,7 +2851,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)", @@ -2855,7 +2868,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))", @@ -2872,7 +2885,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))", @@ -2889,7 +2902,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))", @@ -2906,7 +2919,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)))", @@ -2914,7 +2927,7 @@ "logicSubstitutions": {} }, { - "name": "Dive_Floor-Inner_Sanctum_Cenda", + "name": "Dive_Floor-Inner_Sanctum_Lore", "gameObject": "/Quake Floor", "fsmType": "quake_floor", "sceneName": "Ruins1_32", @@ -2923,7 +2936,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)", @@ -2940,7 +2953,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)))", @@ -2957,7 +2970,7 @@ "persistentBool": "", "sprite": "mage_lord_room_0003_floor_wing_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Ruins2_01_b + QUAKE + $CASTSPELL", @@ -2974,7 +2987,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", @@ -2997,7 +3010,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", @@ -3017,7 +3030,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", @@ -3040,7 +3053,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]", @@ -3063,7 +3076,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", @@ -3086,7 +3099,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "*Soul_Totem-White_Palace_Final + QUAKE + $CASTSPELL", @@ -3103,7 +3116,7 @@ "persistentBool": "", "sprite": "break_floor", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "White_Palace_15[right1] + QUAKE + $CASTSPELL", @@ -3120,7 +3133,7 @@ "persistentBool": "", "sprite": "ancient_wall_pieces_0000_a_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Tutorial_01", @@ -3142,7 +3155,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)", @@ -3159,7 +3172,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)", @@ -3176,7 +3189,7 @@ "persistentBool": "", "sprite": "gg_metal_wall_0001_180deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "GG_Atrium_Roof + (WINGS + ANYCLAW | Wall-Godhome_Roof)", @@ -3193,26 +3206,46 @@ "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-Glowing_Womb_Tunnel", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Crossroads_21", - "x": -0.4, - "y": 0.25, + "x": 26.27, + "y": 21.13, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "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": {} @@ -3223,11 +3256,11 @@ "fsmType": "collapse small", "sceneName": "Crossroads_36", "x": 0.0, - "y": 0.2, + "y": -0.1, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", "logic": "Crossroads_36[right1]", @@ -3248,16 +3281,16 @@ "name": "Collapser-Mawlek_Upper", "gameObject": "Collapser Small 1", "fsmType": "collapse small", - "sceneName": "Crossroads_36[right1] + Collapser-Mawlek_Lower | Crossroads_36[right2]", + "sceneName": "Crossroads_36", "x": 0.0, - "y": 0.5, + "y": 0.35, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_36[right2]", + "logic": "Crossroads_36[right1] + (Collapser-Mawlek_Lower | Collapser-Mawlek_Upper) | Crossroads_36[right2]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3266,15 +3299,16 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_02", - "x": -1.38, - "y": -0.1, + "x": 18.87, + "y": 52.15, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "pinType": "World", + "logic": "Deepnest_02[left1] | Deepnest_02[left2] + (WINGS | ANYCLAW) | Deepnest_02[right1] + Wall-Deepnest_Mimics + (WINGS | ANYCLAW)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3283,15 +3317,16 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_03", - "x": -1.38, - "y": -0.1, + "x": 3.28, + "y": 99.06, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "pinType": "World", + "logic": "Deepnest_03[left1] | Deepnest_03[top1] | Deepnest_03 + (LEFTCLAW | WINGS | RIGHTCLAW + OBSCURESKIPS)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3300,66 +3335,160 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_14", - "x": -1.38, - "y": -0.1, + "x": 0.0, + "y": 0.0, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "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-Super_Secret_Seal_1", - "gameObject": "/Collapser Small", + "name": "Collapser-Deepnest_By_Mantis_Lords_Path", + "gameObject": "/Collapser Small (1)", "fsmType": "collapse small", "sceneName": "Deepnest_16", - "x": -1.38, - "y": -0.1, + "x": 99.33, + "y": 11.12, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "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-Super_Secret_Seal_2", + "name": "Collapser-Deepnest_By_Mantis_Lords_Bottom", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_16", - "x": -1.38, - "y": -0.1, + "x": 85.24, + "y": 11.12, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "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_Above_Hot_Springs_1", + "name": "Collapser-Deepnest_Hot_Springs_Left", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_30", - "x": -1.38, - "y": -0.1, + "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": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "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": {} }, @@ -3368,49 +3497,53 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_33", - "x": -1.38, - "y": -0.1, + "x": -0.45, + "y": -0.15, "persistentBool": "", "sprite": "collapser_short_0deg", - "alsoDestroy": [], - "exit": false, + "alsoDestroy": [ + + ], + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "logic": "Deepnest_33[top1]", + "logicOverrides": { + "King's_Idol-Deepnest": "ORIG | (Deepnest_33[top2] | Deepnest_33[bot1]) + Collapser-Deepnest_Zote" + }, "logicSubstitutions": {} }, { - "name": "Collapser-Garpede_Pogos", + "name": "Collapser-Deepnest_Garpede_Pogo_Room", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_38", - "x": -1.38, - "y": -0.1, + "x": 0.0, + "y": 0.0, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Deepnest_38[bot1] + (RIGHTCLAW | WINGS)", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Dark_Deepnest_Trap_1", + "name": "Collapser-Dark_Deepnest_Trap", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_39", - "x": -1.38, - "y": -0.1, + "x": 0.0, + "y": 0.0, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Deepnest_39", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3424,10 +3557,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Deepnest_41", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3441,10 +3574,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS | $SHRIEKPOGO[3,before:AREASOUL])", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3458,15 +3591,15 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Deepnest_Spider_Town[left1]", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Garden_Cornifer", + "name": "Collapser-Garden_Map", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Fungus1_24", @@ -3477,17 +3610,17 @@ "alsoDestroy": [ "/CameraLockArea (3)" ], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS | $SHADESKIP + Collapser-Garden_Cornifer)", + "logic": "Fungus1_24[left1] + (ANYCLAW | WINGS | $SHADESKIP + Collapser-Garden_Map)", "logicOverrides": {}, "logicSubstitutions": { "Bench-Gardens_Cornifer": { - "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" }, "Queen's_Gardens_Map": { - "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" } } }, @@ -3501,44 +3634,50 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "logic": "Fungus2_23[right1] + (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] + WINGS + Collapser-Bretta" + }, "logicSubstitutions": {} }, { - "name": "Collapser-Deepnest_Entrance_Mask_Shard_1", + "name": "Collapser-Deepnest_Mask_Shard_Left", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Fungus2_25", - "x": -1.38, - "y": -0.1, + "x": 85.24, + "y": 11.12, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "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": {} }, { - "name": "Collapser-Deepnest_Entrance_Mask_Shard_2", - "gameObject": "/Collapser Small", + "name": "Collapser-Deepnest_Mask_Shard_Right", + "gameObject": "/Collapser Small (1)", "fsmType": "collapse small", "sceneName": "Fungus2_25", - "x": -1.38, - "y": -0.1, + "x": 99.33, + "y": 11.12, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "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": {} }, @@ -3552,11 +3691,13 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", - "logicOverrides": {}, + "logic": "Fungus3_28[right1] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH))", + "logicOverrides": { + "Charm_Notch-Fog_Canyon": "ORIG | Fungus3_28[right1] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH))" + }, "logicSubstitutions": {} }, { @@ -3569,10 +3710,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "GG_Pipeway[left1]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3586,10 +3727,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Mines_06[left1]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3598,15 +3739,159 @@ "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", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_1", + "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", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_2", + "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", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_3", + "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", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Catacombs_Trap_4", + "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", + "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", + "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", + "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", + "logicOverrides": {}, + "logicSubstitutions": {} + }, + { + "name": "Collapser-Waterways_Map", + "gameObject": "/Collapser Small", + "fsmType": "collapse small", + "sceneName": "Waterways_09", "x": -1.38, "y": -0.1, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "(Waterways_09[left1] | Waterways_09[right1]) | $StartLocation[West Waterways]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3620,10 +3905,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "Waterways_14[bot1]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3637,15 +3922,15 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "White_Palace_02[left1] + LEFTCLAW + WINGS", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Path_of_Pain_Lever", + "name": "Collapser-Path_of_Pain", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "White_Palace_17", @@ -3654,10 +3939,10 @@ "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], - "exit": false, + "extra": false, "groupWalls": [], "group": "", - "logic": "Crossroads_21[top1] | Crossroads_21[left1] | Crossroads_21[right1]", + "logic": "White_Palace_17[bot1] + (FULLDASH + FULLCLAW + WINGS | FULLDASH + (LEFTCLAW + $SHRIEKPOGO[1,2,NOSTALL] | RIGHTCLAW + $SHRIEKPOGO[2,NOSTALL])) | White_Palace_17[right1] + Lever-Path_of_Pain + Collapser-Path_of_Pain + WINGS + ANYCLAW", "logicOverrides": {}, "logicSubstitutions": {} } diff --git a/Resources/Data/WallGroups.json b/Resources/Data/WallGroups.json index ae1809f..5dcc553 100644 --- a/Resources/Data/WallGroups.json +++ b/Resources/Data/WallGroups.json @@ -110,10 +110,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 +125,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 +132,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 +183,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 38e0970..7554f03 100644 --- a/Resources/Logic/ConnectionOverrides.json +++ b/Resources/Logic/ConnectionOverrides.json @@ -12,16 +12,14 @@ "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": "Chandelier-Watcher_Knights", + "logicOverride": "ORIG + Wall-Chandelier", + "logicSubstitutions": {} }, { "name": "Deepnest_East_04", @@ -51,6 +49,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": "", @@ -66,10 +71,17 @@ } }, { - "name": "Grasshopper", + "name": "Grub-Crystal_Peak_Mimic", "logicOverride": "", "logicSubstitutions": { - "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Cornifer" + "WINGS": "WINGS | $SHADESKIP + Collapser-Garden_Map" + } + }, + { + "name": "Mimic_Grub-Crystal_Peak", + "logicOverride": "", + "logicSubstitutions": { + "Bench-Mimic's_Secret": "Bench-Mimic's_Secret + Wall-Peak_Mimic" } }, { @@ -118,6 +130,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": "", @@ -131,5 +157,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/Sprites/royal_garden_break_window.png b/Resources/Sprites/royal_garden_break_window.png new file mode 100644 index 0000000000000000000000000000000000000000..2368f5b29d7b2c488d15acd61d4f7357f7e17c11 GIT binary patch literal 18854 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%0DiOA>;F0SKY|6>olLCX15fqyIK@3r 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 t^AHJH)DfLWzbw@xsfe3@c=%K4{(n< condition) { + RandomizerMenuAPI.GenerateStartLocationDict(); target.Parent.BeforeShow += () => { target.Text.color = condition() ? Colors.TRUE_COLOR : Colors.DEFAULT_COLOR; From 7507c916a5c59405459652cc999ee76addf13499 Mon Sep 17 00:00:00 2001 From: nerthul11 Date: Tue, 22 Apr 2025 20:44:54 -0300 Subject: [PATCH 4/4] Collapser release --- IC/BreakableWallItem.cs | 37 +- IC/WallLocation.cs | 9 +- IC/{AbstractWallItem.cs => WallObject.cs} | 27 +- Interop/FStats.cs | 4 +- Manager/ItemHandler.cs | 14 +- Manager/LogicHandler.cs | 29 +- Manager/Manager.cs | 10 +- Resources/Data/BreakableWallObjects.json | 544 ++++++++++++++++++---- Resources/Data/WallGroups.json | 41 +- Resources/Logic/ConnectionOverrides.json | 10 + Resources/Logic/Waypoints.json | 10 + Settings/BWR_Settings.cs | 3 +- 12 files changed, 591 insertions(+), 147 deletions(-) rename IC/{AbstractWallItem.cs => WallObject.cs} (57%) diff --git a/IC/BreakableWallItem.cs b/IC/BreakableWallItem.cs index da2bf1c..a2bcc09 100644 --- a/IC/BreakableWallItem.cs +++ b/IC/BreakableWallItem.cs @@ -9,8 +9,14 @@ namespace BreakableWallRandomizer.IC { [Serializable] - public class BreakableWallItem : AbstractWallItem + public class BreakableWallItem : AbstractItem { + 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, bool extra, List groupWalls @@ -64,7 +70,7 @@ public BoxedString GenerateShopDescription() "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 100 breakable wall checks, and even more dive floor checks!", + "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.", @@ -87,23 +93,25 @@ public BoxedString GenerateShopDescription() "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. Although King's Pass' one doesn't count.", + "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 Glowstonetrees. They're transparent.", - "El camino a Roma 337 muros tiene.", - "Nerthul thinks this one is a scam, but you'll buy it regardless.", + "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 wlal credit card." + "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(); @@ -142,7 +150,20 @@ public override void GiveImmediate(GiveInfo info) if (name.StartsWith("Collapser") && !BreakableWallModule.Instance.UnlockedCollapsers.Contains(name)) BreakableWallModule.Instance.UnlockedCollapsers.Add(name); } - base.GiveImmediate(info); + + 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/WallLocation.cs b/IC/WallLocation.cs index 6933a19..3d3e77a 100644 --- a/IC/WallLocation.cs +++ b/IC/WallLocation.cs @@ -144,6 +144,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) "Detect Quake" => "Detect", + "Break" => "Detect", + _ => "Idle" }; @@ -195,7 +197,7 @@ 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") @@ -234,7 +236,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) { if (wall.fsmType == "collapse small") fsm.AddFirstAction("Idle", new SetTriggerCollider()); - MakeWallPassable(fsm.gameObject, Placement.AllObtained()); + if (wall.fsmType != "Break") + MakeWallPassable(fsm.gameObject, Placement.AllObtained()); } else // If we didn't unlock this door yet... @@ -303,6 +306,8 @@ private void ModifyWallBehaviour(PlayMakerFSM fsm) 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"); } } } diff --git a/IC/AbstractWallItem.cs b/IC/WallObject.cs similarity index 57% rename from IC/AbstractWallItem.cs rename to IC/WallObject.cs index 9fac739..307e202 100644 --- a/IC/AbstractWallItem.cs +++ b/IC/WallObject.cs @@ -1,14 +1,12 @@ using System; using System.Collections.Generic; -using BreakableWallRandomizer.Modules; -using ItemChanger; -using UnityEngine; namespace BreakableWallRandomizer.IC { [Serializable] - public class AbstractWallItem : AbstractItem + public class WallObject { + public string name; public string gameObject; public string fsmType; public string sceneName; @@ -19,28 +17,11 @@ public class AbstractWallItem : AbstractItem public List alsoDestroy; public bool extra; public string group; - public string pinType; public List groupWalls; + public string pinType; public string logic; public Dictionary logicOverrides; public Dictionary> logicSubstitutions; - - public override void GiveImmediate(GiveInfo info) - { - 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(); - } } [Serializable] @@ -65,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 012b062..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 (AbstractWallItem wall in wallList) + foreach (BreakableWallItem wall in wallList) module.vanillaWalls.Add(new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType)); } } diff --git a/Manager/ItemHandler.cs b/Manager/ItemHandler.cs index 5952077..840fe0c 100644 --- a/Manager/ItemHandler.cs +++ b/Manager/ItemHandler.cs @@ -273,9 +273,9 @@ 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)); + List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); bool useGroups = BWR_Manager.Settings.GroupWalls; - foreach (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { bool include = wall.name.StartsWith("Wall") && BWR_Manager.Settings.RockWalls; include |= wall.name.StartsWith("Plank") && BWR_Manager.Settings.WoodenPlanks; @@ -283,7 +283,7 @@ private static void AddWalls(RequestBuilder rb) 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; - include = include && (!wall.extra || BWR_Manager.Settings.ExtraWalls); + //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) @@ -323,11 +323,11 @@ private static void AddWalls(RequestBuilder rb) { using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (AbstractWallItem group in groupList) + foreach (WallObject group in groupList) { - foreach (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { if (wall.group == group.name.Split('-')[1]) { @@ -337,7 +337,7 @@ private static void AddWalls(RequestBuilder rb) 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; - include = include && (!wall.extra || BWR_Manager.Settings.ExtraWalls); + //include = include && (!wall.extra || BWR_Manager.Settings.ExtraWalls); if (include) group.groupWalls.Add(new(wall.name, wall.sceneName, wall.gameObject, wall.fsmType)); } diff --git a/Manager/LogicHandler.cs b/Manager/LogicHandler.cs index 39253bc..74cfdc2 100644 --- a/Manager/LogicHandler.cs +++ b/Manager/LogicHandler.cs @@ -30,14 +30,17 @@ private static void FixStartLogic(Dictionary wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); + List wallList = jsonSerializer.Deserialize>(new JsonTextReader(reader)); lmb.GetOrAddTerm("Broken_Walls"); lmb.GetOrAddTerm("Broken_Planks"); @@ -63,13 +66,13 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) 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 (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { lmb.GetOrAddTerm(wall.name); lmb.AddItem(new StringItemTemplate(wall.name, $"Broken_{wall.name.Split('-')[0]}s++ >> {wall.name}++")); } - foreach (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { lmb.AddLogicDef(new(wall.name, wall.logic)); @@ -93,9 +96,9 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (AbstractWallItem g in groupList) + foreach (WallObject g in groupList) { string groupName = g.name.Split('-')[1]; string effect = ""; @@ -104,7 +107,7 @@ private static void ApplyLogic(GenerationSettings gs, LogicManagerBuilder lmb) int plankCount = 0; int floorCount = 0; int collapserCount = 0; - foreach (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { if (wall.group == groupName) { diff --git a/Manager/Manager.cs b/Manager/Manager.cs index df01e61..5d41af8 100644 --- a/Manager/Manager.cs +++ b/Manager/Manager.cs @@ -15,7 +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 = 30; + public static int TotalCollapsers = 58; public static void Hook() { DefineObjects(); @@ -34,9 +34,9 @@ private static void DefineObjects() 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)); - foreach (AbstractWallItem wall in wallList) + foreach (WallObject wall in wallList) { 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); @@ -46,9 +46,9 @@ private static void DefineObjects() using Stream gstream = assembly.GetManifestResourceStream("BreakableWallRandomizer.Resources.Data.WallGroups.json"); StreamReader greader = new(gstream); - List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); + List groupList = jsonSerializer.Deserialize>(new JsonTextReader(greader)); - foreach (AbstractWallItem group in groupList) + foreach (WallObject group in groupList) { 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); diff --git a/Resources/Data/BreakableWallObjects.json b/Resources/Data/BreakableWallObjects.json index b35a253..d3b9ad1 100644 --- a/Resources/Data/BreakableWallObjects.json +++ b/Resources/Data/BreakableWallObjects.json @@ -350,7 +350,7 @@ "group": "", "logic": "Crossroads_08", "logicOverrides": { - "Geo_Rock-Crossroads_Aspid_Arena_Hidden": "(ORIG) + (Wall-Crossroads_Aspid_Arena | (OBSCURESKIPS + (RIGHTCLAW | $SHADESKIP) + WINGS)" + "Geo_Rock-Crossroads_Aspid_Arena_Hidden": "(ORIG) + (Wall-Crossroads_Aspid_Arena | (OBSCURESKIPS + (RIGHTCLAW | $SHADESKIP) + WINGS))" }, "logicSubstitutions": {} }, @@ -707,7 +707,7 @@ "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" }, @@ -730,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", @@ -742,14 +742,14 @@ "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" + "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", @@ -761,7 +761,7 @@ "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": {} }, @@ -1213,8 +1213,8 @@ ], "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": {} }, @@ -1465,9 +1465,13 @@ "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", @@ -1485,8 +1489,7 @@ "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": { @@ -1724,7 +1727,7 @@ "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": {} }, @@ -1900,7 +1903,7 @@ "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": {} }, @@ -2297,7 +2300,7 @@ "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" }, @@ -3232,6 +3235,26 @@ }, "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", @@ -3335,8 +3358,8 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_14", - "x": 0.0, - "y": 0.0, + "x": 69.3, + "y": 9.24, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], @@ -3507,9 +3530,10 @@ "extra": false, "groupWalls": [], "group": "", - "logic": "Deepnest_33[top1]", + "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" + "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": {} }, @@ -3531,36 +3555,220 @@ "logicSubstitutions": {} }, { - "name": "Collapser-Dark_Deepnest_Trap", + "name": "Collapser-Dark_Deepnest_Egg_Trap_Left", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_39", - "x": 0.0, - "y": 0.0, + "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": "", - "logic": "Deepnest_39", + "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-Distant_Village_Path", + "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": -1.38, - "y": -0.1, + "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": "", - "logic": "Deepnest_41", + "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": {} }, @@ -3569,32 +3777,185 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Deepnest_45_v02", - "x": -1.38, - "y": -0.1, + "x": 1.8, + "y": 0.75, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Deepnest_45_v02[left1] + (RIGHTCLAW | LEFTCLAW + WINGS | WINGS + ENEMYPOGOS | $SHRIEKPOGO[3,before:AREASOUL])", + "logic": "Deepnest_45_v02[left1] + (SPIKETUNNELS | LEFTDASH) + (LANTERN | (NOLANTERN ? FALSE) | DARKROOMS)", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Beast's_Den", - "gameObject": "/Collapser Small", + "name": "Collapser-Beast's_Den_Above_Egg_Trap", + "gameObject": "Collapser Small (3)", "fsmType": "collapse small", "sceneName": "Deepnest_Spider_Town", - "x": -1.38, - "y": -0.1, + "x": 0.95, + "y": 0.9, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Deepnest_Spider_Town[left1]", + "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": {} }, @@ -3629,17 +3990,18 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Fungus2_23", - "x": -1.38, - "y": -0.1, + "x": 68.34, + "y": 55.08, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Fungus2_23[right1] + (FULLCLAW + FULLDASH | FULLCLAW + FULLSUPERDASH | LEFTCLAW + WINGS | RIGHTCLAW + ENEMYPOGOS + WINGS | COMPLEXSKIPS + FULLCLAW + $SHADESKIP[2HITS] + SPELLAIRSTALL + $CASTSPELL[1,1,before:ROOMSOUL] + $TAKEDAMAGE[2])", + "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] + WINGS + Collapser-Bretta" + "Rescued_Bretta": "ORIG | Fungus2_23[right1] + (ANYCLAW | WINGS) + Collapser-Bretta" }, "logicSubstitutions": {} }, @@ -3661,7 +4023,14 @@ "logicOverrides": { "Mask_Shard-Deepnest": "ORIG | (Fungus2_25[top1] | Fungus2_25[right1]) + (Collapser-Deepnest_Mask_Shard_Left | Collapser-Deepnest_Mask_Shard_Right) + (WINGS | ANYCLAW)" }, - "logicSubstitutions": {} + "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", @@ -3686,17 +4055,18 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Fungus3_28", - "x": -1.38, - "y": -0.1, + "x": 29.16, + "y": 11.01, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Fungus3_28[right1] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH))", + "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] + (ACID | ACIDSKIPS + (LEFTSKIPACID | WINGS + LEFTDASH | WINGS + RIGHTCLAW + SPELLAIRSTALL + $CASTSPELL[before:ROOMSOUL] | DAMAGEBOOSTS + $TAKEDAMAGE + FULLCLAW + FULLDASH))" + "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": {} }, @@ -3705,15 +4075,16 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "GG_Pipeway", - "x": -1.38, - "y": -0.1, + "x": 0.9, + "y": 20.62, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "GG_Pipeway[left1]", + "pinType": "World", + "logic": "(GG_Pipeway[left1] | GG_Pipeway[right1]) + (ANYCLAW | WINGS)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3722,20 +4093,27 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Mines_06", - "x": -1.38, - "y": -0.1, + "x": 138.42, + "y": 20.2, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Mines_06[left1]", - "logicOverrides": {}, - "logicSubstitutions": {} + "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", + "name": "Collapser-Catacombs_Trap_Left", "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "RestingGrounds_10", @@ -3748,12 +4126,12 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Catacombs_Trap_1", + "name": "Collapser-Catacombs_Trap_Middle", "gameObject": "/Collapser Small (1)", "fsmType": "collapse small", "sceneName": "RestingGrounds_10", @@ -3766,12 +4144,12 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Catacombs_Trap_2", + "name": "Collapser-Catacombs_Trap_Right", "gameObject": "/Collapser Small (2)", "fsmType": "collapse small", "sceneName": "RestingGrounds_10", @@ -3784,12 +4162,12 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Catacombs_Trap_3", + "name": "Collapser-Catacombs_Trap_Right_Dupe", "gameObject": "/Collapser Small (3)", "fsmType": "collapse small", "sceneName": "RestingGrounds_10", @@ -3802,12 +4180,12 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2", "logicOverrides": {}, "logicSubstitutions": {} }, { - "name": "Collapser-Catacombs_Trap_4", + "name": "Collapser-Catacombs_Trap_Final", "gameObject": "/Collapser Small (4)", "fsmType": "collapse small", "sceneName": "RestingGrounds_10", @@ -3820,7 +4198,7 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10 + Wall-Catacombs_Right_2 + (ANYCLAW | WINGS)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3838,7 +4216,7 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "logic": "RestingGrounds_10[top1] | (RestingGrounds_10[left1] + Plank-Catacombs_Elevator | RestingGrounds_10) + Collapser-Catacombs_Entrance", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3856,7 +4234,7 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "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": {} }, @@ -3874,7 +4252,7 @@ "groupWalls": [], "group": "", "pinType": "World", - "logic": "RestingGrounds_10", + "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": {} }, @@ -3883,15 +4261,16 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Waterways_09", - "x": -1.38, - "y": -0.1, + "x": 43.21, + "y": 28.94, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "(Waterways_09[left1] | Waterways_09[right1]) | $StartLocation[West Waterways]", + "pinType": "World", + "logic": "(Waterways_09[left1] | Waterways_09[right1]) + (LEFTCLAW | ((LEFTDASH | LEFTSUPERDASH) + RIGHTCLAW) | WINGS) | $StartLocation[West Waterways]", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3900,16 +4279,19 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "Waterways_14", - "x": -1.38, - "y": -0.1, + "x": 238.19, + "y": 35.72, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "Waterways_14[bot1]", - "logicOverrides": {}, + "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": {} }, { @@ -3917,15 +4299,15 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "White_Palace_02", - "x": -1.38, - "y": -0.1, + "x": 0.5, + "y": -0.9, "persistentBool": "", "sprite": "collapser_short_0deg", "alsoDestroy": [], "extra": false, "groupWalls": [], "group": "", - "logic": "White_Palace_02[left1] + LEFTCLAW + WINGS", + "logic": "White_Palace_02[left1] + LEFTCLAW + (WINGS | RIGHTSUPERDASH + Collapser-White_Palace_Entrance_Orb)", "logicOverrides": {}, "logicSubstitutions": {} }, @@ -3934,16 +4316,18 @@ "gameObject": "/Collapser Small", "fsmType": "collapse small", "sceneName": "White_Palace_17", - "x": -1.38, - "y": -0.1, + "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])) | White_Palace_17[right1] + Lever-Path_of_Pain + Collapser-Path_of_Pain + WINGS + ANYCLAW", - "logicOverrides": {}, + "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 5dcc553..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": "", @@ -111,11 +140,11 @@ "logic": "RestingGrounds_10[left1] | RestingGrounds_10[top1] | RestingGrounds_10[top2]", "logicOverrides": { "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)", + "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[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" }, diff --git a/Resources/Logic/ConnectionOverrides.json b/Resources/Logic/ConnectionOverrides.json index 7554f03..04590f9 100644 --- a/Resources/Logic/ConnectionOverrides.json +++ b/Resources/Logic/ConnectionOverrides.json @@ -6,6 +6,11 @@ "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)", @@ -16,6 +21,11 @@ "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": "Bretta_Key", + "logicOverride": "(ORIG) | Fungus2_23[right1] + (ANYCLAW | WINGS + Collapser-Bretta)", + "logicSubstitutions": {} + }, { "name": "Chandelier-Watcher_Knights", "logicOverride": "ORIG + Wall-Chandelier", 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/Settings/BWR_Settings.cs b/Settings/BWR_Settings.cs index 9d4d5f3..d2bd060 100644 --- a/Settings/BWR_Settings.cs +++ b/Settings/BWR_Settings.cs @@ -7,7 +7,8 @@ public class BWR_Settings public bool RockWalls = false; public bool DiveFloors = false; public bool Collapsers = false; - public bool ExtraWalls = false; + // Extra Walls are not yet implemented on this patch + //public bool ExtraWalls = false; public bool GodhomeWalls = false; [MenuChanger.Attributes.MenuRange(-1, 99)]