@@ -94,6 +94,7 @@ private static IEnumerable<CodeInstruction> TakeDamageTranspiler(IEnumerable<Cod
9494 int shieldStart = - 1 , shieldEnd = - 1 ;
9595 for ( int i = 0 ; i < codes . Count ; i ++ )
9696 {
97+
9798 // grab the required operands, in order of appearance in the code
9899 if ( shieldStart == - 1 && codes [ i ] . operand ? . ToString ( ) == "Boolean HasShield()" )
99100 {
@@ -130,11 +131,22 @@ private static IEnumerable<CodeInstruction> TakeDamageTranspiler(IEnumerable<Cod
130131 attacker = codes [ i ] . operand ;
131132 if ( shieldEnd > 0 )
132133 {
134+ CodeInstruction switch_ = codes . Find ( x => x . opcode == OpCodes . Switch ) ;
135+ //switch_.WithLabels(breakShieldLabel);
136+ object state = codes . Find ( x => x . opcode == OpCodes . Stfld && x . operand . ToString ( ) == "System.Int32 <>1__state" ) . operand ;
137+ object current = codes . Find ( x => x . opcode == OpCodes . Stfld && x . operand . ToString ( ) == "System.Object <>2__current" ) . operand ;
133138 // if (HasShield && damage > 0)
134- // BreakShield ();
139+ // yield return TriggerBreakShield ();
135140 // break;
136141
137- MethodBase breakShield = AccessTools . Method ( typeof ( ShieldManager ) , nameof ( ShieldManager . BreakShield ) ,
142+ // TriggerBreakShield
143+ // this.current = TriggerBreakShield
144+ // this.state = 7
145+ // return true
146+ // this.state = -1
147+ // yield break (new label)
148+
149+ MethodBase breakShield = AccessTools . Method ( typeof ( ShieldManager ) , nameof ( ShieldManager . TriggerBreakShield ) ,
138150 new Type [ ] { typeof ( PlayableCard ) , typeof ( int ) , typeof ( PlayableCard ) } ) ;
139151
140152 codes . RemoveRange ( shieldStart , shieldEnd - shieldStart ) ;
@@ -145,14 +157,33 @@ private static IEnumerable<CodeInstruction> TakeDamageTranspiler(IEnumerable<Cod
145157 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldc_I4_0 ) ) ;
146158 codes . Insert ( shieldStart ++ , new ( OpCodes . Cgt ) ) ;
147159 codes . Insert ( shieldStart ++ , new ( OpCodes . Brfalse , hasShieldLabel ) ) ;
148- // BreakShield();
149- //break;
160+
161+ // TriggerBreakShield();
162+ codes . Insert ( shieldStart ++ , new ( OpCodes . Ldarg_0 ) ) ;
150163 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldloc_1 ) ) ;
151164 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldarg_0 ) ) ;
152165 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldfld , damage ) ) ;
153166 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldarg_0 ) ) ;
154167 codes . Insert ( shieldStart ++ , new ( OpCodes . Ldfld , attacker ) ) ;
155- codes . Insert ( shieldStart ++ , new ( OpCodes . Call , breakShield ) ) ;
168+ codes . Insert ( shieldStart ++ , new ( OpCodes . Callvirt , breakShield ) ) ;
169+
170+ // this.current = TriggerBreakShield
171+ codes . Insert ( shieldStart ++ , new ( OpCodes . Stfld , current ) ) ;
172+ // this.state = 5
173+ codes . Insert ( shieldStart ++ , new ( OpCodes . Ldarg_0 ) ) ;
174+ codes . Insert ( shieldStart ++ , new ( OpCodes . Ldc_I4_4 ) ) ;
175+ codes . Insert ( shieldStart ++ , new ( OpCodes . Stfld , state ) ) ;
176+ // return true
177+ codes . Insert ( shieldStart ++ , new ( OpCodes . Ldc_I4_1 ) ) ;
178+ codes . Insert ( shieldStart ++ , new ( OpCodes . Ret ) ) ;
179+ // this.state = -1
180+ //generator.MarkLabel(breakShieldLabel);
181+ /*CodeInstruction it = new(OpCodes.Ldarg_0);
182+ it.labels.Add(breakShieldLabel);
183+ codes.Insert(shieldStart++, it);
184+ codes.Insert(shieldStart++, new(OpCodes.Ldc_I4_M1));
185+ codes.Insert(shieldStart++, new(OpCodes.Stfld, state));*/
186+ // yield break
156187 }
157188 break ;
158189 }
0 commit comments