From 86b3ca530369b4371cbc6e00719745496c46b919 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sat, 5 Feb 2022 10:44:01 +1100 Subject: [PATCH 01/15] Big refactor: Use IC Placements to load in data Animate pin sprites for mulitple items at one location Other small fixes --- MapModS/Data/DataLoader.cs | 200 ++++++++++++------- MapModS/Data/ItemDef.cs | 25 +++ MapModS/Data/PinDef.cs | 13 +- MapModS/Data/PinLocationState.cs | 19 ++ MapModS/Data/PoolGroup.cs | 4 +- MapModS/Data/PreviewGroup.cs | 22 -- MapModS/Map/FullMap.cs | 1 + MapModS/Map/Pin.cs | 153 -------------- MapModS/Map/PinAnimatedSprite.cs | 136 +++++++++++++ MapModS/Map/PinsCustom.cs | 212 ++++++++++++-------- MapModS/Map/Transition.cs | 22 +- MapModS/Map/WorldMap.cs | 64 +++--- MapModS/MapModS.cs | 16 +- MapModS/MapModS.csproj | 7 +- MapModS/Resources/pins.json | 320 +++++++++++------------------- MapModS/Settings/LocalSettings.cs | 5 +- MapModS/Settings/SettingsUtil.cs | 28 +-- MapModS/UI/MapText.cs | 2 +- MapModS/UI/PauseMenu.cs | 4 + MapModS/UI/TransitionText.cs | 4 +- 20 files changed, 647 insertions(+), 610 deletions(-) create mode 100644 MapModS/Data/ItemDef.cs create mode 100644 MapModS/Data/PinLocationState.cs delete mode 100644 MapModS/Data/PreviewGroup.cs delete mode 100644 MapModS/Map/Pin.cs create mode 100644 MapModS/Map/PinAnimatedSprite.cs diff --git a/MapModS/Data/DataLoader.cs b/MapModS/Data/DataLoader.cs index 6afff3a..e22fdcf 100644 --- a/MapModS/Data/DataLoader.cs +++ b/MapModS/Data/DataLoader.cs @@ -2,22 +2,43 @@ using System; using System.Collections.Generic; using System.Linq; +using ItemChanger; +using RandomizerCore; +using RandomizerMod.IC; namespace MapModS.Data { public static class DataLoader { - private static Dictionary _pins; - private static Dictionary _pinsAM; + private static Dictionary _allPins; + private static Dictionary _allPinsAM; + private static Dictionary _usedPins = new(); public static PinDef[] GetPinArray() { - return _pins.Values.ToArray(); + return _allPins.Values.ToArray(); } public static PinDef[] GetPinAMArray() { - return _pinsAM.Values.ToArray(); + return _allPinsAM.Values.ToArray(); + } + + public static PinDef[] GetUsedPinArray() + { + return _usedPins.Values.ToArray(); + } + + public static PinDef GetUsedPinDef(string locationName) + { + PinDef pinDef; + + if (_usedPins.TryGetValue(locationName, out pinDef)) + { + return pinDef; + } + + return default; } // Uses RandomizerData to get the PoolGroup from an item name @@ -64,6 +85,10 @@ public static PoolGroup GetPoolGroup(string cleanItemName) case "WallClimb": return PoolGroup.Skills; + case "Lever": + case "Switch": + return PoolGroup.Levers; + default: break; } @@ -81,107 +106,146 @@ public static PoolGroup GetPoolGroup(string cleanItemName) } } - MapModS.Instance.LogWarn($"PoolGroup not found for an item"); + MapModS.Instance.LogWarn($"PoolGroup not found for an item: " + cleanItemName); return PoolGroup.Unknown; } - public static PoolGroup GetVanillaPoolGroup(string location) + public static PoolGroup GetLocationPoolGroup(string location) { string cleanItemName = location.Split('-')[0]; return GetPoolGroup(cleanItemName); } - public static PoolGroup GetRandomizerPoolGroup(string location, bool getLast) + public static PoolGroup GetItemPoolGroup(string item) + { + string cleanItemName = item.Replace("Placeholder-", "").Split('-')[0]; + + return GetPoolGroup(cleanItemName); + } + + // Next five helper functions are based on BadMagic100's Rando4Stats RandoExtensions + // MIT License + + // Copyright(c) 2022 BadMagic100 + + // Permission is hereby granted, free of charge, to any person obtaining a copy + // of this software and associated documentation files(the "Software"), to deal + // in the Software without restriction, including without limitation the rights + // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + // copies of the Software, and to permit persons to whom the Software is + // furnished to do so, subject to the following conditions: + + // The above copyright notice and this permission notice shall be included in all + // copies or substantial portions of the Software. + public static ItemPlacement RandoPlacement(this AbstractItem item) { - if (RandomizerMod.RandomizerMod.RS.Context.itemPlacements.Any(pair => pair.location.Name == location)) + if (item.GetTag(out RandoItemTag tag)) { - RandomizerCore.ItemPlacement ilp; + return RandomizerMod.RandomizerMod.RS.Context.itemPlacements[tag.id]; + } + return default; + } - if (getLast) - { - ilp = RandomizerMod.RandomizerMod.RS.Context.itemPlacements.Last(pair => pair.location.Name == location); - } - else - { - ilp = RandomizerMod.RandomizerMod.RS.Context.itemPlacements.First(pair => pair.location.Name == location); - } + public static string RandoItemName(this AbstractItem item) + { + return item.RandoPlacement().item.Name ?? ""; + } - string cleanItemName = ilp.item.Name.Replace("Placeholder-", "").Split('-')[0]; + public static string RandoLocationName(this AbstractItem item) + { + return item.RandoPlacement().location.Name ?? ""; + } - return GetPoolGroup(cleanItemName); + public static int RandoItemId(this AbstractItem item) + { + if (item.GetTag(out RandoItemTag tag)) + { + return tag.id; } + return default; + } + + public static bool CanPreview(this AbstractPlacement placement) + { + return !placement.HasTag(); + } - return GetVanillaPoolGroup(location); + public static bool IsPersistent(this AbstractItem item) + { + return item.HasTag(); } - // This method finds the vanilla and spoiler PoolGroups corresponding to each Pin, using RandomizerMod's ItemPlacements array - // Called once per save load - public static void FindPoolGroups() + public static void SetUsedPinDefs() { - foreach (KeyValuePair entry in _pins) + _usedPins.Clear(); + + foreach (KeyValuePair placement in ItemChanger.Internal.Ref.Settings.Placements) { - string vanillaItem = entry.Key; - PinDef pinD = entry.Value; + IEnumerable items = placement.Value.Items + .Where(x => !x.IsObtained()) + .Select(x => new ItemDef(x)); - // First check if this is a shop pin - if (pinD.isShop) - { - pinD.vanillaPool = PoolGroup.Shop; - pinD.spoilerPool = PoolGroup.Shop; - } - // Then check if this item is randomized - else + if (!items.Any()) continue; + + string locationName = placement.Value.Items.Where(x => !x.IsObtained()).First().RandoLocationName(); + PinDef pinDef; + + if (_allPins.TryGetValue(locationName, out pinDef)) { - pinD.vanillaPool = GetVanillaPoolGroup(vanillaItem); - pinD.spoilerPool = GetRandomizerPoolGroup(vanillaItem, false); + pinDef.randoItems = items; + pinDef.canPreview = placement.Value.CanPreview(); + pinDef.pinLocationState = PinLocationState.UncheckedUnreachable; - if (pinD.vanillaPool == PoolGroup.Unknown || pinD.spoilerPool == PoolGroup.Unknown) + if (pinDef.isShop) + { + pinDef.locationPoolGroup = PoolGroup.Shop; + } + else { - MapModS.Instance.LogWarn($"A location doesn't seem to have a valid pool."); + pinDef.locationPoolGroup = GetLocationPoolGroup(pinDef.name); } + + _usedPins.Add(locationName, pinDef); } - - if (pinD.name == "Focus") + else { - pinD.spoilerPool = GetRandomizerPoolGroup("Lore_Tablet-King's_Pass_Focus", true); + MapModS.Instance.Log("No corresponding pin location: " + locationName); } } - // Disable pins based on Randomizer settings - _pins["Egg_Shop"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.EggShop; - - _pins["Elevator_Pass"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.RandomizeElevatorPass; - - _pins["Focus"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.RandomizeFocus; - - _pins["Mantis_Claw"].disable = RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.SplitClaw; - - _pins["Left_Mantis_Claw"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.SplitClaw; - _pins["Right_Mantis_Claw"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.SplitClaw; - - _pins["Split_Mothwing_Cloak"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.SplitCloak; - - _pins["Split_Crystal_Heart"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.SplitSuperdash; - - _pins["World_Sense"].disable = !RandomizerMod.RandomizerMod.RS.GenerationSettings.PoolSettings.Dreamers; + foreach (KeyValuePair pinDef in _allPins) + { + if (!_usedPins.ContainsKey(pinDef.Key) && !pinDef.Value.randoOnly) + { + pinDef.Value.pinLocationState = PinLocationState.NonRandomizedUnchecked; + pinDef.Value.locationPoolGroup = GetLocationPoolGroup(pinDef.Value.name); + _usedPins.Add(pinDef.Key, pinDef.Value); + } + } - bool disableMushroomLocations = !RandomizerMod.RandomizerMod.RS.Context.itemPlacements.Any(pair => pair.location.Name.Contains("Mr_Mushroom")); + if (MapModS.AdditionalMapsInstalled) + { + foreach (PinDef pinDefAM in GetPinAMArray()) + { + PinDef pinDef; - _pins["Mr_Mushroom-Fungal_Wastes"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-Kingdom's_Edge"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-Deepnest"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-Howling_Cliffs"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-Ancient_Basin"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-Fog_Canyon"].disable = disableMushroomLocations; - _pins["Mr_Mushroom-King's_Pass"].disable = disableMushroomLocations; + if (_usedPins.TryGetValue(pinDefAM.name, out pinDef)) + { + pinDef.pinScene = pinDefAM.pinScene; + pinDef.mapZone = pinDefAM.mapZone; + pinDef.offsetX = pinDefAM.offsetX; + pinDef.offsetY = pinDefAM.offsetY; + } + } + } } public static void Load() { - _pins = JsonUtil.Deserialize>("MapModS.Resources.pins.json"); - _pinsAM = JsonUtil.Deserialize>("MapModS.Resources.pinsAM.json"); + _allPins = JsonUtil.Deserialize>("MapModS.Resources.pins.json"); + _allPinsAM = JsonUtil.Deserialize>("MapModS.Resources.pinsAM.json"); } } } \ No newline at end of file diff --git a/MapModS/Data/ItemDef.cs b/MapModS/Data/ItemDef.cs new file mode 100644 index 0000000..3492988 --- /dev/null +++ b/MapModS/Data/ItemDef.cs @@ -0,0 +1,25 @@ +using ItemChanger; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MapModS.Data +{ + public class ItemDef + { + public ItemDef(AbstractItem item) + { + id = item.RandoItemId(); + itemName = item.RandoItemName(); + poolGroup = DataLoader.GetItemPoolGroup(item.RandoItemName()); + persistent = item.IsPersistent(); + } + + public int id; + public string itemName; + public PoolGroup poolGroup; + public bool persistent = false; + } +} diff --git a/MapModS/Data/PinDef.cs b/MapModS/Data/PinDef.cs index 8ef6336..324e7f4 100644 --- a/MapModS/Data/PinDef.cs +++ b/MapModS/Data/PinDef.cs @@ -1,4 +1,5 @@ using GlobalEnums; +using System.Collections.Generic; namespace MapModS.Data { @@ -24,19 +25,17 @@ public class PinDef // The local offset of the pin relative to its pinScene/sceneName map object public float offsetX; - public float offsetY; public float offsetZ; public bool isShop = false; + public bool randoOnly = false; // These are assigned during FindSpoilerPools, unusued if it's a Shop - public PoolGroup vanillaPool; - - public PoolGroup spoilerPool; - - public PreviewGroup previewGroup; + public PoolGroup locationPoolGroup; - public bool disable = false; + public IEnumerable randoItems; + public bool canPreview; + public PinLocationState pinLocationState; } } \ No newline at end of file diff --git a/MapModS/Data/PinLocationState.cs b/MapModS/Data/PinLocationState.cs new file mode 100644 index 0000000..81b2667 --- /dev/null +++ b/MapModS/Data/PinLocationState.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MapModS.Data +{ + public enum PinLocationState + { + UncheckedUnreachable, + UncheckedReachable, + NonRandomizedUnchecked, + OutOfLogicReachable, + Previewed, + Cleared, + ClearedPersistent + } +} diff --git a/MapModS/Data/PoolGroup.cs b/MapModS/Data/PoolGroup.cs index 58a0c7c..c2e5b8f 100644 --- a/MapModS/Data/PoolGroup.cs +++ b/MapModS/Data/PoolGroup.cs @@ -30,6 +30,8 @@ public enum PoolGroup SoulTotems, LoreTablets, - Shop + Shop, + + Levers } } \ No newline at end of file diff --git a/MapModS/Data/PreviewGroup.cs b/MapModS/Data/PreviewGroup.cs deleted file mode 100644 index 5dec9fa..0000000 --- a/MapModS/Data/PreviewGroup.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MapModS.Data -{ - public enum PreviewGroup - { - None, - Colosseum, - KingFragment, - FlowerQuest, - GreyPrinceZote, - WhisperingRoot, - Dreamer, - AbyssShriek, - VoidHeart, - Godtuner, - LoreTablet, - BasinFountain, - Nailmaster, - Stag, - Map, - Divine - } -} diff --git a/MapModS/Map/FullMap.cs b/MapModS/Map/FullMap.cs index fddcd96..4b4b596 100644 --- a/MapModS/Map/FullMap.cs +++ b/MapModS/Map/FullMap.cs @@ -152,6 +152,7 @@ public static void PurgeMap() || areaObj.name == "Map Markers" || areaObj.name == "WHITE_PALACE" || areaObj.name == "GODS_GLORY" + || areaObj.name == "MMS Custom Pin Group" || areaObj.name == "MMS Custom Map Rooms") continue; //if (areaObj.name == "MMS Custom Map Rooms") diff --git a/MapModS/Map/Pin.cs b/MapModS/Map/Pin.cs deleted file mode 100644 index c6ba825..0000000 --- a/MapModS/Map/Pin.cs +++ /dev/null @@ -1,153 +0,0 @@ -using GlobalEnums; -using MapModS.Data; -using MapModS.Settings; -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace MapModS.Map -{ - internal class Pin : MonoBehaviour - { - public PinDef PinData { get; private set; } = null; - public SpriteRenderer SR => gameObject.GetComponent(); - - private readonly Color _inactiveColor = Color.gray; - private Color _origColor; - - public void SetPinData(PinDef pd) - { - PinData = pd; - _origColor = SR.color; - } - - public void UpdatePin(MapZone mapZone, HashSet transitionPinScenes) - { - try - { - ShowBasedOnMap(mapZone); - HideIfFound(transitionPinScenes); - } - catch (Exception e) - { - MapModS.Instance.LogError(message: $"Failed to update pin! ID: {PinData.name}\n{e}"); - } - } - - // Hides or shows the pin depending on the state of the map (NONE is World Map) - private void ShowBasedOnMap(MapZone mapZone) - { - if (mapZone == MapZone.NONE) - { - if (MapModS.LS.mapMode != MapMode.PinsOverMap) - { - gameObject.SetActive(true); return; - } - - if (SettingsUtil.GetMapSetting(PinData.mapZone)) - { - gameObject.SetActive(true); return; - } - } - - if (mapZone == PinData.mapZone) - { - gameObject.SetActive(true); return; - } - - gameObject.SetActive(false); - } - - private void HideIfFound(HashSet transitionPinScenes) - { - if (transitionPinScenes.Count != 0) - { - if (!transitionPinScenes.Contains(PinData.sceneName)) - { - gameObject.SetActive(false); - } - } - - if (RandomizerMod.RandomizerMod.RS.TrackerData.clearedLocations.Contains(PinData.name)) - { - gameObject.SetActive(false); - return; - } - - if (RandomizerMod.RandomizerMod.RS.Context.itemPlacements.Any(ip => ip.location.Name == PinData.name)) return; - - // For non-randomized items - - if (PinData.pdBool != null) - { - if (PlayerData.instance.GetBool(PinData.pdBool)) - { - gameObject.SetActive(false); return; - } - } - - if (PinData.pdInt != null) - { - if (PlayerData.instance.GetInt(PinData.pdInt) >= PinData.pdIntValue) - { - gameObject.SetActive(false); return; - } - } - - if (PinData.vanillaPool == PoolGroup.WhisperingRoots) - { - if (PlayerData.instance.scenesEncounteredDreamPlantC.Contains(PinData.sceneName)) - { - gameObject.SetActive(false); return; - } - } - - if (PinData.vanillaPool == PoolGroup.Grubs) - { - if (PlayerData.instance.scenesGrubRescued.Contains(PinData.sceneName)) - { - gameObject.SetActive(false); return; - } - } - - if (PinData.vanillaPool == PoolGroup.GrimmkinFlames) - { - if (PlayerData.instance.scenesFlameCollected.Contains(PinData.sceneName)) - { - gameObject.SetActive(false); return; - } - } - - if (MapModS.LS.ObtainedVanillaItems.ContainsKey(PinData.objectName + PinData.sceneName)) - { - gameObject.SetActive(false); - } - } - - public void SetSizeAndColor() - { - float scale = MapModS.GS.pinSize switch - { - PinSize.Small => 0.31f, - PinSize.Medium => 0.37f, - PinSize.Large => 0.42f, - _ => throw new NotImplementedException() - }; - - transform.localScale = 1.45f * scale * new Vector2(1.0f, 1.0f); - - if (RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableLocations.Contains(PinData.name) - || RandomizerMod.RandomizerMod.RS.TrackerData.previewedLocations.Contains(PinData.name)) - { - SR.color = _origColor; - } - else - { - // Non-randomized items also fall here - transform.localScale = 0.7f * transform.localScale; - SR.color = _inactiveColor; - } - } - } -} \ No newline at end of file diff --git a/MapModS/Map/PinAnimatedSprite.cs b/MapModS/Map/PinAnimatedSprite.cs new file mode 100644 index 0000000..687c6bb --- /dev/null +++ b/MapModS/Map/PinAnimatedSprite.cs @@ -0,0 +1,136 @@ +using MapModS.Data; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using GlobalEnums; +using MapModS.Settings; + +namespace MapModS.Map +{ + public class PinAnimatedSprite : MonoBehaviour + { + public PinDef pinDef { get; private set; } = null; + SpriteRenderer SR => gameObject.GetComponent(); + int spriteIndex = 0; + + private readonly Color _inactiveColor = Color.gray; + private Color _origColor; + + public void SetPinData(PinDef pd) + { + pinDef = pd; + _origColor = SR.color; + } + + void OnEnable() + { + if (gameObject.activeSelf + && pinDef != null + && pinDef.randoItems != null + && pinDef.randoItems.Count() > 1) + { + StartCoroutine("CycleSprite"); + } + } + + void OnDisable() + { + if (!gameObject.activeSelf) + { + StopAllCoroutines(); + } + } + + IEnumerator CycleSprite() + { + while (true) + { + yield return new WaitForSecondsRealtime(1); + spriteIndex = (spriteIndex + 1) % pinDef.randoItems.Count(); + SetSprite(); + } + } + + public void ResetSpriteIndex() + { + spriteIndex = 0; + } + + public void SetSprite() + { + if (!gameObject.activeSelf) return; + + // Non-randomized + if (pinDef.pinLocationState == PinLocationState.NonRandomizedUnchecked) + { + SR.sprite = SpriteManager.GetSpriteFromPool(pinDef.locationPoolGroup, PinBorderColor.Normal); + return; + } + + PoolGroup pool; + PinBorderColor pinBorderColor = PinBorderColor.Normal; + + if (pinDef.pinLocationState == PinLocationState.OutOfLogicReachable) + { + pinBorderColor = PinBorderColor.OutOfLogic; + } + + if (pinDef.pinLocationState == PinLocationState.Previewed) + { + pinBorderColor = PinBorderColor.Previewed; + } + + if (MapModS.LS.SpoilerOn + || pinDef.pinLocationState == PinLocationState.Previewed + || pinDef.pinLocationState == PinLocationState.ClearedPersistent) + { + pool = pinDef.randoItems.ElementAt(spriteIndex).poolGroup; + + if (pinDef.randoItems.ElementAt(spriteIndex).persistent) + { + pinBorderColor = PinBorderColor.Persistent; + } + } + else + { + pool = pinDef.locationPoolGroup; + } + + SR.sprite = SpriteManager.GetSpriteFromPool(pool, pinBorderColor); + } + + public void SetSizeAndColor() + { + float scale = MapModS.GS.pinSize switch + { + PinSize.Small => 0.31f, + PinSize.Medium => 0.37f, + PinSize.Large => 0.42f, + _ => throw new NotImplementedException() + }; + + transform.localScale = 1.45f * scale * new Vector2(1.0f, 1.0f); + + if (pinDef.pinLocationState == PinLocationState.UncheckedReachable + || pinDef.pinLocationState == PinLocationState.OutOfLogicReachable + || pinDef.pinLocationState == PinLocationState.Previewed) + { + SR.color = _origColor; + } + else if (pinDef.pinLocationState == PinLocationState.ClearedPersistent) + { + transform.localScale = 0.7f * transform.localScale; + SR.color = _origColor; + } + else + { + transform.localScale = 0.7f * transform.localScale; + SR.color = _inactiveColor; + } + } + } +} diff --git a/MapModS/Map/PinsCustom.cs b/MapModS/Map/PinsCustom.cs index 0e069fb..ca2eaba 100644 --- a/MapModS/Map/PinsCustom.cs +++ b/MapModS/Map/PinsCustom.cs @@ -1,8 +1,10 @@ using GlobalEnums; +using ItemChanger; using MapModS.Data; using MapModS.Settings; using System; using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace MapModS.Map @@ -11,17 +13,17 @@ public class PinsCustom : MonoBehaviour { private readonly Dictionary _Groups = new(); - private readonly List _pins = new(); + private readonly List _pins = new(); public void MakePins(GameMap gameMap) { DestroyPins(); - foreach (PinDef pinData in DataLoader.GetPinArray()) + foreach (PinDef pinDef in DataLoader.GetUsedPinArray()) { try { - MakePin(pinData, gameMap); + MakePin(pinDef, gameMap); } catch (Exception e) { @@ -30,12 +32,10 @@ public void MakePins(GameMap gameMap) } } - private void MakePin(PinDef pinData, GameMap gameMap) + private void MakePin(PinDef pinDef, GameMap gameMap) { - if (pinData.disable) return; - // Create new pin GameObject - GameObject goPin = new($"pin_mapmod_{pinData.name}") + GameObject goPin = new($"pin_mapmod_{pinDef.name}") { layer = 30 }; @@ -44,61 +44,49 @@ private void MakePin(PinDef pinData, GameMap gameMap) SpriteRenderer sr = goPin.AddComponent(); // Initialize sprite to vanillaPool - sr.sprite = SpriteManager.GetSpriteFromPool(pinData.vanillaPool, PinBorderColor.Normal); + sr.sprite = SpriteManager.GetSpriteFromPool(pinDef.locationPoolGroup, PinBorderColor.Normal); sr.sortingLayerName = "HUD"; sr.size = new Vector2(1f, 1f); // Attach pin data to the GameObject - Pin pin = goPin.AddComponent(); - pin.SetPinData(pinData); + PinAnimatedSprite pin = goPin.AddComponent(); + pin.SetPinData(pinDef); _pins.Add(pin); - // Rename pin if there are two items at the same location - if (RandomizerMod.RandomizerMod.RS.GenerationSettings.PoolSettings.LoreTablets - && RandomizerMod.RandomizerMod.RS.GenerationSettings.NoveltySettings.RandomizeFocus - && pin.PinData.name == "Focus") - { - pin.PinData.name = "Lore_Tablet-King's_Pass_Focus"; - } - // Set pin transform (by pool) - AssignGroup(goPin, pinData); - - if (MapModS.AdditionalMapsInstalled) - { - foreach (PinDef pinDataAM in DataLoader.GetPinAMArray()) - { - if (pinDataAM.name == pin.PinData.name) - { - pin.PinData.pinScene = pinDataAM.pinScene; - pin.PinData.mapZone = pinDataAM.mapZone; - pin.PinData.offsetX = pinDataAM.offsetX; - pin.PinData.offsetY = pinDataAM.offsetY; - break; - } - } - } + AssignGroup(pin); - string roomName = pinData.pinScene ?? pinData.sceneName; + string roomName = pinDef.pinScene ?? pinDef.sceneName; Vector3 vec = GetRoomPos(roomName, gameMap); vec.Scale(new Vector3(1.46f, 1.46f, 1)); - vec += new Vector3(pinData.offsetX, pinData.offsetY, pinData.offsetZ); + vec += new Vector3(pinDef.offsetX, pinDef.offsetY, pinDef.offsetZ); goPin.transform.localPosition = new Vector3(vec.x, vec.y, vec.z - 0.01f); } - private void AssignGroup(GameObject newPin, PinDef pinData) + private void AssignGroup(PinAnimatedSprite pin) { - if (!_Groups.ContainsKey(pinData.spoilerPool)) + PoolGroup poolGroup; + + if (pin.pinDef.randoItems == null || !pin.pinDef.randoItems.Any()) + { + poolGroup = pin.pinDef.locationPoolGroup; + } + else + { + poolGroup = pin.pinDef.randoItems.First().poolGroup; + } + + if (!_Groups.ContainsKey(poolGroup)) { - _Groups[pinData.spoilerPool] = new GameObject("PinGroup " + pinData.spoilerPool); - _Groups[pinData.spoilerPool].transform.SetParent(transform); - _Groups[pinData.spoilerPool].SetActive(true); + _Groups[poolGroup] = new GameObject("PinGroup " + poolGroup); + _Groups[poolGroup].transform.SetParent(transform); + _Groups[poolGroup].SetActive(true); } - newPin.transform.SetParent(_Groups[pinData.spoilerPool].transform); + pin.gameObject.transform.SetParent(_Groups[poolGroup].transform); } private Vector3 GetRoomPos(string roomName, GameMap gameMap) @@ -147,11 +135,11 @@ internal void AddGroupToList(PoolGroup group) foreach (Transform pinT in _Groups[group].GetComponentsInChildren()) { - Pin pin = pinT.GetComponent(); + PinAnimatedSprite pin = pinT.GetComponent(); if (pin == null) continue; - if (pin.PinData.vanillaPool != pin.PinData.spoilerPool) + if (pin.pinDef.randoItems != null) { RandomizedGroups.Add(group); return; @@ -164,7 +152,7 @@ internal void AddGroupToList(PoolGroup group) internal void ToggleSpoilers() { MapModS.LS.SpoilerOn = !MapModS.LS.SpoilerOn; - RefreshSprites(); + SetSprites(); } internal void TogglePinStyle() @@ -188,7 +176,7 @@ internal void TogglePinStyle() break; } - RefreshSprites(); + SetSprites(); } internal void ToggleRandomized() @@ -215,62 +203,126 @@ internal void ToggleOthers() public void UpdatePins(MapZone mapZone, HashSet transitionPinScenes) { - foreach (Pin pin in _pins) + foreach (PinAnimatedSprite pin in _pins) { - pin.UpdatePin(mapZone, transitionPinScenes); - } - } + pin.ResetSpriteIndex(); - // Called every time when any relevant setting is changed, or when the Map is opened - public void RefreshGroups() - { - foreach (PoolGroup group in _Groups.Keys) - { - _Groups[group].SetActive(MapModS.LS.GetOnFromGroup(group)); - } - } + PinDef pd = pin.pinDef; - private bool CanBePreviewed(Pin pin) - { - if (!RandomizerMod.RandomizerMod.RS.TrackerData.previewedLocations.Contains(pin.PinData.name)) return false; + // Show based on map settings + if ((mapZone == MapZone.NONE && (MapModS.LS.mapMode != MapMode.PinsOverMap || SettingsUtil.GetMapSetting(pd.mapZone))) + || mapZone == pd.mapZone) + { + pin.gameObject.SetActive(true); - if (pin.PinData.isShop) return true; + if (transitionPinScenes.Count != 0 && !transitionPinScenes.Contains(pd.sceneName)) + { + pin.gameObject.SetActive(false); + } + } + else + { + pin.gameObject.SetActive(false); + } - return SettingsUtil.GetPreviewSetting(pin.PinData.previewGroup); - } + if (pd.pinLocationState == PinLocationState.Cleared) + { + pin.gameObject.SetActive(false); + continue; + } - public void RefreshSprites() - { - foreach (Pin pin in _pins) - { - if (CanBePreviewed(pin)) + if (pd.pinLocationState == PinLocationState.ClearedPersistent) continue; + + if (pd.pinLocationState == PinLocationState.NonRandomizedUnchecked) { - pin.SR.sprite = SpriteManager.GetSpriteFromPool(pin.PinData.spoilerPool, PinBorderColor.Previewed); + if ((pd.pdBool != null && PlayerData.instance.GetBool(pd.pdBool)) + || (pd.pdInt != null && PlayerData.instance.GetInt(pd.pdInt) >= pd.pdIntValue) + || (pd.locationPoolGroup == PoolGroup.WhisperingRoots && PlayerData.instance.scenesEncounteredDreamPlantC.Contains(pd.sceneName)) + || (pd.locationPoolGroup == PoolGroup.Grubs && PlayerData.instance.scenesGrubRescued.Contains(pd.sceneName)) + || (pd.locationPoolGroup == PoolGroup.GrimmkinFlames && PlayerData.instance.scenesFlameCollected.Contains(pd.sceneName)) + || (MapModS.LS.ObtainedVanillaItems.ContainsKey(pd.objectName + pd.sceneName))) + { + pd.pinLocationState = PinLocationState.Cleared; + pin.gameObject.SetActive(false); + } continue; } - PinBorderColor pinColor = PinBorderColor.Normal; + if (RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableLocations.Contains(pd.name)) + { + if (RandomizerMod.RandomizerMod.RS.TrackerDataWithoutSequenceBreaks.uncheckedReachableLocations.Contains(pin.pinDef.name)) + { + pd.pinLocationState = PinLocationState.UncheckedReachable; + } + else + { + pd.pinLocationState = PinLocationState.OutOfLogicReachable; + } + } - if (RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableLocations.Contains(pin.PinData.name) - && !RandomizerMod.RandomizerMod.RS.TrackerDataWithoutSequenceBreaks.uncheckedReachableLocations.Contains(pin.PinData.name)) + if (RandomizerMod.RandomizerMod.RS.TrackerData.previewedLocations.Contains(pd.name) && pd.canPreview) { - pinColor = PinBorderColor.OutOfLogic; + pd.pinLocationState = PinLocationState.Previewed; } - if (MapModS.LS.SpoilerOn) + // Remove obtained rando items from list + if (pd.randoItems != null && pd.randoItems.Any()) { - pin.SR.sprite = SpriteManager.GetSpriteFromPool(pin.PinData.spoilerPool, pinColor); + List newRandoItems = new(); + + foreach (ItemDef item in pd.randoItems) + { + if ((!RandomizerMod.RandomizerMod.RS.TrackerData.obtainedItems.Contains(item.id) + && !RandomizerMod.RandomizerMod.RS.TrackerData.outOfLogicObtainedItems.Contains(item.id)) + || item.persistent) + { + newRandoItems.Add(item); + } + } + + pd.randoItems = newRandoItems; + + if (pd.randoItems.Any()) + { + AssignGroup(pin); + } } - else + + if (RandomizerMod.RandomizerMod.RS.TrackerData.clearedLocations.Contains(pd.name)) { - pin.SR.sprite = SpriteManager.GetSpriteFromPool(pin.PinData.vanillaPool, pinColor); + if (pd.randoItems != null && pd.randoItems.Any(i => i.persistent)) + { + pd.pinLocationState = PinLocationState.ClearedPersistent; + } + else + { + pd.pinLocationState = PinLocationState.Cleared; + pin.gameObject.SetActive(false); + } } } } + // Called every time when any relevant setting is changed, or when the Map is opened + public void RefreshGroups() + { + foreach (PoolGroup group in _Groups.Keys) + { + _Groups[group].SetActive(MapModS.LS.GetOnFromGroup(group)); + } + } + + public void SetSprites() + { + foreach (PinAnimatedSprite pin in _pins) + { + pin.SetSprite(); + } + } + public void ResizePins() { - foreach (Pin pin in _pins) + foreach (PinAnimatedSprite pin in _pins) { pin.SetSizeAndColor(); } @@ -278,7 +330,7 @@ public void ResizePins() public void DestroyPins() { - foreach (Pin pin in _pins) + foreach (PinAnimatedSprite pin in _pins) { Destroy(pin.gameObject); } diff --git a/MapModS/Map/Transition.cs b/MapModS/Map/Transition.cs index 86023ef..a45e0a0 100644 --- a/MapModS/Map/Transition.cs +++ b/MapModS/Map/Transition.cs @@ -225,7 +225,8 @@ public static HashSet SetupMapTransitionMode(GameMap gameMap, bool isAlt || areaObj.name == "Shade Pos" || areaObj.name == "Flame Pins" || areaObj.name == "Dreamer Pins" - || areaObj.name == "Map Markers") continue; + || areaObj.name == "Map Markers" + || areaObj.name == "MMS Custom Pin Group") continue; if (areaObj.name == "MMS Custom Map Rooms") { @@ -275,16 +276,16 @@ public static HashSet SetupMapTransitionMode(GameMap gameMap, bool isAlt } } - if (emd.sceneName == StringUtils.CurrentNormalScene()) + if (visitedAdjacentScenes.Contains(emd.sceneName)) { - color = roomColor[RoomState.Current]; + color = roomColor[RoomState.Adjacent]; } - if (visitedAdjacentScenes.Contains(emd.sceneName)) + if (emd.sceneName == StringUtils.CurrentNormalScene()) { - color = roomColor[RoomState.Adjacent]; + color = roomColor[RoomState.Current]; } - + if (uncheckedReachableScenes.Contains(emd.sceneName)) { color.w = 1f; @@ -401,6 +402,15 @@ public static void ResetMapColors(GameMap gameMap) { foreach (Transform areaObj in gameMap.transform) { + if (areaObj.name == "Grub Pins" + || areaObj.name == "Dream_Gate_Pin" + || areaObj.name == "Compass Icon" + || areaObj.name == "Shade Pos" + || areaObj.name == "Flame Pins" + || areaObj.name == "Dreamer Pins" + || areaObj.name == "Map Markers" + || areaObj.name == "MMS Custom Pin Group") continue; + foreach (Transform roomObj in areaObj.transform) { ExtraMapData extra = roomObj.GetComponent(); diff --git a/MapModS/Map/WorldMap.cs b/MapModS/Map/WorldMap.cs index e13ba1b..327d50e 100644 --- a/MapModS/Map/WorldMap.cs +++ b/MapModS/Map/WorldMap.cs @@ -5,6 +5,7 @@ using Modding; using System; using System.Collections.Generic; +using System.Threading; using UnityEngine; namespace MapModS.Map @@ -51,13 +52,13 @@ private static void GameManager_SetGameMap(On.GameManager.orig_SetGameMap orig, { orig(self, go_gameMap); - GameMap gameMap = go_gameMap.GetComponent(); + DataLoader.SetUsedPinDefs(); - DataLoader.FindPoolGroups(); + GameMap gameMap = go_gameMap.GetComponent(); Transition.AddExtraComponentsToMap(gameMap); - if (RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None) + if (SettingsUtil.IsTransitionRando()) { goExtraRooms = Transition.CreateExtraMapRooms(gameMap); @@ -156,52 +157,43 @@ public static bool GameManager_UpdateGameMap(On.GameManager.orig_UpdateGameMap o // The main method for updating map objects and pins when opening either World Map or Quick Map public static void UpdateMap(GameMap gameMap, MapZone mapZone) { - try - { - ItemTracker.UpdateObtainedItems(); + ItemTracker.UpdateObtainedItems(); - HashSet transitionPinScenes = new(); + HashSet transitionPinScenes = new(); - FullMap.PurgeMap(); + FullMap.PurgeMap(); - if (RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None - && MapModS.LS.ModEnabled) + if (SettingsUtil.IsTransitionRando() + && MapModS.LS.ModEnabled) + { + if (MapModS.LS.mapMode == MapMode.TransitionRando) { - if (MapModS.LS.mapMode == MapMode.TransitionRando) - { - transitionPinScenes = Transition.SetupMapTransitionMode(gameMap, false); - } - else if (MapModS.LS.mapMode == MapMode.TransitionRandoAlt) - { - transitionPinScenes = Transition.SetupMapTransitionMode(gameMap, true); - } - else - { - Transition.ResetMapColors(gameMap); - gameMap.SetupMap(); - } + transitionPinScenes = Transition.SetupMapTransitionMode(gameMap, false); + } + else if (MapModS.LS.mapMode == MapMode.TransitionRandoAlt) + { + transitionPinScenes = Transition.SetupMapTransitionMode(gameMap, true); } else { Transition.ResetMapColors(gameMap); gameMap.SetupMap(); } - - PinsVanilla.ForceDisablePins(gameMap.gameObject); - - if (goCustomPins == null || !MapModS.LS.ModEnabled) return; - - CustomPins.ResizePins(); - CustomPins.UpdatePins(mapZone, transitionPinScenes); - CustomPins.RefreshGroups(); - CustomPins.RefreshSprites(); } - catch (Exception e) + else { - MapModS.Instance.LogError(e); + Transition.ResetMapColors(gameMap); + gameMap.SetupMap(); } - } - + PinsVanilla.ForceDisablePins(gameMap.gameObject); + + if (goCustomPins == null || !MapModS.LS.ModEnabled) return; + + CustomPins.UpdatePins(mapZone, transitionPinScenes); + CustomPins.ResizePins(); + CustomPins.RefreshGroups(); + CustomPins.SetSprites(); + } } } \ No newline at end of file diff --git a/MapModS/MapModS.cs b/MapModS/MapModS.cs index 4465ffd..c24720d 100644 --- a/MapModS/MapModS.cs +++ b/MapModS/MapModS.cs @@ -14,22 +14,16 @@ public class MapModS : Mod, ILocalSettings, IGlobalSettings _version; + public override string GetVersion() => "2.2.0 refactor"; public override int LoadPriority() => 10; - public static LocalSettings LS { get; set; } = new LocalSettings(); - - public void OnLoadLocal(LocalSettings s) => LS = s; - + public static LocalSettings LS = new(); + public void OnLoadLocal(LocalSettings ls) => LS = ls; public LocalSettings OnSaveLocal() => LS; - public static GlobalSettings GS { get; set; } = new GlobalSettings(); - - public void OnLoadGlobal(GlobalSettings s) => GS = s; - + public static GlobalSettings GS = new(); + public void OnLoadGlobal(GlobalSettings gs) => GS = gs; public GlobalSettings OnSaveGlobal() => GS; public static bool AdditionalMapsInstalled = false; diff --git a/MapModS/MapModS.csproj b/MapModS/MapModS.csproj index f5457d6..1af82cf 100644 --- a/MapModS/MapModS.csproj +++ b/MapModS/MapModS.csproj @@ -56,10 +56,12 @@ - + + + @@ -337,6 +339,9 @@ H:\Programs\Steam\steamapps\common\Hollow Knight\hollow_knight_Data\Managed\Mods\Benchwarp\Benchwarp.dll + + H:\Programs\Steam\steamapps\common\Hollow Knight\hollow_knight_Data\Managed\Mods\ItemChanger\ItemChanger.dll + H:\Programs\Steam\steamapps\common\Hollow Knight\hollow_knight_Data\Managed\MMHOOK_Assembly-CSharp.dll false diff --git a/MapModS/Resources/pins.json b/MapModS/Resources/pins.json index 3724f70..e507c15 100644 --- a/MapModS/Resources/pins.json +++ b/MapModS/Resources/pins.json @@ -10,7 +10,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": -0.2, - "offsetZ": 0.009, + "offsetZ": 0.008, "isShop": true }, "Sly_(Key)": { @@ -24,7 +24,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": 0.2, - "offsetZ": 0.008, + "offsetZ": 0.007, "isShop": true }, "Iselda": { @@ -123,8 +123,7 @@ "offsetX": 0.47, "offsetY": 1.3, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Dreamer" + "isShop": false }, "Monomon": { "name": "Monomon", @@ -138,8 +137,7 @@ "offsetX": 0.19, "offsetY": -0.15, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Dreamer" + "isShop": false }, "Herrah": { "name": "Herrah", @@ -153,8 +151,7 @@ "offsetX": 0.0, "offsetY": 1.3, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Dreamer" + "isShop": false }, "World_Sense": { "name": "World_Sense", @@ -168,7 +165,8 @@ "offsetX": 0.2, "offsetY": -0.2, "offsetZ": 0.001, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mothwing_Cloak": { "name": "Mothwing_Cloak", @@ -350,8 +348,7 @@ "offsetX": -1.5, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "AbyssShriek" + "isShop": false }, "Cyclone_Slash": { "name": "Cyclone_Slash", @@ -365,8 +362,7 @@ "offsetX": 0.24, "offsetY": 0.32, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Nailmaster" + "isShop": false }, "Dash_Slash": { "name": "Dash_Slash", @@ -380,8 +376,7 @@ "offsetX": -1.3, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Nailmaster" + "isShop": false }, "Great_Slash": { "name": "Great_Slash", @@ -395,8 +390,7 @@ "offsetX": 0.22, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Nailmaster" + "isShop": false }, "Focus": { "name": "Focus", @@ -410,7 +404,8 @@ "offsetX": 0.4, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Baldur_Shell": { "name": "Baldur_Shell", @@ -591,7 +586,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": -0.6, - "offsetZ": 0.01, + "offsetZ": 0.009, "isShop": false }, "Joni's_Blessing": { @@ -718,8 +713,7 @@ "offsetX": 0.8, "offsetY": -0.2, "offsetZ": 0.005, - "isShop": false, - "previewGroup": "KingFragment" + "isShop": false }, "Void_Heart": { "name": "Void_Heart", @@ -733,8 +727,7 @@ "offsetX": 1.0, "offsetY": -4.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "VoidHeart" + "isShop": false }, "Dreamshield": { "name": "Dreamshield", @@ -790,8 +783,7 @@ "offsetX": -1.6, "offsetY": -0.6, "offsetZ": 0.002, - "isShop": false, - "previewGroup": "Divine" + "isShop": false }, "Unbreakable_Greed": { "name": "Unbreakable_Greed", @@ -805,8 +797,7 @@ "offsetX": -1.6, "offsetY": -0.2, "offsetZ": 0.003, - "isShop": false, - "previewGroup": "Divine" + "isShop": false }, "Unbreakable_Strength": { "name": "Unbreakable_Strength", @@ -820,8 +811,7 @@ "offsetX": -1.6, "offsetY": 0.2, "offsetZ": 0.004, - "isShop": false, - "previewGroup": "Divine" + "isShop": false }, "City_Crest": { "name": "City_Crest", @@ -947,8 +937,7 @@ "offsetX": -0.6, "offsetY": -0.6, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Godtuner" + "isShop": false }, "Collector's_Map": { "name": "Collector's_Map", @@ -1088,8 +1077,7 @@ "offsetX": 0.1, "offsetY": -0.25, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "FlowerQuest" + "isShop": false }, "Mask_Shard-Bretta": { "name": "Mask_Shard-Bretta", @@ -1159,8 +1147,7 @@ "offsetX": 0.5, "offsetY": 0.8, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "BasinFountain" + "isShop": false }, "Vessel_Fragment-Deepnest": { "name": "Vessel_Fragment-Deepnest", @@ -1230,8 +1217,7 @@ "offsetX": 3.1, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Colosseum" + "isShop": false }, "Charm_Notch-Grimm": { "name": "Charm_Notch-Grimm", @@ -1301,8 +1287,7 @@ "offsetX": 3.5, "offsetY": 0.0, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "Colosseum" + "isShop": false }, "Geo_Chest-False_Knight": { "name": "Geo_Chest-False_Knight", @@ -2310,8 +2295,7 @@ "offsetX": -0.5, "offsetY": 1.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Greenpath": { "name": "Whispering_Root-Greenpath", @@ -2325,8 +2309,7 @@ "offsetX": -1.9, "offsetY": 0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Leg_Eater": { "name": "Whispering_Root-Leg_Eater", @@ -2340,8 +2323,7 @@ "offsetX": 0.3, "offsetY": -0.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Mantis_Village": { "name": "Whispering_Root-Mantis_Village", @@ -2355,8 +2337,7 @@ "offsetX": 0.1, "offsetY": -0.25, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Deepnest": { "name": "Whispering_Root-Deepnest", @@ -2370,8 +2351,7 @@ "offsetX": -1.8, "offsetY": -0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Queens_Gardens": { "name": "Whispering_Root-Queens_Gardens", @@ -2385,8 +2365,7 @@ "offsetX": 0.3, "offsetY": -0.5, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Kingdoms_Edge": { "name": "Whispering_Root-Kingdoms_Edge", @@ -2400,8 +2379,7 @@ "offsetX": 0.2, "offsetY": -2.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Waterways": { "name": "Whispering_Root-Waterways", @@ -2415,8 +2393,7 @@ "offsetX": 0.5, "offsetY": -1.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-City": { "name": "Whispering_Root-City", @@ -2430,8 +2407,7 @@ "offsetX": 0.8, "offsetY": 0.0, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Resting_Grounds": { "name": "Whispering_Root-Resting_Grounds", @@ -2445,8 +2421,7 @@ "offsetX": -0.3, "offsetY": 0.5, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Spirits_Glade": { "name": "Whispering_Root-Spirits_Glade", @@ -2460,8 +2435,7 @@ "offsetX": 1.5, "offsetY": 0.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Crystal_Peak": { "name": "Whispering_Root-Crystal_Peak", @@ -2475,8 +2449,7 @@ "offsetX": 0.2, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Howling_Cliffs": { "name": "Whispering_Root-Howling_Cliffs", @@ -2490,8 +2463,7 @@ "offsetX": 0.5, "offsetY": -1.8, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Ancestral_Mound": { "name": "Whispering_Root-Ancestral_Mound", @@ -2505,8 +2477,7 @@ "offsetX": -0.4, "offsetY": 0.6, "offsetZ": -0.495, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Whispering_Root-Hive": { "name": "Whispering_Root-Hive", @@ -2520,8 +2491,7 @@ "offsetX": 0.5, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "WhisperingRoot" + "isShop": false }, "Boss_Essence-Elder_Hu": { "name": "Boss_Essence-Elder_Hu", @@ -2689,8 +2659,7 @@ "offsetX": 0.68, "offsetY": -0.6, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "GreyPrinceZote" + "isShop": false }, "Grub-Crossroads_Acid": { "name": "Grub-Crossroads_Acid", @@ -3404,8 +3373,7 @@ "offsetX": 0.1, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Greenpath_Map": { "name": "Greenpath_Map", @@ -3419,8 +3387,7 @@ "offsetX": 1.45, "offsetY": -0.3, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Fog_Canyon_Map": { "name": "Fog_Canyon_Map", @@ -3434,8 +3401,7 @@ "offsetX": -0.3, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Fungal_Wastes_Map": { "name": "Fungal_Wastes_Map", @@ -3449,8 +3415,7 @@ "offsetX": -1.55, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Deepnest_Map-Upper": { "name": "Deepnest_Map-Upper", @@ -3464,8 +3429,7 @@ "offsetX": -0.45, "offsetY": -0.8, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Deepnest_Map-Right": { "name": "Deepnest_Map-Right", @@ -3479,8 +3443,7 @@ "offsetX": -0.7, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Ancient_Basin_Map": { "name": "Ancient_Basin_Map", @@ -3494,8 +3457,7 @@ "offsetX": 0.5, "offsetY": 0.4, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Kingdom's_Edge_Map": { "name": "Kingdom's_Edge_Map", @@ -3509,8 +3471,7 @@ "offsetX": -0.7, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "City_of_Tears_Map": { "name": "City_of_Tears_Map", @@ -3524,8 +3485,7 @@ "offsetX": 0.2, "offsetY": -0.375, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Royal_Waterways_Map": { "name": "Royal_Waterways_Map", @@ -3539,8 +3499,7 @@ "offsetX": -0.2, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Howling_Cliffs_Map": { "name": "Howling_Cliffs_Map", @@ -3554,8 +3513,7 @@ "offsetX": 1.8, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Crystal_Peak_Map": { "name": "Crystal_Peak_Map", @@ -3569,8 +3527,7 @@ "offsetX": 1.35, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Queen's_Gardens_Map": { "name": "Queen's_Gardens_Map", @@ -3584,8 +3541,7 @@ "offsetX": 0.4, "offsetY": 0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Resting_Grounds_Map": { "name": "Resting_Grounds_Map", @@ -3599,8 +3555,7 @@ "offsetX": -0.8, "offsetY": -0.05, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Map" + "isShop": false }, "Dirtmouth_Stag": { "name": "Dirtmouth_Stag", @@ -3614,8 +3569,7 @@ "offsetX": 0.4, "offsetY": -0.6, "offsetZ": 0.01, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Crossroads_Stag": { "name": "Crossroads_Stag", @@ -3629,8 +3583,7 @@ "offsetX": -0.3, "offsetY": 0.05, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Greenpath_Stag": { "name": "Greenpath_Stag", @@ -3644,8 +3597,7 @@ "offsetX": -0.15, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Queen's_Station_Stag": { "name": "Queen's_Station_Stag", @@ -3659,8 +3611,7 @@ "offsetX": -0.2, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Queen's_Gardens_Stag": { "name": "Queen's_Gardens_Stag", @@ -3674,8 +3625,7 @@ "offsetX": 1.68, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "City_Storerooms_Stag": { "name": "City_Storerooms_Stag", @@ -3689,8 +3639,7 @@ "offsetX": 0.2, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "King's_Station_Stag": { "name": "King's_Station_Stag", @@ -3704,8 +3653,7 @@ "offsetX": 0.3, "offsetY": -0.3, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Resting_Grounds_Stag": { "name": "Resting_Grounds_Stag", @@ -3719,8 +3667,7 @@ "offsetX": 0.15, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Distant_Village_Stag": { "name": "Distant_Village_Stag", @@ -3734,8 +3681,7 @@ "offsetX": 0.6, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Hidden_Station_Stag": { "name": "Hidden_Station_Stag", @@ -3749,8 +3695,7 @@ "offsetX": 0.1, "offsetY": 0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Stag_Nest_Stag": { "name": "Stag_Nest_Stag", @@ -3764,8 +3709,7 @@ "offsetX": -3.3, "offsetY": 1.5, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "Stag" + "isShop": false }, "Lifeblood_Cocoon-King's_Pass": { "name": "Lifeblood_Cocoon-King's_Pass", @@ -4116,7 +4060,7 @@ "offsetY": -1.26, "offsetZ": 0.0, "isShop": false, - "previewGroup": "Stag" + "randoOnly": true }, "Split_Mothwing_Cloak": { "name": "Split_Mothwing_Cloak", @@ -4130,7 +4074,8 @@ "offsetX": -0.25, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Left_Mantis_Claw": { "name": "Left_Mantis_Claw", @@ -4144,7 +4089,8 @@ "offsetX": -1.8, "offsetY": -0.1, "offsetZ": 0.001, - "isShop": false + "isShop": false, + "randoOnly": true }, "Right_Mantis_Claw": { "name": "Right_Mantis_Claw", @@ -4158,7 +4104,8 @@ "offsetX": -1.4, "offsetY": -0.1, "offsetZ": 0.002, - "isShop": false + "isShop": false, + "randoOnly": true }, "Split_Crystal_Heart": { "name": "Split_Crystal_Heart", @@ -4172,7 +4119,8 @@ "offsetX": 1.6, "offsetY": -0.55, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Geo_Rock-Broken_Elevator_1": { "name": "Geo_Rock-Broken_Elevator_1", @@ -8022,8 +7970,7 @@ "offsetX": 0.0, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Pleasure_House": { "name": "Lore_Tablet-Pleasure_House", @@ -8037,8 +7984,7 @@ "offsetX": 0.4, "offsetY": -1.0, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Sanctum_Entrance": { "name": "Lore_Tablet-Sanctum_Entrance", @@ -8052,8 +7998,7 @@ "offsetX": 0.2, "offsetY": 0.6, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Sanctum_Past_Soul_Master": { "name": "Lore_Tablet-Sanctum_Past_Soul_Master", @@ -8067,8 +8012,7 @@ "offsetX": 0.2, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Watcher's_Spire": { "name": "Lore_Tablet-Watcher's_Spire", @@ -8082,8 +8026,7 @@ "offsetX": 0.0, "offsetY": 0.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Archives_Upper": { "name": "Lore_Tablet-Archives_Upper", @@ -8097,8 +8040,7 @@ "offsetX": 0.19, "offsetY": 0.25, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Archives_Left": { "name": "Lore_Tablet-Archives_Left", @@ -8112,8 +8054,7 @@ "offsetX": -0.21, "offsetY": 0.25, "offsetZ": 0.002, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Archives_Right": { "name": "Lore_Tablet-Archives_Right", @@ -8127,8 +8068,7 @@ "offsetX": 0.59, "offsetY": 0.25, "offsetZ": 0.002, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Pilgrim's_Way_1": { "name": "Lore_Tablet-Pilgrim's_Way_1", @@ -8142,8 +8082,7 @@ "offsetX": 1.4, "offsetY": 0.0, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Pilgrim's_Way_2": { "name": "Lore_Tablet-Pilgrim's_Way_2", @@ -8157,8 +8096,7 @@ "offsetX": -1.3, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Mantis_Outskirts": { "name": "Lore_Tablet-Mantis_Outskirts", @@ -8172,8 +8110,7 @@ "offsetX": 1.7, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Mantis_Village": { "name": "Lore_Tablet-Mantis_Village", @@ -8187,8 +8124,7 @@ "offsetX": -1.0, "offsetY": 0.3, "offsetZ": -0.97, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_Upper_Hidden": { "name": "Lore_Tablet-Greenpath_Upper_Hidden", @@ -8202,8 +8138,7 @@ "offsetX": 0.7, "offsetY": 0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_Below_Toll": { "name": "Lore_Tablet-Greenpath_Below_Toll", @@ -8217,8 +8152,7 @@ "offsetX": -0.3, "offsetY": -0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_Lifeblood": { "name": "Lore_Tablet-Greenpath_Lifeblood", @@ -8232,8 +8166,7 @@ "offsetX": -0.5, "offsetY": 0.1, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_Stag": { "name": "Lore_Tablet-Greenpath_Stag", @@ -8247,8 +8180,7 @@ "offsetX": 0.9, "offsetY": 0.4, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_QG": { "name": "Lore_Tablet-Greenpath_QG", @@ -8262,8 +8194,7 @@ "offsetX": -1.3, "offsetY": -0.2, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Greenpath_Lower_Hidden": { "name": "Lore_Tablet-Greenpath_Lower_Hidden", @@ -8277,8 +8208,7 @@ "offsetX": 1.2, "offsetY": -0.14, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Dung_Defender": { "name": "Lore_Tablet-Dung_Defender", @@ -8292,8 +8222,7 @@ "offsetX": 0.9, "offsetY": -0.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Spore_Shroom": { "name": "Lore_Tablet-Spore_Shroom", @@ -8307,8 +8236,7 @@ "offsetX": 0.6, "offsetY": 0.3, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Fungal_Wastes_Hidden": { "name": "Lore_Tablet-Fungal_Wastes_Hidden", @@ -8322,8 +8250,7 @@ "offsetX": -0.6, "offsetY": 0.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres": { "name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", @@ -8337,8 +8264,7 @@ "offsetX": 0.2, "offsetY": -0.6, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Fungal_Core": { "name": "Lore_Tablet-Fungal_Core", @@ -8352,8 +8278,7 @@ "offsetX": 0.4, "offsetY": 0.6, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Ancient_Basin": { "name": "Lore_Tablet-Ancient_Basin", @@ -8367,8 +8292,7 @@ "offsetX": 0.3, "offsetY": 2.7, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-King's_Pass_Focus": { "name": "Lore_Tablet-King's_Pass_Focus", @@ -8382,8 +8306,7 @@ "offsetX": 0.0, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-King's_Pass_Fury": { "name": "Lore_Tablet-King's_Pass_Fury", @@ -8397,8 +8320,7 @@ "offsetX": 1.7, "offsetY": -0.8, "offsetZ": 0.002, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-King's_Pass_Exit": { "name": "Lore_Tablet-King's_Pass_Exit", @@ -8412,8 +8334,7 @@ "offsetX": 1.5, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-World_Sense": { "name": "Lore_Tablet-World_Sense", @@ -8427,8 +8348,7 @@ "offsetX": -0.2, "offsetY": -0.2, "offsetZ": 0.001, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Howling_Cliffs": { "name": "Lore_Tablet-Howling_Cliffs", @@ -8442,8 +8362,7 @@ "offsetX": 1.8, "offsetY": -1.1, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Kingdom's_Edge": { "name": "Lore_Tablet-Kingdom's_Edge", @@ -8457,8 +8376,7 @@ "offsetX": 1.2, "offsetY": -0.5, "offsetZ": 0.0, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Palace_Workshop": { "name": "Lore_Tablet-Palace_Workshop", @@ -8472,8 +8390,7 @@ "offsetX": 1.2, "offsetY": -0.2, "offsetZ": 0.006, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Palace_Throne": { "name": "Lore_Tablet-Palace_Throne", @@ -8487,8 +8404,7 @@ "offsetX": 1.6, "offsetY": -0.2, "offsetZ": 0.007, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Lore_Tablet-Path_of_Pain_Entrance": { "name": "Lore_Tablet-Path_of_Pain_Entrance", @@ -8502,8 +8418,7 @@ "offsetX": 1.4, "offsetY": 0.3, "offsetZ": 0.007, - "isShop": false, - "previewGroup": "LoreTablet" + "isShop": false }, "Mr_Mushroom-Fungal_Wastes": { "name": "Mr_Mushroom-Fungal_Wastes", @@ -8517,7 +8432,8 @@ "offsetX": -1.85, "offsetY": 0.2, "offsetZ": 0.001, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-Kingdom's_Edge": { "name": "Mr_Mushroom-Kingdom's_Edge", @@ -8531,7 +8447,8 @@ "offsetX": -0.9, "offsetY": 0.8, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-Deepnest": { "name": "Mr_Mushroom-Deepnest", @@ -8545,7 +8462,8 @@ "offsetX": -1.3, "offsetY": -0.2, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-Howling_Cliffs": { "name": "Mr_Mushroom-Howling_Cliffs", @@ -8559,7 +8477,8 @@ "offsetX": 0.54, "offsetY": 0.32, "offsetZ": 0.001, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-Ancient_Basin": { "name": "Mr_Mushroom-Ancient_Basin", @@ -8573,7 +8492,8 @@ "offsetX": 0.8, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-Fog_Canyon": { "name": "Mr_Mushroom-Fog_Canyon", @@ -8587,7 +8507,8 @@ "offsetX": -0.6, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true }, "Mr_Mushroom-King's_Pass": { "name": "Mr_Mushroom-King's_Pass", @@ -8601,6 +8522,7 @@ "offsetX": -1.4, "offsetY": -0.7, "offsetZ": 0.0, - "isShop": false + "isShop": false, + "randoOnly": true } } \ No newline at end of file diff --git a/MapModS/Settings/LocalSettings.cs b/MapModS/Settings/LocalSettings.cs index a2a9333..6ae0c7f 100644 --- a/MapModS/Settings/LocalSettings.cs +++ b/MapModS/Settings/LocalSettings.cs @@ -68,7 +68,7 @@ public void ToggleFullMap() break; case MapMode.PinsOverMap: - if (RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None) + if (SettingsUtil.IsTransitionRando()) { mapMode = MapMode.TransitionRando; } @@ -79,8 +79,7 @@ public void ToggleFullMap() break; case MapMode.TransitionRando: - if (RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode == RandomizerMod.Settings.TransitionSettings.TransitionMode.MapAreaRandomizer - || RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode == RandomizerMod.Settings.TransitionSettings.TransitionMode.FullAreaRandomizer) + if (SettingsUtil.IsAreaRando()) { mapMode = MapMode.TransitionRandoAlt; } diff --git a/MapModS/Settings/SettingsUtil.cs b/MapModS/Settings/SettingsUtil.cs index aaff92d..952652b 100644 --- a/MapModS/Settings/SettingsUtil.cs +++ b/MapModS/Settings/SettingsUtil.cs @@ -55,27 +55,15 @@ public static bool IsFSMMapState(string name) }; } - public static bool GetPreviewSetting(PreviewGroup previewGroup) + public static bool IsTransitionRando() { - return previewGroup switch - { - PreviewGroup.Colosseum => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.ColosseumPreview, - PreviewGroup.KingFragment => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.KingFragmentPreview, - PreviewGroup.FlowerQuest => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.FlowerQuestPreview, - PreviewGroup.GreyPrinceZote => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.GreyPrinceZotePreview, - PreviewGroup.WhisperingRoot => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.WhisperingRootPreview, - PreviewGroup.Dreamer => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.DreamerPreview, - PreviewGroup.AbyssShriek => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.AbyssShriekPreview, - PreviewGroup.VoidHeart => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.VoidHeartPreview, - PreviewGroup.Godtuner => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.GodtunerPreview, - PreviewGroup.LoreTablet => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.LoreTabletPreview, - PreviewGroup.BasinFountain => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.BasinFountainPreview, - PreviewGroup.Nailmaster => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.NailmasterPreview, - PreviewGroup.Stag => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.StagPreview, - PreviewGroup.Map => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.MapPreview, - PreviewGroup.Divine => RandomizerMod.RandomizerMod.RS.GenerationSettings.LongLocationSettings.DivinePreview, - _ => false, - }; + return RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None; + } + + public static bool IsAreaRando() + { + return RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode == RandomizerMod.Settings.TransitionSettings.TransitionMode.MapAreaRandomizer + || RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode == RandomizerMod.Settings.TransitionSettings.TransitionMode.FullAreaRandomizer; } } } \ No newline at end of file diff --git a/MapModS/UI/MapText.cs b/MapModS/UI/MapText.cs index 305cffc..af0eb2a 100644 --- a/MapModS/UI/MapText.cs +++ b/MapModS/UI/MapText.cs @@ -63,7 +63,7 @@ public static void RebuildText() public static void SetTexts() { - if (GameManager.instance.gameMap == null) return; + if (GameManager.instance.gameMap == null || WorldMap.CustomPins == null) return; _mapDisplayPanel.SetActive(!LockToggleEnable && MapModS.LS.ModEnabled, false); _refreshDisplayPanel.SetActive(LockToggleEnable, false); diff --git a/MapModS/UI/PauseMenu.cs b/MapModS/UI/PauseMenu.cs index 76e0ef1..1329b13 100644 --- a/MapModS/UI/PauseMenu.cs +++ b/MapModS/UI/PauseMenu.cs @@ -255,6 +255,8 @@ public static void RandomizedClicked(string buttonName) private static void UpdateRandomized() { + if (WorldMap.CustomPins == null) return; + if (!WorldMap.CustomPins.RandomizedGroups.Any(MapModS.LS.GetOnFromGroup)) { _mapControlPanel.GetButton("Randomized").SetTextColor(Color.white); @@ -285,6 +287,8 @@ public static void OthersClicked(string buttonName) private static void UpdateOthers() { + if (WorldMap.CustomPins == null) return; + if (!WorldMap.CustomPins.OthersGroups.Any(MapModS.LS.GetOnFromGroup)) { _mapControlPanel.GetButton("Others").SetTextColor(Color.white); diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 4eea90d..010833d 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -42,7 +42,7 @@ public static void ShowWorldMap() if (Canvas == null || _instructionPanel == null) return; bool isActive = !LockToggleEnable && MapModS.LS.ModEnabled - && RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None + && SettingsUtil.IsTransitionRando() && (MapModS.LS.mapMode == MapMode.TransitionRando || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); @@ -95,7 +95,7 @@ public static void SetTexts() || _instructionPanel == null) return; bool isActive = !LockToggleEnable && MapModS.LS.ModEnabled - && RandomizerMod.RandomizerMod.RS.GenerationSettings.TransitionSettings.Mode != RandomizerMod.Settings.TransitionSettings.TransitionMode.None + && SettingsUtil.IsTransitionRando() && (MapModS.LS.mapMode == MapMode.TransitionRando || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); From ac5f35b5e73be7b3f4f401f52e90c0164822da80 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sat, 5 Feb 2022 22:56:50 +1100 Subject: [PATCH 02/15] Add lever pins --- MapModS/Data/DataLoader.cs | 50 +- MapModS/Data/JsonUtil.cs | 10 + MapModS/Data/PinDef.cs | 1 - MapModS/Map/PinsCustom.cs | 34 +- MapModS/Map/SpriteManager.cs | 1 + MapModS/MapModS.cs | 7 +- MapModS/MapModS.csproj | 16 + MapModS/Resources/Pins/pinLever.png | Bin 0 -> 7791 bytes MapModS/Resources/Pins/pinLeverGreen.png | Bin 0 -> 8657 bytes MapModS/Resources/Pins/pinLeverRed.png | Bin 0 -> 8756 bytes MapModS/Resources/Pins/pinUnknownCyan.png | Bin 0 -> 7376 bytes .../Pins/pinUnknown_LifebloodCyan.png | Bin 0 -> 7745 bytes .../Pins/pinUnknown_LifebloodInvCyan.png | Bin 0 -> 7516 bytes .../Resources/Pins/pinUnknown_TotemCyan.png | Bin 0 -> 9674 bytes .../Pins/pinUnknown_TotemInvCyan.png | Bin 0 -> 9154 bytes MapModS/Resources/pins.json | 2421 ++++++++--------- MapModS/Resources/pinsAM.json | 56 + MapModS/UI/InputListener.cs | 15 +- 18 files changed, 1337 insertions(+), 1274 deletions(-) create mode 100644 MapModS/Resources/Pins/pinLever.png create mode 100644 MapModS/Resources/Pins/pinLeverGreen.png create mode 100644 MapModS/Resources/Pins/pinLeverRed.png create mode 100644 MapModS/Resources/Pins/pinUnknownCyan.png create mode 100644 MapModS/Resources/Pins/pinUnknown_LifebloodCyan.png create mode 100644 MapModS/Resources/Pins/pinUnknown_LifebloodInvCyan.png create mode 100644 MapModS/Resources/Pins/pinUnknown_TotemCyan.png create mode 100644 MapModS/Resources/Pins/pinUnknown_TotemInvCyan.png diff --git a/MapModS/Data/DataLoader.cs b/MapModS/Data/DataLoader.cs index e22fdcf..2add7a8 100644 --- a/MapModS/Data/DataLoader.cs +++ b/MapModS/Data/DataLoader.cs @@ -14,6 +14,20 @@ public static class DataLoader private static Dictionary _allPinsAM; private static Dictionary _usedPins = new(); + //public static Dictionary newPins = new(); + + private static readonly HashSet shopLocations = new() + { + "Sly", + "Sly_(Key)", + "Iselda", + "Salubra", + "Leg_Eater", + "Grubfather", + "Seer", + "Egg_Shop" + }; + public static PinDef[] GetPinArray() { return _allPins.Values.ToArray(); @@ -31,9 +45,7 @@ public static PinDef[] GetUsedPinArray() public static PinDef GetUsedPinDef(string locationName) { - PinDef pinDef; - - if (_usedPins.TryGetValue(locationName, out pinDef)) + if (_usedPins.TryGetValue(locationName, out PinDef pinDef)) { return pinDef; } @@ -44,6 +56,8 @@ public static PinDef GetUsedPinDef(string locationName) // Uses RandomizerData to get the PoolGroup from an item name public static PoolGroup GetPoolGroup(string cleanItemName) { + if (shopLocations.Contains(cleanItemName)) return PoolGroup.Shop; + switch (cleanItemName) { case "Dreamer": @@ -190,22 +204,19 @@ public static void SetUsedPinDefs() if (!items.Any()) continue; string locationName = placement.Value.Items.Where(x => !x.IsObtained()).First().RandoLocationName(); - PinDef pinDef; - if (_allPins.TryGetValue(locationName, out pinDef)) + if (MapModS.RandomizableLeversInstalled + && locationName == "Dirtmouth_Stag" || locationName == "Resting_Grounds_Stag") + { + continue; + } + + if (_allPins.TryGetValue(locationName, out PinDef pinDef)) { pinDef.randoItems = items; pinDef.canPreview = placement.Value.CanPreview(); pinDef.pinLocationState = PinLocationState.UncheckedUnreachable; - - if (pinDef.isShop) - { - pinDef.locationPoolGroup = PoolGroup.Shop; - } - else - { - pinDef.locationPoolGroup = GetLocationPoolGroup(pinDef.name); - } + pinDef.locationPoolGroup = GetLocationPoolGroup(pinDef.name); _usedPins.Add(locationName, pinDef); } @@ -229,9 +240,7 @@ public static void SetUsedPinDefs() { foreach (PinDef pinDefAM in GetPinAMArray()) { - PinDef pinDef; - - if (_usedPins.TryGetValue(pinDefAM.name, out pinDef)) + if (_usedPins.TryGetValue(pinDefAM.name, out PinDef pinDef)) { pinDef.pinScene = pinDefAM.pinScene; pinDef.mapZone = pinDefAM.mapZone; @@ -247,5 +256,12 @@ public static void Load() _allPins = JsonUtil.Deserialize>("MapModS.Resources.pins.json"); _allPinsAM = JsonUtil.Deserialize>("MapModS.Resources.pinsAM.json"); } + + // For debugging pins + //public static void LoadNewPinDef() + //{ + // newPins.Clear(); + // newPins = JsonUtil.DeserializeFromExternalFile>("newPins.json"); + //} } } \ No newline at end of file diff --git a/MapModS/Data/JsonUtil.cs b/MapModS/Data/JsonUtil.cs index 638f3ac..071d0e8 100644 --- a/MapModS/Data/JsonUtil.cs +++ b/MapModS/Data/JsonUtil.cs @@ -1,6 +1,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Converters; using System.IO; +using System.Reflection; // Code taken from homothety: https://github.com/homothetyhk/RandomizerMod/ @@ -17,6 +18,15 @@ public static T Deserialize(string embeddedResourcePath) return _js.Deserialize(jtr); } + // For debugging pins + //public static T DeserializeFromExternalFile(string externalFile) + //{ + // string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + // using StreamReader sr = new(Path.Combine(assemblyFolder, externalFile)); + // using JsonTextReader jtr = new(sr); + // return _js.Deserialize(jtr); + //} + public static T DeserializeString(string json) { using StringReader sr = new(json); diff --git a/MapModS/Data/PinDef.cs b/MapModS/Data/PinDef.cs index 324e7f4..b5ddd5f 100644 --- a/MapModS/Data/PinDef.cs +++ b/MapModS/Data/PinDef.cs @@ -28,7 +28,6 @@ public class PinDef public float offsetY; public float offsetZ; - public bool isShop = false; public bool randoOnly = false; // These are assigned during FindSpoilerPools, unusued if it's a Shop diff --git a/MapModS/Map/PinsCustom.cs b/MapModS/Map/PinsCustom.cs index ca2eaba..6b9921e 100644 --- a/MapModS/Map/PinsCustom.cs +++ b/MapModS/Map/PinsCustom.cs @@ -55,15 +55,7 @@ private void MakePin(PinDef pinDef, GameMap gameMap) // Set pin transform (by pool) AssignGroup(pin); - - string roomName = pinDef.pinScene ?? pinDef.sceneName; - - Vector3 vec = GetRoomPos(roomName, gameMap); - vec.Scale(new Vector3(1.46f, 1.46f, 1)); - - vec += new Vector3(pinDef.offsetX, pinDef.offsetY, pinDef.offsetZ); - - goPin.transform.localPosition = new Vector3(vec.x, vec.y, vec.z - 0.01f); + SetPinPosition(pinDef, goPin, gameMap); } private void AssignGroup(PinAnimatedSprite pin) @@ -89,6 +81,30 @@ private void AssignGroup(PinAnimatedSprite pin) pin.gameObject.transform.SetParent(_Groups[poolGroup].transform); } + private void SetPinPosition(PinDef pinDef, GameObject goPin, GameMap gameMap) + { + string roomName = pinDef.pinScene ?? pinDef.sceneName; + + Vector3 vec = GetRoomPos(roomName, gameMap); + vec.Scale(new Vector3(1.46f, 1.46f, 1)); + + vec += new Vector3(pinDef.offsetX, pinDef.offsetY, pinDef.offsetZ); + + goPin.transform.localPosition = new Vector3(vec.x, vec.y, vec.z - 0.01f); + } + + // For debugging pins + //public void ReadjustPinPostiions() + //{ + // foreach (PinAnimatedSprite pin in _pins) + // { + // if (DataLoader.newPins.TryGetValue(pin.pinDef.name, out PinDef newPinDef)) + // { + // SetPinPosition(newPinDef, pin.gameObject, GameManager.instance.gameMap.GetComponent()); + // } + // } + //} + private Vector3 GetRoomPos(string roomName, GameMap gameMap) { foreach (Transform areaObj in gameMap.transform) diff --git a/MapModS/Map/SpriteManager.cs b/MapModS/Map/SpriteManager.cs index f847c5d..e88f9c1 100644 --- a/MapModS/Map/SpriteManager.cs +++ b/MapModS/Map/SpriteManager.cs @@ -77,6 +77,7 @@ public static Sprite GetSpriteFromPool(PoolGroup pool, PinBorderColor color) PoolGroup.SoulTotems => "pinTotem", PoolGroup.LoreTablets => "pinLore", PoolGroup.Shop => "pinShop", + PoolGroup.Levers => "pinLever", _ => "pinUnknown", }; break; diff --git a/MapModS/MapModS.cs b/MapModS/MapModS.cs index c24720d..403ad08 100644 --- a/MapModS/MapModS.cs +++ b/MapModS/MapModS.cs @@ -27,6 +27,7 @@ public class MapModS : Mod, ILocalSettings, IGlobalSettings GS; public static bool AdditionalMapsInstalled = false; + public static bool RandomizableLeversInstalled = false; public override void Initialize() { @@ -41,11 +42,7 @@ public override void Initialize() } AdditionalMapsInstalled = ModHooks.GetMod("Additional Maps") is Mod; - - if (AdditionalMapsInstalled) - { - Instance.Log("Additional Maps detected"); - } + RandomizableLeversInstalled = ModHooks.GetMod("RandomizableLevers") is Mod; try { diff --git a/MapModS/MapModS.csproj b/MapModS/MapModS.csproj index 1af82cf..9e1be18 100644 --- a/MapModS/MapModS.csproj +++ b/MapModS/MapModS.csproj @@ -120,6 +120,9 @@ + + + @@ -181,6 +184,7 @@ + @@ -201,16 +205,20 @@ + + + + @@ -262,6 +270,9 @@ + + + @@ -300,6 +311,7 @@ + @@ -315,14 +327,18 @@ + + + + diff --git a/MapModS/Resources/Pins/pinLever.png b/MapModS/Resources/Pins/pinLever.png new file mode 100644 index 0000000000000000000000000000000000000000..b5a63a14a3aee9a372111b6bfe0852a9402fe2ff GIT binary patch literal 7791 zcmV-#9+2UQP)002t}1^@s6I8J)%00009a7bBm000ie z000ie0hKEb8vpBfQldx6Noq{ zPeoB&#^<=b8OL#4=J}k#r_UKjN5{btTo4DrU;xD>q9TeQi$FpMggpsaNJu(Kb$4~w z`=jc1EeV^#oZs)}cI{PP&OLSRx#yOPf4{iSV4ZV0a*}gtKmT^lT-v+w^K~7UV_7na z5cf%rwSo#8wT21Gy8XPuJKwM*%Qf7XkgTx8`jf!|6H*u*jSPmMsW?6U6ig`qE@kM<2jLY1xvyX%7YzLg7I5MhoxZ$WChpWeYt^V<9Ca(+={7fDiA=2 z6~KfgifF1oOMWgaVSilcP$Z+4(P4=qp+gcyLI)&(IpH})Xp8_RKnd+?!469l0n4gs zKN;Fjg(Z#?w#VAc;xM(U1CVUluPcD;Nf!Hd22fCJ_aS>^o3U3EMcBYv`>x5pd!#H740umkcBszq=ZBdTwq`YF=JWXCO69 z*q5J|cY(33qj(Dd#{rhDS{+6QRkQ5<6}8J&uBbzR(#3~eP8fAOIxsgTD2(44`ak`Q zft{^pSzq}Al-IbaI7^8^ha`#&FmuMt5i@7Z%*daS-yKLj*+t|wE9`3&zf!S$WkKbN z4+|<+e7JH8ssd1L6o5u_NPeSMj5>tgR3n(S49*bP*}xK@+?YmO*dQ4lQYWMCh@n|M z2VBwPzkhw(sQelEU4abeNec=J2@_^TK|yq#?6xaP-i+Mn?^)O7qxco;=8D(fSW*7^ z;um*r-M&!(YeENAZPWpy7R@tk{5~sSX9`Q$453NZH(UZ9ImP&$31rH0x)131#w!cP zYzYR*{irw!)(gjabDA%O{!k zzPYgxZ-V*ayy~){{NbV7t%uj&eEVHrEnB&A69Sm3)S*LaG)e;|tRQw!Ck1vUu$-V` z(cf}bSg{yd_4dLyM(5{F87&SjSoJ9{zFA;9p<6TG-bbsd+t?%l3v^&sSOCF@!_RD0 zxMJLJo__Rh0A!EMvVww5*WY@p4op=JqC*nE>W$w5mT)ajsa>aoW$nAgp+oBcq+r5I z!y_loyf%0AJFhPq1#|<2f>obVu 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 B5*z>k literal 0 HcmV?d00001 diff --git a/MapModS/Resources/Pins/pinLeverGreen.png b/MapModS/Resources/Pins/pinLeverGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..6a273ff3b6e3a99bb614be37522dd2063a394974 GIT binary patch literal 8657 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 Hu0mjfXvM5O literal 0 HcmV?d00001 diff --git a/MapModS/Resources/Pins/pinUnknown_LifebloodInvCyan.png b/MapModS/Resources/Pins/pinUnknown_LifebloodInvCyan.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b988208f08a863ffa2d8dcde9d42e600cfb463 GIT binary patch literal 7516 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 M07*qoM6N<$f-K_lkN^Mx literal 0 HcmV?d00001 diff --git a/MapModS/Resources/Pins/pinUnknown_TotemInvCyan.png b/MapModS/Resources/Pins/pinUnknown_TotemInvCyan.png new file mode 100644 index 0000000000000000000000000000000000000000..38fa7a2087eb2fb7bb27224d540c9045e1584ae5 GIT binary patch literal 9154 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

{n zk1#tsixAlgy5mzH1SuJjQg=T6ufIZ;N4k^)w45Ion>sf%AvTg(1v?f#`C>C;n#BEj z68A+C_mi`B?b(0$qwhUORviYLr?76_ks2eUjuTdvmWkqoO0|LKW)tuA`ovKtn{3OX zTC1Qe3(K|$!!UE}Xq&UF?Tm==qkQoZAy1kg@O=0q{3!GL`+<+auw}~@v*ozsJExs~ zMol>$2M!$M;K4&k0ge*f{CmF!^#*NKGuuD&>tB9u_mcC9aq{tmCmt`W_w57?X%x}xbh5BhrA4bbN*Z*r zrGzx4QgN`9K<r6w%9Nm$W2pXN2SQNmwN(uEDUE7kJp*$BJ6SvTedB!f4nuJ#98` zJzl*2wAXpv-hh4k_OZCIh_WmkOL5b0{R%h^juc$-o4;}AckcSmkAT^{F66byP%he| zl5dX%R@pUO+?=v@`-T9-%)Z6mjX&Dmd-}S!zD}IDjo!6aQ2XY$GJlj#aUGXdt4Xz5 zC)EODQj$2rcI-^cHwK+1`28Nza!5(>-5vr--84~HgeG7QySZE6#*5~8ViRMGL8ltm zt+3^Ulg0GbZ8U2&2EI?X+a(M`ZaZ-+Kl;SagX`i*!8O14A9sA~wwoR&+w`7T1L0J;psbrf|g`l(CAqrzEjXKIwBv!(#-pd~S0?#JT@NjTH55@N} zt7b@4%=G4MjEqd6>t#o@z;(LslOvj+)+knfywJiO;>s5fvd$@PEmXSd${ zz{5{O!Sa4!Up}XOWcv|Uy)0xbSP;lj8uLpPyr+J2(1d5$ueTEcOm?9hQ3VZ30a<-GT$bKs)x>a(pYGi5OQ^1&08=oHi{9k_j z&_x$`Bnk98@NfSejRzhg%$YyJ8{iXH=G^@cVy^`|Ud^ zsJrIX5mtRwN0L&40x9I`5+kL^^1f1yaw^mvllh?#2q6)k$J6JZ0~eeF7n}_!MupTD z|JLu`a{FEPJRJ_^59O0D_URNZn8IL=SW8i_8CWpPjV}Oe=kFK;#@))~C;-ZAGKQ(C zFaD2@Eu4FHeV}y)SP0yC58Qn(;}1Q;{QL{qOWjuX(vp8%Se4wDJ{)4V8*;{(XYlk{ zXTn);fE(YEMQD`DHbFkTYvu5#KK)JLh=I9iFuyOKe6j6!z66vZlT|MZs8<43IZ?M@ z$?~qTM&1_La}BahQR7!#an1CT@BiQjl5;Qg=BFEqG|hL~r*QinSsy!gWMfamwPIDd z!(Oks7E%q@Tt)Hu0yl_3N+xza+&T42U;6T0_uREeX5SThQvuEbL$_1mBq-!m?$#_QWbs zuNthEF6ErA0x-!CtU5)Ccn+51G{?aRKnh_d!z6YnTMB7d-qj(H&d@O?FfN`C7$fu? z2oojU;^RF9Wi62b(aEnD9t1-MR^eAK$}y;6OLPVxcIjC&lySk0O>SB`uw=&wPRZ z556Y3QCTn7%6)Gn^H_IJnT-kn%GZ9X0IeU)KWBMm+g<;ezkvIH0hPDoQ)wGnssI20 M07*qoM6N<$f+2#brT_o{ literal 0 HcmV?d00001 diff --git a/MapModS/Resources/pins.json b/MapModS/Resources/pins.json index e507c15..0834075 100644 --- a/MapModS/Resources/pins.json +++ b/MapModS/Resources/pins.json @@ -10,8 +10,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": -0.2, - "offsetZ": 0.008, - "isShop": true + "offsetZ": 0.008 }, "Sly_(Key)": { "name": "Sly_(Key)", @@ -24,8 +23,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": 0.2, - "offsetZ": 0.007, - "isShop": true + "offsetZ": 0.007 }, "Iselda": { "name": "Iselda", @@ -38,8 +36,7 @@ "mapZone": "TOWN", "offsetX": 0.4, "offsetY": -0.2, - "offsetZ": 0.009, - "isShop": true + "offsetZ": 0.008 }, "Salubra": { "name": "Salubra", @@ -52,8 +49,7 @@ "mapZone": "CROSSROADS", "offsetX": 1.35, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": true + "offsetZ": 0.0 }, "Leg_Eater": { "name": "Leg_Eater", @@ -66,8 +62,7 @@ "mapZone": "WASTES", "offsetX": 0.5, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": true + "offsetZ": 0.0 }, "Grubfather": { "name": "Grubfather", @@ -80,8 +75,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": true + "offsetZ": 0.0 }, "Seer": { "name": "Seer", @@ -94,8 +88,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.9, "offsetY": 0.9, - "offsetZ": 0.0, - "isShop": true + "offsetZ": 0.0 }, "Egg_Shop": { "name": "Egg_Shop", @@ -108,8 +101,7 @@ "mapZone": "TOWN", "offsetX": 2.7, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": true + "offsetZ": 0.0 }, "Lurien": { "name": "Lurien", @@ -122,8 +114,7 @@ "mapZone": "CITY", "offsetX": 0.47, "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Monomon": { "name": "Monomon", @@ -136,8 +127,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.19, "offsetY": -0.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Herrah": { "name": "Herrah", @@ -150,8 +140,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.0, "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "World_Sense": { "name": "World_Sense", @@ -165,7 +154,6 @@ "offsetX": 0.2, "offsetY": -0.2, "offsetZ": 0.001, - "isShop": false, "randoOnly": true }, "Mothwing_Cloak": { @@ -179,8 +167,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.25, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mantis_Claw": { "name": "Mantis_Claw", @@ -193,8 +180,7 @@ "mapZone": "WASTES", "offsetX": -1.8, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Crystal_Heart": { "name": "Crystal_Heart", @@ -207,8 +193,7 @@ "mapZone": "MINES", "offsetX": 2.5, "offsetY": -0.55, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Monarch_Wings": { "name": "Monarch_Wings", @@ -221,8 +206,7 @@ "mapZone": "ABYSS", "offsetX": -1.2, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Shade_Cloak": { "name": "Shade_Cloak", @@ -235,8 +219,7 @@ "mapZone": "ABYSS", "offsetX": 1.05, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Isma's_Tear": { "name": "Isma's_Tear", @@ -249,8 +232,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.6, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Dream_Nail": { "name": "Dream_Nail", @@ -263,8 +245,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.13, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vengeful_Spirit": { "name": "Vengeful_Spirit", @@ -277,8 +258,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": -0.2, - "offsetZ": -0.5, - "isShop": false + "offsetZ": -0.5 }, "Shade_Soul": { "name": "Shade_Soul", @@ -291,8 +271,7 @@ "mapZone": "CITY", "offsetX": -0.1, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Desolate_Dive": { "name": "Desolate_Dive", @@ -305,8 +284,7 @@ "mapZone": "CITY", "offsetX": -0.1, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Descending_Dark": { "name": "Descending_Dark", @@ -319,8 +297,7 @@ "mapZone": "MINES", "offsetX": 0.0, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Howling_Wraiths": { "name": "Howling_Wraiths", @@ -333,8 +310,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.5, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Abyss_Shriek": { "name": "Abyss_Shriek", @@ -347,8 +323,7 @@ "mapZone": "ABYSS", "offsetX": -1.5, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Cyclone_Slash": { "name": "Cyclone_Slash", @@ -361,8 +336,7 @@ "mapZone": "CLIFFS", "offsetX": 0.24, "offsetY": 0.32, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Dash_Slash": { "name": "Dash_Slash", @@ -375,8 +349,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Great_Slash": { "name": "Great_Slash", @@ -389,8 +362,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.22, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Focus": { "name": "Focus", @@ -404,7 +376,6 @@ "offsetX": 0.4, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Baldur_Shell": { @@ -418,8 +389,7 @@ "mapZone": "CLIFFS", "offsetX": 0.2, "offsetY": -0.65, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Fury_of_the_Fallen": { "name": "Fury_of_the_Fallen", @@ -432,8 +402,7 @@ "mapZone": "TOWN", "offsetX": 1.3, "offsetY": -0.8, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lifeblood_Core": { "name": "Lifeblood_Core", @@ -446,8 +415,7 @@ "mapZone": "ABYSS", "offsetX": 0.4, "offsetY": -0.65, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Defender's_Crest": { "name": "Defender's_Crest", @@ -460,8 +428,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.35, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Flukenest": { "name": "Flukenest", @@ -474,8 +441,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.85, "offsetY": 0.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Thorns_of_Agony": { "name": "Thorns_of_Agony", @@ -488,8 +454,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.75, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mark_of_Pride": { "name": "Mark_of_Pride", @@ -502,8 +467,7 @@ "mapZone": "WASTES", "offsetX": -0.25, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Sharp_Shadow": { "name": "Sharp_Shadow", @@ -516,8 +480,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.0, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Spore_Shroom": { "name": "Spore_Shroom", @@ -530,8 +493,7 @@ "mapZone": "WASTES", "offsetX": 0.35, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Catcher": { "name": "Soul_Catcher", @@ -544,8 +506,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": -0.2, - "offsetZ": -0.499, - "isShop": false + "offsetZ": -0.499 }, "Soul_Eater": { "name": "Soul_Eater", @@ -558,8 +519,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 3.4, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Glowing_Womb": { "name": "Glowing_Womb", @@ -572,8 +532,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.8, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Nailmaster's_Glory": { "name": "Nailmaster's_Glory", @@ -586,8 +545,7 @@ "mapZone": "TOWN", "offsetX": -0.45, "offsetY": -0.6, - "offsetZ": 0.009, - "isShop": false + "offsetZ": 0.009 }, "Joni's_Blessing": { "name": "Joni's_Blessing", @@ -600,8 +558,7 @@ "mapZone": "CLIFFS", "offsetX": 0.6, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Shape_of_Unn": { "name": "Shape_of_Unn", @@ -614,8 +571,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.3, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hiveblood": { "name": "Hiveblood", @@ -628,8 +584,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.0, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Dashmaster": { "name": "Dashmaster", @@ -642,8 +597,7 @@ "mapZone": "WASTES", "offsetX": -0.4, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Quick_Slash": { "name": "Quick_Slash", @@ -656,8 +610,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.4, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Spell_Twister": { "name": "Spell_Twister", @@ -670,8 +623,7 @@ "mapZone": "CITY", "offsetX": 0.55, "offsetY": 0.45, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Deep_Focus": { "name": "Deep_Focus", @@ -684,8 +636,7 @@ "mapZone": "MINES", "offsetX": -0.1, "offsetY": -0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Queen_Fragment": { "name": "Queen_Fragment", @@ -698,8 +649,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.15, "offsetY": 1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King_Fragment": { "name": "King_Fragment", @@ -712,8 +662,7 @@ "mapZone": "ABYSS", "offsetX": 0.8, "offsetY": -0.2, - "offsetZ": 0.005, - "isShop": false + "offsetZ": 0.005 }, "Void_Heart": { "name": "Void_Heart", @@ -726,8 +675,7 @@ "mapZone": "ABYSS", "offsetX": 1.0, "offsetY": -4.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Dreamshield": { "name": "Dreamshield", @@ -740,8 +688,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.6, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Weaversong": { "name": "Weaversong", @@ -754,8 +701,7 @@ "mapZone": "DEEPNEST", "offsetX": 2.5, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmchild": { "name": "Grimmchild", @@ -768,8 +714,7 @@ "mapZone": "TOWN", "offsetX": -1.2, "offsetY": -0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Unbreakable_Heart": { "name": "Unbreakable_Heart", @@ -782,8 +727,7 @@ "mapZone": "TOWN", "offsetX": -1.6, "offsetY": -0.6, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Unbreakable_Greed": { "name": "Unbreakable_Greed", @@ -796,8 +740,7 @@ "mapZone": "TOWN", "offsetX": -1.6, "offsetY": -0.2, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Unbreakable_Strength": { "name": "Unbreakable_Strength", @@ -810,8 +753,7 @@ "mapZone": "TOWN", "offsetX": -1.6, "offsetY": 0.2, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "City_Crest": { "name": "City_Crest", @@ -824,8 +766,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Tram_Pass": { "name": "Tram_Pass", @@ -838,8 +779,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.7, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Simple_Key-Basin": { "name": "Simple_Key-Basin", @@ -852,8 +792,7 @@ "mapZone": "ABYSS", "offsetX": -1.0, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Simple_Key-City": { "name": "Simple_Key-City", @@ -866,8 +805,7 @@ "mapZone": "CITY", "offsetX": 0.8, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Simple_Key-Lurker": { "name": "Simple_Key-Lurker", @@ -880,8 +818,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.8, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Shopkeeper's_Key": { "name": "Shopkeeper's_Key", @@ -894,8 +831,7 @@ "mapZone": "MINES", "offsetX": 0.15, "offsetY": 0.35, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Love_Key": { "name": "Love_Key", @@ -908,8 +844,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 1.1, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Brand": { "name": "King's_Brand", @@ -922,8 +857,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.4, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Godtuner": { "name": "Godtuner", @@ -936,8 +870,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.6, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Collector's_Map": { "name": "Collector's_Map", @@ -950,8 +883,7 @@ "mapZone": "CITY", "offsetX": -0.6, "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Brooding_Mawlek": { "name": "Mask_Shard-Brooding_Mawlek", @@ -964,8 +896,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.5, "offsetY": -0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Crossroads_Goam": { "name": "Mask_Shard-Crossroads_Goam", @@ -978,8 +909,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.7, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Stone_Sanctuary": { "name": "Mask_Shard-Stone_Sanctuary", @@ -992,8 +922,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.0, "offsetY": -0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Mask_Shard-Queen's_Station": { "name": "Mask_Shard-Queen's_Station", @@ -1004,10 +933,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "WASTES", - "offsetX": 0.55, + "offsetX": 0.35, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Deepnest": { "name": "Mask_Shard-Deepnest", @@ -1020,8 +948,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Waterways": { "name": "Mask_Shard-Waterways", @@ -1034,8 +961,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.15, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Enraged_Guardian": { "name": "Mask_Shard-Enraged_Guardian", @@ -1048,8 +974,7 @@ "mapZone": "MINES", "offsetX": -0.45, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Hive": { "name": "Mask_Shard-Hive", @@ -1062,8 +987,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.8, "offsetY": -0.45, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Grey_Mourner": { "name": "Mask_Shard-Grey_Mourner", @@ -1076,8 +1000,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 0.1, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mask_Shard-Bretta": { "name": "Mask_Shard-Bretta", @@ -1088,10 +1011,9 @@ "pdIntValue": 0, "pinScene": "Town", "mapZone": "TOWN", - "offsetX": 1.08, - "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetX": 0.8, + "offsetY": -0.2, + "offsetZ": 0.0085 }, "Vessel_Fragment-Greenpath": { "name": "Vessel_Fragment-Greenpath", @@ -1104,8 +1026,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.4, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vessel_Fragment-City": { "name": "Vessel_Fragment-City", @@ -1118,8 +1039,7 @@ "mapZone": "CITY", "offsetX": 0.5, "offsetY": -0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vessel_Fragment-Crossroads": { "name": "Vessel_Fragment-Crossroads", @@ -1132,8 +1052,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vessel_Fragment-Basin": { "name": "Vessel_Fragment-Basin", @@ -1146,8 +1065,7 @@ "mapZone": "ABYSS", "offsetX": 0.5, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vessel_Fragment-Deepnest": { "name": "Vessel_Fragment-Deepnest", @@ -1160,8 +1078,7 @@ "mapZone": "DEEPNEST", "offsetX": 1.6, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Vessel_Fragment-Stag_Nest": { "name": "Vessel_Fragment-Stag_Nest", @@ -1174,8 +1091,7 @@ "mapZone": "CLIFFS", "offsetX": -2.4, "offsetY": 1.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Charm_Notch-Shrumal_Ogres": { "name": "Charm_Notch-Shrumal_Ogres", @@ -1188,8 +1104,7 @@ "mapZone": "WASTES", "offsetX": 0.1, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Charm_Notch-Fog_Canyon": { "name": "Charm_Notch-Fog_Canyon", @@ -1202,8 +1117,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Charm_Notch-Colosseum": { "name": "Charm_Notch-Colosseum", @@ -1216,8 +1130,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 3.1, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Charm_Notch-Grimm": { "name": "Charm_Notch-Grimm", @@ -1230,8 +1143,7 @@ "mapZone": "TOWN", "offsetX": -1.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Pale_Ore-Basin": { "name": "Pale_Ore-Basin", @@ -1244,8 +1156,7 @@ "mapZone": "ABYSS", "offsetX": -2.05, "offsetY": -0.35, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Pale_Ore-Crystal_Peak": { "name": "Pale_Ore-Crystal_Peak", @@ -1258,8 +1169,7 @@ "mapZone": "MINES", "offsetX": -1.9, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Pale_Ore-Nosk": { "name": "Pale_Ore-Nosk", @@ -1272,8 +1182,7 @@ "mapZone": "DEEPNEST", "offsetX": 2.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Pale_Ore-Colosseum": { "name": "Pale_Ore-Colosseum", @@ -1286,8 +1195,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 3.5, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Chest-False_Knight": { "name": "Geo_Chest-False_Knight", @@ -1300,8 +1208,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Chest-Soul_Master": { "name": "Geo_Chest-Soul_Master", @@ -1313,9 +1220,8 @@ "pinScene": null, "mapZone": "CITY", "offsetX": -0.4, - "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetY": 1.2, + "offsetZ": 0.0 }, "Geo_Chest-Watcher_Knights": { "name": "Geo_Chest-Watcher_Knights", @@ -1328,8 +1234,7 @@ "mapZone": "CITY", "offsetX": -0.8, "offsetY": 1.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Chest-Greenpath": { "name": "Geo_Chest-Greenpath", @@ -1342,8 +1247,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.45, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Chest-Mantis_Lords": { "name": "Geo_Chest-Mantis_Lords", @@ -1356,8 +1260,7 @@ "mapZone": "WASTES", "offsetX": 0.5, "offsetY": 0.2, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Chest-Resting_Grounds": { "name": "Geo_Chest-Resting_Grounds", @@ -1370,8 +1273,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 1.6, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Chest-Crystal_Peak": { "name": "Geo_Chest-Crystal_Peak", @@ -1383,9 +1285,8 @@ "pinScene": null, "mapZone": "MINES", "offsetX": 0.0, - "offsetY": -0.3, - "offsetZ": 0.001, - "isShop": false + "offsetY": -0.4, + "offsetZ": 0.001 }, "Geo_Chest-Weavers_Den": { "name": "Geo_Chest-Weavers_Den", @@ -1398,8 +1299,7 @@ "mapZone": "DEEPNEST", "offsetX": 2.9, "offsetY": 0.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Chest-Junk_Pit_1": { "name": "Geo_Chest-Junk_Pit_1", @@ -1412,8 +1312,7 @@ "mapZone": "WATERWAYS", "offsetX": -2.1, "offsetY": -0.6, - "offsetZ": 0.005, - "isShop": false + "offsetZ": 0.005 }, "Geo_Chest-Junk_Pit_2": { "name": "Geo_Chest-Junk_Pit_2", @@ -1426,8 +1325,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.8, "offsetY": -0.6, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "Geo_Chest-Junk_Pit_3": { "name": "Geo_Chest-Junk_Pit_3", @@ -1440,8 +1338,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.5, "offsetY": -0.6, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Geo_Chest-Junk_Pit_5": { "name": "Geo_Chest-Junk_Pit_5", @@ -1454,8 +1351,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.9, "offsetY": -0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lumafly_Escape-Junk_Pit_Chest_4": { "name": "Lumafly_Escape-Junk_Pit_Chest_4", @@ -1468,8 +1364,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.2, "offsetY": -0.6, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Rancid_Egg-Sheo": { "name": "Rancid_Egg-Sheo", @@ -1482,8 +1377,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.65, "offsetY": -0.45, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Fungal_Core": { "name": "Rancid_Egg-Fungal_Core", @@ -1496,8 +1390,7 @@ "mapZone": "WASTES", "offsetX": -0.8, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Queen's_Gardens": { "name": "Rancid_Egg-Queen's_Gardens", @@ -1510,8 +1403,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.8, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Blue_Lake": { "name": "Rancid_Egg-Blue_Lake", @@ -1524,8 +1416,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.5, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Crystal_Peak_Dive_Entrance": { "name": "Rancid_Egg-Crystal_Peak_Dive_Entrance", @@ -1538,8 +1429,7 @@ "mapZone": "MINES", "offsetX": 0.3, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Crystal_Peak_Dark_Room": { "name": "Rancid_Egg-Crystal_Peak_Dark_Room", @@ -1552,8 +1442,7 @@ "mapZone": "MINES", "offsetX": -0.4, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Crystal_Peak_Tall_Room": { "name": "Rancid_Egg-Crystal_Peak_Tall_Room", @@ -1566,8 +1455,7 @@ "mapZone": "MINES", "offsetX": -0.7, "offsetY": 1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-City_of_Tears_Left": { "name": "Rancid_Egg-City_of_Tears_Left", @@ -1580,8 +1468,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-City_of_Tears_Pleasure_House": { "name": "Rancid_Egg-City_of_Tears_Pleasure_House", @@ -1594,8 +1481,7 @@ "mapZone": "CITY", "offsetX": 0.2, "offsetY": 0.9, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Beast's_Den": { "name": "Rancid_Egg-Beast's_Den", @@ -1608,8 +1494,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.4, "offsetY": 2.1, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Rancid_Egg-Dark_Deepnest": { "name": "Rancid_Egg-Dark_Deepnest", @@ -1622,8 +1507,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.3, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Weaver's_Den": { "name": "Rancid_Egg-Weaver's_Den", @@ -1636,8 +1520,7 @@ "mapZone": "DEEPNEST", "offsetX": 3.3, "offsetY": 0.4, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Rancid_Egg-Near_Quick_Slash": { "name": "Rancid_Egg-Near_Quick_Slash", @@ -1650,8 +1533,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.05, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Upper_Kingdom's_Edge": { "name": "Rancid_Egg-Upper_Kingdom's_Edge", @@ -1664,8 +1546,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.2, "offsetY": 1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Waterways_East": { "name": "Rancid_Egg-Waterways_East", @@ -1678,8 +1559,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.1, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Waterways_Main": { "name": "Rancid_Egg-Waterways_Main", @@ -1692,8 +1572,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.25, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Waterways_West_Bluggsac": { "name": "Rancid_Egg-Waterways_West_Bluggsac", @@ -1706,8 +1585,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.7, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Waterways_West_Pickup": { "name": "Rancid_Egg-Waterways_West_Pickup", @@ -1720,8 +1598,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.5, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Rancid_Egg-Tuk_Defender's_Crest": { "name": "Rancid_Egg-Tuk_Defender's_Crest", @@ -1734,8 +1611,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Cliffs": { "name": "Wanderer's_Journal-Cliffs", @@ -1748,8 +1624,7 @@ "mapZone": "CLIFFS", "offsetX": 1.45, "offsetY": -1.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Greenpath_Stag": { "name": "Wanderer's_Journal-Greenpath_Stag", @@ -1762,8 +1637,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.1, "offsetY": 1.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Greenpath_Lower": { "name": "Wanderer's_Journal-Greenpath_Lower", @@ -1776,8 +1650,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.45, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet": { "name": "Wanderer's_Journal-Fungal_Wastes_Thorns_Gauntlet", @@ -1788,10 +1661,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "WASTES", - "offsetX": 0.2, + "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Above_Mantis_Village": { "name": "Wanderer's_Journal-Above_Mantis_Village", @@ -1804,8 +1676,7 @@ "mapZone": "WASTES", "offsetX": 0.4, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Crystal_Peak_Crawlers": { "name": "Wanderer's_Journal-Crystal_Peak_Crawlers", @@ -1818,8 +1689,7 @@ "mapZone": "MINES", "offsetX": 0.2, "offsetY": 1.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Resting_Grounds_Catacombs": { "name": "Wanderer's_Journal-Resting_Grounds_Catacombs", @@ -1832,8 +1702,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 3.4, "offsetY": -0.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Wanderer's_Journal-King's_Station": { "name": "Wanderer's_Journal-King's_Station", @@ -1846,8 +1715,7 @@ "mapZone": "CITY", "offsetX": 0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Pleasure_House": { "name": "Wanderer's_Journal-Pleasure_House", @@ -1860,8 +1728,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-City_Storerooms": { "name": "Wanderer's_Journal-City_Storerooms", @@ -1874,8 +1741,7 @@ "mapZone": "CITY", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Ancient_Basin": { "name": "Wanderer's_Journal-Ancient_Basin", @@ -1888,8 +1754,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.8, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Kingdom's_Edge_Entrance": { "name": "Wanderer's_Journal-Kingdom's_Edge_Entrance", @@ -1902,8 +1767,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.8, "offsetY": -2.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Kingdom's_Edge_Camp": { "name": "Wanderer's_Journal-Kingdom's_Edge_Camp", @@ -1916,8 +1780,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.6, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive": { "name": "Wanderer's_Journal-Kingdom's_Edge_Requires_Dive", @@ -1930,8 +1793,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.5, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Crossroads_Well": { "name": "Hallownest_Seal-Crossroads_Well", @@ -1944,8 +1806,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.2, "offsetY": 0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Greenpath": { "name": "Hallownest_Seal-Greenpath", @@ -1958,8 +1819,7 @@ "mapZone": "GREEN_PATH", "offsetX": -1.85, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Fog_Canyon_West": { "name": "Hallownest_Seal-Fog_Canyon_West", @@ -1972,8 +1832,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Fog_Canyon_East": { "name": "Hallownest_Seal-Fog_Canyon_East", @@ -1986,8 +1845,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.15, "offsetY": 0.9, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Queen's_Station": { "name": "Hallownest_Seal-Queen's_Station", @@ -2000,8 +1858,7 @@ "mapZone": "WASTES", "offsetX": 0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Fungal_Wastes_Sporgs": { "name": "Hallownest_Seal-Fungal_Wastes_Sporgs", @@ -2014,8 +1871,7 @@ "mapZone": "WASTES", "offsetX": 0.8, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Mantis_Lords": { "name": "Hallownest_Seal-Mantis_Lords", @@ -2028,8 +1884,7 @@ "mapZone": "WASTES", "offsetX": 0.1, "offsetY": 0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Hallownest_Seal-Resting_Grounds_Catacombs": { "name": "Hallownest_Seal-Resting_Grounds_Catacombs", @@ -2042,8 +1897,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.4, "offsetY": 0.0, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Hallownest_Seal-King's_Station": { "name": "Hallownest_Seal-King's_Station", @@ -2056,8 +1910,7 @@ "mapZone": "CITY", "offsetX": -0.4, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-City_Rafters": { "name": "Hallownest_Seal-City_Rafters", @@ -2070,8 +1923,7 @@ "mapZone": "CITY", "offsetX": 0.15, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Soul_Sanctum": { "name": "Hallownest_Seal-Soul_Sanctum", @@ -2083,9 +1935,8 @@ "pinScene": null, "mapZone": "CITY", "offsetX": 0.2, - "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetY": -0.4, + "offsetZ": 0.0 }, "Hallownest_Seal-Watcher_Knight": { "name": "Hallownest_Seal-Watcher_Knight", @@ -2098,8 +1949,7 @@ "mapZone": "CITY", "offsetX": -0.4, "offsetY": 1.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Hallownest_Seal-Deepnest_By_Mantis_Lords": { "name": "Hallownest_Seal-Deepnest_By_Mantis_Lords", @@ -2112,8 +1962,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.9, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hallownest_Seal-Beast's_Den": { "name": "Hallownest_Seal-Beast's_Den", @@ -2126,8 +1975,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.0, "offsetY": 1.7, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Hallownest_Seal-Queen's_Gardens": { "name": "Hallownest_Seal-Queen's_Gardens", @@ -2140,8 +1988,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -1.0, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Cliffs": { "name": "King's_Idol-Cliffs", @@ -2154,8 +2001,7 @@ "mapZone": "CLIFFS", "offsetX": -0.6, "offsetY": -2.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Crystal_Peak": { "name": "King's_Idol-Crystal_Peak", @@ -2168,8 +2014,7 @@ "mapZone": "MINES", "offsetX": 1.6, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Glade_of_Hope": { "name": "King's_Idol-Glade_of_Hope", @@ -2182,8 +2027,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 1.6, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Dung_Defender": { "name": "King's_Idol-Dung_Defender", @@ -2196,8 +2040,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.2, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "King's_Idol-Great_Hopper": { "name": "King's_Idol-Great_Hopper", @@ -2210,8 +2053,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.5, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Pale_Lurker": { "name": "King's_Idol-Pale_Lurker", @@ -2224,8 +2066,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 2.1, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Idol-Deepnest": { "name": "King's_Idol-Deepnest", @@ -2238,8 +2079,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.7, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Arcane_Egg-Lifeblood_Core": { "name": "Arcane_Egg-Lifeblood_Core", @@ -2252,8 +2092,7 @@ "mapZone": "ABYSS", "offsetX": 0.4, "offsetY": -1.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Arcane_Egg-Shade_Cloak": { "name": "Arcane_Egg-Shade_Cloak", @@ -2266,8 +2105,7 @@ "mapZone": "ABYSS", "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Arcane_Egg-Birthplace": { "name": "Arcane_Egg-Birthplace", @@ -2280,8 +2118,7 @@ "mapZone": "ABYSS", "offsetX": -0.6, "offsetY": -4.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Crossroads": { "name": "Whispering_Root-Crossroads", @@ -2294,8 +2131,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.5, "offsetY": 1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Greenpath": { "name": "Whispering_Root-Greenpath", @@ -2308,8 +2144,7 @@ "mapZone": "GREEN_PATH", "offsetX": -1.9, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Leg_Eater": { "name": "Whispering_Root-Leg_Eater", @@ -2322,8 +2157,7 @@ "mapZone": "WASTES", "offsetX": 0.3, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Mantis_Village": { "name": "Whispering_Root-Mantis_Village", @@ -2336,8 +2170,7 @@ "mapZone": "WASTES", "offsetX": 0.1, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Deepnest": { "name": "Whispering_Root-Deepnest", @@ -2350,8 +2183,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.8, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Queens_Gardens": { "name": "Whispering_Root-Queens_Gardens", @@ -2364,8 +2196,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 0.3, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Kingdoms_Edge": { "name": "Whispering_Root-Kingdoms_Edge", @@ -2378,8 +2209,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.2, "offsetY": -2.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Waterways": { "name": "Whispering_Root-Waterways", @@ -2392,8 +2222,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.5, "offsetY": -1.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-City": { "name": "Whispering_Root-City", @@ -2406,8 +2235,7 @@ "mapZone": "CITY", "offsetX": 0.8, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Whispering_Root-Resting_Grounds": { "name": "Whispering_Root-Resting_Grounds", @@ -2420,8 +2248,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.3, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Spirits_Glade": { "name": "Whispering_Root-Spirits_Glade", @@ -2434,8 +2261,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 1.5, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Crystal_Peak": { "name": "Whispering_Root-Crystal_Peak", @@ -2448,8 +2274,7 @@ "mapZone": "MINES", "offsetX": 0.2, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Howling_Cliffs": { "name": "Whispering_Root-Howling_Cliffs", @@ -2462,8 +2287,7 @@ "mapZone": "CLIFFS", "offsetX": 0.5, "offsetY": -1.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Whispering_Root-Ancestral_Mound": { "name": "Whispering_Root-Ancestral_Mound", @@ -2476,8 +2300,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": 0.6, - "offsetZ": -0.495, - "isShop": false + "offsetZ": -0.495 }, "Whispering_Root-Hive": { "name": "Whispering_Root-Hive", @@ -2490,8 +2313,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.5, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Elder_Hu": { "name": "Boss_Essence-Elder_Hu", @@ -2504,8 +2326,7 @@ "mapZone": "WASTES", "offsetX": 0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Xero": { "name": "Boss_Essence-Xero", @@ -2518,8 +2339,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 0.8, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Gorb": { "name": "Boss_Essence-Gorb", @@ -2532,8 +2352,7 @@ "mapZone": "CLIFFS", "offsetX": -1.3, "offsetY": 1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Marmu": { "name": "Boss_Essence-Marmu", @@ -2546,8 +2365,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-No_Eyes": { "name": "Boss_Essence-No_Eyes", @@ -2560,8 +2378,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Galien": { "name": "Boss_Essence-Galien", @@ -2574,8 +2391,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.7, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Markoth": { "name": "Boss_Essence-Markoth", @@ -2588,8 +2404,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.1, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Failed_Champion": { "name": "Boss_Essence-Failed_Champion", @@ -2602,8 +2417,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.1, "offsetY": 0.5, - "offsetZ": -0.99, - "isShop": false + "offsetZ": -0.99 }, "Boss_Essence-Soul_Tyrant": { "name": "Boss_Essence-Soul_Tyrant", @@ -2616,8 +2430,7 @@ "mapZone": "CITY", "offsetX": 0.3, "offsetY": -0.7, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Boss_Essence-Lost_Kin": { "name": "Boss_Essence-Lost_Kin", @@ -2630,8 +2443,7 @@ "mapZone": "ABYSS", "offsetX": -1.35, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-White_Defender": { "name": "Boss_Essence-White_Defender", @@ -2644,8 +2456,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Essence-Grey_Prince_Zote": { "name": "Boss_Essence-Grey_Prince_Zote", @@ -2656,10 +2467,9 @@ "pdIntValue": 0, "pinScene": "Town", "mapZone": "TOWN", - "offsetX": 0.68, + "offsetX": 0.8, "offsetY": -0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.0095 }, "Grub-Crossroads_Acid": { "name": "Grub-Crossroads_Acid", @@ -2672,8 +2482,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.7, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crossroads_Center": { "name": "Grub-Crossroads_Center", @@ -2686,8 +2495,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.45, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crossroads_Stag": { "name": "Grub-Crossroads_Stag", @@ -2700,8 +2508,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.2, "offsetY": 0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Grub-Crossroads_Spike": { "name": "Grub-Crossroads_Spike", @@ -2714,8 +2521,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.35, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crossroads_Guarded": { "name": "Grub-Crossroads_Guarded", @@ -2728,8 +2534,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Greenpath_Cornifer": { "name": "Grub-Greenpath_Cornifer", @@ -2742,8 +2547,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.5, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Greenpath_Journal": { "name": "Grub-Greenpath_Journal", @@ -2756,8 +2560,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.2, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Greenpath_MMC": { "name": "Grub-Greenpath_MMC", @@ -2770,8 +2573,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.5, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Greenpath_Stag": { "name": "Grub-Greenpath_Stag", @@ -2784,8 +2586,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.9, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Fog_Canyon": { "name": "Grub-Fog_Canyon", @@ -2798,8 +2599,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.85, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Fungal_Bouncy": { "name": "Grub-Fungal_Bouncy", @@ -2812,8 +2612,7 @@ "mapZone": "WASTES", "offsetX": 1.45, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Fungal_Spore_Shroom": { "name": "Grub-Fungal_Spore_Shroom", @@ -2826,8 +2625,7 @@ "mapZone": "WASTES", "offsetX": -0.5, "offsetY": 0.35, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Deepnest_Mimic": { "name": "Grub-Deepnest_Mimic", @@ -2840,8 +2638,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.6, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Deepnest_Nosk": { "name": "Grub-Deepnest_Nosk", @@ -2854,8 +2651,7 @@ "mapZone": "DEEPNEST", "offsetX": 1.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Deepnest_Spike": { "name": "Grub-Deepnest_Spike", @@ -2868,8 +2664,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.4, "offsetY": 1.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Dark_Deepnest": { "name": "Grub-Dark_Deepnest", @@ -2882,8 +2677,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.4, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Beast's_Den": { "name": "Grub-Beast's_Den", @@ -2896,8 +2690,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.0, "offsetY": 2.1, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Grub-Kingdom's_Edge_Oro": { "name": "Grub-Kingdom's_Edge_Oro", @@ -2910,8 +2703,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.6, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Kingdom's_Edge_Camp": { "name": "Grub-Kingdom's_Edge_Camp", @@ -2924,8 +2716,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.2, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Hive_External": { "name": "Grub-Hive_External", @@ -2938,8 +2729,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.2, "offsetY": 0.75, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Hive_Internal": { "name": "Grub-Hive_Internal", @@ -2952,8 +2742,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.7, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Basin_Requires_Wings": { "name": "Grub-Basin_Requires_Wings", @@ -2966,8 +2755,7 @@ "mapZone": "ABYSS", "offsetX": 0.05, "offsetY": 1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Basin_Requires_Dive": { "name": "Grub-Basin_Requires_Dive", @@ -2980,8 +2768,7 @@ "mapZone": "ABYSS", "offsetX": 1.85, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Waterways_Main": { "name": "Grub-Waterways_Main", @@ -2994,8 +2781,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.2, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Isma's_Grove": { "name": "Grub-Isma's_Grove", @@ -3008,8 +2794,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.0, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Waterways_Requires_Tram": { "name": "Grub-Waterways_Requires_Tram", @@ -3022,8 +2807,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.5, "offsetY": 0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-City_of_Tears_Left": { "name": "Grub-City_of_Tears_Left", @@ -3036,8 +2820,7 @@ "mapZone": "CITY", "offsetX": 0.45, "offsetY": 1.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Soul_Sanctum": { "name": "Grub-Soul_Sanctum", @@ -3049,9 +2832,8 @@ "pinScene": null, "mapZone": "CITY", "offsetX": -0.4, - "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetY": -0.8, + "offsetZ": 0.0 }, "Grub-Watcher's_Spire": { "name": "Grub-Watcher's_Spire", @@ -3064,8 +2846,7 @@ "mapZone": "CITY", "offsetX": -0.1, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-City_of_Tears_Guarded": { "name": "Grub-City_of_Tears_Guarded", @@ -3078,8 +2859,7 @@ "mapZone": "CITY", "offsetX": 1.1, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-King's_Station": { "name": "Grub-King's_Station", @@ -3092,8 +2872,7 @@ "mapZone": "CITY", "offsetX": 0.15, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Resting_Grounds": { "name": "Grub-Resting_Grounds", @@ -3104,10 +2883,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "RESTING_GROUNDS", - "offsetX": 0.9, - "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetX": -0.3, + "offsetY": 0.9, + "offsetZ": 0.0 }, "Grub-Crystal_Peak_Below_Chest": { "name": "Grub-Crystal_Peak_Below_Chest", @@ -3120,8 +2898,7 @@ "mapZone": "MINES", "offsetX": 0.0, "offsetY": 1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crystallized_Mound": { "name": "Grub-Crystallized_Mound", @@ -3134,8 +2911,7 @@ "mapZone": "MINES", "offsetX": 0.4, "offsetY": 0.8, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Grub-Crystal_Peak_Spike": { "name": "Grub-Crystal_Peak_Spike", @@ -3148,8 +2924,7 @@ "mapZone": "MINES", "offsetX": 0.1, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crystal_Peak_Mimic": { "name": "Grub-Crystal_Peak_Mimic", @@ -3162,8 +2937,7 @@ "mapZone": "MINES", "offsetX": 0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crystal_Peak_Crushers": { "name": "Grub-Crystal_Peak_Crushers", @@ -3174,10 +2948,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "MINES", - "offsetX": 0.1, + "offsetX": 0.0, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Crystal_Heart": { "name": "Grub-Crystal_Heart", @@ -3190,8 +2963,7 @@ "mapZone": "MINES", "offsetX": -2.5, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Hallownest_Crown": { "name": "Grub-Hallownest_Crown", @@ -3204,8 +2976,7 @@ "mapZone": "MINES", "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Howling_Cliffs": { "name": "Grub-Howling_Cliffs", @@ -3218,8 +2989,7 @@ "mapZone": "CLIFFS", "offsetX": 0.2, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Queen's_Gardens_Stag": { "name": "Grub-Queen's_Gardens_Stag", @@ -3232,8 +3002,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -1.0, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Queen's_Gardens_Marmu": { "name": "Grub-Queen's_Gardens_Marmu", @@ -3246,8 +3015,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.85, "offsetY": 1.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Queen's_Gardens_Top": { "name": "Grub-Queen's_Gardens_Top", @@ -3260,8 +3028,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 0.2, "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Collector_1": { "name": "Grub-Collector_1", @@ -3274,8 +3041,7 @@ "mapZone": "CITY", "offsetX": 0.8, "offsetY": 1.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Collector_2": { "name": "Grub-Collector_2", @@ -3288,8 +3054,7 @@ "mapZone": "CITY", "offsetX": 0.4, "offsetY": 1.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grub-Collector_3": { "name": "Grub-Collector_3", @@ -3302,8 +3067,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": 1.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Mimic_Grub-Deepnest_1": { "name": "Mimic_Grub-Deepnest_1", @@ -3316,8 +3080,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Mimic_Grub-Deepnest_2": { "name": "Mimic_Grub-Deepnest_2", @@ -3330,8 +3093,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Mimic_Grub-Deepnest_3": { "name": "Mimic_Grub-Deepnest_3", @@ -3344,8 +3106,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.3, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Mimic_Grub-Crystal_Peak": { "name": "Mimic_Grub-Crystal_Peak", @@ -3358,8 +3119,7 @@ "mapZone": "MINES", "offsetX": 0.3, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Crossroads_Map": { "name": "Crossroads_Map", @@ -3372,8 +3132,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Greenpath_Map": { "name": "Greenpath_Map", @@ -3386,8 +3145,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.45, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Fog_Canyon_Map": { "name": "Fog_Canyon_Map", @@ -3400,8 +3158,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Fungal_Wastes_Map": { "name": "Fungal_Wastes_Map", @@ -3414,8 +3171,7 @@ "mapZone": "WASTES", "offsetX": -1.55, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Deepnest_Map-Upper": { "name": "Deepnest_Map-Upper", @@ -3428,8 +3184,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.45, "offsetY": -0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Deepnest_Map-Right": { "name": "Deepnest_Map-Right", @@ -3442,8 +3197,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.7, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Ancient_Basin_Map": { "name": "Ancient_Basin_Map", @@ -3456,8 +3210,7 @@ "mapZone": "ABYSS", "offsetX": 0.5, "offsetY": 0.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Kingdom's_Edge_Map": { "name": "Kingdom's_Edge_Map", @@ -3470,8 +3223,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.7, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "City_of_Tears_Map": { "name": "City_of_Tears_Map", @@ -3484,8 +3236,7 @@ "mapZone": "CITY", "offsetX": 0.2, "offsetY": -0.375, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Royal_Waterways_Map": { "name": "Royal_Waterways_Map", @@ -3497,9 +3248,8 @@ "pinScene": null, "mapZone": "WATERWAYS", "offsetX": -0.2, - "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetY": 0.3, + "offsetZ": 0.0 }, "Howling_Cliffs_Map": { "name": "Howling_Cliffs_Map", @@ -3512,8 +3262,7 @@ "mapZone": "CLIFFS", "offsetX": 1.8, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Crystal_Peak_Map": { "name": "Crystal_Peak_Map", @@ -3526,8 +3275,7 @@ "mapZone": "MINES", "offsetX": 1.35, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Queen's_Gardens_Map": { "name": "Queen's_Gardens_Map", @@ -3540,8 +3288,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 0.4, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Resting_Grounds_Map": { "name": "Resting_Grounds_Map", @@ -3554,8 +3301,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.8, "offsetY": -0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Dirtmouth_Stag": { "name": "Dirtmouth_Stag", @@ -3568,8 +3314,7 @@ "mapZone": "TOWN", "offsetX": 0.4, "offsetY": -0.6, - "offsetZ": 0.01, - "isShop": false + "offsetZ": 0.009 }, "Crossroads_Stag": { "name": "Crossroads_Stag", @@ -3582,8 +3327,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Greenpath_Stag": { "name": "Greenpath_Stag", @@ -3596,8 +3340,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.15, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Queen's_Station_Stag": { "name": "Queen's_Station_Stag", @@ -3610,8 +3353,7 @@ "mapZone": "WASTES", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Queen's_Gardens_Stag": { "name": "Queen's_Gardens_Stag", @@ -3624,8 +3366,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 1.68, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "City_Storerooms_Stag": { "name": "City_Storerooms_Stag", @@ -3638,8 +3379,7 @@ "mapZone": "CITY", "offsetX": 0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "King's_Station_Stag": { "name": "King's_Station_Stag", @@ -3652,8 +3392,7 @@ "mapZone": "CITY", "offsetX": 0.3, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Resting_Grounds_Stag": { "name": "Resting_Grounds_Stag", @@ -3666,8 +3405,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 0.15, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Distant_Village_Stag": { "name": "Distant_Village_Stag", @@ -3680,8 +3418,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.6, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hidden_Station_Stag": { "name": "Hidden_Station_Stag", @@ -3694,8 +3431,7 @@ "mapZone": "ABYSS", "offsetX": 0.1, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Stag_Nest_Stag": { "name": "Stag_Nest_Stag", @@ -3708,8 +3444,7 @@ "mapZone": "CLIFFS", "offsetX": -3.3, "offsetY": 1.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-King's_Pass": { "name": "Lifeblood_Cocoon-King's_Pass", @@ -3722,8 +3457,7 @@ "mapZone": "TOWN", "offsetX": -1.25, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Ancestral_Mound": { "name": "Lifeblood_Cocoon-Ancestral_Mound", @@ -3736,8 +3470,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": 0.2, - "offsetZ": -0.497, - "isShop": false + "offsetZ": -0.497 }, "Lifeblood_Cocoon-Greenpath": { "name": "Lifeblood_Cocoon-Greenpath", @@ -3750,8 +3483,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.1, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Fog_Canyon_West": { "name": "Lifeblood_Cocoon-Fog_Canyon_West", @@ -3764,8 +3496,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Mantis_Village": { "name": "Lifeblood_Cocoon-Mantis_Village", @@ -3776,10 +3507,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "WASTES", - "offsetX": -0.7, - "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetX": -0.8, + "offsetY": -0.8, + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Failed_Tramway": { "name": "Lifeblood_Cocoon-Failed_Tramway", @@ -3792,8 +3522,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.4, "offsetY": 0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Galien": { "name": "Lifeblood_Cocoon-Galien", @@ -3806,8 +3535,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.05, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lifeblood_Cocoon-Kingdom's_Edge": { "name": "Lifeblood_Cocoon-Kingdom's_Edge", @@ -3820,8 +3548,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-City_Storerooms": { "name": "Grimmkin_Flame-City_Storerooms", @@ -3834,8 +3561,7 @@ "mapZone": "CITY", "offsetX": 0.5, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Greenpath": { "name": "Grimmkin_Flame-Greenpath", @@ -3848,8 +3574,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Crystal_Peak": { "name": "Grimmkin_Flame-Crystal_Peak", @@ -3862,8 +3587,7 @@ "mapZone": "MINES", "offsetX": 0.2, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-King's_Pass": { "name": "Grimmkin_Flame-King's_Pass", @@ -3876,8 +3600,7 @@ "mapZone": "TOWN", "offsetX": -0.5, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Resting_Grounds": { "name": "Grimmkin_Flame-Resting_Grounds", @@ -3890,8 +3613,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.3, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Kingdom's_Edge": { "name": "Grimmkin_Flame-Kingdom's_Edge", @@ -3904,8 +3626,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.3, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Fungal_Core": { "name": "Grimmkin_Flame-Fungal_Core", @@ -3918,8 +3639,7 @@ "mapZone": "WASTES", "offsetX": -0.1, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Ancient_Basin": { "name": "Grimmkin_Flame-Ancient_Basin", @@ -3932,8 +3652,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Hive": { "name": "Grimmkin_Flame-Hive", @@ -3946,8 +3665,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.4, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Grimmkin_Flame-Brumm": { "name": "Grimmkin_Flame-Brumm", @@ -3960,8 +3678,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.3, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Hunter's_Journal": { "name": "Hunter's_Journal", @@ -3974,8 +3691,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.3, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Journal_Entry-Void_Tendrils": { "name": "Journal_Entry-Void_Tendrils", @@ -3988,8 +3704,7 @@ "mapZone": "ABYSS", "offsetX": 1.8, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Journal_Entry-Charged_Lumafly": { "name": "Journal_Entry-Charged_Lumafly", @@ -4002,8 +3717,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.21, "offsetY": -0.15, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Journal_Entry-Goam": { "name": "Journal_Entry-Goam", @@ -4016,8 +3730,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": -0.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Journal_Entry-Garpede": { "name": "Journal_Entry-Garpede", @@ -4030,8 +3743,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.5, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Journal_Entry-Seal_of_Binding": { "name": "Journal_Entry-Seal_of_Binding", @@ -4044,8 +3756,7 @@ "mapZone": "ABYSS", "offsetX": 1.0, "offsetY": -0.2, - "offsetZ": 0.008, - "isShop": false + "offsetZ": 0.008 }, "Elevator_Pass": { "name": "Elevator_Pass", @@ -4059,7 +3770,6 @@ "offsetX": 0.0, "offsetY": -1.26, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Split_Mothwing_Cloak": { @@ -4074,7 +3784,6 @@ "offsetX": -0.25, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Left_Mantis_Claw": { @@ -4089,7 +3798,6 @@ "offsetX": -1.8, "offsetY": -0.1, "offsetZ": 0.001, - "isShop": false, "randoOnly": true }, "Right_Mantis_Claw": { @@ -4104,7 +3812,6 @@ "offsetX": -1.4, "offsetY": -0.1, "offsetZ": 0.002, - "isShop": false, "randoOnly": true }, "Split_Crystal_Heart": { @@ -4119,7 +3826,6 @@ "offsetX": 1.6, "offsetY": -0.55, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Geo_Rock-Broken_Elevator_1": { @@ -4133,8 +3839,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.3, "offsetY": -0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Broken_Elevator_2": { "name": "Geo_Rock-Broken_Elevator_2", @@ -4147,8 +3852,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.1, "offsetY": 0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Broken_Elevator_3": { "name": "Geo_Rock-Broken_Elevator_3", @@ -4161,8 +3865,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.1, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Broken_Bridge_Upper": { "name": "Geo_Rock-Broken_Bridge_Upper", @@ -4175,8 +3878,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.3, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Broken_Bridge_Lower": { "name": "Geo_Rock-Broken_Bridge_Lower", @@ -4189,8 +3891,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.0, "offsetY": -0.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Broken_Bridge_Lower_Dupe": { "name": "Geo_Rock-Broken_Bridge_Lower_Dupe", @@ -4203,8 +3904,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.3, "offsetY": -0.3, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Abyss_1": { "name": "Geo_Rock-Abyss_1", @@ -4217,8 +3917,7 @@ "mapZone": "ABYSS", "offsetX": 0.6, "offsetY": 1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Abyss_2": { "name": "Geo_Rock-Abyss_2", @@ -4231,8 +3930,7 @@ "mapZone": "ABYSS", "offsetX": 0.3, "offsetY": 0.9, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Abyss_3": { "name": "Geo_Rock-Abyss_3", @@ -4245,8 +3943,7 @@ "mapZone": "ABYSS", "offsetX": -0.2, "offsetY": -1.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Basin_Tunnel": { "name": "Geo_Rock-Basin_Tunnel", @@ -4259,8 +3956,7 @@ "mapZone": "ABYSS", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Basin_Grub": { "name": "Geo_Rock-Basin_Grub", @@ -4273,8 +3969,7 @@ "mapZone": "ABYSS", "offsetX": 1.4, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Basin_Before_Broken_Vessel": { "name": "Geo_Rock-Basin_Before_Broken_Vessel", @@ -4287,8 +3982,7 @@ "mapZone": "ABYSS", "offsetX": 0.8, "offsetY": -0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Cliffs_Main_1": { "name": "Geo_Rock-Cliffs_Main_1", @@ -4301,8 +3995,7 @@ "mapZone": "CLIFFS", "offsetX": 0.3, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Cliffs_Main_2": { "name": "Geo_Rock-Cliffs_Main_2", @@ -4315,8 +4008,7 @@ "mapZone": "CLIFFS", "offsetX": 0.1, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Cliffs_Main_3": { "name": "Geo_Rock-Cliffs_Main_3", @@ -4329,8 +4021,7 @@ "mapZone": "CLIFFS", "offsetX": 1.65, "offsetY": -0.5, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Cliffs_Main_4": { "name": "Geo_Rock-Cliffs_Main_4", @@ -4343,8 +4034,7 @@ "mapZone": "CLIFFS", "offsetX": 0.7, "offsetY": -1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Below_Gorb_Dupe": { "name": "Geo_Rock-Below_Gorb_Dupe", @@ -4357,8 +4047,7 @@ "mapZone": "CLIFFS", "offsetX": -1.6, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Below_Gorb": { "name": "Geo_Rock-Below_Gorb", @@ -4371,8 +4060,7 @@ "mapZone": "CLIFFS", "offsetX": -1.2, "offsetY": 0.5, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crossroads_Well": { "name": "Geo_Rock-Crossroads_Well", @@ -4385,8 +4073,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.1, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Center_Grub": { "name": "Geo_Rock-Crossroads_Center_Grub", @@ -4399,8 +4086,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Root": { "name": "Geo_Rock-Crossroads_Root", @@ -4413,8 +4099,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 1.1, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Geo_Rock-Crossroads_Root_Dupe_1": { "name": "Geo_Rock-Crossroads_Root_Dupe_1", @@ -4427,8 +4112,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.2, "offsetY": 1.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crossroads_Root_Dupe_2": { "name": "Geo_Rock-Crossroads_Root_Dupe_2", @@ -4441,8 +4125,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": 1.1, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Crossroads_Aspid_Arena": { "name": "Geo_Rock-Crossroads_Aspid_Arena", @@ -4455,8 +4138,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": 0.3, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1": { "name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_1", @@ -4469,8 +4151,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2": { "name": "Geo_Rock-Crossroads_Aspid_Arena_Dupe_2", @@ -4483,8 +4164,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Aspid_Arena_Hidden": { "name": "Geo_Rock-Crossroads_Aspid_Arena_Hidden", @@ -4497,8 +4177,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.45, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Above_False_Knight": { "name": "Geo_Rock-Crossroads_Above_False_Knight", @@ -4511,8 +4190,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 0.5, - "offsetZ": -0.99, - "isShop": false + "offsetZ": -0.99 }, "Geo_Rock-Crossroads_Before_Acid_Grub": { "name": "Geo_Rock-Crossroads_Before_Acid_Grub", @@ -4525,8 +4203,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Below_Goam_Mask_Shard": { "name": "Geo_Rock-Crossroads_Below_Goam_Mask_Shard", @@ -4539,8 +4216,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crossroads_After_Goam_Mask_Shard": { "name": "Geo_Rock-Crossroads_After_Goam_Mask_Shard", @@ -4553,8 +4229,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.6, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Above_Lever": { "name": "Geo_Rock-Crossroads_Above_Lever", @@ -4567,8 +4242,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.55, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Before_Fungal": { "name": "Geo_Rock-Crossroads_Before_Fungal", @@ -4581,8 +4255,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.1, "offsetY": 0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crossroads_Before_Fungal_Dupe_1": { "name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_1", @@ -4595,8 +4268,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.4, "offsetY": 0.2, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Crossroads_Before_Fungal_Dupe_2": { "name": "Geo_Rock-Crossroads_Before_Fungal_Dupe_2", @@ -4609,8 +4281,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.2, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Before_Shops": { "name": "Geo_Rock-Crossroads_Before_Shops", @@ -4623,8 +4294,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Before_Glowing_Womb": { "name": "Geo_Rock-Crossroads_Before_Glowing_Womb", @@ -4637,8 +4307,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.5, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Above_Tram": { "name": "Geo_Rock-Crossroads_Above_Tram", @@ -4651,8 +4320,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Above_Mawlek": { "name": "Geo_Rock-Crossroads_Above_Mawlek", @@ -4665,8 +4333,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.25, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Vessel_Fragment": { "name": "Geo_Rock-Crossroads_Vessel_Fragment", @@ -4679,8 +4346,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.5, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Goam_Alcove": { "name": "Geo_Rock-Crossroads_Goam_Alcove", @@ -4693,8 +4359,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.8, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Goam_Damage_Boost": { "name": "Geo_Rock-Crossroads_Goam_Damage_Boost", @@ -4707,8 +4372,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Tram": { "name": "Geo_Rock-Crossroads_Tram", @@ -4721,8 +4385,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Goam_Journal": { "name": "Geo_Rock-Crossroads_Goam_Journal", @@ -4735,8 +4398,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": -0.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crossroads_Goam_Journal_Dupe": { "name": "Geo_Rock-Crossroads_Goam_Journal_Dupe", @@ -4749,8 +4411,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.1, "offsetY": -0.15, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Ancestral_Mound": { "name": "Geo_Rock-Ancestral_Mound", @@ -4763,8 +4424,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": 0.2, - "offsetZ": -0.498, - "isShop": false + "offsetZ": -0.498 }, "Geo_Rock-Ancestral_Mound_Dupe": { "name": "Geo_Rock-Ancestral_Mound_Dupe", @@ -4777,8 +4437,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 0.2, - "offsetZ": -0.497, - "isShop": false + "offsetZ": -0.497 }, "Geo_Rock-Ancestral_Mound_Tree": { "name": "Geo_Rock-Ancestral_Mound_Tree", @@ -4791,8 +4450,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": 0.6, - "offsetZ": -0.495, - "isShop": false + "offsetZ": -0.495 }, "Geo_Rock-Ancestral_Mound_Tree_Dupe": { "name": "Geo_Rock-Ancestral_Mound_Tree_Dupe", @@ -4805,8 +4463,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": 0.6, - "offsetZ": -0.496, - "isShop": false + "offsetZ": -0.496 }, "Geo_Rock-Moss_Prophet": { "name": "Geo_Rock-Moss_Prophet", @@ -4819,8 +4476,7 @@ "mapZone": "WASTES", "offsetX": 0.0, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Moss_Prophet_Dupe": { "name": "Geo_Rock-Moss_Prophet_Dupe", @@ -4833,8 +4489,7 @@ "mapZone": "WASTES", "offsetX": -0.4, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Below_Mimics": { "name": "Geo_Rock-Deepnest_Below_Mimics", @@ -4847,8 +4502,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.2, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Below_Mimics_Dupe": { "name": "Geo_Rock-Deepnest_Below_Mimics_Dupe", @@ -4861,8 +4515,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.2, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Below_Spike_Grub": { "name": "Geo_Rock-Deepnest_Below_Spike_Grub", @@ -4875,8 +4528,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.6, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe": { "name": "Geo_Rock-Deepnest_Below_Spike_Grub_Dupe", @@ -4889,8 +4541,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.2, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Spike_Grub_Right": { "name": "Geo_Rock-Deepnest_Spike_Grub_Right", @@ -4903,8 +4554,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.6, "offsetY": 1.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo", @@ -4917,8 +4567,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.7, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Garpede_Pogo_Dupe", @@ -4931,8 +4580,7 @@ "mapZone": "DEEPNEST", "offsetX": 1.1, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_1", @@ -4945,8 +4593,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.2, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_2", @@ -4959,8 +4606,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.3, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_Requires_Claw_3", @@ -4973,8 +4619,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.7, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Nosk_1": { "name": "Geo_Rock-Deepnest_Nosk_1", @@ -4987,8 +4632,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.6, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Nosk_2": { "name": "Geo_Rock-Deepnest_Nosk_2", @@ -5001,8 +4645,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.2, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Nosk_3": { "name": "Geo_Rock-Deepnest_Nosk_3", @@ -5015,8 +4658,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.9, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Above_Galien": { "name": "Geo_Rock-Deepnest_Above_Galien", @@ -5029,8 +4671,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.5, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Galien_Spike": { "name": "Geo_Rock-Deepnest_Galien_Spike", @@ -5043,8 +4684,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.05, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Garpede_1": { "name": "Geo_Rock-Deepnest_Garpede_1", @@ -5057,8 +4697,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.3, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Garpede_2": { "name": "Geo_Rock-Deepnest_Garpede_2", @@ -5071,8 +4710,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.2, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Dark_Deepnest_Above_Grub_1": { "name": "Geo_Rock-Dark_Deepnest_Above_Grub_1", @@ -5085,8 +4723,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.8, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Dark_Deepnest_Above_Grub_2": { "name": "Geo_Rock-Dark_Deepnest_Above_Grub_2", @@ -5099,8 +4736,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.1, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Dark_Deepnest_Bottom_Left": { "name": "Geo_Rock-Dark_Deepnest_Bottom_Left", @@ -5113,8 +4749,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.8, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Above_Mask_Maker_1": { "name": "Geo_Rock-Above_Mask_Maker_1", @@ -5127,8 +4762,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.3, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Above_Mask_Maker_2": { "name": "Geo_Rock-Above_Mask_Maker_2", @@ -5141,8 +4775,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 0.0, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Lower_Kingdom's_Edge_1": { "name": "Geo_Rock-Lower_Kingdom's_Edge_1", @@ -5155,8 +4788,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.5, "offsetY": -0.5, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Lower_Kingdom's_Edge_2": { "name": "Geo_Rock-Lower_Kingdom's_Edge_2", @@ -5169,8 +4801,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.6, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Lower_Kingdom's_Edge_3": { "name": "Geo_Rock-Lower_Kingdom's_Edge_3", @@ -5183,8 +4814,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Lower_Kingdom's_Edge_Dive": { "name": "Geo_Rock-Lower_Kingdom's_Edge_Dive", @@ -5197,8 +4827,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Below_Bardoon": { "name": "Geo_Rock-Kingdom's_Edge_Below_Bardoon", @@ -5211,8 +4840,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.4, "offsetY": -1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Oro_Far_Left": { "name": "Geo_Rock-Kingdom's_Edge_Oro_Far_Left", @@ -5225,8 +4853,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -3.6, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left": { "name": "Geo_Rock-Kingdom's_Edge_Oro_Middle_Left", @@ -5239,8 +4866,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Above_Root": { "name": "Geo_Rock-Kingdom's_Edge_Above_Root", @@ -5253,8 +4879,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.5, "offsetY": -1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Above_Tower": { "name": "Geo_Rock-Kingdom's_Edge_Above_Tower", @@ -5267,8 +4892,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.9, "offsetY": -0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Below_Colosseum": { "name": "Geo_Rock-Kingdom's_Edge_Below_Colosseum", @@ -5281,8 +4905,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.1, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock": { "name": "Geo_Rock-Kingdom's_Edge_Above_420_Geo_Rock", @@ -5295,8 +4918,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.2, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Kingdom's_Edge_420_Geo_Rock": { "name": "Geo_Rock-Kingdom's_Edge_420_Geo_Rock", @@ -5309,8 +4931,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.6, "offsetY": -1.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Beast's_Den_Above_Trilobite": { "name": "Geo_Rock-Beast's_Den_Above_Trilobite", @@ -5323,8 +4944,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.4, "offsetY": 1.7, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe": { "name": "Geo_Rock-Beast's_Den_Above_Trilobite_Dupe", @@ -5337,8 +4957,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.4, "offsetY": 1.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Beast's_Den_Below_Herrah": { "name": "Geo_Rock-Beast's_Den_Below_Herrah", @@ -5351,8 +4970,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.8, "offsetY": 1.3, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Geo_Rock-Beast's_Den_Below_Egg": { "name": "Geo_Rock-Beast's_Den_Below_Egg", @@ -5365,8 +4983,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.8, "offsetY": 1.7, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "Geo_Rock-Beast's_Den_Below_Egg_Dupe": { "name": "Geo_Rock-Beast's_Den_Below_Egg_Dupe", @@ -5379,8 +4996,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.8, "offsetY": 1.3, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Beast's_Den_Bottom": { "name": "Geo_Rock-Beast's_Den_Bottom", @@ -5393,8 +5009,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.8, "offsetY": 1.7, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Geo_Rock-Beast's_Den_Bottom_Dupe": { "name": "Geo_Rock-Beast's_Den_Bottom_Dupe", @@ -5407,8 +5022,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.4, "offsetY": 1.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Beast's_Den_After_Herrah": { "name": "Geo_Rock-Beast's_Den_After_Herrah", @@ -5421,8 +5035,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.4, "offsetY": 1.7, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Greenpath_Entrance": { "name": "Geo_Rock-Greenpath_Entrance", @@ -5435,8 +5048,7 @@ "mapZone": "GREEN_PATH", "offsetX": -1.1, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Waterfall": { "name": "Geo_Rock-Greenpath_Waterfall", @@ -5449,8 +5061,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.3, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Below_Skip_Squit": { "name": "Geo_Rock-Greenpath_Below_Skip_Squit", @@ -5463,8 +5074,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.0, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Skip_Squit": { "name": "Geo_Rock-Greenpath_Skip_Squit", @@ -5477,8 +5087,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Second_Skip_Fool_Eater": { "name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater", @@ -5491,8 +5100,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.7, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe": { "name": "Geo_Rock-Greenpath_Second_Skip_Fool_Eater_Dupe", @@ -5505,8 +5113,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.3, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Second_Skip_Lower": { "name": "Geo_Rock-Greenpath_Second_Skip_Lower", @@ -5519,8 +5126,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.7, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Below_Hornet": { "name": "Geo_Rock-Greenpath_Below_Hornet", @@ -5533,8 +5139,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.25, "offsetY": -0.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Greenpath_Above_Thorns": { "name": "Geo_Rock-Greenpath_Above_Thorns", @@ -5547,8 +5152,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.1, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Hunter's_Journal": { "name": "Geo_Rock-Greenpath_Hunter's_Journal", @@ -5561,8 +5165,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.5, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Acid_Bridge": { "name": "Geo_Rock-Greenpath_Acid_Bridge", @@ -5575,8 +5178,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.0, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_After_MMC_Hidden": { "name": "Geo_Rock-Greenpath_After_MMC_Hidden", @@ -5589,8 +5191,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.2, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_After_MMC": { "name": "Geo_Rock-Greenpath_After_MMC", @@ -5603,8 +5204,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_After_MMC_Dupe": { "name": "Geo_Rock-Greenpath_After_MMC_Dupe", @@ -5617,8 +5217,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Obbles_Fool_Eater": { "name": "Geo_Rock-Greenpath_Obbles_Fool_Eater", @@ -5631,8 +5230,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.7, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Moss_Knights": { "name": "Geo_Rock-Greenpath_Moss_Knights", @@ -5645,8 +5243,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.6, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Moss_Knights_Dupe_1": { "name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_1", @@ -5659,8 +5256,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.6, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Greenpath_Moss_Knights_Dupe_2": { "name": "Geo_Rock-Greenpath_Moss_Knights_Dupe_2", @@ -5673,8 +5269,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.6, "offsetY": -0.4, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Greenpath_Below_Stag": { "name": "Geo_Rock-Greenpath_Below_Stag", @@ -5687,8 +5282,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Below_Stag_Fool_Eater": { "name": "Geo_Rock-Greenpath_Below_Stag_Fool_Eater", @@ -5701,8 +5295,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": -1.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Baldur_Shell_Top_Left": { "name": "Geo_Rock-Baldur_Shell_Top_Left", @@ -5715,8 +5308,7 @@ "mapZone": "CLIFFS", "offsetX": -1.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Baldur_Shell_Alcove": { "name": "Geo_Rock-Baldur_Shell_Alcove", @@ -5729,8 +5321,7 @@ "mapZone": "CLIFFS", "offsetX": -0.7, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_MMC": { "name": "Geo_Rock-Greenpath_MMC", @@ -5743,8 +5334,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.4, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Below_Toll": { "name": "Geo_Rock-Greenpath_Below_Toll", @@ -5757,8 +5347,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": -1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Toll_Hidden": { "name": "Geo_Rock-Greenpath_Toll_Hidden", @@ -5771,8 +5360,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Greenpath_Toll_Hidden_Dupe": { "name": "Geo_Rock-Greenpath_Toll_Hidden_Dupe", @@ -5785,8 +5373,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Fungal_Below_Shrumal_Ogres": { "name": "Geo_Rock-Fungal_Below_Shrumal_Ogres", @@ -5799,8 +5386,7 @@ "mapZone": "WASTES", "offsetX": 0.2, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_Above_Cloth": { "name": "Geo_Rock-Fungal_Above_Cloth", @@ -5813,8 +5399,7 @@ "mapZone": "WASTES", "offsetX": -0.25, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_After_Cloth": { "name": "Geo_Rock-Fungal_After_Cloth", @@ -5827,8 +5412,7 @@ "mapZone": "WASTES", "offsetX": 0.7, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_Below_Pilgrim's_Way": { "name": "Geo_Rock-Fungal_Below_Pilgrim's_Way", @@ -5841,8 +5425,7 @@ "mapZone": "WASTES", "offsetX": 0.3, "offsetY": 0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe": { "name": "Geo_Rock-Fungal_Below_Pilgrim's_Way_Dupe", @@ -5855,8 +5438,7 @@ "mapZone": "WASTES", "offsetX": 0.0, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Mantis_Outskirts_Guarded": { "name": "Geo_Rock-Mantis_Outskirts_Guarded", @@ -5869,8 +5451,7 @@ "mapZone": "WASTES", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Mantis_Outskirts_Guarded_Dupe": { "name": "Geo_Rock-Mantis_Outskirts_Guarded_Dupe", @@ -5883,8 +5464,7 @@ "mapZone": "WASTES", "offsetX": -0.1, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Mantis_Outskirts_Alcove": { "name": "Geo_Rock-Mantis_Outskirts_Alcove", @@ -5897,8 +5477,7 @@ "mapZone": "WASTES", "offsetX": 0.1, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Mantis_Village_After_Lever": { "name": "Geo_Rock-Mantis_Village_After_Lever", @@ -5911,8 +5490,7 @@ "mapZone": "WASTES", "offsetX": -0.5, "offsetY": -0.1, - "offsetZ": -0.95, - "isShop": false + "offsetZ": -0.95 }, "Geo_Rock-Mantis_Village_Above_Claw": { "name": "Geo_Rock-Mantis_Village_Above_Claw", @@ -5925,8 +5503,7 @@ "mapZone": "WASTES", "offsetX": -1.4, "offsetY": 0.3, - "offsetZ": -0.98, - "isShop": false + "offsetZ": -0.98 }, "Geo_Rock-Mantis_Village_Above_Claw_Dupe": { "name": "Geo_Rock-Mantis_Village_Above_Claw_Dupe", @@ -5939,8 +5516,7 @@ "mapZone": "WASTES", "offsetX": -1.8, "offsetY": 0.3, - "offsetZ": -0.97, - "isShop": false + "offsetZ": -0.97 }, "Geo_Rock-Mantis_Village_Below_Lore": { "name": "Geo_Rock-Mantis_Village_Below_Lore", @@ -5953,8 +5529,7 @@ "mapZone": "WASTES", "offsetX": -1.0, "offsetY": -0.1, - "offsetZ": -1.0, - "isShop": false + "offsetZ": -1.0 }, "Geo_Rock-Mantis_Village_Above_Lever": { "name": "Geo_Rock-Mantis_Village_Above_Lever", @@ -5967,8 +5542,7 @@ "mapZone": "WASTES", "offsetX": -0.1, "offsetY": 0.3, - "offsetZ": -0.99, - "isShop": false + "offsetZ": -0.99 }, "Geo_Rock-Above_Mantis_Lords_1": { "name": "Geo_Rock-Above_Mantis_Lords_1", @@ -5979,10 +5553,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "WASTES", - "offsetX": 0.0, - "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetX": -0.8, + "offsetY": -0.4, + "offsetZ": 0.0 }, "Geo_Rock-Above_Mantis_Lords_2": { "name": "Geo_Rock-Above_Mantis_Lords_2", @@ -5993,10 +5566,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "WASTES", - "offsetX": -0.4, - "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetX": 0.0, + "offsetY": -0.1, + "offsetZ": 0.0 }, "Geo_Rock-Fungal_After_Bouncy_Grub": { "name": "Geo_Rock-Fungal_After_Bouncy_Grub", @@ -6009,8 +5581,7 @@ "mapZone": "WASTES", "offsetX": 0.5, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe": { "name": "Geo_Rock-Fungal_After_Bouncy_Grub_Dupe", @@ -6023,8 +5594,7 @@ "mapZone": "WASTES", "offsetX": 0.8, "offsetY": 0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Fungal_Bouncy_Grub_Lever": { "name": "Geo_Rock-Fungal_Bouncy_Grub_Lever", @@ -6037,8 +5607,7 @@ "mapZone": "WASTES", "offsetX": -0.1, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_After_Cornifer": { "name": "Geo_Rock-Fungal_After_Cornifer", @@ -6051,8 +5620,7 @@ "mapZone": "WASTES", "offsetX": -0.1, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_Above_City_Entrance": { "name": "Geo_Rock-Fungal_Above_City_Entrance", @@ -6065,8 +5633,7 @@ "mapZone": "WASTES", "offsetX": 0.5, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_1": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_1", @@ -6079,8 +5646,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.6, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_By_Mantis_Lords_2": { "name": "Geo_Rock-Deepnest_By_Mantis_Lords_2", @@ -6093,8 +5659,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.2, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Deepnest_Lower_Cornifer": { "name": "Geo_Rock-Deepnest_Lower_Cornifer", @@ -6107,8 +5672,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.2, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_Core_Entrance": { "name": "Geo_Rock-Fungal_Core_Entrance", @@ -6121,8 +5685,7 @@ "mapZone": "WASTES", "offsetX": 0.1, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fungal_Core_Hidden": { "name": "Geo_Rock-Fungal_Core_Hidden", @@ -6135,8 +5698,7 @@ "mapZone": "WASTES", "offsetX": 0.0, "offsetY": 0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Fungal_Core_Above_Elder": { "name": "Geo_Rock-Fungal_Core_Above_Elder", @@ -6149,8 +5711,7 @@ "mapZone": "WASTES", "offsetX": 0.4, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Queen's_Gardens_Acid_Entrance": { "name": "Geo_Rock-Queen's_Gardens_Acid_Entrance", @@ -6163,8 +5724,7 @@ "mapZone": "FOG_CANYON", "offsetX": 1.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Queen's_Gardens_Below_Stag": { "name": "Geo_Rock-Queen's_Gardens_Below_Stag", @@ -6177,8 +5737,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.5, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fog_Canyon_East": { "name": "Geo_Rock-Fog_Canyon_East", @@ -6191,8 +5750,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Love_Key": { "name": "Geo_Rock-Love_Key", @@ -6205,8 +5763,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Love_Key_Dupe": { "name": "Geo_Rock-Love_Key_Dupe", @@ -6219,8 +5776,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -1.1, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Queen's_Gardens_Above_Marmu": { "name": "Geo_Rock-Queen's_Gardens_Above_Marmu", @@ -6233,8 +5789,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -0.2, "offsetY": -1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Pale_Lurker": { "name": "Geo_Rock-Pale_Lurker", @@ -6247,8 +5802,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Godhome_Pipeway": { "name": "Geo_Rock-Godhome_Pipeway", @@ -6261,8 +5815,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.2, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Entrance": { "name": "Geo_Rock-Hive_Entrance", @@ -6275,8 +5828,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.0, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Outside_Bench": { "name": "Geo_Rock-Hive_Outside_Bench", @@ -6289,8 +5841,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.7, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Below_Root": { "name": "Geo_Rock-Hive_Below_Root", @@ -6303,8 +5854,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.9, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_After_Root": { "name": "Geo_Rock-Hive_After_Root", @@ -6317,8 +5867,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.4, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Below_Stash": { "name": "Geo_Rock-Hive_Below_Stash", @@ -6331,8 +5880,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.8, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Stash": { "name": "Geo_Rock-Hive_Stash", @@ -6345,8 +5893,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.4, "offsetY": 1.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Stash_Dupe": { "name": "Geo_Rock-Hive_Stash_Dupe", @@ -6359,8 +5906,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.4, "offsetY": 0.6, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Hive_Below_Grub": { "name": "Geo_Rock-Hive_Below_Grub", @@ -6373,8 +5919,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hive_Above_Mask": { "name": "Geo_Rock-Hive_Above_Mask", @@ -6387,8 +5932,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Lower_Middle": { "name": "Geo_Rock-Crystal_Peak_Lower_Middle", @@ -6401,8 +5945,7 @@ "mapZone": "MINES", "offsetX": 1.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Lower_Conveyer_1": { "name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_1", @@ -6415,8 +5958,7 @@ "mapZone": "MINES", "offsetX": -0.2, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Lower_Conveyer_2": { "name": "Geo_Rock-Crystal_Peak_Lower_Conveyer_2", @@ -6429,8 +5971,7 @@ "mapZone": "MINES", "offsetX": 0.2, "offsetY": -0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Before_Dark_Room": { "name": "Geo_Rock-Crystal_Peak_Before_Dark_Room", @@ -6443,8 +5984,7 @@ "mapZone": "MINES", "offsetX": 0.1, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe": { "name": "Geo_Rock-Crystal_Peak_Before_Dark_Room_Dupe", @@ -6457,8 +5997,7 @@ "mapZone": "MINES", "offsetX": 0.1, "offsetY": -0.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Above_Spike_Grub": { "name": "Geo_Rock-Crystal_Peak_Above_Spike_Grub", @@ -6471,8 +6010,7 @@ "mapZone": "MINES", "offsetX": -0.3, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Mimic_Grub": { "name": "Geo_Rock-Crystal_Peak_Mimic_Grub", @@ -6485,8 +6023,7 @@ "mapZone": "MINES", "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Dive_Egg": { "name": "Geo_Rock-Crystal_Peak_Dive_Egg", @@ -6499,8 +6036,7 @@ "mapZone": "MINES", "offsetX": -0.4, "offsetY": 1.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe": { "name": "Geo_Rock-Crystal_Peak_Dive_Egg_Dupe", @@ -6513,8 +6049,7 @@ "mapZone": "MINES", "offsetX": -0.1, "offsetY": 1.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Conga_Line": { "name": "Geo_Rock-Crystal_Peak_Conga_Line", @@ -6527,8 +6062,7 @@ "mapZone": "MINES", "offsetX": 0.6, "offsetY": 1.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hallownest_Crown_Dive": { "name": "Geo_Rock-Hallownest_Crown_Dive", @@ -6541,8 +6075,7 @@ "mapZone": "MINES", "offsetX": -0.8, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hallownest_Crown_Dive_Dupe": { "name": "Geo_Rock-Hallownest_Crown_Dive_Dupe", @@ -6555,8 +6088,7 @@ "mapZone": "MINES", "offsetX": -0.5, "offsetY": -0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Hallownest_Crown_Hidden": { "name": "Geo_Rock-Hallownest_Crown_Hidden", @@ -6569,8 +6101,7 @@ "mapZone": "MINES", "offsetX": -0.5, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1": { "name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_1", @@ -6583,8 +6114,7 @@ "mapZone": "MINES", "offsetX": -0.2, "offsetY": 0.5, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2": { "name": "Geo_Rock-Hallownest_Crown_Hidden_Dupe_2", @@ -6597,8 +6127,7 @@ "mapZone": "MINES", "offsetX": 0.1, "offsetY": 0.5, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Crystal_Peak_Before_Crystal_Heart": { "name": "Geo_Rock-Crystal_Peak_Before_Crystal_Heart", @@ -6611,8 +6140,7 @@ "mapZone": "MINES", "offsetX": -2.2, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Entrance": { "name": "Geo_Rock-Crystal_Peak_Entrance", @@ -6625,8 +6153,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Crystal_Peak_Entrance_Dupe_1": { "name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_1", @@ -6639,8 +6166,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Crystal_Peak_Entrance_Dupe_2": { "name": "Geo_Rock-Crystal_Peak_Entrance_Dupe_2", @@ -6653,8 +6179,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Above_Crushers_Lower": { "name": "Geo_Rock-Crystal_Peak_Above_Crushers_Lower", @@ -6667,8 +6192,7 @@ "mapZone": "MINES", "offsetX": -0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Crystal_Peak_Above_Crushers_Higher": { "name": "Geo_Rock-Crystal_Peak_Above_Crushers_Higher", @@ -6681,8 +6205,7 @@ "mapZone": "MINES", "offsetX": -0.4, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Resting_Grounds_Catacombs_Grub": { "name": "Geo_Rock-Resting_Grounds_Catacombs_Grub", @@ -6695,8 +6218,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe": { "name": "Geo_Rock-Resting_Grounds_Catacombs_Left_Dupe", @@ -6709,8 +6231,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -1.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Resting_Grounds_Catacombs_Left": { "name": "Geo_Rock-Resting_Grounds_Catacombs_Left", @@ -6723,8 +6244,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": -0.8, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-Overgrown_Mound": { "name": "Geo_Rock-Overgrown_Mound", @@ -6737,8 +6257,7 @@ "mapZone": "FOG_CANYON", "offsetX": -1.0, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fluke_Hermit_Dupe": { "name": "Geo_Rock-Fluke_Hermit_Dupe", @@ -6751,8 +6270,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.0, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Fluke_Hermit": { "name": "Geo_Rock-Fluke_Hermit", @@ -6765,8 +6283,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.6, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Pleasure_House": { "name": "Geo_Rock-Pleasure_House", @@ -6779,8 +6296,7 @@ "mapZone": "CITY", "offsetX": -0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-City_of_Tears_Quirrel": { "name": "Geo_Rock-City_of_Tears_Quirrel", @@ -6793,8 +6309,7 @@ "mapZone": "CITY", "offsetX": -0.8, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-City_of_Tears_Lemm": { "name": "Geo_Rock-City_of_Tears_Lemm", @@ -6805,10 +6320,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": -0.5, + "offsetX": -0.7, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-City_of_Tears_Above_Lemm": { "name": "Geo_Rock-City_of_Tears_Above_Lemm", @@ -6821,8 +6335,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Soul_Sanctum": { "name": "Geo_Rock-Soul_Sanctum", @@ -6833,10 +6346,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": 0.2, + "offsetX": 0.1, "offsetY": 0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Watcher's_Spire": { "name": "Geo_Rock-Watcher's_Spire", @@ -6849,8 +6361,7 @@ "mapZone": "CITY", "offsetX": -0.9, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Above_King's_Station": { "name": "Geo_Rock-Above_King's_Station", @@ -6863,8 +6374,7 @@ "mapZone": "CITY", "offsetX": -0.2, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-King's_Station": { "name": "Geo_Rock-King's_Station", @@ -6877,8 +6387,7 @@ "mapZone": "CITY", "offsetX": 0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-King's_Pass_Left": { "name": "Geo_Rock-King's_Pass_Left", @@ -6891,8 +6400,7 @@ "mapZone": "TOWN", "offsetX": -1.9, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-King's_Pass_Below_Fury": { "name": "Geo_Rock-King's_Pass_Below_Fury", @@ -6905,8 +6413,7 @@ "mapZone": "TOWN", "offsetX": 0.9, "offsetY": -0.8, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-King's_Pass_Hidden": { "name": "Geo_Rock-King's_Pass_Hidden", @@ -6919,8 +6426,7 @@ "mapZone": "TOWN", "offsetX": -1.25, "offsetY": -0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-King's_Pass_Collapse": { "name": "Geo_Rock-King's_Pass_Collapse", @@ -6933,8 +6439,7 @@ "mapZone": "TOWN", "offsetX": -0.1, "offsetY": 0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Geo_Rock-King's_Pass_Above_Fury": { "name": "Geo_Rock-King's_Pass_Above_Fury", @@ -6947,8 +6452,7 @@ "mapZone": "TOWN", "offsetX": 1.3, "offsetY": -0.4, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Geo_Rock-Waterways_Tuk": { "name": "Geo_Rock-Waterways_Tuk", @@ -6961,8 +6465,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.6, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Waterways_Tuk_Alcove": { "name": "Geo_Rock-Waterways_Tuk_Alcove", @@ -6975,8 +6478,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.7, "offsetY": 0.05, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Waterways_Left": { "name": "Geo_Rock-Waterways_Left", @@ -6989,8 +6491,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.5, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Waterways_East": { "name": "Geo_Rock-Waterways_East", @@ -7003,8 +6504,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.0, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Geo_Rock-Waterways_Flukemarm": { "name": "Geo_Rock-Waterways_Flukemarm", @@ -7017,8 +6517,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Geo-Massive_Moss_Charger": { "name": "Boss_Geo-Massive_Moss_Charger", @@ -7031,8 +6530,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Geo-Gorgeous_Husk": { "name": "Boss_Geo-Gorgeous_Husk", @@ -7045,8 +6543,7 @@ "mapZone": "CITY", "offsetX": -0.1, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Geo-Sanctum_Soul_Warrior": { "name": "Boss_Geo-Sanctum_Soul_Warrior", @@ -7057,10 +6554,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": -0.2, - "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetX": 0.1, + "offsetY": 0.8, + "offsetZ": 0.0 }, "Boss_Geo-Elegant_Soul_Warrior": { "name": "Boss_Geo-Elegant_Soul_Warrior", @@ -7073,8 +6569,7 @@ "mapZone": "CITY", "offsetX": -0.1, "offsetY": -0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Boss_Geo-Crystal_Guardian": { "name": "Boss_Geo-Crystal_Guardian", @@ -7087,8 +6582,7 @@ "mapZone": "MINES", "offsetX": -0.1, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Geo-Enraged_Guardian": { "name": "Boss_Geo-Enraged_Guardian", @@ -7101,8 +6595,7 @@ "mapZone": "MINES", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Boss_Geo-Gruz_Mother": { "name": "Boss_Geo-Gruz_Mother", @@ -7115,8 +6608,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Boss_Geo-Vengefly_King": { "name": "Boss_Geo-Vengefly_King", @@ -7129,8 +6621,7 @@ "mapZone": "GREEN_PATH", "offsetX": -1.0, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Basin": { "name": "Soul_Totem-Basin", @@ -7143,8 +6634,7 @@ "mapZone": "ABYSS", "offsetX": -1.0, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Cliffs_Main": { "name": "Soul_Totem-Cliffs_Main", @@ -7157,8 +6647,7 @@ "mapZone": "CLIFFS", "offsetX": 1.45, "offsetY": -1.9, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-Cliffs_Gorb": { "name": "Soul_Totem-Cliffs_Gorb", @@ -7171,8 +6660,7 @@ "mapZone": "CLIFFS", "offsetX": -2.3, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Cliffs_Joni's": { "name": "Soul_Totem-Cliffs_Joni's", @@ -7185,8 +6673,7 @@ "mapZone": "CLIFFS", "offsetX": 0.4, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crossroads_Goam_Journal": { "name": "Soul_Totem-Crossroads_Goam_Journal", @@ -7199,8 +6686,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.2, "offsetY": -0.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-Crossroads_Shops": { "name": "Soul_Totem-Crossroads_Shops", @@ -7213,8 +6699,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crossroads_Mawlek_Upper": { "name": "Soul_Totem-Crossroads_Mawlek_Upper", @@ -7227,8 +6712,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.5, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crossroads_Acid": { "name": "Soul_Totem-Crossroads_Acid", @@ -7241,8 +6725,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crossroads_Mawlek_Lower": { "name": "Soul_Totem-Crossroads_Mawlek_Lower", @@ -7255,8 +6738,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.3, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crossroads_Myla": { "name": "Soul_Totem-Crossroads_Myla", @@ -7269,8 +6751,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.0, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Ancestral_Mound": { "name": "Soul_Totem-Ancestral_Mound", @@ -7283,8 +6764,7 @@ "mapZone": "CROSSROADS", "offsetX": 0.4, "offsetY": -0.2, - "offsetZ": -0.499, - "isShop": false + "offsetZ": -0.499 }, "Soul_Totem-Distant_Village": { "name": "Soul_Totem-Distant_Village", @@ -7297,8 +6777,7 @@ "mapZone": "DEEPNEST", "offsetX": -1.0, "offsetY": -1.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Deepnest_Vessel": { "name": "Soul_Totem-Deepnest_Vessel", @@ -7311,8 +6790,7 @@ "mapZone": "DEEPNEST", "offsetX": 2.0, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Mask_Maker": { "name": "Soul_Totem-Mask_Maker", @@ -7325,8 +6803,7 @@ "mapZone": "DEEPNEST", "offsetX": -0.35, "offsetY": -1.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Lower_Kingdom's_Edge_1": { "name": "Soul_Totem-Lower_Kingdom's_Edge_1", @@ -7339,8 +6816,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.5, "offsetY": -0.9, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Lower_Kingdom's_Edge_2": { "name": "Soul_Totem-Lower_Kingdom's_Edge_2", @@ -7353,8 +6829,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -0.05, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Upper_Kingdom's_Edge": { "name": "Soul_Totem-Upper_Kingdom's_Edge", @@ -7367,8 +6842,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.7, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Kingdom's_Edge_Camp": { "name": "Soul_Totem-Kingdom's_Edge_Camp", @@ -7381,8 +6855,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.25, "offsetY": 0.9, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Oro_Dive_2": { "name": "Soul_Totem-Oro_Dive_2", @@ -7395,8 +6868,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.8, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Oro_Dive_1": { "name": "Soul_Totem-Oro_Dive_1", @@ -7409,8 +6881,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.2, "offsetY": 0.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-Oro": { "name": "Soul_Totem-Oro", @@ -7423,8 +6894,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 0.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-420_Geo_Rock": { "name": "Soul_Totem-420_Geo_Rock", @@ -7437,8 +6907,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 2.0, "offsetY": -1.0, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-Beast's_Den": { "name": "Soul_Totem-Beast's_Den", @@ -7451,8 +6920,7 @@ "mapZone": "DEEPNEST", "offsetX": 0.4, "offsetY": 2.1, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "Soul_Totem-Greenpath_Hunter's_Journal": { "name": "Soul_Totem-Greenpath_Hunter's_Journal", @@ -7465,8 +6933,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.5, "offsetY": 0.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-Greenpath_MMC": { "name": "Soul_Totem-Greenpath_MMC", @@ -7479,8 +6946,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.4, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Greenpath_Below_Toll": { "name": "Soul_Totem-Greenpath_Below_Toll", @@ -7493,8 +6959,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.9, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Before_Pilgrim's_Way": { "name": "Soul_Totem-Before_Pilgrim's_Way", @@ -7507,8 +6972,7 @@ "mapZone": "WASTES", "offsetX": 0.45, "offsetY": -0.25, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Pilgrim's_Way": { "name": "Soul_Totem-Pilgrim's_Way", @@ -7521,8 +6985,7 @@ "mapZone": "WASTES", "offsetX": -0.2, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Fungal_Core": { "name": "Soul_Totem-Fungal_Core", @@ -7535,8 +6998,7 @@ "mapZone": "WASTES", "offsetX": -0.8, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Top_Left_Queen's_Gardens": { "name": "Soul_Totem-Top_Left_Queen's_Gardens", @@ -7549,8 +7011,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": 0.7, "offsetY": 0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Below_Marmu": { "name": "Soul_Totem-Below_Marmu", @@ -7563,8 +7024,7 @@ "mapZone": "ROYAL_GARDENS", "offsetX": -1.4, "offsetY": -0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Upper_Crystal_Peak": { "name": "Soul_Totem-Upper_Crystal_Peak", @@ -7577,8 +7037,7 @@ "mapZone": "MINES", "offsetX": -0.3, "offsetY": -0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Hallownest_Crown": { "name": "Soul_Totem-Hallownest_Crown", @@ -7591,8 +7050,7 @@ "mapZone": "MINES", "offsetX": 0.1, "offsetY": -0.75, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Outside_Crystallized_Mound": { "name": "Soul_Totem-Outside_Crystallized_Mound", @@ -7605,8 +7063,7 @@ "mapZone": "MINES", "offsetX": 1.2, "offsetY": 0.8, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-Crystal_Heart_1": { "name": "Soul_Totem-Crystal_Heart_1", @@ -7619,8 +7076,7 @@ "mapZone": "MINES", "offsetX": -0.9, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crystal_Heart_2": { "name": "Soul_Totem-Crystal_Heart_2", @@ -7633,8 +7089,7 @@ "mapZone": "MINES", "offsetX": 2.6, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Crystallized_Mound": { "name": "Soul_Totem-Crystallized_Mound", @@ -7647,8 +7102,7 @@ "mapZone": "MINES", "offsetX": 0.8, "offsetY": 0.8, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-Resting_Grounds": { "name": "Soul_Totem-Resting_Grounds", @@ -7661,8 +7115,7 @@ "mapZone": "RESTING_GROUNDS", "offsetX": 0.25, "offsetY": -0.35, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Below_Xero": { "name": "Soul_Totem-Below_Xero", @@ -7674,9 +7127,8 @@ "pinScene": null, "mapZone": "RESTING_GROUNDS", "offsetX": -1.0, - "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetY": -0.1, + "offsetZ": 0.0 }, "Soul_Totem-Sanctum_Below_Soul_Master": { "name": "Soul_Totem-Sanctum_Below_Soul_Master", @@ -7689,8 +7141,7 @@ "mapZone": "CITY", "offsetX": 0.7, "offsetY": -0.7, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-Sanctum_Below_Chest": { "name": "Soul_Totem-Sanctum_Below_Chest", @@ -7702,9 +7153,8 @@ "pinScene": null, "mapZone": "CITY", "offsetX": -0.4, - "offsetY": 0.9, - "offsetZ": 0.001, - "isShop": false + "offsetY": 0.8, + "offsetZ": 0.001 }, "Soul_Totem-Sanctum_Above_Grub": { "name": "Soul_Totem-Sanctum_Above_Grub", @@ -7715,10 +7165,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": -0.45, - "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetX": -0.4, + "offsetY": -0.4, + "offsetZ": 0.0 }, "Soul_Totem-Waterways_Entrance": { "name": "Soul_Totem-Waterways_Entrance", @@ -7731,8 +7180,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.4, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Top_Left_Waterways": { "name": "Soul_Totem-Top_Left_Waterways", @@ -7745,8 +7193,7 @@ "mapZone": "WATERWAYS", "offsetX": -1.3, "offsetY": 0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Waterways_East": { "name": "Soul_Totem-Waterways_East", @@ -7759,8 +7206,7 @@ "mapZone": "WATERWAYS", "offsetX": -0.9, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Waterways_Flukemarm": { "name": "Soul_Totem-Waterways_Flukemarm", @@ -7773,8 +7219,7 @@ "mapZone": "WATERWAYS", "offsetX": 1.2, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-White_Palace_Entrance": { "name": "Soul_Totem-White_Palace_Entrance", @@ -7787,8 +7232,7 @@ "mapZone": "ABYSS", "offsetX": -1.2, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-White_Palace_Hub": { "name": "Soul_Totem-White_Palace_Hub", @@ -7801,8 +7245,7 @@ "mapZone": "ABYSS", "offsetX": -0.8, "offsetY": -0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-White_Palace_Left": { "name": "Soul_Totem-White_Palace_Left", @@ -7815,8 +7258,7 @@ "mapZone": "ABYSS", "offsetX": -0.4, "offsetY": -0.2, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-White_Palace_Final": { "name": "Soul_Totem-White_Palace_Final", @@ -7829,8 +7271,7 @@ "mapZone": "ABYSS", "offsetX": 0.0, "offsetY": -0.2, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Soul_Totem-White_Palace_Right": { "name": "Soul_Totem-White_Palace_Right", @@ -7843,8 +7284,7 @@ "mapZone": "ABYSS", "offsetX": 0.4, "offsetY": -0.2, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "Soul_Totem-Path_of_Pain_Below_Lever": { "name": "Soul_Totem-Path_of_Pain_Below_Lever", @@ -7857,8 +7297,7 @@ "mapZone": "ABYSS", "offsetX": -1.4, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Soul_Totem-Path_of_Pain_Left_of_Lever": { "name": "Soul_Totem-Path_of_Pain_Left_of_Lever", @@ -7871,8 +7310,7 @@ "mapZone": "ABYSS", "offsetX": -1.0, "offsetY": 0.3, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Soul_Totem-Path_of_Pain_Entrance": { "name": "Soul_Totem-Path_of_Pain_Entrance", @@ -7885,8 +7323,7 @@ "mapZone": "ABYSS", "offsetX": -0.6, "offsetY": 0.3, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Soul_Totem-Path_of_Pain_Second": { "name": "Soul_Totem-Path_of_Pain_Second", @@ -7899,8 +7336,7 @@ "mapZone": "ABYSS", "offsetX": -0.2, "offsetY": 0.3, - "offsetZ": 0.003, - "isShop": false + "offsetZ": 0.003 }, "Soul_Totem-Path_of_Pain_Hidden": { "name": "Soul_Totem-Path_of_Pain_Hidden", @@ -7913,8 +7349,7 @@ "mapZone": "ABYSS", "offsetX": 0.2, "offsetY": 0.3, - "offsetZ": 0.004, - "isShop": false + "offsetZ": 0.004 }, "Soul_Totem-Path_of_Pain_Below_Thornskip": { "name": "Soul_Totem-Path_of_Pain_Below_Thornskip", @@ -7927,8 +7362,7 @@ "mapZone": "ABYSS", "offsetX": 0.6, "offsetY": 0.3, - "offsetZ": 0.005, - "isShop": false + "offsetZ": 0.005 }, "Soul_Totem-Path_of_Pain_Final": { "name": "Soul_Totem-Path_of_Pain_Final", @@ -7941,8 +7375,7 @@ "mapZone": "ABYSS", "offsetX": 1.0, "offsetY": 0.3, - "offsetZ": 0.006, - "isShop": false + "offsetZ": 0.006 }, "Soul_Totem-Pale_Lurker": { "name": "Soul_Totem-Pale_Lurker", @@ -7955,8 +7388,7 @@ "mapZone": "OUTSKIRTS", "offsetX": -1.1, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-City_Entrance": { "name": "Lore_Tablet-City_Entrance", @@ -7969,8 +7401,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Pleasure_House": { "name": "Lore_Tablet-Pleasure_House", @@ -7983,8 +7414,7 @@ "mapZone": "CITY", "offsetX": 0.4, "offsetY": -1.0, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lore_Tablet-Sanctum_Entrance": { "name": "Lore_Tablet-Sanctum_Entrance", @@ -7995,10 +7425,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": 0.2, - "offsetY": 0.6, - "offsetZ": 0.001, - "isShop": false + "offsetX": 0.5, + "offsetY": 0.5, + "offsetZ": 0.001 }, "Lore_Tablet-Sanctum_Past_Soul_Master": { "name": "Lore_Tablet-Sanctum_Past_Soul_Master", @@ -8009,10 +7438,9 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CITY", - "offsetX": 0.2, - "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetX": 0.5, + "offsetY": 0.8, + "offsetZ": 0.0 }, "Lore_Tablet-Watcher's_Spire": { "name": "Lore_Tablet-Watcher's_Spire", @@ -8025,8 +7453,7 @@ "mapZone": "CITY", "offsetX": 0.0, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Archives_Upper": { "name": "Lore_Tablet-Archives_Upper", @@ -8039,8 +7466,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.19, "offsetY": 0.25, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lore_Tablet-Archives_Left": { "name": "Lore_Tablet-Archives_Left", @@ -8053,8 +7479,7 @@ "mapZone": "FOG_CANYON", "offsetX": -0.21, "offsetY": 0.25, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Lore_Tablet-Archives_Right": { "name": "Lore_Tablet-Archives_Right", @@ -8067,8 +7492,7 @@ "mapZone": "FOG_CANYON", "offsetX": 0.59, "offsetY": 0.25, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Lore_Tablet-Pilgrim's_Way_1": { "name": "Lore_Tablet-Pilgrim's_Way_1", @@ -8081,8 +7505,7 @@ "mapZone": "CROSSROADS", "offsetX": 1.4, "offsetY": 0.0, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Pilgrim's_Way_2": { "name": "Lore_Tablet-Pilgrim's_Way_2", @@ -8095,8 +7518,7 @@ "mapZone": "WASTES", "offsetX": -1.3, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Mantis_Outskirts": { "name": "Lore_Tablet-Mantis_Outskirts", @@ -8109,8 +7531,7 @@ "mapZone": "WASTES", "offsetX": 1.7, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Mantis_Village": { "name": "Lore_Tablet-Mantis_Village", @@ -8123,8 +7544,7 @@ "mapZone": "WASTES", "offsetX": -1.0, "offsetY": 0.3, - "offsetZ": -0.97, - "isShop": false + "offsetZ": -0.97 }, "Lore_Tablet-Greenpath_Upper_Hidden": { "name": "Lore_Tablet-Greenpath_Upper_Hidden", @@ -8137,8 +7557,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.7, "offsetY": 0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Greenpath_Below_Toll": { "name": "Lore_Tablet-Greenpath_Below_Toll", @@ -8151,8 +7570,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.3, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Greenpath_Lifeblood": { "name": "Lore_Tablet-Greenpath_Lifeblood", @@ -8165,8 +7583,7 @@ "mapZone": "GREEN_PATH", "offsetX": -0.5, "offsetY": 0.1, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lore_Tablet-Greenpath_Stag": { "name": "Lore_Tablet-Greenpath_Stag", @@ -8179,8 +7596,7 @@ "mapZone": "GREEN_PATH", "offsetX": 0.9, "offsetY": 0.4, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lore_Tablet-Greenpath_QG": { "name": "Lore_Tablet-Greenpath_QG", @@ -8193,8 +7609,7 @@ "mapZone": "GREEN_PATH", "offsetX": -1.3, "offsetY": -0.2, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Greenpath_Lower_Hidden": { "name": "Lore_Tablet-Greenpath_Lower_Hidden", @@ -8207,8 +7622,7 @@ "mapZone": "GREEN_PATH", "offsetX": 1.2, "offsetY": -0.14, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Dung_Defender": { "name": "Lore_Tablet-Dung_Defender", @@ -8221,8 +7635,7 @@ "mapZone": "WATERWAYS", "offsetX": 0.9, "offsetY": -0.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Spore_Shroom": { "name": "Lore_Tablet-Spore_Shroom", @@ -8235,8 +7648,7 @@ "mapZone": "WASTES", "offsetX": 0.6, "offsetY": 0.3, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Fungal_Wastes_Hidden": { "name": "Lore_Tablet-Fungal_Wastes_Hidden", @@ -8249,8 +7661,7 @@ "mapZone": "WASTES", "offsetX": -0.6, "offsetY": 0.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres": { "name": "Lore_Tablet-Fungal_Wastes_Below_Shrumal_Ogres", @@ -8263,8 +7674,7 @@ "mapZone": "WASTES", "offsetX": 0.2, "offsetY": -0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Fungal_Core": { "name": "Lore_Tablet-Fungal_Core", @@ -8277,8 +7687,7 @@ "mapZone": "WASTES", "offsetX": 0.4, "offsetY": 0.6, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Ancient_Basin": { "name": "Lore_Tablet-Ancient_Basin", @@ -8291,8 +7700,7 @@ "mapZone": "ABYSS", "offsetX": 0.3, "offsetY": 2.7, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-King's_Pass_Focus": { "name": "Lore_Tablet-King's_Pass_Focus", @@ -8305,8 +7713,7 @@ "mapZone": "TOWN", "offsetX": 0.0, "offsetY": -0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-King's_Pass_Fury": { "name": "Lore_Tablet-King's_Pass_Fury", @@ -8319,8 +7726,7 @@ "mapZone": "TOWN", "offsetX": 1.7, "offsetY": -0.8, - "offsetZ": 0.002, - "isShop": false + "offsetZ": 0.002 }, "Lore_Tablet-King's_Pass_Exit": { "name": "Lore_Tablet-King's_Pass_Exit", @@ -8333,8 +7739,7 @@ "mapZone": "TOWN", "offsetX": 1.5, "offsetY": 0.4, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-World_Sense": { "name": "Lore_Tablet-World_Sense", @@ -8347,8 +7752,7 @@ "mapZone": "CROSSROADS", "offsetX": -0.2, "offsetY": -0.2, - "offsetZ": 0.001, - "isShop": false + "offsetZ": 0.001 }, "Lore_Tablet-Howling_Cliffs": { "name": "Lore_Tablet-Howling_Cliffs", @@ -8361,8 +7765,7 @@ "mapZone": "CLIFFS", "offsetX": 1.8, "offsetY": -1.1, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Kingdom's_Edge": { "name": "Lore_Tablet-Kingdom's_Edge", @@ -8375,8 +7778,7 @@ "mapZone": "OUTSKIRTS", "offsetX": 1.2, "offsetY": -0.5, - "offsetZ": 0.0, - "isShop": false + "offsetZ": 0.0 }, "Lore_Tablet-Palace_Workshop": { "name": "Lore_Tablet-Palace_Workshop", @@ -8389,8 +7791,7 @@ "mapZone": "ABYSS", "offsetX": 1.2, "offsetY": -0.2, - "offsetZ": 0.006, - "isShop": false + "offsetZ": 0.006 }, "Lore_Tablet-Palace_Throne": { "name": "Lore_Tablet-Palace_Throne", @@ -8403,8 +7804,7 @@ "mapZone": "ABYSS", "offsetX": 1.6, "offsetY": -0.2, - "offsetZ": 0.007, - "isShop": false + "offsetZ": 0.007 }, "Lore_Tablet-Path_of_Pain_Entrance": { "name": "Lore_Tablet-Path_of_Pain_Entrance", @@ -8417,9 +7817,9 @@ "mapZone": "ABYSS", "offsetX": 1.4, "offsetY": 0.3, - "offsetZ": 0.007, - "isShop": false + "offsetZ": 0.007 }, + // RandoPlus interop "Mr_Mushroom-Fungal_Wastes": { "name": "Mr_Mushroom-Fungal_Wastes", "sceneName": "Fungus2_18", @@ -8432,8 +7832,7 @@ "offsetX": -1.85, "offsetY": 0.2, "offsetZ": 0.001, - "isShop": false, - "randoOnly": true + "randoOnly": true }, "Mr_Mushroom-Kingdom's_Edge": { "name": "Mr_Mushroom-Kingdom's_Edge", @@ -8447,7 +7846,6 @@ "offsetX": -0.9, "offsetY": 0.8, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Mr_Mushroom-Deepnest": { @@ -8462,7 +7860,6 @@ "offsetX": -1.3, "offsetY": -0.2, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Mr_Mushroom-Howling_Cliffs": { @@ -8477,7 +7874,6 @@ "offsetX": 0.54, "offsetY": 0.32, "offsetZ": 0.001, - "isShop": false, "randoOnly": true }, "Mr_Mushroom-Ancient_Basin": { @@ -8492,7 +7888,6 @@ "offsetX": 0.8, "offsetY": 0.4, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Mr_Mushroom-Fog_Canyon": { @@ -8507,7 +7902,6 @@ "offsetX": -0.6, "offsetY": -0.4, "offsetZ": 0.0, - "isShop": false, "randoOnly": true }, "Mr_Mushroom-King's_Pass": { @@ -8522,7 +7916,566 @@ "offsetX": -1.4, "offsetY": -0.7, "offsetZ": 0.0, - "isShop": false, + "randoOnly": true + }, + // RandomizableLevers interop + "Switch-Dirtmouth_Stag": { + "name": "Switch-Dirtmouth_Stag", + "sceneName": "Room_Town_Stag_Station", + "pinScene": "Town", + "mapZone": "TOWN", + "offsetX": 0.4, + "offsetY": -0.6, + "offsetZ": 0.009, + "randoOnly": true + }, + "Switch-Outside_Ancestral_Mound": { + "name": "Switch-Outside_Ancestral_Mound", + "sceneName": "Crossroads_06", + "mapZone": "CROSSROADS", + "offsetX": -0.4, + "offsetY": -0.6, + "offsetZ": -0.500, + "randoOnly": true + }, + "Switch-Greenpath_Stag": { + "name": "Switch-Greenpath_Stag", + "sceneName": "Fungus1_22", + "mapZone": "GREEN_PATH", + "offsetX": 0.4, + "offsetY": -1.2, + "offsetZ": 0.0, + "randoOnly": true + }, + "Switch-Lower_Resting_Grounds": { + "name": "Switch-Lower_Resting_Grounds", + "sceneName": "RestingGrounds_06", + "mapZone": "RESTING_GROUNDS", + "offsetX": -1.0, + "offsetY": 0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Switch-Petra_Arena": { + "name": "Switch-Petra_Arena", + "sceneName": "Fungus3_05", + "mapZone": "ROYAL_GARDENS", + "offsetX": 0.4, + "offsetY": -0.5, + "offsetZ": 0.0, + "randoOnly": true + }, + "Switch-Queen's_Gardens_Stag": { + "name": "Switch-Queen's_Gardens_Stag", + "sceneName": "Fungus3_40", + "mapZone": "ROYAL_GARDENS", + "offsetX": 2.5, + "offsetY": 0.0, + "offsetZ": 0.0, + "randoOnly": true + }, + "Switch-Crossroads_East": { + "name": "Switch-Crossroads_East", + "sceneName": "Crossroads_03", + "mapZone": "CROSSROADS", + "offsetX": 0.0, + "offsetY": 0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Dung_Defender": { + "name": "Lever-Dung_Defender", + "sceneName": "Waterways_05", + "mapZone": "WATERWAYS", + "offsetX": 0.9, + "offsetY": 0.0, + "offsetZ": 0.001, + "randoOnly": true + }, + "Lever-Waterways_Hwurmp_Arena": { + "name": "Lever-Waterways_Hwurmp_Arena", + "sceneName": "Waterways_09", + "mapZone": "WATERWAYS", + "offsetX": -0.2, + "offsetY": -0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Queen's_Station_Mask_Shard": { + "name": "Lever-Queen's_Station_Mask_Shard", + "sceneName": "Fungus2_01", + "mapZone": "WASTES", + "offsetX": 0.75, + "offsetY": 0.05, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Queen's_Gardens_Ground_Block": { + "name": "Lever-Queen's_Gardens_Ground_Block", + "sceneName": "Fungus3_04", + "mapZone": "ROYAL_GARDENS", + "offsetX": 0.0, + "offsetY": 0.4, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Below_Overgrown_Mound": { + "name": "Lever-Below_Overgrown_Mound", + "sceneName": "Fungus3_44", + "mapZone": "FOG_CANYON", + "offsetX": 0.6, + "offsetY": -0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Tower_of_Love": { + "name": "Lever-Tower_of_Love", + "sceneName": "Ruins2_11_b", + "mapZone": "CITY", + "offsetX": 0.6, + "offsetY": -1.7, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Abyss_Lighthouse": { + "name": "Lever-Abyss_Lighthouse", + "sceneName": "Abyss_Lighthouse_room", + "pinScene": "Abyss_09", + "mapZone": "ABYSS", + "offsetX": -1.1, + "offsetY": 0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Failed_Tramway_Right": { + "name": "Lever-Failed_Tramway_Right", + "sceneName": "Deepnest_26", + "mapZone": "DEEPNEST", + "offsetX": 0.9, + "offsetY": -0.4, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Failed_Tramway_Left": { + "name": "Lever-Failed_Tramway_Left", + "sceneName": "Deepnest_26b", + "mapZone": "DEEPNEST", + "offsetX": 1.4, + "offsetY": 0.0, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Below_Spell_Twister": { + "name": "Lever-Below_Spell_Twister", + "sceneName": "Ruins1_30", + "mapZone": "CITY", + "offsetX": -0.1, + "offsetY": 0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Sanctum_East": { + "name": "Lever-Sanctum_East", + "sceneName": "Ruins1_25", + "mapZone": "CITY", + "offsetX": -0.1, + "offsetY": 0.2, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Sanctum_Soul_Warrior": { + "name": "Lever-Sanctum_Soul_Warrior", + "sceneName": "Ruins1_23", + "mapZone": "CITY", + "offsetX": -0.3, + "offsetY": 0.6, + "offsetZ": 0.002, + "randoOnly": true + }, + "Lever-Sanctum_Bottom": { + "name": "Lever-Sanctum_Bottom", + "sceneName": "Ruins1_23", + "mapZone": "CITY", + "offsetX": 0.4, + "offsetY": -0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Sanctum_West_Upper": { + "name": "Lever-Sanctum_West_Upper", + "sceneName": "Ruins1_32", + "mapZone": "CITY", + "offsetX": -0.4, + "offsetY": 0.0, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Sanctum_West_Lower": { + "name": "Lever-Sanctum_West_Lower", + "sceneName": "Ruins1_32", + "mapZone": "CITY", + "offsetX": 0.2, + "offsetY": -0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Fountain": { + "name": "Lever-City_Fountain", + "sceneName": "Ruins1_27", + "mapZone": "CITY", + "offsetX": 0.6, + "offsetY": -0.6, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Spire_Sentry_Lower": { + "name": "Lever-City_Spire_Sentry_Lower", + "sceneName": "Ruins2_01", + "mapZone": "CITY", + "offsetX": -0.3, + "offsetY": 0.5, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Spire_Sentry_Upper": { + "name": "Lever-City_Spire_Sentry_Upper", + "sceneName": "Ruins2_01", + "mapZone": "CITY", + "offsetX": 0.2, + "offsetY": 1.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Bridge_Above_Fountain": { + "name": "Lever-City_Bridge_Above_Fountain", + "sceneName": "Ruins1_18", + "mapZone": "CITY", + "offsetX": -0.6, + "offsetY": 0.2, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Storerooms": { + "name": "Lever-City_Storerooms", + "sceneName": "Ruins1_17", + "mapZone": "CITY", + "offsetX": -0.5, + "offsetY": -0.7, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Lemm": { + "name": "Lever-City_Lemm", + "sceneName": "Ruins1_05b", + "mapZone": "CITY", + "offsetX": -0.3, + "offsetY": 0.2, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Above_Lemm_Right": { + "name": "Lever-City_Above_Lemm_Right", + "sceneName": "Ruins1_05c", + "mapZone": "CITY", + "offsetX": 0.4, + "offsetY": -0.5, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Above_Lemm_Left": { + "name": "Lever-City_Above_Lemm_Left", + "sceneName": "Ruins1_05c", + "mapZone": "CITY", + "offsetX": -0.1, + "offsetY": 0.6, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-City_Above_Lemm_Upper": { + "name": "Lever-City_Above_Lemm_Upper", + "sceneName": "Ruins1_05", + "mapZone": "CITY", + "offsetX": -0.1, + "offsetY": 1.5, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Shade_Soul_Exit": { + "name": "Lever-Shade_Soul_Exit", + "sceneName": "Ruins1_31b", + "mapZone": "CITY", + "offsetX": 0.3, + "offsetY": 0.2, + "offsetZ": 0.001, + "randoOnly": true + }, + "Lever-Emilitia": { + "name": "Lever-Emilitia", + "sceneName": "Ruins_House_03", + "pinScene": "Ruins2_04", + "mapZone": "CITY", + "offsetX": 0.0, + "offsetY": -0.7, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Mantis_Lords_Top_Left": { + "name": "Lever-Mantis_Lords_Top_Left", + "sceneName": "Fungus2_15", + "mapZone": "WASTES", + "offsetX": -0.4, + "offsetY": 1.2, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Mantis_Lords_Middle_Left": { + "name": "Lever-Mantis_Lords_Middle_Left", + "sceneName": "Fungus2_15", + "mapZone": "WASTES", + "offsetX": -0.4, + "offsetY": 0.5, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Mantis_Lords_Bottom_Left": { + "name": "Lever-Mantis_Lords_Bottom_Left", + "sceneName": "Fungus2_15", + "mapZone": "WASTES", + "offsetX": -0.4, + "offsetY": -0.4, + "offsetZ": 0.001, + "randoOnly": true + }, + "Lever-Mantis_Lords_Middle_Right": { + "name": "Lever-Mantis_Lords_Middle_Right", + "sceneName": "Fungus2_15", + "mapZone": "WASTES", + "offsetX": 0.3, + "offsetY": 0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Mantis_Lords_Bottom_Right": { + "name": "Lever-Mantis_Lords_Bottom_Right", + "sceneName": "Fungus2_15", + "mapZone": "WASTES", + "offsetX": 0.5, + "offsetY": -0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Mantis_Claw": { + "name": "Lever-Mantis_Claw", + "sceneName": "Fungus2_14", + "mapZone": "WASTES", + "offsetX": -1.8, + "offsetY": -0.5, + "offsetZ": 0.002, + "randoOnly": true + }, + "Lever-Mantis_Lords_Access": { + "name": "Lever-Mantis_Lords_Access", + "sceneName": "Fungus2_14", + "mapZone": "WASTES", + "offsetX": -0.1, + "offsetY": -0.1, + "offsetZ": -0.96, + "randoOnly": true + }, + "Lever-Fungal_Wastes_Thorns_Gauntlet": { + "name": "Lever-Fungal_Wastes_Thorns_Gauntlet", + "sceneName": "Fungus2_04", + "mapZone": "WASTES", + "offsetX": 0.4, + "offsetY": -0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Fungal_Wastes_Below_Shrumal_Ogres": { + "name": "Lever-Fungal_Wastes_Below_Shrumal_Ogres", + "sceneName": "Fungus2_04", + "mapZone": "WASTES", + "offsetX": 0.2, + "offsetY": 0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Fungal_Wastes_Bouncy_Grub": { + "name": "Lever-Fungal_Wastes_Bouncy_Grub", + "sceneName": "Fungus2_18", + "mapZone": "WASTES", + "offsetX": -0.1, + "offsetY": -0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Dirtmouth_Elevator": { + "name": "Lever-Dirtmouth_Elevator", + "sceneName": "Town", + "mapZone": "TOWN", + "offsetX": 2.7, + "offsetY": 0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Tall_Room_Upper": { + "name": "Lever-Crystal_Peak_Tall_Room_Upper", + "sceneName": "Mines_20", + "mapZone": "MINES", + "offsetX": 0.2, + "offsetY": 0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Tall_Room_Middle": { + "name": "Lever-Crystal_Peak_Tall_Room_Middle", + "sceneName": "Mines_20", + "mapZone": "MINES", + "offsetX": -0.2, + "offsetY": 0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Tall_Room_Lower": { + "name": "Lever-Crystal_Peak_Tall_Room_Lower", + "sceneName": "Mines_20", + "mapZone": "MINES", + "offsetX": 0.3, + "offsetY": -0.8, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Spike_Grub": { + "name": "Lever-Crystal_Peak_Spike_Grub", + "sceneName": "Mines_03", + "mapZone": "MINES", + "offsetX": -0.3, + "offsetY": 0.7, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Below_Chest": { + "name": "Lever-Crystal_Peak_Below_Chest", + "sceneName": "Mines_04", + "mapZone": "MINES", + "offsetX": 0.1, + "offsetY": 0.9, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Above_Chest": { + "name": "Lever-Crystal_Peak_Above_Chest", + "sceneName": "Mines_37", + "mapZone": "MINES", + "offsetX": 0.0, + "offsetY": 0.3, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Crushers_Grub": { + "name": "Lever-Crystal_Peak_Crushers_Grub", + "sceneName": "Mines_19", + "mapZone": "MINES", + "offsetX": 0.4, + "offsetY": 0.1, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Crystal_Peak_Crushers_Chest": { + "name": "Lever-Crystal_Peak_Crushers_Chest", + "sceneName": "Mines_37", + "mapZone": "MINES", + "offsetX": -0.4, + "offsetY": -0.4, + "offsetZ": 0.002, + "randoOnly": true + }, + "Lever-Palace_Atrium": { + "name": "Lever-Palace_Atrium", + "sceneName": "White_Palace_03_hub", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": -1.2, + "offsetY": 0.8, + "offsetZ": 0.001, + "randoOnly": true + }, + "Lever-Palace_Right": { + "name": "Lever-Palace_Right", + "sceneName": "White_Palace_15", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": -0.8, + "offsetY": 0.8, + "offsetZ": 0.002, + "randoOnly": true + }, + "Lever-Palace_Final": { + "name": "Lever-Palace_Final", + "sceneName": "White_Palace_12", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": -0.4, + "offsetY": 0.8, + "offsetZ": 0.003, + "randoOnly": true + }, + "Lever-Path_of_Pain": { + "name": "Lever-Path_of_Pain", + "sceneName": "White_Palace_17", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": 0.0, + "offsetY": 0.8, + "offsetZ": 0.004, + "randoOnly": true + }, + "Lever-Palace_Entrance_Orb": { + "name": "Lever-Palace_Entrance_Orb", + "sceneName": "White_Palace_02", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": 0.4, + "offsetY": 0.8, + "offsetZ": 0.005, + "randoOnly": true + }, + "Lever-Palace_Left_Orb": { + "name": "Lever-Palace_Left_Orb", + "sceneName": "White_Palace_14", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": 0.8, + "offsetY": 0.8, + "offsetZ": 0.006, + "randoOnly": true + }, + "Lever-Palace_Right_Orb": { + "name": "Lever-Palace_Right_Orb", + "sceneName": "White_Palace_15", + "pinScene": "Abyss_05", + "mapZone": "ABYSS", + "offsetX": 1.2, + "offsetY": 0.8, + "offsetZ": 0.007, + "randoOnly": true + }, + "Lever-Pilgrim's_Way_Left": { + "name": "Lever-Pilgrim's_Way_Left", + "sceneName": "Fungus2_21", + "mapZone": "WASTES", + "offsetX": -0.1, + "offsetY": -0.4, + "offsetZ": 0.0, + "randoOnly": true + }, + "Lever-Pilgrim's_Way_Right": { + "name": "Lever-Pilgrim's_Way_Right", + "sceneName": "Fungus2_21", + "mapZone": "WASTES", + "offsetX": 0.9, + "offsetY": -0.4, + "offsetZ": 0.0, "randoOnly": true } } \ No newline at end of file diff --git a/MapModS/Resources/pinsAM.json b/MapModS/Resources/pinsAM.json index 06dbac0..b4d9289 100644 --- a/MapModS/Resources/pinsAM.json +++ b/MapModS/Resources/pinsAM.json @@ -117,5 +117,61 @@ "mapZone": "WHITE_PALACE", "offsetX": 2.2, "offsetY": -0.9 + }, + "Lever-Palace_Atrium": { + "name": "Lever-Palace_Atrium", + "pinScene": "White_Palace_03_hub", + "mapZone": "WHITE_PALACE", + "offsetX": -0.8, + "offsetY": 0.0, + "offsetZ": 0.001 + }, + "Lever-Palace_Right": { + "name": "Lever-Palace_Right", + "pinScene": "White_Palace_15", + "mapZone": "WHITE_PALACE", + "offsetX": -0.1, + "offsetY": -0.2, + "offsetZ": 0.0 + }, + "Lever-Palace_Final": { + "name": "Lever-Palace_Final", + "pinScene": "White_Palace_12", + "mapZone": "WHITE_PALACE", + "offsetX": 0.4, + "offsetY": 0.6, + "offsetZ": 0.0 + }, + "Lever-Path_of_Pain": { + "name": "Lever-Path_of_Pain", + "pinScene": "White_Palace_17", + "mapZone": "WHITE_PALACE", + "offsetX": 0.5, + "offsetY": 0.8, + "offsetZ": 0.0 + }, + "Lever-Palace_Entrance_Orb": { + "name": "Lever-Palace_Entrance_Orb", + "pinScene": "White_Palace_02", + "mapZone": "WHITE_PALACE", + "offsetX": 0.3, + "offsetY": 0.4, + "offsetZ": 0.0 + }, + "Lever-Palace_Left_Orb": { + "name": "Lever-Palace_Left_Orb", + "pinScene": "White_Palace_14", + "mapZone": "WHITE_PALACE", + "offsetX": 1.5, + "offsetY": 0.0, + "offsetZ": 0.0 + }, + "Lever-Palace_Right_Orb": { + "name": "Lever-Palace_Right_Orb", + "pinScene": "White_Palace_15", + "mapZone": "WHITE_PALACE", + "offsetX": -0.35, + "offsetY": -1.0, + "offsetZ": 0.0 } } \ No newline at end of file diff --git a/MapModS/UI/InputListener.cs b/MapModS/UI/InputListener.cs index 0c946fa..a224de2 100644 --- a/MapModS/UI/InputListener.cs +++ b/MapModS/UI/InputListener.cs @@ -1,4 +1,6 @@ -using UnityEngine; +using MapModS.Data; +using MapModS.Map; +using UnityEngine; namespace MapModS.UI { @@ -70,14 +72,11 @@ protected void Update() PauseMenu.SizeClicked("Size"); } - //if (Input.GetKeyDown(KeyCode.T) && MapModS.LS.mapMode == Settings.MapMode.TransitionRando) + // For debugging pins + //if (Input.GetKeyDown(KeyCode.R)) //{ - // TransitionText.GetRoute(); - //} - - //if (Input.GetKeyDown(KeyCode.B) && MapModS.LS.mapMode == Settings.MapMode.TransitionRando) - //{ - // MapModS.GS.ToggleAllowBenchWarp(); + // DataLoader.LoadNewPinDef(); + // WorldMap.CustomPins.ReadjustPinPostiions(); //} } } From 15a6284b6d373c9743725b0e9399e1136113f49a Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 00:47:05 +1100 Subject: [PATCH 03/15] Fix map not working at bench Add white palace text for no AMaps Use coroutine to update selected scene --- MapModS/Data/DataLoader.cs | 5 ++++- MapModS/Map/FullMap.cs | 5 +++++ MapModS/Map/Transition.cs | 40 ++++++++++++++++++++++++++++++++++-- MapModS/Map/WorldMap.cs | 2 +- MapModS/Resources/pins.json | 17 +++++++++++---- MapModS/UI/GUIController.cs | 13 ++++++++++++ MapModS/UI/TransitionText.cs | 31 +++++++++++++++++++++++++++- 7 files changed, 104 insertions(+), 9 deletions(-) diff --git a/MapModS/Data/DataLoader.cs b/MapModS/Data/DataLoader.cs index 2add7a8..d8cc658 100644 --- a/MapModS/Data/DataLoader.cs +++ b/MapModS/Data/DataLoader.cs @@ -65,6 +65,7 @@ public static PoolGroup GetPoolGroup(string cleanItemName) case "Split_Mothwing_Cloak": case "Split_Crystal_Heart": + case "Downslash": return PoolGroup.Skills; case "Double_Mask_Shard": @@ -205,6 +206,8 @@ public static void SetUsedPinDefs() string locationName = placement.Value.Items.Where(x => !x.IsObtained()).First().RandoLocationName(); + if (locationName == "Start") continue; + if (MapModS.RandomizableLeversInstalled && locationName == "Dirtmouth_Stag" || locationName == "Resting_Grounds_Stag") { @@ -222,7 +225,7 @@ public static void SetUsedPinDefs() } else { - MapModS.Instance.Log("No corresponding pin location: " + locationName); + MapModS.Instance.Log("No corresponding pin location for a placement"); } } diff --git a/MapModS/Map/FullMap.cs b/MapModS/Map/FullMap.cs index 4b4b596..f09da63 100644 --- a/MapModS/Map/FullMap.cs +++ b/MapModS/Map/FullMap.cs @@ -369,6 +369,11 @@ private static void PlayMakerFSM_OnEnable(On.PlayMakerFSM.orig_OnEnable orig, Pl { ReplaceBool(self, "Check", 0); } + + else if (self.FsmName == "Bench Control") + { + FsmUtil.GetAction(self, "Open Map", 0).boolName = "MMS_hasMap"; + } } public static bool BoolGetOverride(string boolName, bool orig) diff --git a/MapModS/Map/Transition.cs b/MapModS/Map/Transition.cs index a45e0a0..d280234 100644 --- a/MapModS/Map/Transition.cs +++ b/MapModS/Map/Transition.cs @@ -55,6 +55,28 @@ internal static class Transition "White_Palace_11" }; + public static HashSet whitePalaceScenes = new() + { + "White_Palace_01", + "White_Palace_02", + "White_Palace_03_hub", + "White_Palace_04", + "White_Palace_05", + "White_Palace_06", + "White_Palace_07", + "White_Palace_08", + "White_Palace_09", + "White_Palace_12", + "White_Palace_13", + "White_Palace_14", + "White_Palace_15", + "White_Palace_16", + "White_Palace_17", + "White_Palace_18", + "White_Palace_19", + "White_Palace_20" + }; + public static GameObject CreateExtraMapRooms(GameMap gameMap) { GameObject go_extraMapRooms = new GameObject("MMS Custom Map Rooms"); @@ -78,14 +100,23 @@ public static GameObject CreateExtraMapRooms(GameMap gameMap) areaNamePrefab.SetActive(false); int mapPositionCounter = 0; + int maxTableWidth = 4; + + HashSet allScenes = new(nonMapScenes); - foreach (string scene in nonMapScenes) + if (!MapModS.AdditionalMapsInstalled) + { + allScenes.UnionWith(whitePalaceScenes); + maxTableWidth = 6; + } + + foreach (string scene in allScenes) { GameObject go_extraMapRoom = UnityEngine.Object.Instantiate(areaNamePrefab, go_extraMapRooms.transform); go_extraMapRoom.name = scene; go_extraMapRoom.GetComponent().convName = scene; - go_extraMapRoom.transform.localPosition = new Vector3((mapPositionCounter % 4) * 4f, -0.8f * (mapPositionCounter / 4), 0); + go_extraMapRoom.transform.localPosition = new Vector3((mapPositionCounter % maxTableWidth) * 4f, -0.8f * (mapPositionCounter / maxTableWidth), 0); var tmp = go_extraMapRoom.GetComponent(); @@ -276,6 +307,11 @@ public static HashSet SetupMapTransitionMode(GameMap gameMap, bool isAlt } } +#if DEBUG + // For debugging + active = true; +#endif + if (visitedAdjacentScenes.Contains(emd.sceneName)) { color = roomColor[RoomState.Adjacent]; diff --git a/MapModS/Map/WorldMap.cs b/MapModS/Map/WorldMap.cs index 327d50e..343d7a7 100644 --- a/MapModS/Map/WorldMap.cs +++ b/MapModS/Map/WorldMap.cs @@ -39,7 +39,7 @@ public static void Unhook() private static string OnLanguageGetHook(string key, string sheet, string orig) { - if (sheet == "MMS" && Transition.nonMapScenes.Contains(key)) + if (sheet == "MMS" && (Transition.nonMapScenes.Contains(key) || Transition.whitePalaceScenes.Contains(key))) { return key; } diff --git a/MapModS/Resources/pins.json b/MapModS/Resources/pins.json index 0834075..2f8db1a 100644 --- a/MapModS/Resources/pins.json +++ b/MapModS/Resources/pins.json @@ -2883,8 +2883,8 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "RESTING_GROUNDS", - "offsetX": -0.3, - "offsetY": 0.9, + "offsetX": 0.9, + "offsetY": 0.0, "offsetZ": 0.0 }, "Grub-Crystal_Peak_Below_Chest": { @@ -2896,8 +2896,8 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "MINES", - "offsetX": 0.0, - "offsetY": 1.0, + "offsetX": -0.3, + "offsetY": 0.9, "offsetZ": 0.0 }, "Grub-Crystallized_Mound": { @@ -8037,6 +8037,15 @@ "offsetZ": 0.0, "randoOnly": true }, + "Lever-Resting_Grounds_Stag": { + "name": "Lever-Resting_Grounds_Stag", + "sceneName": "RestingGrounds_09", + "mapZone": "ABYSS", + "offsetX": 0.15, + "offsetY": 0.0, + "offsetZ": 0.0, + "randoOnly": true + }, "Lever-Abyss_Lighthouse": { "name": "Lever-Abyss_Lighthouse", "sceneName": "Abyss_Lighthouse_room", diff --git a/MapModS/UI/GUIController.cs b/MapModS/UI/GUIController.cs index 2e7d37f..5789b20 100644 --- a/MapModS/UI/GUIController.cs +++ b/MapModS/UI/GUIController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; @@ -56,6 +57,8 @@ public static void Unload() { if (_instance != null) { + _instance.StopAllCoroutines(); + Destroy(_instance._pauseCanvas); Destroy(_instance._mapCanvas); Destroy(_instance._transitionCanvas); @@ -103,6 +106,7 @@ public void BuildMenus() _transitionCanvas.SetActive(false); TransitionText.Initialize(); + StartCoroutine("UpdateSelectedScene"); } public void Update() @@ -118,6 +122,15 @@ public void Update() } } + IEnumerator UpdateSelectedScene() + { + while (true) + { + yield return new WaitForSecondsRealtime(0.1f); + TransitionText.UpdateSelectedScene(); + } + } + private void LoadResources() { TrajanBold = Modding.CanvasUtil.TrajanBold; diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 010833d..916b201 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -3,6 +3,7 @@ using MapModS.Map; using MapModS.Settings; using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -47,6 +48,7 @@ public static void ShowWorldMap() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _instructionPanel.SetActive(isActive, isActive); + } public static void Hide() @@ -137,7 +139,34 @@ public static void Update() rejectedTransitionPairs = new(); } - frameCounter = (frameCounter + 1) % 24; + //frameCounter = (frameCounter + 1) % 24; + + //if (frameCounter == 0) + //{ + // colorUpdateThread = new(() => + // { + // if (GetRoomClosestToMiddle(selectedScene, out selectedScene)) + // { + // SetInstructionsText(); + // SetRoomColors(); + // } + // }); + + // colorUpdateThread.Start(); + //} + } + + public static void UpdateSelectedScene() + { + if (Canvas == null + || !Canvas.activeSelf + || !_instructionPanel.Active + || !_transitionPanel.Active + || HeroController.instance == null + || GameManager.instance.IsGamePaused()) + { + return; + } if (frameCounter == 0) { From 11a5fced2d9c0c36684625b834ce2b0d444b7244 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 00:52:18 +1100 Subject: [PATCH 04/15] Slight adjustment to transition map room text --- MapModS/Map/Transition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapModS/Map/Transition.cs b/MapModS/Map/Transition.cs index d280234..89ca67a 100644 --- a/MapModS/Map/Transition.cs +++ b/MapModS/Map/Transition.cs @@ -82,7 +82,7 @@ public static GameObject CreateExtraMapRooms(GameMap gameMap) GameObject go_extraMapRooms = new GameObject("MMS Custom Map Rooms"); go_extraMapRooms.layer = 5; go_extraMapRooms.transform.SetParent(gameMap.transform); - go_extraMapRooms.transform.localPosition = new Vector3(-13f, 16f, 0); + go_extraMapRooms.transform.localPosition = new Vector3(-14f, 16f, 0); go_extraMapRooms.SetActive(true); var areaNamePrefab = UnityEngine.Object.Instantiate(gameMap.areaCliffs.transform.GetChild(0).gameObject); From 4e077db6c3e6565ec25add4d1d9791fe22f577e5 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 09:56:46 +1100 Subject: [PATCH 05/15] Fix disabling dirtmouth/resting grounds pins for lever rando --- MapModS/Data/DataLoader.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/MapModS/Data/DataLoader.cs b/MapModS/Data/DataLoader.cs index d8cc658..fc20c55 100644 --- a/MapModS/Data/DataLoader.cs +++ b/MapModS/Data/DataLoader.cs @@ -58,6 +58,8 @@ public static PoolGroup GetPoolGroup(string cleanItemName) { if (shopLocations.Contains(cleanItemName)) return PoolGroup.Shop; + if (cleanItemName.EndsWith("_Geo")) return PoolGroup.GeoChests; + switch (cleanItemName) { case "Dreamer": @@ -208,12 +210,6 @@ public static void SetUsedPinDefs() if (locationName == "Start") continue; - if (MapModS.RandomizableLeversInstalled - && locationName == "Dirtmouth_Stag" || locationName == "Resting_Grounds_Stag") - { - continue; - } - if (_allPins.TryGetValue(locationName, out PinDef pinDef)) { pinDef.randoItems = items; @@ -229,10 +225,17 @@ public static void SetUsedPinDefs() } } + bool leverRandoEnabled = _usedPins.Any(p => p.Key.StartsWith("Lever")); + foreach (KeyValuePair pinDef in _allPins) { if (!_usedPins.ContainsKey(pinDef.Key) && !pinDef.Value.randoOnly) { + if (leverRandoEnabled && (pinDef.Value.name == "Dirtmouth_Stag" || pinDef.Value.name == "Resting_Grounds_Stag")) + { + continue; + } + pinDef.Value.pinLocationState = PinLocationState.NonRandomizedUnchecked; pinDef.Value.locationPoolGroup = GetLocationPoolGroup(pinDef.Value.name); _usedPins.Add(pinDef.Key, pinDef.Value); From f54bd2e7b2150cc06078a8c6e4641f6166476153 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 10:41:04 +1100 Subject: [PATCH 06/15] Fix cleared pins showing --- MapModS/Data/DataLoader.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MapModS/Data/DataLoader.cs b/MapModS/Data/DataLoader.cs index fc20c55..01972db 100644 --- a/MapModS/Data/DataLoader.cs +++ b/MapModS/Data/DataLoader.cs @@ -229,7 +229,9 @@ public static void SetUsedPinDefs() foreach (KeyValuePair pinDef in _allPins) { - if (!_usedPins.ContainsKey(pinDef.Key) && !pinDef.Value.randoOnly) + if (!_usedPins.ContainsKey(pinDef.Key) + && !pinDef.Value.randoOnly + && !RandomizerMod.RandomizerMod.RS.TrackerData.clearedLocations.Contains(pinDef.Key)) { if (leverRandoEnabled && (pinDef.Value.name == "Dirtmouth_Stag" || pinDef.Value.name == "Resting_Grounds_Stag")) { From 0aca0f94ff7277e5a8a6ec9000763670e255b402 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 20:13:48 +1100 Subject: [PATCH 07/15] Small pin fixes --- MapModS/Map/SpriteManager.cs | 3 ++- MapModS/Resources/pins.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MapModS/Map/SpriteManager.cs b/MapModS/Map/SpriteManager.cs index e88f9c1..5c8bee0 100644 --- a/MapModS/Map/SpriteManager.cs +++ b/MapModS/Map/SpriteManager.cs @@ -141,7 +141,8 @@ public static Sprite GetSprite(string name) } MapModS.Instance.LogWarn("Failed to load sprite named '" + name + "'"); - return null; + + return _sprites["pinUnknown"]; } private static Sprite FromStream(Stream s) diff --git a/MapModS/Resources/pins.json b/MapModS/Resources/pins.json index 2f8db1a..6e0ab39 100644 --- a/MapModS/Resources/pins.json +++ b/MapModS/Resources/pins.json @@ -3728,7 +3728,7 @@ "pdIntValue": 0, "pinScene": null, "mapZone": "CROSSROADS", - "offsetX": 0.1, + "offsetX": -0.2, "offsetY": -0.15, "offsetZ": 0.0 }, From 00af61dc5c8fcec10808d5a01cfea58c1de35b03 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 20:14:02 +1100 Subject: [PATCH 08/15] Version bump --- MapModS/MapModS.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MapModS/MapModS.cs b/MapModS/MapModS.cs index 403ad08..083bdbe 100644 --- a/MapModS/MapModS.cs +++ b/MapModS/MapModS.cs @@ -14,7 +14,7 @@ public class MapModS : Mod, ILocalSettings, IGlobalSettings "2.2.0 refactor"; + public override string GetVersion() => "2.2.0"; public override int LoadPriority() => 10; From 885125a6bcac444a0f6be55675c51a4e6443e4ad Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Sun, 6 Feb 2022 20:38:35 +1100 Subject: [PATCH 09/15] Fix persistent pin behaviour --- MapModS/Map/PinAnimatedSprite.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MapModS/Map/PinAnimatedSprite.cs b/MapModS/Map/PinAnimatedSprite.cs index 687c6bb..521a565 100644 --- a/MapModS/Map/PinAnimatedSprite.cs +++ b/MapModS/Map/PinAnimatedSprite.cs @@ -84,8 +84,11 @@ public void SetSprite() pinBorderColor = PinBorderColor.Previewed; } - if (MapModS.LS.SpoilerOn - || pinDef.pinLocationState == PinLocationState.Previewed + if (pinDef.pinLocationState == PinLocationState.Previewed) + { + pool = pinDef.randoItems.ElementAt(spriteIndex).poolGroup; + } + else if (MapModS.LS.SpoilerOn || pinDef.pinLocationState == PinLocationState.ClearedPersistent) { pool = pinDef.randoItems.ElementAt(spriteIndex).poolGroup; From b93b8e37e067576d6f1490c97f58d1543c324b44 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Mon, 7 Feb 2022 15:48:23 +1100 Subject: [PATCH 10/15] Add list of unchecked transitions --- MapModS/UI/TransitionText.cs | 77 ++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 29 deletions(-) diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 916b201..23edbb7 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -20,6 +20,7 @@ internal class TransitionText private static CanvasPanel _instructionPanel; private static CanvasPanel _transitionPanel; + private static CanvasPanel _uncheckedTransitionsPanel; public static TransitionHelper th; @@ -48,6 +49,7 @@ public static void ShowWorldMap() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _instructionPanel.SetActive(isActive, isActive); + _uncheckedTransitionsPanel.SetActive(false, false); } @@ -88,6 +90,12 @@ public static void BuildText(GameObject _canvas) _transitionPanel.SetActive(false, false); + _uncheckedTransitionsPanel = new CanvasPanel + (_canvas, GUIController.Instance.Images["ButtonsMenuBG"], new Vector2(10f, 20f), new Vector2(1346f, 0f), new Rect(0f, 0f, 0f, 0f)); + _uncheckedTransitionsPanel.AddText("Unchecked", "Transitions: None", new Vector2(-37f, 0f), Vector2.zero, GUIController.Instance.TrajanNormal, 14, FontStyle.Normal, TextAnchor.UpperRight); + + _uncheckedTransitionsPanel.SetActive(false, false); + SetTexts(); } @@ -102,14 +110,14 @@ public static void SetTexts() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _transitionPanel.SetActive(isActive, isActive); - + _uncheckedTransitionsPanel.SetActive(isActive, isActive); + SetTransitionsText(); + SetUncheckedTransitionsText(); SetRouteText(); } - private static int frameCounter = 0; private static Thread searchThread; - private static Thread colorUpdateThread; // Called every frame public static void Update() @@ -138,24 +146,11 @@ public static void Update() SetRouteText(); rejectedTransitionPairs = new(); } - - //frameCounter = (frameCounter + 1) % 24; - - //if (frameCounter == 0) - //{ - // colorUpdateThread = new(() => - // { - // if (GetRoomClosestToMiddle(selectedScene, out selectedScene)) - // { - // SetInstructionsText(); - // SetRoomColors(); - // } - // }); - - // colorUpdateThread.Start(); - //} } + private static Thread colorUpdateThread; + + // Called every 0.1 seconds public static void UpdateSelectedScene() { if (Canvas == null @@ -168,19 +163,16 @@ public static void UpdateSelectedScene() return; } - if (frameCounter == 0) + colorUpdateThread = new(() => { - colorUpdateThread = new(() => + if (GetRoomClosestToMiddle(selectedScene, out selectedScene)) { - if (GetRoomClosestToMiddle(selectedScene, out selectedScene)) - { - SetInstructionsText(); - SetRoomColors(); - } - }); + SetInstructionsText(); + SetRoomColors(); + } + }); - colorUpdateThread.Start(); - } + colorUpdateThread.Start(); } private static double DistanceToMiddle(Transform transform, bool shift) @@ -353,6 +345,33 @@ public static void SetTransitionsText() _transitionPanel.GetText("Transitions").UpdateText(transitionsText); } + public static void SetUncheckedTransitionsText() + { + string uncheckedTransitionsText = "Unchecked:"; + IEnumerable uncheckedTransitions = GetUncheckedTransitions(); + + if (uncheckedTransitions.Any()) + { + foreach(string transition in uncheckedTransitions) + { + uncheckedTransitionsText += "\n" + transition; + } + } + else + { + uncheckedTransitionsText += "\nNone"; + } + + _uncheckedTransitionsPanel.GetText("Unchecked").UpdateText(uncheckedTransitionsText); + } + + public static IEnumerable GetUncheckedTransitions() + { + return RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableTransitions + .Where(t => t.StartsWith(StringUtils.CurrentNormalScene())) + .Select(t => t.Substring(StringUtils.CurrentNormalScene().Length)); + } + public static void GetRoute() { if (_instructionPanel == null From 90771faef601e37c32f78d4c7398cf59c200ea01 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Mon, 7 Feb 2022 18:43:54 +1100 Subject: [PATCH 11/15] Fix throw when running search algorithm for the first time Change route text to start/final transitions Fix unchecked/visited transitions --- MapModS/UI/TransitionHelper.cs | 19 ++++++----- MapModS/UI/TransitionText.cs | 59 +++++++++++++++++++++++++--------- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/MapModS/UI/TransitionHelper.cs b/MapModS/UI/TransitionHelper.cs index dde7526..99087bd 100644 --- a/MapModS/UI/TransitionHelper.cs +++ b/MapModS/UI/TransitionHelper.cs @@ -8,7 +8,7 @@ namespace MapModS.UI { public class TransitionHelper { - private static readonly Dictionary itemFixes = new() + private static readonly Dictionary termFixes = new() { { "Ruins1_31[left3]", "ELEGANT" }, { "Ruins2_11_b[left1]", "LOVE" } @@ -194,18 +194,17 @@ public void GetNewItems() } } - // Emulate a transition being possibly available via having the required item - foreach (KeyValuePair pair in itemFixes) + // Emulate a transition being possibly available via having the required term + foreach (KeyValuePair pair in termFixes) { int keyId = pm.lm.TermLookup[pair.Key]; int ValueId = pm.lm.TermLookup[pair.Value]; if (RandomizerMod.RandomizerMod.RS.TrackerData.pm.Has(keyId) - && !addedItems.Contains(ValueId)) + && !addedTerms.Contains(ValueId)) { - // MapModS.Instance.Log("Has " + pair.Value); - addedItems.Add(ValueId); - pm.Add(pm.ctx.itemPlacements[keyId].item); + addedTerms.Add(ValueId); + pm.Set(ValueId, 1); } } @@ -269,10 +268,10 @@ public void GetNewItems() } } - if (GameManager.instance.sceneData.persistentBoolItems.Any(pbi => pbi.id == "Mines Lever" && pbi.sceneName == "Town" && pbi.activated == true)) - { + if (GameManager.instance.sceneData.persistentBoolItems.Any(pbi => pbi.id == "Mines Lever" && pbi.sceneName == "Town" && pbi.activated == true)) + { pm.Add(pm.lm.TransitionLookup["Town[right1]"]); - } + } } public class DelegateUpdateEntry : UpdateEntry diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 23edbb7..364a331 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -24,8 +24,10 @@ internal class TransitionText public static TransitionHelper th; - public static string lastStartScene = null; - public static string lastFinalScene = null; + public static string lastStartScene = ""; + public static string lastFinalScene = ""; + public static string lastStartTransition = ""; + public static string lastFinalTransition = ""; public static string selectedScene = "None"; public static List selectedRoute = new(); public static HashSet> rejectedTransitionPairs = new(); @@ -67,8 +69,10 @@ public static void Initialize() { th = new(); - lastStartScene = null; - lastFinalScene = null; + lastStartScene = ""; + lastFinalScene = ""; + lastStartTransition = ""; + lastFinalTransition = ""; selectedScene = "None"; selectedRoute = new(); rejectedTransitionPairs = new(); @@ -110,7 +114,7 @@ public static void SetTexts() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _transitionPanel.SetActive(isActive, isActive); - _uncheckedTransitionsPanel.SetActive(isActive, isActive); + _uncheckedTransitionsPanel.SetActive(isActive && !_instructionPanel.Active, isActive && !_instructionPanel.Active); SetTransitionsText(); SetUncheckedTransitionsText(); @@ -302,9 +306,13 @@ public static void SetRouteText() { string routeText = "Current route: "; - if (lastStartScene != null && lastFinalScene != null && selectedRoute.Any()) + if (lastStartScene != "" + && lastFinalScene != "" + && lastStartTransition != "" + && lastFinalTransition != "" + && selectedRoute.Any()) { - routeText += $"{lastStartScene} -> {lastFinalScene} "; + routeText += $"{lastStartTransition} -> {lastFinalTransition} "; routeText += $"Transitions: {selectedRoute.Count()}"; } else @@ -345,21 +353,34 @@ public static void SetTransitionsText() _transitionPanel.GetText("Transitions").UpdateText(transitionsText); } + // Display both unchecked and visited transitions of current room public static void SetUncheckedTransitionsText() { - string uncheckedTransitionsText = "Unchecked:"; + string uncheckedTransitionsText = ""; IEnumerable uncheckedTransitions = GetUncheckedTransitions(); if (uncheckedTransitions.Any()) { - foreach(string transition in uncheckedTransitions) + uncheckedTransitionsText += "Unchecked:"; + + foreach (string transition in uncheckedTransitions) { uncheckedTransitionsText += "\n" + transition; } + + uncheckedTransitionsText += "\n\n"; } - else + + IEnumerable> visitedTransitions = GetVisitedTransitions(); + + if (visitedTransitions.Any()) { - uncheckedTransitionsText += "\nNone"; + uncheckedTransitionsText += "Visited:"; + + foreach (Tuple transition in visitedTransitions) + { + uncheckedTransitionsText += "\n" + transition.Item1 + " -> " + transition.Item2; + } } _uncheckedTransitionsPanel.GetText("Unchecked").UpdateText(uncheckedTransitionsText); @@ -368,8 +389,15 @@ public static void SetUncheckedTransitionsText() public static IEnumerable GetUncheckedTransitions() { return RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableTransitions - .Where(t => t.StartsWith(StringUtils.CurrentNormalScene())) - .Select(t => t.Substring(StringUtils.CurrentNormalScene().Length)); + .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t).SceneName == StringUtils.CurrentNormalScene()) + .Select(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t).DoorName); + } + + public static IEnumerable> GetVisitedTransitions() + { + return RandomizerMod.RandomizerMod.RS.TrackerData.visitedTransitions + .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t.Key).SceneName == StringUtils.CurrentNormalScene()) + .Select(t => new Tuple(RandomizerMod.RandomizerData.Data.GetTransitionDef(t.Key).DoorName, t.Value)); } public static void GetRoute() @@ -380,7 +408,6 @@ public static void GetRoute() || !_transitionPanel.Active || HeroController.instance == null || GameManager.instance.IsGamePaused() - || selectedScene == "None" || th == null) { return; @@ -395,13 +422,15 @@ public static void GetRoute() if (!selectedRoute.Any()) { - lastFinalScene = null; + lastFinalScene = ""; rejectedTransitionPairs.Clear(); } else { lastStartScene = StringUtils.CurrentNormalScene(); lastFinalScene = selectedScene; + lastStartTransition = selectedRoute.First(); + lastFinalTransition = TransitionHelper.GetAdjacentTransition(selectedRoute.Last()); rejectedTransitionPairs.Add(new(selectedRoute.First(), selectedRoute.Last())); } From 8d7b0304574a6f7b2675a4fd7a2b7e8031f1dc48 Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Mon, 7 Feb 2022 20:33:00 +1100 Subject: [PATCH 12/15] Allow route search to current room --- MapModS/UI/TransitionHelper.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MapModS/UI/TransitionHelper.cs b/MapModS/UI/TransitionHelper.cs index 99087bd..effed76 100644 --- a/MapModS/UI/TransitionHelper.cs +++ b/MapModS/UI/TransitionHelper.cs @@ -481,8 +481,8 @@ public List ShortestRoute(string startScene, string finalScene, HashSet< } // Just in case - if (startScene == null || finalScene == null - || startScene == finalScene) + if (startScene == null || finalScene == null) + //|| startScene == finalScene) { return new(); } From e7ef57ddb816eddeb3ebb3ab401553f15b55862f Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Tue, 8 Feb 2022 00:40:57 +1100 Subject: [PATCH 13/15] Logic fix Slight formatting changes --- MapModS/UI/TransitionHelper.cs | 2 +- MapModS/UI/TransitionText.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MapModS/UI/TransitionHelper.cs b/MapModS/UI/TransitionHelper.cs index effed76..5ded19d 100644 --- a/MapModS/UI/TransitionHelper.cs +++ b/MapModS/UI/TransitionHelper.cs @@ -268,7 +268,7 @@ public void GetNewItems() } } - if (GameManager.instance.sceneData.persistentBoolItems.Any(pbi => pbi.id == "Mines Lever" && pbi.sceneName == "Town" && pbi.activated == true)) + if (PlayerData.instance.mineLiftOpened) { pm.Add(pm.lm.TransitionLookup["Town[right1]"]); } diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 364a331..5cb32ce 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -296,7 +296,7 @@ public static void SetInstructionsText() } else { - instructionsText += $" Press [Menu Select] to find new route or to switch starting / final transitions for current route."; + instructionsText += $" Press [Menu Select] to find new route or switch starting / final transitions."; } _instructionPanel.GetText("Instructions").UpdateText(instructionsText); @@ -312,7 +312,7 @@ public static void SetRouteText() && lastFinalTransition != "" && selectedRoute.Any()) { - routeText += $"{lastStartTransition} -> {lastFinalTransition} "; + routeText += $"{lastStartTransition} ->...-> {lastFinalTransition} "; routeText += $"Transitions: {selectedRoute.Count()}"; } else From 60eb9c71fa0ec2799d012ed58401a5a367f2688f Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Thu, 10 Feb 2022 09:02:11 +1100 Subject: [PATCH 14/15] Small route algorithm changes --- MapModS/UI/TransitionHelper.cs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/MapModS/UI/TransitionHelper.cs b/MapModS/UI/TransitionHelper.cs index 5ded19d..9065580 100644 --- a/MapModS/UI/TransitionHelper.cs +++ b/MapModS/UI/TransitionHelper.cs @@ -96,6 +96,7 @@ public class TransitionHelper { "Warp Queen's Gardens Stag", "Fungus3_40[right1]" }, // Special waypoint needed { "Warp White Palace Entrance?", "White_Palace_01[left1]" }, + // Special waypoint needed { "Warp White Palace Atrium", "White_Palace_03_hub[right1]" }, { "Warp White Palace Balcony", "White_Palace_06[top1]" }, { "Warp Upper Tram -> Exit Left", "Crossroads_46[left1]" }, @@ -374,6 +375,17 @@ public static string GetAdjacentTransition(string source) return transitionDef.VanillaTarget; } + private bool ApplyAltLogic(string transition) + { + if (transition == "Warp White Palace Atrium") + { + tt.pm.Add(new LogicWaypoint(tt.pm.lm.TermLookup["White_Palace_03_hub"], tt.pm.lm.LogicLookup["White_Palace_03_hub"])); + return true; + } + + return false; + } + class SearchNode { public SearchNode(string scene, List route, string lat) @@ -560,6 +572,13 @@ public List ShortestRoute(string startScene, string finalScene, HashSet< if (currentNode.currentScene == finalScene) return currentNode.currentRoute; + tt.pm.StartTemp(); + + if (currentNode.currentRoute.Count != 0 && !ApplyAltLogic(currentNode.currentRoute.Last())) + { + tt.pm.Add(tt.pm.lm.GetTransition(currentNode.lastAdjacentTransition)); + } + foreach (string transition in transitionSpace) { if (GetScene(transition) != currentNode.currentScene @@ -567,13 +586,6 @@ public List ShortestRoute(string startScene, string finalScene, HashSet< && !elevatorTransitions.ContainsKey(transition) && !tramTransitions.ContainsKey(transition)) continue; - tt.pm.StartTemp(); - - if (currentNode.currentRoute.Count != 0) - { - tt.pm.Add(tt.pm.lm.GetTransition(currentNode.lastAdjacentTransition)); - } - if (GetAdjacentTransition(transition) != null && !visitedTransitions.Contains(transition) && !rejectedTransitionPairs.Any(pair => pair.Key == currentNode.currentRoute.First() && pair.Value == transition) @@ -586,9 +598,9 @@ public List ShortestRoute(string startScene, string finalScene, HashSet< visitedTransitions.Add(transition); queue.AddLast(newNode); } - - tt.pm.RemoveTempItems(); } + + tt.pm.RemoveTempItems(); } // No route found, or the parameters are invalid From c90ef265bff41b74c6f65d4ccf2e954237b29f3f Mon Sep 17 00:00:00 2001 From: Sebastian Young Ye Date: Fri, 11 Feb 2022 22:21:31 +1100 Subject: [PATCH 15/15] Add unchecked/visited transitions panel to world map --- MapModS/MapModS.csproj | 2 + MapModS/Resources/GUI/EnemiesBg.png | Bin 0 -> 26104 bytes MapModS/Settings/GlobalSettings.cs | 9 +++- MapModS/UI/TransitionHelper.cs | 8 ++- MapModS/UI/TransitionText.cs | 77 ++++++++++++++++++++++------ 5 files changed, 78 insertions(+), 18 deletions(-) create mode 100644 MapModS/Resources/GUI/EnemiesBg.png diff --git a/MapModS/MapModS.csproj b/MapModS/MapModS.csproj index 9e1be18..a633f29 100644 --- a/MapModS/MapModS.csproj +++ b/MapModS/MapModS.csproj @@ -70,6 +70,7 @@ + @@ -238,6 +239,7 @@ + diff --git a/MapModS/Resources/GUI/EnemiesBg.png b/MapModS/Resources/GUI/EnemiesBg.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5d812b9f95e5130f98a9175666d778f520eee6 GIT binary patch literal 26104 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 literal 0 HcmV?d00001 diff --git a/MapModS/Settings/GlobalSettings.cs b/MapModS/Settings/GlobalSettings.cs index 4e0713a..1d07732 100644 --- a/MapModS/Settings/GlobalSettings.cs +++ b/MapModS/Settings/GlobalSettings.cs @@ -11,7 +11,9 @@ public enum PinSize public class GlobalSettings { public bool allowBenchWarpSearch = true; - + + public bool uncheckedPanelActive = false; + public PinSize pinSize = PinSize.Medium; public void ToggleAllowBenchWarp() @@ -19,6 +21,11 @@ public void ToggleAllowBenchWarp() allowBenchWarpSearch = !allowBenchWarpSearch; } + public void ToggleUncheckedPanel() + { + uncheckedPanelActive = !uncheckedPanelActive; + } + public void TogglePinSize() { switch (pinSize) diff --git a/MapModS/UI/TransitionHelper.cs b/MapModS/UI/TransitionHelper.cs index 9065580..44b9cd6 100644 --- a/MapModS/UI/TransitionHelper.cs +++ b/MapModS/UI/TransitionHelper.cs @@ -95,7 +95,7 @@ public class TransitionHelper { "Warp Queen's Gardens Toll", "Fungus3_50[right1]" }, { "Warp Queen's Gardens Stag", "Fungus3_40[right1]" }, // Special waypoint needed - { "Warp White Palace Entrance?", "White_Palace_01[left1]" }, + { "Warp White Palace Entrance", "White_Palace_01[left1]" }, // Special waypoint needed { "Warp White Palace Atrium", "White_Palace_03_hub[right1]" }, { "Warp White Palace Balcony", "White_Palace_06[top1]" }, @@ -377,6 +377,12 @@ public static string GetAdjacentTransition(string source) private bool ApplyAltLogic(string transition) { + if (transition == "Warp White Palace Entrace") + { + tt.pm.Add(new LogicWaypoint(tt.pm.lm.TermLookup["White_Palace_01"], tt.pm.lm.LogicLookup["White_Palace_01"])); + return true; + } + if (transition == "Warp White Palace Atrium") { tt.pm.Add(new LogicWaypoint(tt.pm.lm.TermLookup["White_Palace_03_hub"], tt.pm.lm.LogicLookup["White_Palace_03_hub"])); diff --git a/MapModS/UI/TransitionText.cs b/MapModS/UI/TransitionText.cs index 5cb32ce..fa8e763 100644 --- a/MapModS/UI/TransitionText.cs +++ b/MapModS/UI/TransitionText.cs @@ -12,6 +12,7 @@ namespace MapModS.UI { + // Spaghetti warning internal class TransitionText { public static GameObject Canvas; @@ -20,7 +21,8 @@ internal class TransitionText private static CanvasPanel _instructionPanel; private static CanvasPanel _transitionPanel; - private static CanvasPanel _uncheckedTransitionsPanel; + private static CanvasPanel _uncheckedTransitionsPanelQuickMap; + private static CanvasPanel _uncheckedTransitionsPanelWorldMap; public static TransitionHelper th; @@ -51,7 +53,8 @@ public static void ShowWorldMap() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _instructionPanel.SetActive(isActive, isActive); - _uncheckedTransitionsPanel.SetActive(false, false); + _uncheckedTransitionsPanelQuickMap.SetActive(false, false); + SetUncheckedTransitionsWorldMapText(); } @@ -63,6 +66,7 @@ public static void Hide() LockToggleEnable = false; _instructionPanel.SetActive(false, false); + _uncheckedTransitionsPanelWorldMap.SetActive(false, false); } public static void Initialize() @@ -94,11 +98,17 @@ public static void BuildText(GameObject _canvas) _transitionPanel.SetActive(false, false); - _uncheckedTransitionsPanel = new CanvasPanel + _uncheckedTransitionsPanelQuickMap = new CanvasPanel (_canvas, GUIController.Instance.Images["ButtonsMenuBG"], new Vector2(10f, 20f), new Vector2(1346f, 0f), new Rect(0f, 0f, 0f, 0f)); - _uncheckedTransitionsPanel.AddText("Unchecked", "Transitions: None", new Vector2(-37f, 0f), Vector2.zero, GUIController.Instance.TrajanNormal, 14, FontStyle.Normal, TextAnchor.UpperRight); + _uncheckedTransitionsPanelQuickMap.AddText("Unchecked", "Transitions: None", new Vector2(-37f, 0f), Vector2.zero, GUIController.Instance.TrajanNormal, 14, FontStyle.Normal, TextAnchor.UpperRight); - _uncheckedTransitionsPanel.SetActive(false, false); + _uncheckedTransitionsPanelQuickMap.SetActive(false, false); + + _uncheckedTransitionsPanelWorldMap = new CanvasPanel + (_canvas, GUIController.Instance.Images["EnemiesBg"], new Vector2(1400f, 150f), Vector2.zero, new Rect(0f, 0f, GUIController.Instance.Images["EnemiesBg"].width, GUIController.Instance.Images["EnemiesBg"].height)); + _uncheckedTransitionsPanelWorldMap.AddText("UncheckedSelected", "Transitions: None", new Vector2(20f, 20f), Vector2.zero, GUIController.Instance.TrajanNormal, 14); + + _uncheckedTransitionsPanelWorldMap.SetActive(false, false); SetTexts(); } @@ -114,10 +124,10 @@ public static void SetTexts() || MapModS.LS.mapMode == MapMode.TransitionRandoAlt); _transitionPanel.SetActive(isActive, isActive); - _uncheckedTransitionsPanel.SetActive(isActive && !_instructionPanel.Active, isActive && !_instructionPanel.Active); + _uncheckedTransitionsPanelQuickMap.SetActive(isActive && !_instructionPanel.Active, isActive && !_instructionPanel.Active); SetTransitionsText(); - SetUncheckedTransitionsText(); + SetUncheckedTransitionsQuickMapText(); SetRouteText(); } @@ -150,6 +160,14 @@ public static void Update() SetRouteText(); rejectedTransitionPairs = new(); } + + if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) + && Input.GetKeyDown(KeyCode.U)) + { + MapModS.GS.ToggleUncheckedPanel(); + SetRouteText(); + SetUncheckedTransitionsWorldMapText(); + } } private static Thread colorUpdateThread; @@ -172,6 +190,7 @@ public static void UpdateSelectedScene() if (GetRoomClosestToMiddle(selectedScene, out selectedScene)) { SetInstructionsText(); + SetUncheckedTransitionsWorldMapText(); SetRoomColors(); } }); @@ -329,6 +348,15 @@ public static void SetRouteText() routeText += "\nInclude benchwarp (Ctrl-B): Off"; } + if (MapModS.GS.uncheckedPanelActive) + { + routeText += "\nShow unchecked/visited (Ctrl-U): On"; + } + else + { + routeText += "\nShow unchecked/visited (Ctrl-U): Off"; + } + _instructionPanel.GetText("Route").UpdateText(routeText); } @@ -354,10 +382,27 @@ public static void SetTransitionsText() } // Display both unchecked and visited transitions of current room - public static void SetUncheckedTransitionsText() + public static void SetUncheckedTransitionsQuickMapText() + { + _uncheckedTransitionsPanelQuickMap.GetText("Unchecked").UpdateText(GetUncheckedVisited(StringUtils.CurrentNormalScene())); + } + + public static void SetUncheckedTransitionsWorldMapText() + { + _uncheckedTransitionsPanelWorldMap.GetText("UncheckedSelected").UpdateText(GetUncheckedVisited(selectedScene)); + + bool active = MapModS.LS.ModEnabled + && (MapModS.LS.mapMode == MapMode.TransitionRando || MapModS.LS.mapMode == MapMode.TransitionRando) + && MapModS.GS.uncheckedPanelActive + && _instructionPanel != null && _instructionPanel.Active; + + _uncheckedTransitionsPanelWorldMap.SetActive(active, active); + } + + public static string GetUncheckedVisited(string scene) { string uncheckedTransitionsText = ""; - IEnumerable uncheckedTransitions = GetUncheckedTransitions(); + IEnumerable uncheckedTransitions = GetUncheckedTransitions(scene); if (uncheckedTransitions.Any()) { @@ -371,7 +416,7 @@ public static void SetUncheckedTransitionsText() uncheckedTransitionsText += "\n\n"; } - IEnumerable> visitedTransitions = GetVisitedTransitions(); + IEnumerable> visitedTransitions = GetVisitedTransitions(scene); if (visitedTransitions.Any()) { @@ -379,24 +424,24 @@ public static void SetUncheckedTransitionsText() foreach (Tuple transition in visitedTransitions) { - uncheckedTransitionsText += "\n" + transition.Item1 + " -> " + transition.Item2; + uncheckedTransitionsText += "\n" + transition.Item1 + " -> " + transition.Item2; } } - _uncheckedTransitionsPanel.GetText("Unchecked").UpdateText(uncheckedTransitionsText); + return uncheckedTransitionsText; } - public static IEnumerable GetUncheckedTransitions() + public static IEnumerable GetUncheckedTransitions(string scene) { return RandomizerMod.RandomizerMod.RS.TrackerData.uncheckedReachableTransitions - .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t).SceneName == StringUtils.CurrentNormalScene()) + .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t).SceneName == scene) .Select(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t).DoorName); } - public static IEnumerable> GetVisitedTransitions() + public static IEnumerable> GetVisitedTransitions(string scene) { return RandomizerMod.RandomizerMod.RS.TrackerData.visitedTransitions - .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t.Key).SceneName == StringUtils.CurrentNormalScene()) + .Where(t => RandomizerMod.RandomizerData.Data.GetTransitionDef(t.Key).SceneName == scene) .Select(t => new Tuple(RandomizerMod.RandomizerData.Data.GetTransitionDef(t.Key).DoorName, t.Value)); }