Skip to content

Commit d56bf5b

Browse files
authored
Merge pull request #321 from HumabHatterZed/main
Fix shields persisting, minor visual fixes
2 parents 3ac13ac + e7ca7ac commit d56bf5b

File tree

7 files changed

+112
-112
lines changed

7 files changed

+112
-112
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# 2.23.1
2+
- Fixed non-CardModificationInfo shields not breaking
3+
- Fixed ShieldGeneratorItem not correclty updating visuals
4+
- Fixed DamageShieldBehaviours not initialising before being called
5+
- Added CardInfo.GetAbilityStacks()
6+
- Changed how DamageShieldBehaviour.ResetShield works to be more inline with how vanilla shields work
7+
- Removed some shield-reset-related patches
8+
19
# 2.23.0
210
- Added 'GBC Vanilla Render' config to community patches (false by default) - makes GBC cards render with vanilla cost sprites
311
- Added 'Vanilla Stacking' config to community patches (false by default) - renders cards with only two (stacking) sigils as they appear in vanilla, eg Spore Mice and Sporedigger

InscryptionAPI/Card/CardExtensionsHelpers.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,22 @@ public static int GetAbilityStacks(this PlayableCard card, Ability ability)
304304
return AbilitiesUtil.GetInfo(ability).canStack ? count : 1;
305305
}
306306

307+
/// <summary>
308+
/// Gets the number of Ability stacks a card has.
309+
/// </summary>
310+
/// <param name="card">The PlayableCard to access.</param>
311+
/// <param name="ability">The Ability to check for.</param>
312+
/// <returns>The number of Ability stacks the card has.</returns>
313+
public static int GetAbilityStacks(this CardInfo info, Ability ability)
314+
{
315+
int count = info.Abilities.Count(a => a == ability);
316+
if (count == 0)
317+
return 0;
318+
319+
// If it's not stackable, you get at most one
320+
return AbilitiesUtil.GetInfo(ability).canStack ? count : 1;
321+
}
322+
307323
/// <summary>
308324
/// Check if the other PlayableCard is on the same side of the board as this PlayableCard.
309325
/// </summary>
@@ -776,7 +792,10 @@ public static int GetTotalShields(this PlayableCard card)
776792
// covers for a situation I discovered where you use a SpecialBattleSequencer's triggers to advance a boss fight
777793
// somehow you can end up with a null playablecard which breaks this bit here
778794
if (card == null)
795+
{
796+
InscryptionAPIPlugin.Logger.LogDebug("[GetTotalShields] Card is null, returning 0.");
779797
return 0;
798+
}
780799

781800
int totalShields = 0;
782801
List<Ability> distinct = new(); // keep track of non-stacking shield abilities so we don't add them again
@@ -792,6 +811,7 @@ public static int GetTotalShields(this PlayableCard card)
792811
}
793812
}
794813

814+
//InscryptionAPIPlugin.Logger.LogDebug("[GetTotalShields] Total is " + totalShields);
795815
return totalShields;
796816
}
797817

InscryptionAPI/Card/DamageShieldBehaviour.cs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ public abstract class DamageShieldBehaviour : AbilityBehaviour
1818
public bool HasShields() => NumShields > 0;
1919

2020
public bool initialised = false;
21-
public virtual void Start()
21+
22+
public virtual void Awake()
2223
{
2324
if (base.Card != null)
2425
numShields = StartingNumShields;
2526

2627
initialised = true;
2728
}
29+
public virtual void Start()
30+
{
31+
32+
}
2833

