class   RWRealisticAimingAngles
extends UIScreenListener
config (RWRealisticAimingAngles);


var bool ModInjected;
event OnInit(UIScreen Screen) {
	if (ModInjected == false) {
		ModInjected  = true;
		ReplaceStandardAimAlsoInAbilitiesWithUnusuallyDefinedHitCalc();}}



//SOME ABILITIES CALL DEFAULT.SIMPLESTANDARDAIM INSTEAD OF CONVENTIONAL CLASS HABILITYTOHITCALC_STANDARDAIM
static function ReplaceStandardAimAlsoInAbilitiesWithUnusuallyDefinedHitCalc() {
	local X2DataTemplate					DataTemplate;
	local X2AbilityTemplate					AbilityTemplate;
//	local		   X2AbilityToHitCalc_StandardAim    OldAbilityToHitCalc;
//	local Override_X2AbilityToHitCalc_StandardAim    NewAbilityToHitCalc;
	local X2AbilityToHitCalc_StandardAim    AbilityToHitCalc;
  	local X2AbilityToHitCalc_StandardMelee	AbilityToHitCalcMelee;

	foreach class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager().IterateTemplates(DataTemplate, None) {
		AbilityTemplate = X2AbilityTemplate(DataTemplate);
/* 		if (AbilityTemplate.AbilityToHitCalc.class == class'X2AbilityToHitCalc_StandardAim'  ){//&&
		//	AbilityTemplate.AbilityToHitCalc.class != class'X2AbilityToHitCalc_StandardMelee'){ //JUST IN CASE... _STANDARDMELEE IS THE (ONLY) CHILD OF _STANDARDMELEE...
			OldAbilityToHitCalc = X2AbilityToHitCalc_StandardAim(AbilityTemplate.AbilityToHitCalc);
			NewAbilityToHitCalc	= new class'Override_X2AbilityToHitCalc_StandardAim';

			NewAbilityToHitCalc.HitModifiers			 = OldAbilityToHitCalc.HitModifiers;		     // Configured in the ability template to provide always-on modifiers.
			NewAbilityToHitCalc.bIndirectFire			 = OldAbilityToHitCalc.bIndirectFire;            // Indirect fire is stuff like grenades. Hit chance is 100, but crit and dodge and armor mitigation still exists.
			NewAbilityToHitCalc.bMeleeAttack			 = OldAbilityToHitCalc.bMeleeAttack;             // Melee attacks ignore cover and get their own instrinsic hit bonus.
			NewAbilityToHitCalc.bReactionFire			 = OldAbilityToHitCalc.bReactionFire;            // Reaction fire suffers specific penalties to the hit roll. Reaction fire also causes the Flanking hit bonus to be ignored.
			NewAbilityToHitCalc.bAllowCrit				 = OldAbilityToHitCalc.bAllowCrit;               // Ability will build crit into the hit table as applicable
			NewAbilityToHitCalc.bHitsAreCrits			 = OldAbilityToHitCalc.bHitsAreCrits;            // After the roll is made, eHit_Success will always change into eHit_Crit
			NewAbilityToHitCalc.bMultiTargetOnly		 = OldAbilityToHitCalc.bMultiTargetOnly;         // Guarantees a success for the ability when there is no primary target.
			NewAbilityToHitCalc.bOnlyMultiHitWithSuccess = OldAbilityToHitCalc.bOnlyMultiHitWithSuccess; // Multi hit targets will only be hit as long as there is a successful roll (e.g. Sharpshooter's Faceoff ability)
			NewAbilityToHitCalc.bGuaranteedHit			 = OldAbilityToHitCalc.bGuaranteedHit;           // Skips all of the normal hit mods but does allow for armor mitigation rolls as normal.
			NewAbilityToHitCalc.bIgnoreCoverBonus		 = OldAbilityToHitCalc.bIgnoreCoverBonus;		 // Standard high/low cover bonuses do not apply
			NewAbilityToHitCalc.FinalMultiplier			 = OldAbilityToHitCalc.FinalMultiplier;          // Modifier applied to otherwise final aim chance. Will calculate an amount and display the ability as the reason for the modifier.
			NewAbilityToHitCalc.BuiltInHitMod			 = OldAbilityToHitCalc.BuiltInHitMod;			 // Initial modifiers that are always used by the ability. ModReason will be the ability name.
			NewAbilityToHitCalc.BuiltInCritMod			 = OldAbilityToHitCalc.BuiltInCritMod;			 // Initial modifiers that are always used by the ability. ModReason will be the ability name.

			AbilityTemplate.AbilityToHitCalc			= NewAbilityToHitCalc;
			if (AbilityTemplate.AbilityToHitOwnerOnMissCalc.class == class'X2AbilityToHitCalc_StandardAim'){ //ABILITIES ALSO HAVING .ABILITYTOHITOWNERONMISSCALC
				AbilityTemplate.AbilityToHitOwnerOnMissCalc = NewAbilityToHitCalc;}}}}						 //ALWAYS HAVE IT IDENTICAL TO .ABILITYTOHITCALC
*/	//	if (AbilityTemplate.AbilityToHitCalc		   .Name == 'DefaultSimpleStandardAim') AbilityTemplate.AbilityToHitCalc			= new class'Override_X2AbilityToHitCalc_StandardAim';
	//	if (AbilityTemplate.AbilityToHitOwnerOnMissCalc.Name == 'DefaultSimpleStandardAim') AbilityTemplate.AbilityToHitOwnerOnMissCalc = new class'Override_X2AbilityToHitCalc_StandardAim';
	//	if (AbilityTemplate.AbilityToHitCalc		   .Name ==		   'SimpleStandardAim') AbilityTemplate.AbilityToHitCalc			= new class'Override_X2AbilityToHitCalc_StandardAim';
	//	if (AbilityTemplate.AbilityToHitOwnerOnMissCalc.Name ==		   'SimpleStandardAim') AbilityTemplate.AbilityToHitOwnerOnMissCalc = new class'Override_X2AbilityToHitCalc_StandardAim';}}
		AbilityToHitCalc = X2AbilityToHitCalc_StandardAim(AbilityTemplate.AbilityToHitCalc); if (AbilityToHitCalc == None) continue;
		if (AbilityToHitCalc.bIndirectFire			  == true  || //HITABILITIESTEMPLATE WITH THESE VARIABLES PRESENT
			AbilityToHitCalc.bReactionFire			  == true  || //ALREADY CORRECTLY USE THE OVERRIDDEN HITABILITY CLASS
			AbilityToHitCalc.bAllowCrit				  == false || //WHILE THE REMAINING ONES USED AN UNCONVENTIONAL
			AbilityToHitCalc.bHitsAreCrits			  == true  || //DEFINITION NOT REFERENCING DIRECTLY TO HABILITYTOHITCALC
			AbilityToHitCalc.bMultiTargetOnly		  == true  || //AND THEREFORE USING THE UNOVERRIDDEN HITABILITY CLASS
			AbilityToHitCalc.bOnlyMultiHitWithSuccess == true  || //... ?? ... ONLYMULTIHITWITHSUCCESS DEFINED ONLY ON SHARPSHOOTER'S FACEOFF ABILITY (AS FALSE)... BUT UNDEFINED BOOLS ARE ALWAYS FALSE... MAYBE FIRAXIS IS STILL "THINKING ABOUT IT"???
			AbilityToHitCalc.bGuaranteedHit			  == true  ||
			AbilityToHitCalc.FinalMultiplier		  != 1	   ||
			AbilityToHitCalc.BuiltInHitMod			  != 0	   || //) continue;
			AbilityToHitCalc.BuiltInCritMod			  != 0	   ||
			AbilityToHitCalc.bMeleeAttack			  == true  ) continue; //BEFORE THE BMELEEATTACK WAS NOT SEEN AS TRUE WITH MY OVERRIDE (APPLYING THEREFORE COVER, GOODANGLE,ETC..)... STRANGE... SO TRIED TO ADD THIS LAST CHECK TO LEAVE THE X2ABILITYTOHIT_STANDARDMELEE ALONE...
		AbilityToHitCalcMelee = X2AbilityToHitCalc_StandardMelee(AbilityTemplate.AbilityToHitCalc); if (AbilityToHitCalcMelee != None) continue; //EVEN THIS LINE... JUST IN CASE X2ABILITYTOHITCALC_STANDARDMELEE'S FATHER (_STANDARDAIM) DOESNT SEE THE .BMELEEATTACK VARIABLES SET...

		AbilityTemplate.AbilityToHitCalc			= new class'Override_X2AbilityToHitCalc_StandardAim';
		AbilityToHitCalc = X2AbilityToHitCalc_StandardAim(AbilityTemplate.AbilityToHitOwnerOnMissCalc); if (AbilityToHitCalc == None) continue;
		AbilityTemplate.AbilityToHitOwnerOnMissCalc = new class'Override_X2AbilityToHitCalc_StandardAim';}}
//	class'X2DataTemplateManager'.static.RebuildAllTemplateGameCaches();}




defaultproperties {
	ModInjected = false;
    ScreenClass = none;}