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