Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------------------
- // FILE: X2Ability_ConeOfFire.uc
- // AUTHOR: Kregano
- // DATE:
- // PURPOSE: Defines Cone of Fire ability.
- //
- //---------------------------------------------------------------------------------------
- //
- //---------------------------------------------------------------------------------------
- class X2Ability_ConeOfFire extends X2Ability_GrenadierAbilitySet;
- static function array<X2DataTemplate> CreateTemplates()
- {
- local array<X2DataTemplate> Templates;
- Templates.AddItem(ConeOfFire());
- Templates.AddItem(COF_ReactionShot());
- return Templates;
- }
- static function X2AbilityTemplate ConeOfFire()
- {
- local X2AbilityTemplate Template;
- local X2AbilityCost_ActionPoints ActionPointCost;
- local X2AbilityCost_Ammo AmmoCost;
- local X2AbilityCooldown Cooldown;
- local X2Effect_ReserveActionPoints ReserveActionPointsEffect;
- local X2AbilityMultiTarget_Cone ConeMultiTarget;
- local X2Condition_UnitProperty UnitPropertyCondition;
- local X2Effect_Suppression SuppressionEffect;
- `CREATE_X2ABILITY_TEMPLATE(Template, 'ConeOfFire');
- Template.IconImage = "img:///UILibrary_ConeOfFire.UIPerk_coneoffire";
- ActionPointCost = new class'X2AbilityCost_ActionPoints';
- ActionPointCost.bConsumeAllPoints = true; // this will guarantee the unit has at least 1 action point
- ActionPointCost.bFreeCost = true; // ReserveActionPoints effect will take all action points away
- Template.AbilityCosts.AddItem(ActionPointCost);
- AmmoCost = new class'X2AbilityCost_Ammo';
- AmmoCost.iAmmo = 2;
- Template.AbilityCosts.AddItem(AmmoCost);
- Cooldown = new class'X2AbilityCooldown';
- Cooldown.iNumTurns = 1;
- Template.AbilityCooldown = Cooldown;
- Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
- Template.AddShooterEffectExclusions();
- ReserveActionPointsEffect = new class'X2Effect_ReserveActionPoints';
- ReserveActionPointsEffect.ReserveType = 'Suppression';
- Template.AddShooterEffect(ReserveActionPointsEffect);
- Template.AbilityToHitCalc = default.DeadEye;
- Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty);
- Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition);
- Template.AbilityTriggers.AddItem(default.PlayerInputTrigger);
- Template.AbilityTargetStyle = new class'X2AbilityTarget_Cursor';
- ConeMultiTarget.bIgnoreBlockingCover = true;
- ConeMultiTarget = new class'X2AbilityMultiTarget_Cone';
- ConeMultiTarget.bUseWeaponRadius = true;
- ConeMultiTarget.ConeEndDiameter = 12 * class'XComWorldData'.const.WORLD_StepSize;
- ConeMultiTarget.bUseWeaponRangeForLength = true;
- Template.AbilityMultiTargetStyle = ConeMultiTarget;
- UnitPropertyCondition = new class'X2Condition_UnitProperty';
- UnitPropertyCondition.ExcludeDead = true;
- UnitPropertyCondition.ExcludeFriendlyToSource = true;
- Template.AbilityShooterConditions.AddItem(UnitPropertyCondition);
- Template.AbilityTargetConditions.AddItem(UnitPropertyCondition);
- SuppressionEffect = new class'X2Effect_Suppression';
- SuppressionEffect.BuildPersistentEffect(1, false, true, false, eWatchRule_UnitTurnBegin);
- SuppressionEffect.bRemoveWhenTargetDies = true;
- SuppressionEffect.bRemoveWhenSourceDamaged = true;
- SuppressionEffect.bBringRemoveVisualizationForward = true;
- SuppressionEffect.SetDisplayInfo(ePerkBuff_Penalty, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionTargetEffectDesc, Template.IconImage);
- SuppressionEffect.SetSourceDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionSourceEffectDesc, Template.IconImage);
- Template.AddMultiTargetEffect(SuppressionEffect);
- Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect());
- Template.bAllowAmmoEffects = true;
- Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY;
- Template.AbilitySourceName = 'eAbilitySource_Perk';
- Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow;
- Template.bDisplayInUITooltip = false;
- Template.AdditionalAbilities.AddItem('COF_ReactionShot');
- Template.bIsASuppressionEffect = true;
- Template.AbilityConfirmSound = "TacticalUI_ActivateAbility";
- Template.AssociatedPassives.AddItem('HoloTargeting');
- Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
- Template.BuildVisualizationFn = ConeOfFireBuildVisualization;
- Template.BuildAppliedVisualizationSyncFn = class'X2Ability_GrenadierAbilitySet'.static.SuppressionBuildVisualizationSync;
- Template.CinescriptCameraType = "StandardSuppression";
- Template.TargetingMethod = class'X2TargetingMethod_Cone';
- Template.bCrossClassEligible = true;
- return Template;
- }
- simulated function ConeOfFireBuildVisualization(XComGameState VisualizeGameState)
- {
- local XComGameStateHistory History;
- local XComGameStateContext_Ability Context;
- local StateObjectReference InteractingUnitRef;
- local VisualizationActionMetadata EmptyTrack;
- local VisualizationActionMetadata ActionMetadata;
- local int i;
- local XComGameState_Ability Ability;
- local X2Action_PlaySoundAndFlyOver SoundAndFlyOver;
- // Variables for Issue #45
- local XComGameState_Item SourceWeapon;
- local XGWeapon WeaponVis;
- local XComUnitPawn UnitPawn;
- local XComWeapon Weapon;
- History = `XCOMHISTORY;
- Context = XComGameStateContext_Ability(VisualizeGameState.GetContext());
- InteractingUnitRef = Context.InputContext.SourceObject;
- //Configure the visualization track for the shooter
- //****************************************************************************************
- ActionMetadata = EmptyTrack;
- ActionMetadata.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
- ActionMetadata.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
- ActionMetadata.VisualizeActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
- // Check the actor's pawn and weapon, see if they can play the suppression effect
- Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
- SourceWeapon = XComGameState_Item(History.GetGameStateForObjectID(Ability.SourceWeapon.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
- WeaponVis = XGWeapon(SourceWeapon.GetVisualizer());
- UnitPawn = XGUnit(ActionMetadata.VisualizeActor).GetPawn();
- Weapon = WeaponVis.GetEntity();
- if (
- Weapon != None &&
- !UnitPawn.GetAnimTreeController().CanPlayAnimation(Weapon.WeaponSuppressionFireAnimSequenceName) &&
- !UnitPawn.GetAnimTreeController().CanPlayAnimation(class'XComWeapon'.default.WeaponSuppressionFireAnimSequenceName))
- {
- // The unit can't play their weapon's suppression effect. Replace it with the normal fire effect so at least they'll look like they're shooting
- Weapon.WeaponSuppressionFireAnimSequenceName = Weapon.WeaponFireAnimSequenceName;
- }
- class'X2Action_ExitCover'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded);
- class'X2Action_StartSuppression'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded);
- //****************************************************************************************
- //Configure the visualization track for the targets
- for (i = 0; i < Context.InputContext.MultiTargets.Length; i++)
- {
- // Fake it out by assigning the first multi-target as the primary target
- if (Context.InputContext.PrimaryTarget.ObjectID == 0)
- Context.InputContext.PrimaryTarget = Context.InputContext.MultiTargets[i];
- }
- InteractingUnitRef = Context.InputContext.MultiTargets[i];
- //Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
- ActionMetadata = EmptyTrack;
- ActionMetadata.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
- ActionMetadata.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
- ActionMetadata.VisualizeActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
- SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded));
- SoundAndFlyOver.SetSoundAndFlyOverParameters(None, Ability.GetMyTemplate().LocFlyOverText, '', eColor_Good);
- if (XComGameState_Unit(ActionMetadata.StateObject_OldState).ReserveActionPoints.Length != 0 && XComGameState_Unit(ActionMetadata.StateObject_NewState).ReserveActionPoints.Length == 0)
- {
- SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded));
- SoundAndFlyOver.SetSoundAndFlyOverParameters(none, class'XLocalizedData'.default.OverwatchRemovedMsg, '', eColor_Good);
- }
- }
- static function X2AbilityTemplate COF_ReactionShot()
- {
- local X2AbilityTemplate Template;
- local X2AbilityCost_ReserveActionPoints ReserveActionPointCost;
- local X2AbilityToHitCalc_StandardAim ToHitCalc;
- local X2Condition_Visibility TargetVisibilityCondition;
- local X2AbilityTrigger_Event Trigger;
- local X2Condition_UnitEffectsWithAbilitySource TargetEffectCondition;
- local X2Effect_RemoveEffects RemoveSuppression;
- local X2Effect ShotEffect;
- local X2AbilityCost_Ammo AmmoCost;
- `CREATE_X2ABILITY_TEMPLATE(Template, 'COF_ReactionShot');
- Template.bDontDisplayInAbilitySummary = true;
- ReserveActionPointCost = new class'X2AbilityCost_ReserveActionPoints';
- ReserveActionPointCost.iNumPoints = 1;
- ReserveActionPointCost.AllowedTypes.AddItem('Suppression');
- Template.AbilityCosts.AddItem(ReserveActionPointCost);
- AmmoCost = new class'X2AbilityCost_Ammo';
- AmmoCost.iAmmo = 1;
- Template.AbilityCosts.AddItem(AmmoCost);
- ToHitCalc = new class'X2AbilityToHitCalc_StandardAim';
- ToHitCalc.BuiltInHitMod = 200;
- ToHitCalc.bAllowCrit = false;
- Template.AbilityToHitCalc = ToHitCalc;
- Template.AbilityToHitOwnerOnMissCalc = ToHitCalc;
- Template.AbilityTargetStyle = default.SimpleSingleTarget;
- Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty);
- TargetEffectCondition = new class'X2Condition_UnitEffectsWithAbilitySource';
- TargetEffectCondition.AddRequireEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsNotSuppressed');
- Template.AbilityTargetConditions.AddItem(TargetEffectCondition);
- TargetVisibilityCondition = new class'X2Condition_Visibility';
- TargetVisibilityCondition.bRequireGameplayVisible = false;
- Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition);
- Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
- Template.bAllowAmmoEffects = true;
- RemoveSuppression = new class'X2Effect_RemoveEffects';
- RemoveSuppression.EffectNamesToRemove.AddItem(class'X2Effect_Suppression'.default.EffectName);
- RemoveSuppression.bCheckSource = true;
- RemoveSuppression.SetupEffectOnShotContextResult(true, true);
- Template.AddShooterEffect(RemoveSuppression);
- //Trigger on movement - interrupt the move
- Trigger = new class'X2AbilityTrigger_Event';
- Trigger.EventObserverClass = class'X2TacticalGameRuleset_MovementObserver';
- Trigger.MethodName = 'InterruptGameState';
- Template.AbilityTriggers.AddItem(Trigger);
- Template.AbilitySourceName = 'eAbilitySource_Standard';
- Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow;
- Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_supression";
- Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY;
- Template.bDisplayInUITooltip = false;
- Template.bDisplayInUITacticalText = false;
- //don't want to exit cover, we are already in suppression/alert mode.
- Template.bSkipExitCoverWhenFiring = true;
- Template.bAllowFreeFireWeaponUpgrade = true;
- // Put holo target effect first because if the target dies from this shot, it will be too late to notify the effect.
- ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect();
- ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
- Template.AddTargetEffect(ShotEffect);
- // Various Soldier ability specific effects - effects check for the ability before applying
- ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect();
- ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
- Template.AddTargetEffect(ShotEffect);
- Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
- Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
- return Template;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement