diff --git a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini index 23c1e3d72..3c2308156 100644 --- a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini +++ b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini @@ -2634,6 +2634,13 @@ FACTION_ABILITY_COSTS[7]=30 ; Example: ; +CLASSES_IGNORE_CUSTOM_COSTS=YourClassName +; Perks which, if appearing in an XCOM or pistol row, do not require a Training Center +; to learn. Note that classes specified in CLASSES_IGNORE_CUSTOM_COSTS will also ignore +; this list, unless their name is also specified in CLASSES_ALLOW_NO_TRAINING_CENTER. ++IGNORE_NO_TRAINING_CENTER=Magnum_LW ++IGNORE_NO_TRAINING_CENTER=Quickdraw ++IGNORE_NO_TRAINING_CENTER=ClutchShot + ; Cost multiplier for the first purchased class ability BASE_ABILITY_COST_MODIFIER=0.2 diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc index 419446bf5..1350f2553 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc @@ -29,6 +29,8 @@ var config array CUSTOM_ABILITY_COSTS; var config array FACTION_ABILITY_COSTS; var config float BASE_ABILITY_COST_MODIFIER; var config arrayCLASSES_IGNORE_CUSTOM_COSTS; +var config array IGNORE_NO_TRAINING_CENTER; +var config array CLASSES_ALLOW_NO_TRAINING_CENTER; var config array SPARKUnitValues, SPARKCharacterTemplates, SPARKSoldierClasses, SPARKAbilities; @@ -520,6 +522,7 @@ static function EventListenerReturn OverrideCanPurchaseAbility( { local XComGameState_Unit UnitState; local XComLWTuple Tuple; + local name AbilityName, ClassName; local int Rank, Branch; local int ClassAbilityRankCount; //Rank is 0 indexed but AbilityRanks is not. This means a >= comparison requires no further adjustments @@ -531,6 +534,8 @@ static function EventListenerReturn OverrideCanPurchaseAbility( if (UnitState == none) return ELR_NoInterrupt; + AbilityName = Tuple.Data[0].n; + ClassName = UnitState.GetSoldierClassTemplateName(); Rank = Tuple.Data[1].i; Branch = Tuple.Data[2].i; ClassAbilityRankCount = Tuple.Data[11].i; @@ -542,7 +547,7 @@ static function EventListenerReturn OverrideCanPurchaseAbility( Tuple.Data[13].b = false; // CanPurchaseAbility Tuple.Data[15].s = default.ReasonClassAbilityPickedAtRank; // LocReasonLocked - if (UnitState.GetSoldierClassTemplateName() != 'PsiOperative') { return ELR_NoInterrupt; } + if (ClassName != 'PsiOperative') { return ELR_NoInterrupt; } if (Branch < ClassAbilityRankCount) //row 0, row 1 { @@ -555,7 +560,17 @@ static function EventListenerReturn OverrideCanPurchaseAbility( // training center has been built. if (Branch >= ClassAbilityRankCount) { - if (`XCOMHQ.HasFacilityByName('RecoveryCenter')) + if ( + `XCOMHQ.HasFacilityByName('RecoveryCenter') || + ( + // Some abilities might also be available before the training center has been built. + ( + default.CLASSES_ALLOW_NO_TRAINING_CENTER.Find(ClassName) != INDEX_NONE + || default.CLASSES_IGNORE_CUSTOM_COSTS.Find(ClassName) == INDEX_NONE + ) + && default.IGNORE_NO_TRAINING_CENTER.Find(AbilityName) != INDEX_NONE + ) + ) { if (Tuple.Data[12].b) { @@ -574,7 +589,7 @@ static function EventListenerReturn OverrideCanPurchaseAbility( } } - if (UnitState.GetSoldierClassTemplateName() != 'PsiOperative') { return ELR_NoInterrupt; } + if (ClassName != 'PsiOperative') { return ELR_NoInterrupt; } if (Branch< ClassAbilityRankCount) //row 0, row 1 {