Advertisement
kregano

(Chimera Squad) Cone of Fire

Apr 25th, 2020
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.02 KB | None | 0 0
  1. //---------------------------------------------------------------------------------------
  2. // FILE: X2Ability_ConeOfFire.uc
  3. // AUTHOR: Kregano
  4. // DATE:
  5. // PURPOSE: Defines Cone of Fire ability.
  6. //
  7. //---------------------------------------------------------------------------------------
  8. //
  9. //---------------------------------------------------------------------------------------
  10.  
  11. class X2Ability_ConeOfFire extends X2Ability_GrenadierAbilitySet;
  12.  
  13. static function array<X2DataTemplate> CreateTemplates()
  14. {
  15. local array<X2DataTemplate> Templates;
  16.  
  17. Templates.AddItem(ConeOfFire());
  18. Templates.AddItem(COF_ReactionShot());
  19. return Templates;
  20. }
  21.  
  22. static function X2AbilityTemplate ConeOfFire()
  23. {
  24. local X2AbilityTemplate Template;
  25. local X2AbilityCost_ActionPoints ActionPointCost;
  26. local X2AbilityCost_Ammo AmmoCost;
  27. local X2AbilityCooldown Cooldown;
  28. local X2Effect_ReserveActionPoints ReserveActionPointsEffect;
  29. local X2AbilityMultiTarget_Cone ConeMultiTarget;
  30. local X2Condition_UnitProperty UnitPropertyCondition;
  31. local X2Effect_Suppression SuppressionEffect;
  32.  
  33. `CREATE_X2ABILITY_TEMPLATE(Template, 'ConeOfFire');
  34.  
  35. Template.IconImage = "img:///UILibrary_ConeOfFire.UIPerk_coneoffire";
  36.  
  37. ActionPointCost = new class'X2AbilityCost_ActionPoints';
  38. ActionPointCost.bConsumeAllPoints = true; // this will guarantee the unit has at least 1 action point
  39. ActionPointCost.bFreeCost = true; // ReserveActionPoints effect will take all action points away
  40. Template.AbilityCosts.AddItem(ActionPointCost);
  41.  
  42. AmmoCost = new class'X2AbilityCost_Ammo';
  43. AmmoCost.iAmmo = 2;
  44. Template.AbilityCosts.AddItem(AmmoCost);
  45.  
  46. Cooldown = new class'X2AbilityCooldown';
  47. Cooldown.iNumTurns = 1;
  48. Template.AbilityCooldown = Cooldown;
  49.  
  50. Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
  51.  
  52. Template.AddShooterEffectExclusions();
  53.  
  54. ReserveActionPointsEffect = new class'X2Effect_ReserveActionPoints';
  55. ReserveActionPointsEffect.ReserveType = 'Suppression';
  56. Template.AddShooterEffect(ReserveActionPointsEffect);
  57.  
  58. Template.AbilityToHitCalc = default.DeadEye;
  59. Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty);
  60. Template.AbilityTargetConditions.AddItem(default.GameplayVisibilityCondition);
  61. Template.AbilityTriggers.AddItem(default.PlayerInputTrigger);
  62. Template.AbilityTargetStyle = new class'X2AbilityTarget_Cursor';
  63. ConeMultiTarget.bIgnoreBlockingCover = true;
  64. ConeMultiTarget = new class'X2AbilityMultiTarget_Cone';
  65. ConeMultiTarget.bUseWeaponRadius = true;
  66. ConeMultiTarget.ConeEndDiameter = 12 * class'XComWorldData'.const.WORLD_StepSize;
  67. ConeMultiTarget.bUseWeaponRangeForLength = true;
  68. Template.AbilityMultiTargetStyle = ConeMultiTarget;
  69.  
  70. UnitPropertyCondition = new class'X2Condition_UnitProperty';
  71. UnitPropertyCondition.ExcludeDead = true;
  72. UnitPropertyCondition.ExcludeFriendlyToSource = true;
  73. Template.AbilityShooterConditions.AddItem(UnitPropertyCondition);
  74. Template.AbilityTargetConditions.AddItem(UnitPropertyCondition);
  75.  
  76. SuppressionEffect = new class'X2Effect_Suppression';
  77. SuppressionEffect.BuildPersistentEffect(1, false, true, false, eWatchRule_UnitTurnBegin);
  78. SuppressionEffect.bRemoveWhenTargetDies = true;
  79. SuppressionEffect.bRemoveWhenSourceDamaged = true;
  80. SuppressionEffect.bBringRemoveVisualizationForward = true;
  81. SuppressionEffect.SetDisplayInfo(ePerkBuff_Penalty, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionTargetEffectDesc, Template.IconImage);
  82. SuppressionEffect.SetSourceDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, class'X2Ability_GrenadierAbilitySet'.default.SuppressionSourceEffectDesc, Template.IconImage);
  83. Template.AddMultiTargetEffect(SuppressionEffect);
  84. Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect());
  85. Template.bAllowAmmoEffects = true;
  86.  
  87. Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY;
  88. Template.AbilitySourceName = 'eAbilitySource_Perk';
  89. Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow;
  90. Template.bDisplayInUITooltip = false;
  91. Template.AdditionalAbilities.AddItem('COF_ReactionShot');
  92. Template.bIsASuppressionEffect = true;
  93. Template.AbilityConfirmSound = "TacticalUI_ActivateAbility";
  94.  
  95. Template.AssociatedPassives.AddItem('HoloTargeting');
  96.  
  97. Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
  98. Template.BuildVisualizationFn = ConeOfFireBuildVisualization;
  99. Template.BuildAppliedVisualizationSyncFn = class'X2Ability_GrenadierAbilitySet'.static.SuppressionBuildVisualizationSync;
  100. Template.CinescriptCameraType = "StandardSuppression";
  101.  
  102. Template.TargetingMethod = class'X2TargetingMethod_Cone';
  103.  
  104. Template.bCrossClassEligible = true;
  105.  
  106. return Template;
  107. }
  108.  
  109. simulated function ConeOfFireBuildVisualization(XComGameState VisualizeGameState)
  110. {
  111. local XComGameStateHistory History;
  112. local XComGameStateContext_Ability Context;
  113. local StateObjectReference InteractingUnitRef;
  114.  
  115. local VisualizationActionMetadata EmptyTrack;
  116. local VisualizationActionMetadata ActionMetadata;
  117.  
  118. local int i;
  119. local XComGameState_Ability Ability;
  120. local X2Action_PlaySoundAndFlyOver SoundAndFlyOver;
  121.  
  122. // Variables for Issue #45
  123. local XComGameState_Item SourceWeapon;
  124. local XGWeapon WeaponVis;
  125. local XComUnitPawn UnitPawn;
  126. local XComWeapon Weapon;
  127.  
  128. History = `XCOMHISTORY;
  129.  
  130. Context = XComGameStateContext_Ability(VisualizeGameState.GetContext());
  131. InteractingUnitRef = Context.InputContext.SourceObject;
  132.  
  133. //Configure the visualization track for the shooter
  134. //****************************************************************************************
  135. ActionMetadata = EmptyTrack;
  136. ActionMetadata.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
  137. ActionMetadata.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
  138. ActionMetadata.VisualizeActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
  139.  
  140. // Check the actor's pawn and weapon, see if they can play the suppression effect
  141. Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
  142. SourceWeapon = XComGameState_Item(History.GetGameStateForObjectID(Ability.SourceWeapon.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
  143. WeaponVis = XGWeapon(SourceWeapon.GetVisualizer());
  144.  
  145. UnitPawn = XGUnit(ActionMetadata.VisualizeActor).GetPawn();
  146. Weapon = WeaponVis.GetEntity();
  147. if (
  148. Weapon != None &&
  149. !UnitPawn.GetAnimTreeController().CanPlayAnimation(Weapon.WeaponSuppressionFireAnimSequenceName) &&
  150. !UnitPawn.GetAnimTreeController().CanPlayAnimation(class'XComWeapon'.default.WeaponSuppressionFireAnimSequenceName))
  151. {
  152. // 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
  153. Weapon.WeaponSuppressionFireAnimSequenceName = Weapon.WeaponFireAnimSequenceName;
  154. }
  155.  
  156. class'X2Action_ExitCover'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded);
  157. class'X2Action_StartSuppression'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded);
  158. //****************************************************************************************
  159. //Configure the visualization track for the targets
  160. for (i = 0; i < Context.InputContext.MultiTargets.Length; i++)
  161. {
  162. // Fake it out by assigning the first multi-target as the primary target
  163. if (Context.InputContext.PrimaryTarget.ObjectID == 0)
  164. Context.InputContext.PrimaryTarget = Context.InputContext.MultiTargets[i];
  165. }
  166. InteractingUnitRef = Context.InputContext.MultiTargets[i];
  167. //Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1));
  168. ActionMetadata = EmptyTrack;
  169. ActionMetadata.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1);
  170. ActionMetadata.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID);
  171. ActionMetadata.VisualizeActor = History.GetVisualizer(InteractingUnitRef.ObjectID);
  172. SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded));
  173. SoundAndFlyOver.SetSoundAndFlyOverParameters(None, Ability.GetMyTemplate().LocFlyOverText, '', eColor_Good);
  174. if (XComGameState_Unit(ActionMetadata.StateObject_OldState).ReserveActionPoints.Length != 0 && XComGameState_Unit(ActionMetadata.StateObject_NewState).ReserveActionPoints.Length == 0)
  175. {
  176. SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(ActionMetadata, Context, false, ActionMetadata.LastActionAdded));
  177. SoundAndFlyOver.SetSoundAndFlyOverParameters(none, class'XLocalizedData'.default.OverwatchRemovedMsg, '', eColor_Good);
  178. }
  179. }
  180.  
  181. static function X2AbilityTemplate COF_ReactionShot()
  182. {
  183. local X2AbilityTemplate Template;
  184. local X2AbilityCost_ReserveActionPoints ReserveActionPointCost;
  185. local X2AbilityToHitCalc_StandardAim ToHitCalc;
  186. local X2Condition_Visibility TargetVisibilityCondition;
  187. local X2AbilityTrigger_Event Trigger;
  188. local X2Condition_UnitEffectsWithAbilitySource TargetEffectCondition;
  189. local X2Effect_RemoveEffects RemoveSuppression;
  190. local X2Effect ShotEffect;
  191. local X2AbilityCost_Ammo AmmoCost;
  192.  
  193. `CREATE_X2ABILITY_TEMPLATE(Template, 'COF_ReactionShot');
  194.  
  195. Template.bDontDisplayInAbilitySummary = true;
  196.  
  197. ReserveActionPointCost = new class'X2AbilityCost_ReserveActionPoints';
  198. ReserveActionPointCost.iNumPoints = 1;
  199. ReserveActionPointCost.AllowedTypes.AddItem('Suppression');
  200. Template.AbilityCosts.AddItem(ReserveActionPointCost);
  201.  
  202. AmmoCost = new class'X2AbilityCost_Ammo';
  203. AmmoCost.iAmmo = 1;
  204. Template.AbilityCosts.AddItem(AmmoCost);
  205.  
  206. ToHitCalc = new class'X2AbilityToHitCalc_StandardAim';
  207. ToHitCalc.BuiltInHitMod = 200;
  208. ToHitCalc.bAllowCrit = false;
  209. Template.AbilityToHitCalc = ToHitCalc;
  210. Template.AbilityToHitOwnerOnMissCalc = ToHitCalc;
  211.  
  212. Template.AbilityTargetStyle = default.SimpleSingleTarget;
  213.  
  214. Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty);
  215.  
  216. TargetEffectCondition = new class'X2Condition_UnitEffectsWithAbilitySource';
  217. TargetEffectCondition.AddRequireEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsNotSuppressed');
  218. Template.AbilityTargetConditions.AddItem(TargetEffectCondition);
  219.  
  220. TargetVisibilityCondition = new class'X2Condition_Visibility';
  221. TargetVisibilityCondition.bRequireGameplayVisible = false;
  222. Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition);
  223. Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty);
  224.  
  225. Template.bAllowAmmoEffects = true;
  226.  
  227. RemoveSuppression = new class'X2Effect_RemoveEffects';
  228. RemoveSuppression.EffectNamesToRemove.AddItem(class'X2Effect_Suppression'.default.EffectName);
  229. RemoveSuppression.bCheckSource = true;
  230. RemoveSuppression.SetupEffectOnShotContextResult(true, true);
  231. Template.AddShooterEffect(RemoveSuppression);
  232.  
  233. //Trigger on movement - interrupt the move
  234. Trigger = new class'X2AbilityTrigger_Event';
  235. Trigger.EventObserverClass = class'X2TacticalGameRuleset_MovementObserver';
  236. Trigger.MethodName = 'InterruptGameState';
  237. Template.AbilityTriggers.AddItem(Trigger);
  238.  
  239. Template.AbilitySourceName = 'eAbilitySource_Standard';
  240. Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow;
  241. Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_supression";
  242. Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY;
  243. Template.bDisplayInUITooltip = false;
  244. Template.bDisplayInUITacticalText = false;
  245.  
  246. //don't want to exit cover, we are already in suppression/alert mode.
  247. Template.bSkipExitCoverWhenFiring = true;
  248. Template.bAllowFreeFireWeaponUpgrade = true;
  249.  
  250. // Put holo target effect first because if the target dies from this shot, it will be too late to notify the effect.
  251. ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect();
  252. ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
  253. Template.AddTargetEffect(ShotEffect);
  254.  
  255. // Various Soldier ability specific effects - effects check for the ability before applying
  256. ShotEffect = class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect();
  257. ShotEffect.TargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition());
  258. Template.AddTargetEffect(ShotEffect);
  259.  
  260. Template.BuildNewGameStateFn = TypicalAbility_BuildGameState;
  261. Template.BuildVisualizationFn = TypicalAbility_BuildVisualization;
  262.  
  263. return Template;
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement