From 605e866e92f4231ee05fbc3d6fbbea42383ba48e Mon Sep 17 00:00:00 2001 From: Star Rauchenberger Date: Wed, 22 May 2024 20:05:14 -0400 Subject: Added red cave tentacle locations --- AnodyneArchipelago/Locations.cs | 8 ++-- AnodyneArchipelago/Patches/PatchHelper.cs | 15 +++++++ AnodyneArchipelago/Plugin.cs | 68 ++++++++++++++++++------------- 3 files changed, 59 insertions(+), 32 deletions(-) create mode 100644 AnodyneArchipelago/Patches/PatchHelper.cs (limited to 'AnodyneArchipelago') diff --git a/AnodyneArchipelago/Locations.cs b/AnodyneArchipelago/Locations.cs index 56701a5..dba2379 100644 --- a/AnodyneArchipelago/Locations.cs +++ b/AnodyneArchipelago/Locations.cs @@ -72,15 +72,15 @@ namespace AnodyneArchipelago {new Guid("5ffe5efb-6e92-da36-302a-7b75d3e72085"), "Red Grotto - Widen Upgrade Chest" }, {new Guid("ae87f1d5-57e0-1749-7e1e-1d0bcc1bcab4"), "Red Grotto - Middle Cave Left Chest" }, {new Guid("72bad10e-598f-f238-0103-60e1b36f6240"), "Red Grotto - Middle Cave Right Chest" }, - // Middle Left Tentacle - // Middle Right Tentacle + {new Guid("09241266-9657-6152-bb37-5ff0a7fddcf9"), "Red Grotto - Middle Cave Left Tentacle" }, + {new Guid("95d6cf28-66df-54a5-0aec-6b54f56a2edc"), "Red Grotto - Middle Cave Right Tentacle" }, {new Guid("ed7d4d0f-c29d-d5aa-289a-b6c6ab8a041e"), "Red Grotto - Middle Cave Middle Chest" }, {new Guid("4a9dc50d-8739-9ad8-2cb1-82ece29d3b6f"), "Red Grotto - Left Cave Rapids Chest" }, {new Guid("cda1ff45-0f88-4855-b0ec-a9b42376c33f"), "Red Grotto - Left Cave Sticky Chest" }, - // Left Tentacle + {new Guid("a0b1ccc8-849a-b61d-7742-bfaf11013b2a"), "Red Grotto - Left Cave Tentacle" }, {new Guid("83286bfb-ffda-237e-ba57-ca2e532e1dc7"), "Red Grotto - Right Cave Four Shooter Chest" }, {new Guid("a7672339-f3fb-c49e-33ce-42a49d7e4533"), "Red Grotto - Right Cave Slasher Chest" }, - // Right Tentacle + {new Guid("ed3b58c5-9191-013c-6935-777766e39a65"), "Red Grotto - Right Cave Tentacle" }, {new Guid("0504f29a-042a-bbc7-9fd4-5559e8ec64d0"), "Red Grotto - Top Cave Slasher Chest" }, {new Guid("082409e1-1d7e-3a22-9059-d5d9d0626fb1"), "Red Grotto - Health Cicada" }, {new Guid("622180eb-bc49-c327-d598-af9714b5ecb3"), "Red Grotto - Boss Chest" }, diff --git a/AnodyneArchipelago/Patches/PatchHelper.cs b/AnodyneArchipelago/Patches/PatchHelper.cs new file mode 100644 index 0000000..6b6d532 --- /dev/null +++ b/AnodyneArchipelago/Patches/PatchHelper.cs @@ -0,0 +1,15 @@ +using AnodyneSharp.Entities; +using System; +using System.Reflection; + +namespace AnodyneArchipelago.Patches +{ + internal class PatchHelper + { + public static EntityPreset GetEntityPreset(Type type, object instance) + { + FieldInfo presetField = type.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); + return presetField.GetValue(instance) as EntityPreset; + } + } +} diff --git a/AnodyneArchipelago/Plugin.cs b/AnodyneArchipelago/Plugin.cs index 0bc372b..0fb7b60 100644 --- a/AnodyneArchipelago/Plugin.cs +++ b/AnodyneArchipelago/Plugin.cs @@ -1,4 +1,5 @@ -using AnodyneSharp; +using AnodyneArchipelago.Patches; +using AnodyneSharp; using AnodyneSharp.Entities; using AnodyneSharp.Entities.Events; using AnodyneSharp.Entities.Gadget; @@ -69,10 +70,8 @@ namespace AnodyneArchipelago { static void Prefix(TreasureChest __instance) { - Type chestType = typeof(TreasureChest); - FieldInfo presetField = chestType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(__instance) as EntityPreset; - Plugin.Instance.Log.LogInfo($"Touched chest: {preset.EntityID.ToString()}"); + string entityId = PatchHelper.GetEntityPreset(typeof(TreasureChest), __instance).EntityID.ToString(); + Plugin.Instance.Log.LogInfo($"Touched chest: {entityId}"); } } @@ -81,15 +80,12 @@ namespace AnodyneArchipelago { static bool Prefix(TreasureChest __instance) { - Type chestType = typeof(TreasureChest); - FieldInfo presetField = chestType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(__instance) as EntityPreset; - - if (Locations.LocationsByGuid.ContainsKey(preset.EntityID)) + Guid entityId = PatchHelper.GetEntityPreset(typeof(TreasureChest), __instance).EntityID; + if (Locations.LocationsByGuid.ContainsKey(entityId)) { - BaseTreasure treasure = new ArchipelagoTreasure(Locations.LocationsByGuid[preset.EntityID], __instance.Position); + BaseTreasure treasure = new ArchipelagoTreasure(Locations.LocationsByGuid[entityId], __instance.Position); - FieldInfo treasureField = chestType.GetField("_treasure", BindingFlags.NonPublic | BindingFlags.Instance); + FieldInfo treasureField = typeof(TreasureChest).GetField("_treasure", BindingFlags.NonPublic | BindingFlags.Instance); treasureField.SetValue(__instance, treasure); return false; @@ -105,15 +101,12 @@ namespace AnodyneArchipelago // We basically just rewrite this method, because we need to get rid of the part that adds the key to the inventory. static bool Prefix(Big_Key __instance, ref bool __result) { - Type keyType = typeof(Big_Key); - FieldInfo presetField = keyType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(__instance) as EntityPreset; - - MethodInfo statesMethod = keyType.GetMethod("States", BindingFlags.NonPublic | BindingFlags.Instance); + MethodInfo statesMethod = typeof(Big_Key).GetMethod("States", BindingFlags.NonPublic | BindingFlags.Instance); + EntityPreset preset = PatchHelper.GetEntityPreset(typeof(Big_Key), __instance); preset.Alive = false; __instance.Solid = false; - GlobalState.StartCutscene = (System.Collections.Generic.IEnumerator)statesMethod.Invoke(__instance, new object[] { }); + GlobalState.StartCutscene = (IEnumerator)statesMethod.Invoke(__instance, new object[] { }); __result = true; return false; } @@ -124,9 +117,7 @@ namespace AnodyneArchipelago { static void Postfix(Big_Key __instance) { - Type keyType = typeof(Big_Key); - FieldInfo presetField = keyType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(__instance) as EntityPreset; + EntityPreset preset = PatchHelper.GetEntityPreset(typeof(Big_Key), __instance); if (preset.Frame == 0) { @@ -152,9 +143,7 @@ namespace AnodyneArchipelago FieldInfo childField = hcsType.GetField("_child", BindingFlags.NonPublic | BindingFlags.Instance); HealthCicada healthCicada = (HealthCicada)childField.GetValue(__instance); - Type cicadaType = typeof(HealthCicada); - FieldInfo presetField = cicadaType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(healthCicada) as EntityPreset; + EntityPreset preset = PatchHelper.GetEntityPreset(typeof(HealthCicada), healthCicada); Plugin.Instance.Log.LogInfo($"Touched cicada: {preset.EntityID.ToString()}"); } } @@ -184,15 +173,13 @@ namespace AnodyneArchipelago static IEnumerator StateLogic(HealthCicada healthCicada) { - Type cicadaType = typeof(HealthCicada); - FieldInfo presetField = cicadaType.GetField("_preset", BindingFlags.NonPublic | BindingFlags.Instance); - EntityPreset preset = presetField.GetValue(healthCicada) as EntityPreset; + EntityPreset preset = PatchHelper.GetEntityPreset(typeof(HealthCicada), healthCicada); while (!MathUtilities.MoveTo(ref healthCicada.opacity, 0.0f, 0.6f)) yield return "FadingOut"; preset.Alive = false; - FieldInfo sentinelField = cicadaType.GetField("_sentinel", BindingFlags.NonPublic | BindingFlags.Instance); + FieldInfo sentinelField = typeof(HealthCicada).GetField("_sentinel", BindingFlags.NonPublic | BindingFlags.Instance); HealthCicadaSentinel sentinel = (HealthCicadaSentinel)sentinelField.GetValue(healthCicada); sentinel.exists = false; @@ -261,4 +248,29 @@ namespace AnodyneArchipelago } } } + + [HarmonyPatch] + class BreakChainPatch + { + static MethodInfo TargetMethod() + { + return typeof(Red_Pillar).GetNestedType("Chain", BindingFlags.NonPublic).GetMethod("Collided"); + } + + static void Postfix(object __instance) + { + Type chainType = typeof(Red_Pillar).GetNestedType("Chain", BindingFlags.NonPublic); + FieldInfo parentField = chainType.GetField("_parent", BindingFlags.NonPublic | BindingFlags.Instance); + + Red_Pillar redPillar = (Red_Pillar)parentField.GetValue(__instance); + EntityPreset preset = PatchHelper.GetEntityPreset(typeof(Red_Pillar), redPillar); + + Plugin.Instance.Log.LogInfo($"Broke red chain: {preset.EntityID.ToString()}"); + + if (Locations.LocationsByGuid.ContainsKey(preset.EntityID)) + { + ArchipelagoManager.SendLocation(Locations.LocationsByGuid[preset.EntityID]); + } + } + } } -- cgit 1.4.1