2934
public virtual void AddShields(int amount, bool updateDisplay = true)
3035
{
@@ -40,13 +45,15 @@ public virtual void AddShields(int amount, bool updateDisplay = true)
4045
public virtual void RemoveShields(int amount, bool updateDisplay = true)
4146
{
4247
numShields -= amount;
43-
if (base.Card.GetTotalShields() <= 0)
44-
base.Card.Status.lostShield = true;
45-
46-
if (!Ability.GetHideSingleStacks() && !HasShields() && !base.Card.Status.hiddenAbilities.Contains(this.Ability))
48+
if (!this.HasShields())
4749
{
48-
base.Card.Status.hiddenAbilities.Add(this.Ability);
49-
//Debug.Log("Add hidden single");
50+
if (Ability.GetHideSingleStacks()) // visually reduce the number of shield stacks
51+
{
52+
for (int i = 0; i < amount; i++)
53+
base.Card.Status.hiddenAbilities.Add(this.Ability);
54+
}
55+
else if (!base.Card.Status.hiddenAbilities.Contains(this.Ability)) // hide the whole sigil
56+
base.Card.Status.hiddenAbilities.Add(this.Ability);
5057
}
5158

5259
if (updateDisplay)
@@ -56,11 +63,15 @@ public virtual void RemoveShields(int amount, bool updateDisplay = true)
5663
}
5764
public virtual void ResetShields(bool updateDisplay)
5865
{
59-
bool depleted = !HasShields();
66+
int currentShields = NumShields;
6067
numShields = StartingNumShields;
6168
base.Card.Status.lostShield = false;
6269

63-
base.Card.Status.hiddenAbilities.RemoveAll(x => x == this.Ability);
70+
for (int i = 0; i < numShields - currentShields; i++)
71+
{
72+
base.Card.Status.hiddenAbilities.Remove(this.Ability);
73+
}
74+
6475
if (updateDisplay)
6576
{
6677
base.Card.OnStatsChanged();

InscryptionAPI/Card/ShieldManager.cs

Lines changed: 54 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ public static class ShieldManager
2323
public static List<FullAbility> AllShieldAbilities { get; internal set; } = new(AllAbilities);
2424
public static List<AbilityInfo> AllShieldInfos { get; internal set; } = AllShieldAbilities.Select(x => x.Info).ToList();
2525

26-
2726
public static IEnumerator TriggerBreakShield(PlayableCard target, int damage, PlayableCard attacker)
2827
{
28+
//InscryptionAPIPlugin.Logger.LogDebug("[TriggerBreakShield] Begin");
2929
BreakShield(target, damage, attacker);
3030

3131
List<IShieldPreventedDamage> shieldTriggers = CustomTriggerFinder.FindTriggersOnBoard<IShieldPreventedDamage>(false).ToList();
@@ -56,9 +56,11 @@ public static void BreakShield(PlayableCard target, int damage, PlayableCard att
5656
DamageShieldBehaviour shield = Array.Find(target.GetComponents<DamageShieldBehaviour>(), x => x.HasShields());
5757
if (shield != null)
5858
{
59+
//InscryptionAPIPlugin.Logger.LogDebug("[BreakShield] Found DamageShieldBehaviour");
5960
CardModificationInfo info = target.TemporaryMods.Find(x => x.abilities != null && x.abilities.Contains(shield.Ability));
6061
if (info != null)
6162
{
63+
//InscryptionAPIPlugin.Logger.LogDebug("[BreakShield] CardModInfo found for behaviour");
6264
target.RemoveTemporaryMod(info, false); // RemoveShields is called here in a patch
6365
info.abilities.Remove(shield.Ability);
6466
target.AddTemporaryMod(info);
@@ -71,6 +73,7 @@ public static void BreakShield(PlayableCard target, int damage, PlayableCard att
7173
target.Anim.StrongNegationEffect();
7274
if (target.GetTotalShields() == 0) // if we removed the last shield
7375
{
76+
//InscryptionAPIPlugin.Logger.LogDebug("[BreakShield] TotalShields == 0");
7477
target.Status.lostShield = true;
7578
if (target.Info.HasBrokenShieldPortrait())
7679
target.SwitchToPortrait(target.Info.BrokenShieldPortrait());
@@ -85,73 +88,37 @@ private static void PreventShieldReset(Latch __instance, ref bool __result, Play
8588
if (__instance is LatchDeathShield && card.HasShield())
8689
__result = true;
8790
}
91+
8892
[HarmonyPrefix, HarmonyPatch(typeof(LatchDeathShield), nameof(LatchDeathShield.OnSuccessfullyLatched))]
8993
private static bool PreventShieldReset(PlayableCard target)
9094
{
91-
target.UpdateFaceUpOnBoardEffects();
92-
return false; // latch death shield doesn't reset shields
95+
target.UpdateFaceUpOnBoardEffects(); // latch death shield doesn't reset shields
96+
return false;
9397
}
9498

9599
/// <summary>
96-
/// The new version of PlayableCard.HasShield implementing the new shield logic.
100+
/// Modified version of PlayableCard.HasShield that replaces the original method's result.
97101
/// </summary>
98-
public static bool NewHasShield(PlayableCard instance) => instance.GetTotalShields() > 0 && !instance.Status.lostShield;
102+
public static bool NewHasShield(PlayableCard instance)
103+
{
104+
return instance.GetTotalShields() > 0 && !instance.Status.lostShield;
105+
}
99106

100107
[HarmonyPostfix, HarmonyPatch(typeof(PlayableCard), nameof(PlayableCard.HasShield))]
101-
private static void ReplaceHasShieldBool(PlayableCard __instance, ref bool __result) => __result = NewHasShield(__instance);
108+
private static void ReplaceHasShieldBool(PlayableCard __instance, ref bool __result)
109+
{
110+
__result = NewHasShield(__instance);
111+
}
102112

103113
[HarmonyPrefix, HarmonyPatch(typeof(PlayableCard), nameof(PlayableCard.ResetShield), new Type[] { })]
104114
private static void ResetModShields(PlayableCard __instance) // runs before the base ResetShield logic
105115
{
106116
foreach (DamageShieldBehaviour com in __instance.GetComponents<DamageShieldBehaviour>())
107117
com.ResetShields(false);
108118

109-
// if we're using the broken shield portrait, reset to the default portrait - if we're MudTurtle
119+
// if we're using the broken shield portrait, reset to the default portrait
110120
if (__instance.Info.name == "MudTurtle" || (__instance.Info.BrokenShieldPortrait() != null && __instance.RenderInfo.portraitOverride == __instance.Info.BrokenShieldPortrait()))
111121
__instance.SwitchToDefaultPortrait();
112-
113-
__instance.Status.lostShield = false;
114-
}
115-
116-
[HarmonyTranspiler, HarmonyPatch(typeof(ShieldGeneratorItem), nameof(ShieldGeneratorItem.ActivateSequence), MethodType.Enumerator)]
117-
private static IEnumerable<CodeInstruction> DontResetOnActivate(IEnumerable<CodeInstruction> instructions)
118-
{
119-
List<CodeInstruction> codes = new(instructions);
120-
int index = codes.FindIndex(x => x.operand?.ToString() == "DiskCardGame.BoardManager get_Instance()");
121-
if (index > 0)
122-
{
123-
MethodBase method = AccessTools.Method(typeof(ShieldManager), nameof(ShieldManager.EmptyList));
124-
codes.RemoveRange(index, 2);
125-
codes.Insert(index, new(OpCodes.Callvirt, method));
126-
}
127-
return codes;
128-
}
129-
[HarmonyTranspiler, HarmonyPatch(typeof(ShieldGems), nameof(ShieldGems.OnResolveOnBoard), MethodType.Enumerator)]
130-
private static IEnumerable<CodeInstruction> DontResetOnResolve(IEnumerable<CodeInstruction> instructions)
131-
{
132-
List<CodeInstruction> codes = new(instructions);
133-
int index = codes.FindLastIndex(x => x.operand?.ToString() == "0.25") - 4;
134-
if (index > 0)
135-
{
136-
MethodBase method = AccessTools.Method(typeof(ShieldManager), nameof(ShieldManager.EmptyList));
137-
codes.RemoveRange(index, 2);
138-
codes.Insert(index, new(OpCodes.Callvirt, method));
139-
}
140-
return codes;
141-
}
142-
143-
[HarmonyTranspiler, HarmonyPatch(typeof(RandomCardGainsShieldEffect), nameof(RandomCardGainsShieldEffect.Execute), MethodType.Enumerator)]
144-
private static IEnumerable<CodeInstruction> DontResetOnExecute(IEnumerable<CodeInstruction> instructions)
145-
{
146-
List<CodeInstruction> codes = new(instructions);
147-
int index = codes.FindLastIndex(x => x.opcode == OpCodes.Newobj);
148-
if (index > 0)
149-
{
150-
MethodBase method = AccessTools.Method(typeof(ShieldManager), nameof(ShieldManager.EmptyList));
151-
codes.RemoveRange(index, 4);
152-
codes.Insert(index, new(OpCodes.Callvirt, method));
153-
}
154-
return codes;
155122
}
156123

157124
[HarmonyTranspiler, HarmonyPatch(typeof(PlayableCard), nameof(PlayableCard.UpdateFaceUpOnBoardEffects))]
@@ -209,7 +176,7 @@ private static IEnumerable<CodeInstruction> RemoveSingleHiddenStacks(IEnumerable
209176
return codes;
210177
}
211178

212-
private static List<CardSlot> EmptyList() => new(); // for transpiler logic (why can't i just pass an empty list?)
179+
private static List<CardSlot> EmptyList() => new(); // for transpiler logic
213180

214181
private static List<Ability> HiddensOnlyRemoveStacks(List<Ability> abilities, List<Ability> hiddenAbilities)
215182
{
@@ -222,49 +189,42 @@ private static List<Ability> HiddensOnlyRemoveStacks(List<Ability> abilities, Li
222189
}
223190
private static void CorrectHiddenAbilityRender(PlayableCard card)
224191
{
225-
foreach (DamageShieldBehaviour com in card.GetComponents<DamageShieldBehaviour>().Where(x => x.initialised))
226-
{
227-
if (com.HasShields())
228-
{
229-
if (com.Ability.GetHideSingleStacks())
230-
{
231-
// if there are more hidden shields than there should be
232-
if (card.Status.hiddenAbilities.Count(x => x == com.Ability) >= com.NumShields)
233-
{
234-
for (int i = 0; i < com.NumShields; i++)
235-
{
236-
card.Status.hiddenAbilities.Remove(com.Ability);
237-
}
238-
}
239-
}
240-
else
241-
{
242-
card.Status.hiddenAbilities.Remove(com.Ability);
243-
}
244-
break;
245-
}
246-
else
247-
{
248-
if (com.Ability.GetHideSingleStacks())
249-
{
250-
card.AddShieldCount(1, Ability.DeathShield);
251-
int shieldsLost = com.StartingNumShields - com.NumShields;
252-
if (card.Status.hiddenAbilities.Count(x => x == com.Ability) < shieldsLost)
253-
{
254-
for (int i = 0; i < shieldsLost; i++)
255-
{
256-
//Debug.Log($"{com.StartingNumShields} {com.NumShields} {shieldsLost} Add hidden");
257-
card.Status.hiddenAbilities.Add(com.Ability);
258-
}
259-
}
260-
}
261-
else if (!card.Status.hiddenAbilities.Contains(com.Ability))
262-
{
263-
card.Status.hiddenAbilities.Add(com.Ability);
264-
}
265-
break;
266-
}
267-
}
192+
//foreach (DamageShieldBehaviour com in card.GetComponents<DamageShieldBehaviour>().Where(x => x.initialised))
193+
//{
194+
// if (com.HasShields())
195+
// {
196+
// if (com.Ability.GetHideSingleStacks())
197+
// {
198+
// // if there are more hidden shields than there should be
199+
// while (card.Status.hiddenAbilities.Count(x => x == com.Ability) > com.NumShields)
200+
// {
201+
// card.Status.hiddenAbilities.Remove(com.Ability);
202+
// }
203+
// }
204+
// else
205+
// {
206+
// card.Status.hiddenAbilities.RemoveAll(x => x == com.Ability);
207+
// }
208+
// break;
209+
// }
210+
// else
211+
// {
212+
// if (com.Ability.GetHideSingleStacks())
213+
// {
214+
// int shieldsLost = com.StartingNumShields - com.NumShields;
215+
// while (card.Status.hiddenAbilities.Count(x => x == com.Ability) < shieldsLost)
216+
// {
217+
// //Debug.Log($"{com.StartingNumShields} {com.NumShields} {shieldsLost} Add hidden");
218+
// card.Status.hiddenAbilities.Add(com.Ability);
219+
// }
220+
// }
221+
// else if (!card.Status.hiddenAbilities.Contains(com.Ability))
222+
// {
223+
// card.Status.hiddenAbilities.Add(com.Ability);
224+
// }
225+
// break;
226+
// }
227+
//}
268228

269229
if (card.Info.HasBrokenShieldPortrait() && card.RenderInfo.portraitOverride == card.Info.BrokenShieldPortrait() && card.HasShield())
270230
{

InscryptionAPI/InscryptionAPI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<DebugType>full</DebugType>
1111
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
1212
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
13-
<Version>2.23.0</Version>
13+
<Version>2.23.1</Version>
1414
</PropertyGroup>
1515

1616
<PropertyGroup>

InscryptionAPI/InscryptionAPIPlugin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class InscryptionAPIPlugin : BaseUnityPlugin
3030
{
3131
public const string ModGUID = "cyantist.inscryption.api";
3232
public const string ModName = "InscryptionAPI";
33-
public const string ModVer = "2.23.0";
33+
public const string ModVer = "2.23.1";
3434

3535
public static string Directory = "";
3636

InscryptionCommunityPatch/Card/StackAbilityIcons.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -319,19 +319,20 @@ private static void AddIconNumber(Ability ability, CardInfo info, PlayableCard c
319319
AbilityInfo ai = AbilityManager.AllAbilityInfos.AbilityByID(ability);
320320
if (card != null)
321321
{
322-
baseAbilities.AddRange(AbilitiesUtil.GetAbilitiesFromMods(card.TemporaryMods/*.Where(x => !x.fromTotem && (!x.fromCardMerge || PatchPlugin.configMergeOnBottom.Value)).ToList()*/));
322+
if (ai.IsShieldAbility())
323+
count = card.GetShieldBehaviour(ability)?.NumShields;
324+
325+
baseAbilities.AddRange(AbilitiesUtil.GetAbilitiesFromMods(card.TemporaryMods));
323326
if (ai.GetHideSingleStacks())
324327
{
325-
for (int i = 0; i < card.Status.hiddenAbilities.Count(x => x == ability); i++)
328+
for (int i = 0; i < card.Status.hiddenAbilities.Count; i++)
326329
{
327-
baseAbilities.Remove(ability);
330+
if (card.Status.hiddenAbilities[i] == ability)
331+
baseAbilities.Remove(ability);
328332
}
329333
}
330334
else if (card.Status.hiddenAbilities.Contains(ability))
331335
baseAbilities.RemoveAll(x => x == ability);
332-
333-
if (ai.IsShieldAbility())
334-
count = card.GetShieldBehaviour(ability)?.NumShields;
335336
}
336337

337338
count ??= baseAbilities.Count(ab => ab == ability);
@@ -340,7 +341,7 @@ private static void AddIconNumber(Ability ability, CardInfo info, PlayableCard c
340341
if (count > 1) // we have a stack and need to add an override
341342
{
342343
if (PatchPlugin.doubleStackSplit.Value && count == 2 && count == baseAbilities.Count)
343-
__instance.SetIcon(__instance.LoadIcon(info, ai, card != null && card.OpponentCard));//RenderSameSigilTwice(__instance, ai, info, card);
344+
__instance.SetIcon(__instance.LoadIcon(info, ai, card != null && card.OpponentCard));
344345
else
345346
__instance.SetIcon(PatchTexture(ability, (int)count));
346347
}

0 commit comments

Comments
 (0)