Skip to content

Commit 8dc646f

Browse files
Adding Energy Drone back to API 2.0
1 parent a248513 commit 8dc646f

File tree

2 files changed

+281
-0
lines changed

2 files changed

+281
-0
lines changed

InscryptionAPI/InscryptionAPIPlugin.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
global using UnityObject = UnityEngine.Object;
22

33
using BepInEx;
4+
using BepInEx.Configuration;
45
using BepInEx.Logging;
56
using HarmonyLib;
67
using InscryptionAPI.Card;
8+
using InscryptionAPI.ResourceManagers;
79
using System.Runtime.CompilerServices;
10+
using UnityEngine.SceneManagement;
811

912
[assembly: InternalsVisibleTo("Assembly-CSharp")]
1013

@@ -18,6 +21,13 @@ public class InscryptionAPIPlugin : BaseUnityPlugin
1821
public const string ModName = "InscryptionAPI";
1922
public const string ModVer = "2.0.0";
2023

24+
internal static InscryptionAPIPlugin Instance;
25+
26+
internal static ConfigEntry<bool> configEnergy;
27+
internal static ConfigEntry<bool> configDrone;
28+
internal static ConfigEntry<bool> configMox;
29+
internal static ConfigEntry<bool> configDroneMox;
30+
2131
static InscryptionAPIPlugin()
2232
{
2333
AppDomain.CurrentDomain.AssemblyResolve += static (_, e) => {
@@ -46,6 +56,7 @@ public void OnEnable()
4656
Logger = base.Logger;
4757

4858
HarmonyInstance.PatchAll(typeof(InscryptionAPIPlugin).Assembly);
59+
SceneManager.sceneLoaded += this.OnSceneLoaded;
4960
}
5061

5162
public void OnDisable()
@@ -58,4 +69,18 @@ public void Start()
5869
CardManager.SyncCardList();
5970
AbilityManager.SyncAbilityList();
6071
}
72+
73+
public void Awake()
74+
{
75+
Instance = this;
76+
configEnergy = Config.Bind("Energy","Energy Refresh",true,"Max energy increases and energy refreshes at end of turn");
77+
configDrone = Config.Bind("Energy","Energy Drone",false,"Drone is visible to display energy (requires Energy Refresh)");
78+
configMox = Config.Bind("Mox","Mox Refresh",false,"Mox refreshes at end of battle");
79+
configDroneMox = Config.Bind("Mox","Mox Drone",false,"Drone displays mox (requires Energy Drone and Mox Refresh)");
80+
}
81+
82+
public void OnSceneLoaded(Scene scene, LoadSceneMode mode)
83+
{
84+
ActOneEnergyDrone.TryEnableEnergy(scene.name);
85+
}
6186
}
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
using System.Collections;
2+
using System.Reflection;
3+
using DiskCardGame;
4+
using HarmonyLib;
5+
using InscryptionAPI.Card;
6+
using Mono.Cecil.Cil;
7+
using MonoMod.Cil;
8+
using UnityEngine;
9+
10+
namespace InscryptionAPI.ResourceManagers;
11+
12+
[HarmonyPatch]
13+
public static class ActOneEnergyDrone
14+
{
15+
public class ActOneEnergyConfig
16+
{
17+
public bool configEnergy { get; private set; }
18+
public bool configDrone { get; private set; }
19+
public bool configMox { get; private set; }
20+
public bool configDroneMox { get; private set; }
21+
22+
public static bool CardVisibleInActOne(CardInfo info)
23+
{
24+
if (info.temple != CardTemple.Nature) // Non-nature cards can't be selected in Act 1
25+
return false;
26+
27+
// Now we check metacategories
28+
// If the card's metacategories are set such that it can't actually appear, don't count it
29+
return (info.metaCategories.Contains(CardMetaCategory.ChoiceNode) ||
30+
info.metaCategories.Contains(CardMetaCategory.TraderOffer) ||
31+
info.metaCategories.Contains(CardMetaCategory.Rare));
32+
}
33+
34+
public ActOneEnergyConfig()
35+
{
36+
// Check the entire pool of cards for mox and energy
37+
bool poolHasEnergy = CardManager.AllCardsCopy.Exists(ci => ci.energyCost > 0 && CardVisibleInActOne(ci));
38+
bool poolHasMox = CardManager.AllCardsCopy.Exists(ci => ci.gemsCost.Count > 0 && CardVisibleInActOne(ci));
39+
40+
configEnergy = poolHasEnergy || InscryptionAPIPlugin.configEnergy.Value;
41+
configMox = poolHasMox || InscryptionAPIPlugin.configMox.Value;
42+
configDroneMox = poolHasMox || InscryptionAPIPlugin.configDroneMox.Value;
43+
configDrone = configDroneMox || poolHasEnergy || InscryptionAPIPlugin.configDrone.Value;
44+
45+
InscryptionAPIPlugin.Logger.LogDebug($"Act 1 Energy Config: energy {configEnergy}, mox {configMox}, drone {configDroneMox}, drone mox {configDrone}");
46+
}
47+
}
48+
49+
public static ActOneEnergyConfig EnergyConfig;
50+
51+
internal static void TryEnableEnergy(string sceneName)
52+
{
53+
InscryptionAPIPlugin.Logger.LogDebug($"Checking to see if I need to enable energy for scene {sceneName}");
54+
55+
if (sceneName == "Part1_Cabin")
56+
{
57+
EnergyConfig = new ActOneEnergyConfig();
58+
59+
UnityEngine.Object.Instantiate(Resources.Load<ResourceDrone>("prefabs/cardbattle/ResourceModules"));
60+
61+
if(EnergyConfig.configDrone)
62+
InscryptionAPIPlugin.Instance.StartCoroutine(AwakeDrone());
63+
}
64+
}
65+
66+
private static IEnumerator AwakeDrone()
67+
{
68+
yield return new WaitForSeconds(1);
69+
70+
InscryptionAPIPlugin.Logger.LogDebug($"Awaking drone. Exists? {ResourceDrone.Instance}");
71+
72+
if (ResourceDrone.Instance != null)
73+
ResourceDrone.Instance.Awake();
74+
75+
yield return new WaitForSeconds(1);
76+
77+
if (ResourceDrone.Instance != null)
78+
ResourceDrone.Instance.AttachGemsModule();
79+
}
80+
81+
[HarmonyPatch(typeof(ResourceDrone), "SetOnBoard")]
82+
[HarmonyPostfix]
83+
public static void ResourceDrone_SetOnBoard(ResourceDrone __instance)
84+
{
85+
if (SaveManager.SaveFile.IsPart1)
86+
{
87+
// These three settings came from playing around with the UnityExplorer plugin
88+
__instance.gameObject.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);
89+
__instance.gameObject.transform.localPosition = new Vector3(-3.038f, 7.24f, -0.42f);
90+
__instance.gameObject.transform.localEulerAngles = new Vector3(270.3065f, 309.2996f, 180f);
91+
92+
__instance.gameObject.transform.Find("Anim").gameObject.GetComponent<Animator>().enabled = false;
93+
94+
__instance.gameObject.transform.Find("Anim/Module-Energy/Propellers").gameObject.SetActive(false);
95+
96+
__instance.Gems.gameObject.SetActive(EnergyConfig.configDroneMox);
97+
}
98+
}
99+
100+
[HarmonyPatch(typeof(Part1ResourcesManager), "CleanUp")]
101+
[HarmonyPrefix]
102+
public static void Part1ResourcesManager_CleanUp(Part1ResourcesManager __instance)
103+
{
104+
ResourcesManager baseResourceManager = (ResourcesManager)__instance;
105+
if (EnergyConfig.configEnergy)
106+
{
107+
baseResourceManager.PlayerEnergy = 0;
108+
baseResourceManager.PlayerMaxEnergy = 0;
109+
}
110+
111+
if (EnergyConfig.configDrone)
112+
{
113+
ResourceDrone.Instance.CloseAllCells(false);
114+
ResourceDrone.Instance.SetOnBoard(false, false);
115+
if (EnergyConfig.configDroneMox)
116+
{
117+
ResourceDrone.Instance.Gems.SetAllGemsOn(false, false);
118+
}
119+
}
120+
121+
if (EnergyConfig.configMox)
122+
{
123+
__instance.gems.Clear();
124+
}
125+
}
126+
127+
[HarmonyPatch(typeof(ResourcesManager), "Setup")]
128+
[HarmonyPrefix]
129+
public static void ResourcesManager_Setup(ResourcesManager __instance)
130+
{
131+
if (__instance is Part1ResourcesManager && EnergyConfig.configDrone)
132+
{
133+
InscryptionAPIPlugin.Logger.LogDebug($"Setting up extra resources: drone {ResourceDrone.Instance}");
134+
ResourceDrone.Instance.SetOnBoard(true, false);
135+
if (EnergyConfig.configDroneMox)
136+
{
137+
ResourceDrone.Instance.Gems.SetAllGemsOn(false, true);
138+
}
139+
}
140+
}
141+
142+
[HarmonyPatch(typeof(ResourcesManager), "ShowAddMaxEnergy")]
143+
[HarmonyPostfix]
144+
public static IEnumerator ResourcesManager_ShowAddMaxEnergy(IEnumerator result, ResourcesManager __instance)
145+
{
146+
if (__instance is Part1ResourcesManager && EnergyConfig.configDrone)
147+
{
148+
ResourceDrone.Instance.OpenCell(__instance.PlayerMaxEnergy - 1);
149+
yield return new WaitForSeconds(0.4f);
150+
}
151+
152+
yield return result;
153+
}
154+
155+
[HarmonyPatch(typeof(ResourcesManager), "ShowAddEnergy")]
156+
[HarmonyPostfix]
157+
public static IEnumerator ResourcesManager_ShowAddEnergy(IEnumerator result, int amount, ResourcesManager __instance)
158+
{
159+
if (__instance is Part1ResourcesManager && EnergyConfig.configDrone)
160+
{
161+
int num;
162+
for (int i = __instance.PlayerEnergy - amount; i < __instance.PlayerEnergy; i = num + 1)
163+
{
164+
ResourceDrone.Instance.SetCellOn(i, true, false);
165+
yield return new WaitForSeconds(0.05f);
166+
num = i;
167+
}
168+
}
169+
170+
yield return result;
171+
}
172+
173+
[HarmonyPatch(typeof(ResourcesManager), "ShowSpendEnergy")]
174+
[HarmonyPostfix]
175+
public static IEnumerator ResourcesManager_ShowSpendEnergy(IEnumerator result, int amount, ResourcesManager __instance)
176+
{
177+
if (__instance is Part1ResourcesManager && EnergyConfig.configDrone)
178+
{
179+
int num;
180+
for (int i = __instance.PlayerEnergy + amount - 1; i >= __instance.PlayerEnergy; i = num - 1)
181+
{
182+
AudioController.Instance.PlaySound3D("crushBlip3", MixerGroup.TableObjectsSFX,
183+
__instance.transform.position, 0.4f, 0f,
184+
new AudioParams.Pitch(0.9f + (float)(__instance.PlayerEnergy + i) * 0.05f), null, null, null,
185+
false);
186+
ResourceDrone.Instance.SetCellOn(i, false, false);
187+
yield return new WaitForSeconds(0.05f);
188+
num = i;
189+
}
190+
}
191+
192+
yield return result;
193+
}
194+
195+
[HarmonyPatch(typeof(ResourcesManager), "ShowAddGem")]
196+
[HarmonyPostfix]
197+
public static IEnumerator ResourcesManager_ShowAddGem(IEnumerator result, GemType gem, ResourcesManager __instance)
198+
{
199+
if (__instance is Part1ResourcesManager && EnergyConfig.configDroneMox)
200+
{
201+
__instance.SetGemOnImmediate(gem, true);
202+
yield return new WaitForSeconds(0.05f);
203+
}
204+
205+
yield return result;
206+
}
207+
208+
[HarmonyPatch(typeof(ResourcesManager), "ShowLoseGem")]
209+
[HarmonyPostfix]
210+
public static IEnumerator ResourcesManager_ShowLoseGem(IEnumerator result, GemType gem, ResourcesManager __instance)
211+
{
212+
if (__instance is Part1ResourcesManager && EnergyConfig.configDroneMox)
213+
{
214+
__instance.SetGemOnImmediate(gem, false);
215+
yield return new WaitForSeconds(0.05f);
216+
}
217+
218+
yield return result;
219+
}
220+
221+
[HarmonyPatch(typeof(ResourcesManager), "SetGemOnImmediate")]
222+
[HarmonyPostfix]
223+
public static void ResourcesManager_SetGemOnImmediate(GemType gem, bool on, ResourcesManager __instance)
224+
{
225+
if (__instance is Part1ResourcesManager)
226+
ResourceDrone.Instance.Gems.SetGemOn(gem, on, false);
227+
}
228+
229+
[HarmonyPatch(typeof(TurnManager), nameof(TurnManager.DoUpkeepPhase))]
230+
[HarmonyPostfix]
231+
public static IEnumerator TurnManager_UpkeepPhase(IEnumerator sequence, bool playerUpkeep)
232+
{
233+
// This replaces a complex IL patch
234+
// If the game is not going to automatically update the energy, I'll do it
235+
yield return sequence;
236+
237+
if (SaveManager.SaveFile.IsPart1 && EnergyConfig.configEnergy && playerUpkeep)
238+
{
239+
bool showEnergyModule = !ResourcesManager.Instance.EnergyAtMax || ResourcesManager.Instance.PlayerEnergy < ResourcesManager.Instance.PlayerMaxEnergy;
240+
if (showEnergyModule)
241+
{
242+
ViewManager.Instance.SwitchToView(View.Default, false, true);
243+
yield return new WaitForSeconds(0.1f);
244+
}
245+
246+
yield return ResourcesManager.Instance.AddMaxEnergy(1);
247+
yield return ResourcesManager.Instance.RefreshEnergy();
248+
249+
if (showEnergyModule)
250+
{
251+
yield return new WaitForSeconds(0.25f);
252+
Singleton<ViewManager>.Instance.Controller.LockState = ViewLockState.Unlocked;
253+
}
254+
}
255+
}
256+
}

0 commit comments

Comments
 (0)