Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Overhaul_Faceoff extends X2Ability config (WOTC_Pistol_Overhaul);
- var config bool FACEOFF_FIX;
- static function array<X2DataTemplate> CreateTemplates()
- {
- local array<X2DataTemplate> Templates;
- Templates.AddItem(Faceoff());
- Templates.AddItem(FaceoffContinue());
- return Templates;
- }
- static function X2AbilityTemplate Faceoff()
- {
- local X2AbilityTemplate Template;
- local X2AbilityCost_ActionPoints ActionPointCost;
- local X2AbilityCost_Ammo AmmoCost;
- local X2AbilityToHitCalc_StandardAim StandardAim;
- local X2Effect_Persistent FaceoffTargetEffect;
- local X2Condition_UnitEffectsWithAbilitySource FaceoffTargetCondition;
- `LOG("Here is Faceoff Template",, 'FACEOFF');
- if(default.FACEOFF_FIX == true)
- {
- `CREATE_X2ABILITY_TEMPLATE(Template, 'manyshots');
- ActionPointCost = new class'X2AbilityCost_ActionPoints';
- ActionPointCost.iNumPoints = 1;
- ActionPointCost.bConsumeAllPoints = true;
- Template.AbilityCosts.AddItem(ActionPointCost);
- // require 2 ammo to be present so that multiple shots will be taken - otherwise it's a waste
- AmmoCost = new class'X2AbilityCost_Ammo';
- AmmoCost.iAmmo = 2;
- AmmoCost.bFreeCost = true;
- Template.AbilityCosts.AddItem(AmmoCost);
- // actually charge 1 ammo for this shot. the 2nd shot will charge the extra ammo.
- AmmoCost = new class'X2AbilityCost_Ammo';
- AmmoCost.iAmmo = 1;
- Template.AbilityCosts.AddItem(AmmoCost);
- StandardAim = new class'X2AbilityToHitCalc_StandardAim';
- StandardAim.bAllowCrit = false;
- //StandardAim.BuiltInHitMod = default.BanishFirstShotAimMod;
- Template.AbilityToHitCalc = StandardAim;
- Template.AbilityTargetStyle = default.SimpleSingleTarget;
- Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
- Template.AddShooterEffectExclusions();
- Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitOnlyProperty);
- Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition);
- Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect());
- Template.AssociatedPassives.AddItem('HoloTargeting');
- Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect());
- Template.bAllowAmmoEffects = true;
- Template.bAllowBonusWeaponEffects = true;
- FaceoffTargetEffect = new class'X2Effect_Persistent';
- FaceoffTargetEffect.BuildPersistentEffect(1, false, true, true, eGameRule_PlayerTurnEnd);
- FaceoffTargetEffect.EffectName = 'FaceoffTarget';
- FaceoffTargetEffect.bApplyOnMiss = true; //Only one chance, even if you miss (prevents crazy flailing counter-attack chains with a Muton, for example)
- Template.AddTargetEffect(FaceoffTargetEffect);
- FaceoffTargetCondition = new class'X2Condition_UnitEffectsWithAbilitySource';
- FaceoffTargetCondition.AddExcludeEffect('FaceoffTarget', 'AA_DuplicateEffectIgnored');
- Template.AbilityTargetConditions.AddItem(FaceoffTargetCondition);
- Template.AbilityTriggers.AddItem(default.PlayerInputTrigger);
- Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY;
- Template.AbilitySourceName = 'eAbilitySource_Perk';
- Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow;
- Template.AbilityConfirmSound = "TacticalUI_ActivateAbility";
- Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
- Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
- Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState;
- Template.SuperConcealmentLoss = 0;
- Template.AdditionalAbilities.AddItem('FaceoffContinue');
- Template.PostActivationEvents.AddItem('FaceoffContinue');
- // this ability will always break concealment at the end and we don't want to roll on it
- Template.ConcealmentRule = eConceal_Always;
- Template.SuperConcealmentLoss = 0;
- Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse;
- Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse;
- Template.bFrameEvenWhenUnitIsHidden = true;
- Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_faceoff";
- Template.ActivationSpeech = 'Faceoff';
- return Template;
- }
- }
- static function X2AbilityTemplate FaceoffContinue()
- {
- local X2AbilityTemplate Template;
- local X2AbilityCost_Ammo AmmoCost;
- local X2AbilityTrigger_EventListener Trigger;
- local X2AbilityToHitCalc_StandardAim StandardAim;
- local X2Effect_Persistent FaceoffTargetEffect;
- local X2Condition_UnitEffectsWithAbilitySource FaceoffTargetCondition;
- `LOG("Here is FaceoffContinue Template",, 'FACEOFF');
- `CREATE_X2ABILITY_TEMPLATE(Template, 'FaceoffContinue');
- AmmoCost = new class'X2AbilityCost_Ammo';
- AmmoCost.iAmmo = 1;
- Template.AbilityCosts.AddItem(AmmoCost);
- StandardAim = new class'X2AbilityToHitCalc_StandardAim';
- StandardAim.bAllowCrit = false;
- //StandardAim.BuiltInHitMod = default.BanishSubsequentShotsAimMod;
- Template.AbilityToHitCalc = StandardAim;
- Template.AbilityTargetStyle = default.SimpleSingleTarget;
- Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
- Template.AddShooterEffectExclusions();
- Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty);
- Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition);
- Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect());
- Template.AssociatedPassives.AddItem('HoloTargeting');
- Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect());
- Template.bAllowAmmoEffects = true;
- Template.bAllowBonusWeaponEffects = true;
- Trigger = new class'X2AbilityTrigger_EventListener';
- Trigger.ListenerData.Deferral = ELD_OnStateSubmitted;
- Trigger.ListenerData.EventID = 'FaceoffContinue';
- Trigger.ListenerData.Filter = eFilter_Unit;
- Trigger.ListenerData.EventFn = static.FaceoffListener;
- Template.AbilityTriggers.AddItem(Trigger);
- FaceoffTargetEffect = new class'X2Effect_Persistent';
- FaceoffTargetEffect.BuildPersistentEffect(1, false, true, true, eGameRule_PlayerTurnEnd);
- FaceoffTargetEffect.EffectName = 'FaceoffTarget';
- FaceoffTargetEffect.bApplyOnMiss = true; //Only one chance, even if you miss (prevents crazy flailing counter-attack chains with a Muton, for example)
- Template.AddTargetEffect(FaceoffTargetEffect);
- FaceoffTargetCondition = new class'X2Condition_UnitEffectsWithAbilitySource';
- FaceoffTargetCondition.AddExcludeEffect('FaceoffTarget', 'AA_DuplicateEffectIgnored');
- Template.AbilityTargetConditions.AddItem(FaceoffTargetCondition);
- Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY;
- Template.AbilitySourceName = 'eAbilitySource_Perk';
- Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow;
- Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
- //Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
- Template.BuildVisualizationFn = class'X2Ability_SharpshooterAbilitySet'.static.Faceoff_BuildVisualization;
- Template.MergeVisualizationFn = SequentialShot_MergeVisualization;
- Template.SuperConcealmentLoss = 0;
- Template.PostActivationEvents.AddItem('FaceoffContinue');
- Template.bShowActivation = true;
- // this ability will always break concealment at the end and we don't want to roll on it
- Template.ConcealmentRule = eConceal_Always;
- Template.SuperConcealmentLoss = 0;
- Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse;
- Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse;
- Template.bFrameEvenWhenUnitIsHidden = true;
- Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_soulreaper";
- return Template;
- }
- static function EventListenerReturn FaceoffListener(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData)
- {
- local XComGameStateHistory History;
- local XComGameStateContext_Ability AbilityContext;
- local XComGameState_Unit SourceUnit, TargetUnit;
- local array<StateObjectReference> PossibleTargets;
- local StateObjectReference BestTargetRef;
- local int BestTargetHP;
- local int i;
- local bool bAbilityContinues;
- local XComGameState_Ability AbilityState;
- local XComGameState_Item ItemState;
- `LOG("Here is the Listener",, 'FACEOFF');
- AbilityContext = XComGameStateContext_Ability(GameState.GetContext());
- if (AbilityContext != none && AbilityContext.InterruptionStatus != eInterruptionStatus_Interrupt)
- {
- SourceUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.SourceObject.ObjectID));
- TargetUnit = XComGameState_Unit(GameState.GetGameStateForObjectID(AbilityContext.InputContext.PrimaryTarget.ObjectID));
- AbilityState = XComGameState_Ability(`XCOMHISTORY.GetGameStateForObjectID(SourceUnit.FindAbility('FaceoffContinue').ObjectID));
- /*
- foreach SourceUnit.Abilities(BestTargetRef)
- {
- AbilityState = XComGameState_Ability(GameState.GetGameStateForObjectID(BestTargetRef.ObjectID));
- `LOG("Found ability: " @ AbilityState.GetMyTemplateName(),, 'FACEOFF');
- if (AbilityState.GetMyTemplateName() == 'FaceoffContinue') break;
- }*/
- `LOG("SourceUnit: " @ SourceUnit.GetFullName(),, 'FACEOFF');
- `LOG("TargetUnit: " @ TargetUnit.GetFullName(),, 'FACEOFF');
- if (AbilityState == none)
- {
- `LOG("Ability State is none!",, 'FACEOFF');
- return ELR_NoInterrupt;
- }
- else
- {
- `LOG("Ability State template is: " @ AbilityState.GetMyTemplateName(),, 'FACEOFF');
- }
- ItemState = XComGameState_Item(GameState.GetGameStateForObjectID(AbilityState.SourceWeapon.ObjectID));
- if (ItemState == none)
- {
- `LOG("Item State is none!",, 'FACEOFF');
- return ELR_NoInterrupt;
- }
- else
- {
- `LOG("Item State template is: " @ ItemState.GetMyTemplateName() @ ", ammo: " @ ItemState.Ammo,, 'FACEOFF');
- }
- if (ItemState.Ammo > 0)
- {
- History = `XCOMHISTORY;
- // find all possible new targets and select one with the highest HP to fire against
- class'X2TacticalVisibilityHelpers'.static.GetAllVisibleEnemyUnitsForUnit(SourceUnit.ObjectID, PossibleTargets, AbilityState.GetMyTemplate().AbilityTargetConditions);
- BestTargetHP = -1;
- /*
- `LOG("Looking for targets, step 1: " @ PossibleTargets.Length,, 'FACEOFF');
- for (i = 0; i < PossibleTargets.Length; ++i)
- {
- TargetUnit = XComGameState_Unit(History.GetGameStateForObjectID(PossibleTargets[i].ObjectID));
- if (TargetUnit.IsUnitAffectedByEffectName('FaceoffTarget'))
- {
- PossibleTargets.Remove(i, 1);
- i = 0;
- }
- }*/
- `LOG("Looking for targets: " @ PossibleTargets.Length,, 'FACEOFF');
- for (i = 0; i < PossibleTargets.Length; ++i)
- {
- TargetUnit = XComGameState_Unit(History.GetGameStateForObjectID(PossibleTargets[i].ObjectID));
- if (TargetUnit.GetCurrentStat(eStat_HP) > BestTargetHP)
- {
- BestTargetHP = TargetUnit.GetCurrentStat(eStat_HP);
- BestTargetRef = PossibleTargets[i];
- }
- }
- if (BestTargetRef.ObjectID > 0)
- {
- `LOG("Activating against: " @ TargetUnit.GetFullName(),, 'FACEOFF');
- bAbilityContinues = AbilityState.AbilityTriggerAgainstSingleTarget(BestTargetRef, false);
- `LOG("bAbilityContinues: " @ bAbilityContinues,, 'FACEOFF');
- }
- }
- else
- {
- `LOG("Ability finished.",, 'FACEOFF');
- bAbilityContinues = false;
- }
- if (!bAbilityContinues)
- {
- SourceUnit.BreakConcealment();
- }
- }
- `LOG("Exiting listener.",, 'FACEOFF');
- return ELR_NoInterrupt;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement