Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //class X2Ability_RemoteFuse extends X2Ability;
- // Implements all Combat Knife abilities
- class X2Ability_RemoteFuse extends X2Ability
- dependson (XComGameStateContext_Ability) config(DualWieldedPistols);
- static function array<X2DataTemplate> CreateTemplates()
- {
- local array<X2DataTemplate> Templates;
- Templates.AddItem(Create_RemoteFuse());
- Templates.AddItem(Create_RemoteFuseCounter());
- //Templates.AddItem(Create_RemoteFuseAttack());
- return Templates;
- }
- static function X2AbilityTemplate Create_RemoteFuse()
- {
- local X2AbilityTemplate Template;
- Template = PurePassive('RemoteFuse', "img:///UILibrary_PerkIcons.UIPerk_RemoteFuse", false, 'eAbilitySource_Perk');
- Template.AdditionalAbilities.AddItem('RemoteFuseCounter');
- return Template;
- }
- static function X2AbilityTemplate Create_RemoteFuseCounter()
- {
- local X2AbilityTemplate Template;
- local X2AbilityTrigger_EventListener Trigger;
- local X2Condition_UnitProperty SourceNotConcealedCondition;
- local X2Condition_Visibility TargetVisibilityCondition;
- local X2Condition_UnitEffects UnitEffectsCondition;
- local X2Condition_UnitProperty ExcludeSquadmatesCondition;
- local X2Effect_Stunned StunEffect;
- local X2Effect_StunRecover StunRecoverEffect;
- `CREATE_X2ABILITY_TEMPLATE(Template, 'RemoteFuseCounter');
- Template.AbilitySourceName = 'eAbilitySource_Perk';
- Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow;
- Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_RemoteFuse";
- Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY;
- Template.AbilityTargetStyle = default.SimpleSingleTarget;
- Template.AbilityToHitCalc = default.DeadEye;
- // trigger on movement
- /*
- Trigger = new class'X2AbilityTrigger_EventListener';
- Trigger.ListenerData.EventID = 'ObjectMoved';
- Trigger.ListenerData.Deferral = ELD_OnStateSubmitted;
- Trigger.ListenerData.Filter = eFilter_None;
- Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.TypicalOverwatchListener;
- Template.AbilityTriggers.AddItem(Trigger);*/
- Template.AbilityTargetConditions.AddItem(new class'X2Condition_FuseTarget');
- Template.PostActivationEvents.AddItem('FuseTriggered');
- Template.PostActivationEvents.AddItem('FusePostTriggered');
- StunEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(2, 100); // # ACTIONS, % chance
- StunEffect.bRemoveWhenSourceDies = true;
- Template.AddTargetEffect(StunEffect);
- StunRecoverEffect = new class'X2Effect_StunRecover';
- Template.AddTargetEffect(StunRecoverEffect);
- //Trigger on movement - interrupt the move
- /*
- Trigger = new class'X2AbilityTrigger_EventListener';
- Trigger.ListenerData.EventID = 'ObjectMoved';
- Trigger.ListenerData.Deferral = ELD_OnStateSubmitted;
- Trigger.ListenerData.Filter = eFilter_None;
- Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.SkirmisherInterruptListener;
- Template.AbilityTriggers.AddItem(Trigger);
- */
- // trigger on an attack
- Trigger = new class'X2AbilityTrigger_EventListener';
- Trigger.ListenerData.EventID = 'AbilityActivated';
- Trigger.ListenerData.Deferral = ELD_OnStateSubmitted;
- Trigger.ListenerData.Filter = eFilter_None;
- Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.TypicalAttackListener;
- Template.AbilityTriggers.AddItem(Trigger);
- // it may be the case that enemy movement caused a concealment break, which made RemoteFuse applicable - attempt to trigger afterwards
- Trigger = new class'X2AbilityTrigger_EventListener';
- Trigger.ListenerData.Deferral = ELD_OnStateSubmitted;
- Trigger.ListenerData.EventID = 'UnitConcealmentBroken';
- Trigger.ListenerData.Filter = eFilter_Unit;
- Trigger.ListenerData.EventFn = RemoteFuseConcealmentListener;
- Trigger.ListenerData.Priority = 55;
- Template.AbilityTriggers.AddItem(Trigger);
- Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty);
- TargetVisibilityCondition = new class'X2Condition_Visibility';
- TargetVisibilityCondition.bRequireGameplayVisible = true;
- TargetVisibilityCondition.bRequireBasicVisibility = true;
- TargetVisibilityCondition.bDisablePeeksOnMovement = true; //Don't use peek tiles for over watch shots
- Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition);
- Template.AbilityTargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
- // Adding exclusion condition to prevent friendly RemoteFuse fire when panicked.
- ExcludeSquadmatesCondition = new class'X2Condition_UnitProperty';
- ExcludeSquadmatesCondition.ExcludeSquadmates = true;
- Template.AbilityTargetConditions.AddItem(ExcludeSquadmatesCondition);
- Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
- Template.AddShooterEffectExclusions();
- //Don't trigger when the source is concealed
- SourceNotConcealedCondition = new class'X2Condition_UnitProperty';
- SourceNotConcealedCondition.ExcludeConcealed = true;
- Template.AbilityShooterConditions.AddItem(SourceNotConcealedCondition);
- // Don't trigger if the unit has vanished
- UnitEffectsCondition = new class'X2Condition_UnitEffects';
- UnitEffectsCondition.AddExcludeEffect('Vanish', 'AA_UnitIsConcealed');
- UnitEffectsCondition.AddExcludeEffect('VanishingWind', 'AA_UnitIsConcealed');
- Template.AbilityShooterConditions.AddItem(UnitEffectsCondition);
- //Template.bAllowBonusWeaponEffects = true;
- //Template.AddTargetEffect(new class'X2Effect_ApplyWeaponDamage');
- Template.CustomFireAnim = 'SingleShotLeft';
- //Template.ActivationSpeech = 'Fuse';
- //Template.AdditionalAbilities.AddItem('DualWieldedShot');
- //Template.PostActivationEvents.AddItem('DualWieldedShot');
- /*
- BattlelordEffect = new class'X2Effect_Battlelord';
- BattlelordEffect.BuildPersistentEffect(1, false, , , eGameRule_PlayerTurnBegin);
- BattlelordEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.LocLongDescription, Template.IconImage, true, , Template.AbilitySourceName);
- Template.AddShooterEffect(BattlelordEffect);
- //Template.AdditionalAbilities.AddItem('RemoteFuseAttack');*/
- //Prevent repeatedly hammering on a unit with RemoteFuse triggers.
- //(This effect does nothing, but enables many-to-many marking of which RemoteFuse attacks have already occurred each turn.)
- Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
- Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
- Template.bShowActivation = true;
- Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss;
- Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.NormalChosenActivationIncreasePerUse;
- Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.MeleeLostSpawnIncreasePerUse;
- //BEGIN AUTOGENERATED CODE: Template Overrides 'RemoteFuseCounter'
- Template.bFrameEvenWhenUnitIsHidden = true;
- //END AUTOGENERATED CODE: Template Overrides 'RemoteFuseCounter'
- return Template;
- }
- static function EventListenerReturn RemoteFuseConcealmentListener(Object EventData, Object EventSource, XComGameState GameState, Name Event, Object CallbackData)
- {
- local XComGameStateContext_Ability AbilityContext;
- local XComGameState_Unit ConcealmentBrokenUnit;
- local StateObjectReference RemoteFuseRef;
- local XComGameState_Ability RemoteFuseState;
- local XComGameStateHistory History;
- History = `XCOMHISTORY;
- ConcealmentBrokenUnit = XComGameState_Unit(EventSource);
- if (ConcealmentBrokenUnit == None)
- return ELR_NoInterrupt;
- //Do not trigger if the RemoteFuse Ranger himself moved to cause the concealment break - only when an enemy moved and caused it.
- AbilityContext = XComGameStateContext_Ability(GameState.GetContext().GetFirstStateInEventChain().GetContext());
- if (AbilityContext != None && AbilityContext.InputContext.SourceObject != ConcealmentBrokenUnit.ConcealmentBrokenByUnitRef)
- return ELR_NoInterrupt;
- RemoteFuseRef = ConcealmentBrokenUnit.FindAbility('RemoteFuseCounter');
- if (RemoteFuseRef.ObjectID == 0)
- return ELR_NoInterrupt;
- RemoteFuseState = XComGameState_Ability(History.GetGameStateForObjectID(RemoteFuseRef.ObjectID));
- if (RemoteFuseState == None)
- return ELR_NoInterrupt;
- RemoteFuseState.AbilityTriggerAgainstSingleTarget(ConcealmentBrokenUnit.ConcealmentBrokenByUnitRef, false);
- return ELR_NoInterrupt;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement