@@ -548,6 +548,25 @@ public NewRegion(RegionData region, int tier){
548548 }
549549 }
550550
551+ public class NewAbility
552+ {
553+ public static List < NewAbility > abilities = new List < NewAbility > ( ) ;
554+ public Ability ability ;
555+ public AbilityInfo info ;
556+ public Type abilityBehaviour ;
557+ public Texture tex ;
558+
559+ public NewAbility ( Ability ability , AbilityInfo info , Type abilityBehaviour , Texture tex )
560+ {
561+ this . ability = ability ;
562+ this . info = info ;
563+ this . abilityBehaviour = abilityBehaviour ;
564+ this . tex = tex ;
565+ NewAbility . abilities . Add ( this ) ;
566+ Plugin . Log . LogInfo ( $ "Loaded custom ability { info . rulebookName } !") ;
567+ }
568+ }
569+
551570 [ HarmonyPatch ( typeof ( LoadingScreenManager ) , "LoadGameData" ) ]
552571 public class LoadingScreenManager_LoadGameData
553572 {
@@ -572,6 +591,16 @@ public static void Prefix()
572591 ScriptableObjectLoader < CardInfo > . allData = official . Concat ( NewCard . cards ) . ToList ( ) ;
573592 Plugin . Log . LogInfo ( $ "Loaded custom cards into data") ;
574593 }
594+ if ( ScriptableObjectLoader < AbilityInfo > . allData == null )
595+ {
596+ List < AbilityInfo > official = ScriptableObjectLoader < AbilityInfo > . AllData ;
597+ foreach ( NewAbility newAbility in NewAbility . abilities )
598+ {
599+ official . Add ( newAbility . info ) ;
600+ }
601+ ScriptableObjectLoader < AbilityInfo > . allData = official ;
602+ Plugin . Log . LogInfo ( $ "Loaded custom abilities into data") ;
603+ }
575604 }
576605 }
577606
@@ -654,4 +683,69 @@ public static void Prefix(ref RegionProgression ___instance)
654683 }
655684 }
656685 }
686+
687+ [ HarmonyPatch ( typeof ( CardTriggerHandler ) , "AddAbility" , new Type [ ] { typeof ( Ability ) } ) ]
688+ public class CardTriggerHandler_AddAbility
689+ {
690+ public static bool Prefix ( Ability ability , CardTriggerHandler __instance )
691+ {
692+ if ( ( int ) ability < 99 )
693+ {
694+ return true ;
695+ }
696+ if ( ( ! __instance . triggeredAbilities . Exists ( ( Tuple < Ability , AbilityBehaviour > x ) => x . Item1 == ability ) || AbilitiesUtil . GetInfo ( ability ) . canStack ) && ! AbilitiesUtil . GetInfo ( ability ) . passive )
697+ {
698+ NewAbility newAbility = NewAbility . abilities . Find ( ( NewAbility x ) => x . ability == ability ) ;
699+ Type type = newAbility . abilityBehaviour ;
700+ Component baseC = ( Component ) __instance ;
701+ AbilityBehaviour item = baseC . gameObject . GetComponent ( type ) as AbilityBehaviour ;
702+ if ( item == null )
703+ {
704+ item = baseC . gameObject . AddComponent ( type ) as AbilityBehaviour ;
705+ }
706+ __instance . triggeredAbilities . Add ( new Tuple < Ability , AbilityBehaviour > ( ability , item ) ) ;
707+ }
708+ return false ;
709+ }
710+ }
711+
712+ [ HarmonyPatch ( typeof ( AbilitiesUtil ) , "LoadAbilityIcon" , new Type [ ] { typeof ( string ) , typeof ( bool ) , typeof ( bool ) } ) ]
713+ public class AbilitiesUtil_LoadAbilityIcon
714+ {
715+ public static bool Prefix ( string abilityName , CardTriggerHandler __instance , ref Texture __result )
716+ {
717+ int ability = 0 ;
718+ if ( ! int . TryParse ( abilityName , out ability ) )
719+ {
720+ return true ;
721+ }
722+ NewAbility newAbility = NewAbility . abilities . Find ( ( NewAbility x ) => x . ability == ( Ability ) ability ) ;
723+ __result = newAbility . tex ;
724+ return false ;
725+ }
726+ }
727+
728+ [ HarmonyPatch ( typeof ( AbilitiesUtil ) , "GetAbilities" , new Type [ ] { typeof ( bool ) , typeof ( bool ) , typeof ( int ) , typeof ( int ) , typeof ( AbilityMetaCategory ) } ) ]
729+ public class AbilitiesUtil_GetAbilities
730+ {
731+ public static void Postfix ( bool learned , bool opponentUsable , int minPower , int maxPower , AbilityMetaCategory categoryCriteria , ref List < Ability > __result )
732+ {
733+ foreach ( NewAbility newAbility in NewAbility . abilities )
734+ {
735+ AbilityInfo info = newAbility . info ;
736+ bool flag = ! opponentUsable || info . opponentUsable ;
737+ bool flag2 = info . powerLevel >= minPower && info . powerLevel <= maxPower ;
738+ bool flag3 = info . metaCategories . Contains ( categoryCriteria ) ;
739+ bool flag4 = true ;
740+ if ( learned )
741+ {
742+ flag4 = ProgressionData . LearnedAbility ( info . ability ) ;
743+ }
744+ if ( flag && flag2 && flag3 && flag4 )
745+ {
746+ __result . Add ( newAbility . ability ) ;
747+ }
748+ }
749+ }
750+ }
657751}
0 commit comments