Skip to content

Commit f3aa9a1

Browse files
Renamed to ShieldPrevented, changed BreakShield transpiler to use TriggerBreakShield instead
1 parent ac1cc2b commit f3aa9a1

File tree

4 files changed

+60
-23
lines changed

4 files changed

+60
-23
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
<details>
22
<summary>View Changelog</summary>
33

4+
# 2.22.1
5+
- Added IShieldPreventedDamage and IShieldPreventedDamageInHand ability triggers and interfaces
6+
- Added TriggerBreakShield, wraps BreakShield in an IEnumerator for additional customisation by modders
7+
- Added ICustomExhaustSequence trigger interface for modifying the draw pile exhaustion effect - use with Opponents
8+
- Removed debug logging related to rulebook redirect coordinates
9+
410
# 2.22.0
511
- Added FullBoon objects for each vanilla Boon
612
- Added 'AllFullBoons' list to BoonManager

InscryptionAPI/Card/ShieldManager.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,22 @@ public static IEnumerator TriggerBreakShield(PlayableCard target, int damage, Pl
2929
{
3030
BreakShield(target, damage, attacker);
3131

32-
List<IShieldPreventDamage> shieldTriggers = CustomTriggerFinder.FindTriggersOnBoard<IShieldPreventDamage>(false).ToList();
33-
shieldTriggers.Sort((IShieldPreventDamage a, IShieldPreventDamage b) => b.ShieldPreventDamagePriority(target, damage, attacker) - a.ShieldPreventDamagePriority(target, damage, attacker));
34-
foreach (IShieldPreventDamage damageTrigger in shieldTriggers)
32+
List<IShieldPreventedDamage> shieldTriggers = CustomTriggerFinder.FindTriggersOnBoard<IShieldPreventedDamage>(false).ToList();
33+
shieldTriggers.Sort((IShieldPreventedDamage a, IShieldPreventedDamage b) => b.ShieldPreventedDamagePriority(target, damage, attacker) - a.ShieldPreventedDamagePriority(target, damage, attacker));
34+
foreach (IShieldPreventedDamage damageTrigger in shieldTriggers)
3535
{
36-
if ((damageTrigger as TriggerReceiver) != null && damageTrigger.RespondsToShieldPreventDamage(target, damage, attacker))
36+
if ((damageTrigger as TriggerReceiver) != null && damageTrigger.RespondsToShieldPreventedDamage(target, damage, attacker))
3737
{
38-
yield return damageTrigger.OnShieldPreventDamage(target, damage, attacker);
38+
yield return damageTrigger.OnShieldPreventedDamage(target, damage, attacker);
3939
}
4040
}
41-
List<IShieldPreventDamageInHand> shieldInHandTriggers = CustomTriggerFinder.FindTriggersInHand<IShieldPreventDamageInHand>().ToList();
42-
shieldInHandTriggers.Sort((IShieldPreventDamageInHand a, IShieldPreventDamageInHand b) => b.ShieldPreventDamageInHandPriority(target, damage, attacker) - a.ShieldPreventDamageInHandPriority(target, damage, attacker));
43-
foreach (IShieldPreventDamageInHand damageTrigger in shieldInHandTriggers)
41+
List<IShieldPreventedDamageInHand> shieldInHandTriggers = CustomTriggerFinder.FindTriggersInHand<IShieldPreventedDamageInHand>().ToList();
42+
shieldInHandTriggers.Sort((IShieldPreventedDamageInHand a, IShieldPreventedDamageInHand b) => b.ShieldPreventedDamageInHandPriority(target, damage, attacker) - a.ShieldPreventedDamageInHandPriority(target, damage, attacker));
43+
foreach (IShieldPreventedDamageInHand damageTrigger in shieldInHandTriggers)
4444
{
45-
if ((damageTrigger as TriggerReceiver) != null && damageTrigger.RespondsToShieldPreventDamageInHand(target, damage, attacker))
45+
if ((damageTrigger as TriggerReceiver) != null && damageTrigger.RespondsToShieldPreventedDamageInHand(target, damage, attacker))
4646
{
47-
yield return damageTrigger.OnShieldPreventDamageInHand(target, damage, attacker);
47+
yield return damageTrigger.OnShieldPreventedDamageInHand(target, damage, attacker);
4848
}
4949
}
5050
}

InscryptionAPI/Triggers/Interfaces.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -805,20 +805,20 @@ public interface IOnCardDealtDamageDirectly
805805
/// <summary>
806806
/// Trigger that is called after a shielded card was attacked and lost a shield.
807807
/// </summary>
808-
public interface IShieldPreventDamage
808+
public interface IShieldPreventedDamage
809809
{
810-
public bool RespondsToShieldPreventDamage(PlayableCard target, int damage, PlayableCard attacker);
811-
public IEnumerator OnShieldPreventDamage(PlayableCard target, int damage, PlayableCard attacker);
812-
public int ShieldPreventDamagePriority(PlayableCard target, int damage, PlayableCard attacker);
810+
public bool RespondsToShieldPreventedDamage(PlayableCard target, int damage, PlayableCard attacker);
811+
public IEnumerator OnShieldPreventedDamage(PlayableCard target, int damage, PlayableCard attacker);
812+
public int ShieldPreventedDamagePriority(PlayableCard target, int damage, PlayableCard attacker);
813813
}
814814
/// <summary>
815815
/// Variant of IShieldPreventDamage that triggers for cards in the hand.
816816
/// </summary>
817-
public interface IShieldPreventDamageInHand
817+
public interface IShieldPreventedDamageInHand
818818
{
819-
public bool RespondsToShieldPreventDamageInHand(PlayableCard target, int damage, PlayableCard attacker);
820-
public IEnumerator OnShieldPreventDamageInHand(PlayableCard target, int damage, PlayableCard attacker);
821-
public int ShieldPreventDamageInHandPriority(PlayableCard target, int damage, PlayableCard attacker);
819+
public bool RespondsToShieldPreventedDamageInHand(PlayableCard target, int damage, PlayableCard attacker);
820+
public IEnumerator OnShieldPreventedDamageInHand(PlayableCard target, int damage, PlayableCard attacker);
821+
public int ShieldPreventedDamageInHandPriority(PlayableCard target, int damage, PlayableCard attacker);
822822
}
823823
/*public interface IOnPreTakeDamageFromHammer
824824
{

InscryptionAPI/Triggers/TakeDamagePatches.cs

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)