Skip to content

Commit b7d75eb

Browse files
committed
initial patch for special abilities
1 parent 87559c1 commit b7d75eb

5 files changed

Lines changed: 138 additions & 6 deletions

File tree

Models/NewSpecialAbility.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using DiskCardGame;
4+
using UnityEngine;
5+
6+
namespace APIPlugin
7+
{
8+
public class NewSpecialAbility
9+
{
10+
public static List<NewSpecialAbility> specialAbilities = new();
11+
public SpecialTriggeredAbility specialTriggeredAbility;
12+
public StatIconInfo statIconInfo;
13+
public Type abilityBehaviour;
14+
public Texture tex;
15+
public AbilityIdentifier id;
16+
17+
public NewSpecialAbility(
18+
StatIconInfo statIconInfo,
19+
Type abilityBehaviour,
20+
Texture tex,
21+
AbilityIdentifier id = null
22+
)
23+
{
24+
this.specialTriggeredAbility = (SpecialTriggeredAbility)100 + specialAbilities.Count;
25+
this.statIconInfo = statIconInfo;
26+
this.abilityBehaviour = abilityBehaviour;
27+
tex.filterMode = FilterMode.Point;
28+
this.tex = tex;
29+
this.id = id;
30+
specialAbilities.Add(this);
31+
// if (id != null)
32+
// {
33+
// id.id = specialTriggeredAbility;
34+
// }
35+
36+
Plugin.Log.LogInfo($"Loaded custom special ability [{statIconInfo.rulebookName}]!");
37+
}
38+
}
39+
}

Patches/CardTriggerHandler.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
namespace API.Patches
88
{
9-
[HarmonyPatch(typeof(CardTriggerHandler), "AddAbility", new Type[] { typeof(Ability) })]
10-
public class CardTriggerHandler_AddAbility
9+
[HarmonyPatch(typeof(CardTriggerHandler), "AddAbility", new[] { typeof(Ability) })]
10+
public class CardTriggerHandler_AddAbility_Ability
1111
{
1212
public static bool Prefix(Ability ability, CardTriggerHandler __instance)
1313
{
@@ -19,7 +19,7 @@ public static bool Prefix(Ability ability, CardTriggerHandler __instance)
1919
Predicate<Tuple<Ability, AbilityBehaviour>> checkAbilityExists = tuple =>
2020
tuple.Item1 == ability || AbilityCanStackAndIsNotPassive(ability);
2121

22-
// return true if the ability is equal to pair item1 OR if ability cannot stack and is passive
22+
// return true if the ability is equal to the ability in the pair OR if ability cannot stack and is passive
2323
if (!__instance.triggeredAbilities.Exists(checkAbilityExists))
2424
{
2525
NewAbility newAbility = NewAbility.abilities.Find((NewAbility x) => x.ability == ability);
@@ -37,9 +37,40 @@ public static bool Prefix(Ability ability, CardTriggerHandler __instance)
3737
return false;
3838
}
3939

40-
public static bool AbilityCanStackAndIsNotPassive(Ability ability)
40+
private static bool AbilityCanStackAndIsNotPassive(Ability ability)
4141
{
4242
return AbilitiesUtil.GetInfo(ability).canStack && !AbilitiesUtil.GetInfo(ability).passive;
4343
}
4444
}
45+
46+
[HarmonyPatch(typeof(CardTriggerHandler), "AddAbility", new[] { typeof(SpecialTriggeredAbility) })]
47+
public class CardTriggerHandler_AddAbility_SpecialTriggeredAbility
48+
{
49+
public static bool Prefix(SpecialTriggeredAbility ability, CardTriggerHandler __instance)
50+
{
51+
Plugin.Log.LogInfo($"Attempting to add spec ability to card trigger handler [{ability}]");
52+
if ((int)ability < 99)
53+
{
54+
return true;
55+
}
56+
// return true if the ability is equal to the ability in the pair OR if ability cannot stack and is passive
57+
if (!__instance.specialAbilities.Exists(ab => ab.Item1 == ability))
58+
{
59+
Plugin.Log.LogInfo($"-> spec ability does not exist yet, adding");
60+
NewSpecialAbility newAbility = NewSpecialAbility.specialAbilities
61+
.Find(x => x.specialTriggeredAbility == ability);
62+
Type type = newAbility.abilityBehaviour;
63+
Component baseC = (Component)__instance;
64+
SpecialCardBehaviour item = baseC.gameObject.GetComponent(type) as SpecialCardBehaviour;
65+
if (item == null)
66+
{
67+
item = baseC.gameObject.AddComponent(type) as SpecialCardBehaviour;
68+
}
69+
70+
__instance.specialAbilities.Add(new Tuple<SpecialTriggeredAbility, SpecialCardBehaviour>(ability, item));
71+
}
72+
73+
return false;
74+
}
75+
}
4576
}

Patches/LoadingScreenManager.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,36 @@ public static void Prefix()
2727
Plugin.Log.LogInfo($"Loaded modified {card.name} into data");
2828
}
2929
}
30+
3031
ScriptableObjectLoader<CardInfo>.allData = official.Concat(NewCard.cards).ToList();
3132
Plugin.Log.LogInfo($"Loaded custom cards into data");
3233
}
34+
3335
if (ScriptableObjectLoader<AbilityInfo>.allData == null)
3436
{
3537
List<AbilityInfo> official = ScriptableObjectLoader<AbilityInfo>.AllData;
3638
foreach (NewAbility newAbility in NewAbility.abilities)
3739
{
3840
official.Add(newAbility.info);
3941
}
42+
4043
ScriptableObjectLoader<AbilityInfo>.allData = official;
4144
Plugin.Log.LogInfo($"Loaded custom abilities into data");
4245
}
46+
47+
if (ScriptableObjectLoader<StatIconInfo>.allData == null)
48+
{
49+
List<StatIconInfo> official = ScriptableObjectLoader<StatIconInfo>.AllData;
50+
official
51+
.AddRange(
52+
NewSpecialAbility.specialAbilities
53+
.Select(newSpecialAbility => newSpecialAbility.statIconInfo)
54+
);
55+
56+
ScriptableObjectLoader<StatIconInfo>.allData = official;
57+
Plugin.Log.LogInfo(
58+
$"Loaded {NewSpecialAbility.specialAbilities.Count} custom special abilities into data");
59+
}
4360
}
4461
}
45-
}
62+
}

Patches/Rulebook.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public static void Postfix(AbilityMetaCategory metaCategory, RuleBookInfo __inst
1717
{
1818
foreach (PageRangeInfo pageRangeInfo in __instance.pageRanges)
1919
{
20+
// regular abilities
2021
if (pageRangeInfo.type == PageRangeType.Abilities)
2122
{
2223
List<int> customAbilities = NewAbility.abilities.Select(x => (int)x.ability).ToList();
@@ -31,9 +32,28 @@ public static void Postfix(AbilityMetaCategory metaCategory, RuleBookInfo __inst
3132
max + 1,
3233
min,
3334
doAddPageFunc,
34-
new Action<RuleBookPageInfo, PageRangeInfo, int>(__instance.FillAbilityPage),
35+
__instance.FillAbilityPage,
3536
Localization.Translate("APPENDIX XII, SUBSECTION I - MOD ABILITIES {0}")));
3637
}
38+
39+
// special abilities
40+
if (pageRangeInfo.type == PageRangeType.StatIcons)
41+
{
42+
List<int> customAbilities = NewAbility.abilities.Select(x => (int)x.ability).ToList();
43+
int min = customAbilities.AsQueryable().Min();
44+
int max = customAbilities.AsQueryable().Max();
45+
PageRangeInfo pageRange = pageRangeInfo;
46+
Func<int, bool> doAddPageFunc;
47+
doAddPageFunc = (int index) =>
48+
customAbilities.Contains(index)
49+
&& StatIconInfo.GetIconInfo((SpecialStatIcon)index).metaCategories.Contains(metaCategory);
50+
__result.AddRange(__instance.ConstructPages(pageRange,
51+
max + 1,
52+
min,
53+
doAddPageFunc,
54+
__instance.FillStatIconPage,
55+
Localization.Translate("APPENDIX XII, SUBSECTION I - MOD SPEC. ABILITIES {0}")));
56+
}
3757
}
3858
}
3959
}

Patches/StatIconInfo.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Collections.Generic;
2+
using APIPlugin;
3+
using DiskCardGame;
4+
using HarmonyLib;
5+
6+
namespace API.Patches
7+
{
8+
[HarmonyPatch(typeof(StatIconInfo), "AllIconInfo", MethodType.Getter)]
9+
public class StatIconInfoPatch
10+
{
11+
[HarmonyPostfix]
12+
static void Postfix(ref List<StatIconInfo> __result)
13+
{
14+
foreach (var ability in NewSpecialAbility.specialAbilities)
15+
{
16+
// this is never being logged?
17+
APIPlugin.Plugin.Log.LogInfo($"Adding {ability.statIconInfo.name} in StatIconInfo");
18+
if (!__result.Exists(x => x == ability.statIconInfo)) {
19+
__result.Add(ability.statIconInfo);
20+
}
21+
}
22+
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)