diff --git a/.gitignore b/.gitignore index d3ce181e1..ed7eaa14b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /*.code-workspace BuildCache/ PublishedFileID.Id -*.upk -*.umap +/LongWarOfTheChosen/Content/ +/LongWarOfTheChosen/ContentForCook/ diff --git a/LongWarOfTheChosen/Config/OldTemplarClassData.ini b/LongWarOfTheChosen/Config/OldTemplarClassData.ini new file mode 100644 index 000000000..c4673d633 --- /dev/null +++ b/LongWarOfTheChosen/Config/OldTemplarClassData.ini @@ -0,0 +1,118 @@ + +; Pre rework Templar Class data information. If you want the old Templar, swap the Templar section of XComClassData.ini for this (and see the other Shield rework stuff to turn the shields back on.) + +[Templar X2SoldierClassTemplate] + +-AllowedWeapons=(SlotType=eInvSlot_SecondaryWeapon, WeaponType="sidearm") ++AllowedWeapons=(SlotType=eInvSlot_SecondaryWeapon, WeaponType="templarshield") + + +!RandomAbilityDecks=() ++RandomAbilityDecks=(DeckName="TemplarTier1XComAbilities", \\ + Abilities=((AbilityName="Salvo"), \\ + (AbilityName="Flashbanger"), \\ + (AbilityName="Phantom"), \\ + (AbilityName="ZoneOfControl_LW"), \\ + (AbilityName="Covert"), \\ + (AbilityName="FieldMedic", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="SmokeGrenade", ApplyToWeaponSlot=eInvSlot_Unknown) \\ + )) ++RandomAbilityDecks=(DeckName="TemplarTier2XComAbilities", \\ + Abilities=((AbilityName="CombatEngineer"), \\ + (AbilityName="RapidDeployment"), \\ + (AbilityName="FullKit"), \\ + (AbilityName="LoneWolf"), \\ + (AbilityName="Aggression", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="Dedication_LW"), \\ + (AbilityName="InspireAgility_LW"), \\ + (AbilityName="Infighter"), \\ + (AbilityName="Bringemon"), \\ + (AbilityName="Stealth"), \\ + (AbilityName="Formidable", ApplyToWeaponSlot=eInvSlot_Unknown) \\ + )) + ++RandomAbilityDecks=(DeckName="TemplarTier3XComAbilities", \\ + Abilities=((AbilityName="Resilience", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="Evasive"), \\ + (AbilityName="HardTarget", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="Fortify", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="CombatFitness", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="OverKill_LW", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="CenterMass", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="SurvivalInstinct_LW", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="Cutthroat", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="Tradecraft", ApplyToWeaponSlot=eInvSlot_Unknown) \\ + )) + ++RandomAbilityDecks=(DeckName="TemplarTier4XComAbilities", \\ + Abilities=((AbilityName="Lethal", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="CoupDeGrace2", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="Concentration_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="Implacable", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="TacticalSense", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="LightningReflexes_LW", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="LightningSlash_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon) \\ + )) +!SoldierRanks=() +; squaddie ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="Rend", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="Volt", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="TemplarFocus", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="Momentum"))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=0), (StatType=eStat_Strength,StatAmount=1), (StatType=eStat_PsiOffense,StatAmount=0), (StatType=eStat_CombatSims,StatAmount=1), (StatType=eStat_Will,StatAmount=5))) + +; LCPL ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="TemplarInvert")), \\ + (AbilityType=(AbilityName="Amplify")), \\ + (AbilityType=(AbilityName="Indomitable")), \\ + (RandomDeckName="TemplarTier1XComAbilities"), \\ + (AbilityType=(AbilityName="Magnum_LW", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=1), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Will,StatAmount=5))) + +; CPL ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="StunStrike")), \\ + (AbilityType=(AbilityName="ShieldBash_LW", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ + (AbilityType=(AbilityName="Brawler", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (RandomDeckName="TemplarTier1XComAbilities"), \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=1))) + +; SGT ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="Pillar", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="OverCharge_LW" )), \\ + (AbilityType=(AbilityName="Sustain")), \\ + (RandomDeckName="TemplarTier2XComAbilities"), \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Strength,StatAmount=1))) + +; SSGT ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="VoidConduit", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="Channel")), \\ + (AbilityType=(AbilityName="Fortress", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (RandomDeckName="TemplarTier2XComAbilities"), \\ + (AbilityType=(AbilityName="LightningHands", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=1))) + +; TSGT ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="DoubleRendFocus", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="ArcWavePassive")), \\ + (AbilityType=(AbilityName="CrusaderRage_LW")), \\ + (RandomDeckName="TemplarTier3XComAbilities"), \\ + (AbilityType=(AbilityName="Gunslinger", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_Strength,StatAmount=1))) + +; GSGT ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="TemplarTerror", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ + (AbilityType=(AbilityName="TemplarBladeStorm", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="ImpactCompensation_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (RandomDeckName="TemplarTier3XComAbilities"), \\ + (AbilityType=(AbilityName="Faceoff", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_HP,StatAmount=1))) + +; MSGT ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="IonicStorm", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="Apotheosis")), \\ + (AbilityType=(AbilityName="Ghost", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (RandomDeckName="TemplarTier4XComAbilities"), \\ + (AbilityType=(AbilityName="FanFire", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=3))) diff --git a/LongWarOfTheChosen/Config/XComAI.ini b/LongWarOfTheChosen/Config/XComAI.ini index 1a8356ba7..ae7be8524 100644 --- a/LongWarOfTheChosen/Config/XComAI.ini +++ b/LongWarOfTheChosen/Config/XComAI.ini @@ -88,6 +88,9 @@ ;Scamper root used by purifier +NewBehaviors=(BehaviorName=ScamperRoot_Purifier, NodeType=Selector, Child[0]=CounterBeaglerushManeuver, Child[1]=SniperDefense, Child[2]=MoveAggressiveUnsafe, Child[3]=HuntEnemyWithCover, Child[4]=SkipMove) +; "ScamperRoot_Warlock" - used by the chosen warlock ++NewBehaviors=(BehaviorName=ScamperRoot_ChosenWarlock, NodeType=Selector, Child[0]=CounterBeaglerushManeuver, Child[1]=TryChosenSummon, Child[2]=TryShieldAlly, Child[3]=MoveStandardWithLoSUnsafe, Child[4]=MoveStandardUnsafe, Child[5]=MoveStandardWithLoSUnsafeIgnoreHazards, Child[6]=MoveStandardUnsafeIgnoreHazards, Child[7]=SkipMove) + ; "AvoidBoundAndPanickedTargets" - Add a uniform score bonus to all non-last-resort units (+25) +BehaviorRemovals="AvoidBoundAndPanickedTargets" +NewBehaviors=(BehaviorName=AvoidBoundAndPanickedTargets, NodeType=Selector, Child[0]=ScoreIfTargetBoundOrPanicked, Child[1]=AddToTargetScore_25) @@ -392,8 +395,25 @@ Child[4]=HuntEnemyWithCover) DistributionPercentToXCom=60 [XComGame.XComGameState_AIGroup] -+FallbackExclusionList="HiveQueen" -+FallbackExclusionList="ChryssalidSoldier" ++FallbackExclusionList=HiveQueen ++FallbackExclusionList=ChryssalidSoldier +;Removing chosen from this is useful for debugging ++FallbackExclusionList=ChosenSniperM1 ++FallbackExclusionList=ChosenSniperM2 ++FallbackExclusionList=ChosenSniperM3 ++FallbackExclusionList=ChosenSniperM4 ++FallbackExclusionList=ChosenSniperM5 ++FallbackExclusionList=ChosenWarlockM1 ++FallbackExclusionList=ChosenWarlockM2 ++FallbackExclusionList=ChosenWarlockM3 ++FallbackExclusionList=ChosenWarlockM4 ++FallbackExclusionList=ChosenWarlockM5 ++FallbackExclusionList=ChosenAssassinM1 ++FallbackExclusionList=ChosenAssassinM2 ++FallbackExclusionList=ChosenAssassinM3 ++FallbackExclusionList=ChosenAssassinM4 ++FallbackExclusionList=ChosenAssassinM5 + [XComGame.XComGameState_AIPlayerData] DownThrottleUnitCount = 999 ; Number of enemies engaged to activate Down Throttling. DISABLED @@ -1283,7 +1303,7 @@ MAX_SURPRISED_SCAMPER_PATH_LENGTH=7 ; Scamper paths longer than this number of +Behaviors=(BehaviorName=TryOverwatchLastAction, NodeType=Sequence, Child[0]=IsLastActionPoint, Child[1]=AvoidDoubleMove, Child[2]=TryOverwatch) ;ChosenWarlock -+EquivalentAbilities=( KeyName=ShieldAlly, EquivalentAbilityName[0]=ShieldAllyM1, EquivalentAbilityName[1]=ShieldAllyM2, EquivalentAbilityName[2]=ShieldAllyM3, EquivalentAbilityName[3]=ShieldAllyM4) ++EquivalentAbilities=( KeyName=ShieldAlly, EquivalentAbilityName[0]=ShieldAllyM1, EquivalentAbilityName[1]=ShieldAllyM2, EquivalentAbilityName[2]=ShieldAllyM3, EquivalentAbilityName[3]=ShieldAllyM4, EquivalentAbilityName[4]=ShieldAllyM5) -Behaviors=(BehaviorName="ChosenWarlock::CharacterRoot", NodeType=Selector, Child[0]=ChosenUnactivated, Child[1]=ChosenActivated, Child[2]=ChosenEngaged, Child[3]=SkipMove) -Behaviors=(BehaviorName="ChosenWarlock::ChosenEngaged", NodeType=Selector, Child[0]=TryEndSpectralArmy, Child[1]=TryChosenSummon, Child[2]=OverwatchHandlerShootOverwatcherOption, Child[3]=WarlockMoveIfNecessary, Child[4]=TryWarlockCombatAbilities, Child[5]=OverwatchHandlerBackupOption, Child[6]=TryShootOrReloadOrOverwatch, Child[7]=HuntEnemyWithCover) @@ -1318,12 +1338,13 @@ MAX_SURPRISED_SCAMPER_PATH_LENGTH=7 ; Scamper paths longer than this number of Child[8]=TryShootOrReloadOrOverwatch, \\ Child[9]=HuntEnemyWithCover) -+Behaviors=(BehaviorName=WarlockReaction, NodeType=Selector, Child[0]=DoIfFlankedPrimeFallback, Child[1]=NeedsReload, Child[2]=TryCombatReadinessIfMobDebuffed, Child[3]=TryTriggerDamagedTeleportIfFlanked, Child[4]=TryCombatReadiness) ++Behaviors=(BehaviorName=WarlockReaction, NodeType=Selector, Child[0]=TrySpectralArmyIfFlanked, Child[1]=DoIfFlankedPrimeFallback, Child[2]=NeedsReload, Child[3]=TryCombatReadinessIfMobDebuffed, Child[4]=TryTriggerDamagedTeleportIfFlanked, Child[5]=TryCorress, Child[6]=TryCombatReadiness) +Behaviors=(BehaviorName=SelectAbility-AmmoDump_LW, NodeType=Action) +Behaviors=(BehaviorName=SelectAbility-ShieldAlly, NodeType=Action) +Behaviors=(BehaviorName=IsAbilityAvailable-AmmoDump_LW, NodeType=Condition) +Behaviors=(BehaviorName=IsAbilityAvailable-ShieldAlly, NodeType=Condition) ++Behaviors=(BehaviorName=TrySpectralArmyIfFlanked, NodeType=Sequence, Child[0]=CheckIfNeedToMove, Child[1]=TrySpectralArmy) +Behaviors=(BehaviorName=TryPostChosenSuperiority, NodeType=Sequence, Child[0]=WasLastAbility-StandardShot, Child[1]=ChosenWarlockLastActionSelector) @@ -1384,7 +1405,7 @@ MAX_SURPRISED_SCAMPER_PATH_LENGTH=7 ; Scamper paths longer than this number of -Behaviors=(BehaviorName="ChosenAssassin::ChosenEngaged", NodeType=Selector, Child[0]=PostBendingReedSkip, Child[1]=StealthAssassinBranch, Child[2]=VisibleAssassinBranch, Child[3]=TryShootOrReload, Child[4]=TryOverwatch, Child[5]=SkipMove) -Behaviors=(BehaviorName=TryVanishingWind, NodeType=Sequence, Child[0]=IsAbilityAvailable-VanishingWind, Child[1]=TargetsExistForAoE-HarborWaveProfile, Child[2]=SelectAbility-VanishingWind, Child[3]=SSSetAssassinCycle1IfNotSet) -+Behaviors=(BehaviorName=TryVanishingWind, NodeType=Sequence, Child[0]=IsAbilityAvailable-VanishingWind, Child[1]=SelectAbility-VanishingWind) ++Behaviors=(BehaviorName=TryVanishingWind, NodeType=Sequence, Child[0]=NotFlanked, Child[1]=IsAbilityAvailable-VanishingWind, Child[2]=SelectAbility-VanishingWind) -Behaviors=(BehaviorName=TryPartingSilk, NodeType=Sequence, Child[0]=IsAbilityAvailable-PartingSilk, Child[1]=ChosenSafeToMove, Child[2]=FindPartingSilkTarget, Child[3]=SelectAbility-PartingSilk, Child[4]=DisableExtractThisTurn) +Behaviors=(BehaviorName=TryPartingSilk, NodeType=Sequence, Child[0]=IsAbilityAvailable-PartingSilk, Child[1]=FindPartingSilkTarget, Child[2]=SelectAbility-PartingSilk) @@ -1510,35 +1531,36 @@ MAX_SURPRISED_SCAMPER_PATH_LENGTH=7 ; Scamper paths longer than this number of +Behaviors=(BehaviorName="ChosenSniper::ChosenEngaged", NodeType=Selector, Child[0]=TryLWChosenkidnap, Child[1]=ChosenSniperFirstAction, Child[2]=ChosenSniperLastAction) +Behaviors=(BehaviorName="ChosenSniperFirstActionSelector", NodeType=Selector, \\ - Child[0]=TryGrenade,\\ - Child[1]=ShootWhenKillShot_Pistol,\\ + Child[0]=TryTrackingShotMark,\\ + Child[1]=TryGrenade,\\ Child[2]=TryLightningHands, \\ - Child[3]=TryFanFire, \\ - Child[4]=ShootWhenFlanking_Pistol, \\ - Child[5]=TryGrappleForOffense,\\ - Child[6]=DoIfFlankedFallback, \\ - Child[7]=TakePriorityshotsChosen_Pistol, \\ - Child[8]=TakePriorityshotsChosen, \\ - Child[9]=MoveChosenStayBack, \\ - Child[10]=TryFaceoff, \\ + Child[3]=ShootWhenFlanking_Pistol, \\ + Child[4]=TryGrappleForOffense,\\ + Child[5]=DoIfFlankedFallback, \\ + Child[6]=TryTrackingShot,\\ + Child[7]=TryFaceoff, \\ + Child[8]=TakePriorityshotsChosen_Pistol, \\ + Child[9]=TakePriorityshotsChosen, \\ + Child[10]=MoveChosenStayBack, \\ Child[11]=TryShootOrReloadOrOverwatch,\\ Child[12]=HuntEnemyWithCover, \\ Child[13]=TryCombatReadiness) +Behaviors=(BehaviorName="ChosenSniperLastActionSelector", NodeType=Selector, \\ - Child[0]=TryGrenade,\\ - Child[1]=TryLightningHands, \\ - Child[2]=TryFanFire, \\ - Child[3]=TryGrappleForOffense,\\ - Child[4]=TryFaceoff, \\ - Child[5]=TakePriorityshotsChosen, \\ - Child[6]=ShootWhenKillShot_Pistol, \\ - Child[7]=ShootWhenFlanking_Pistol, \\ - Child[8]=DoIfFlankedFallback, \\ - Child[9]=TryShootOrReloadOrOverwatch,\\ - Child[10]=MoveChosenStayBack, \\ - Child[11]=HuntEnemyWithCover, \\ - Child[12]=TryCombatReadiness) + Child[0]=TryTrackingShotMark,\\ + Child[1]=TryGrenade,\\ + Child[2]=TryTrackingShot,\\ + Child[3]=TryLightningHands, \\ + Child[4]=TryFanFire, \\ + Child[5]=TryGrappleForOffense,\\ + Child[6]=TakePriorityshotsChosen, \\ + Child[7]=ShootWhenKillShot_Pistol, \\ + Child[8]=ShootWhenFlanking_Pistol, \\ + Child[9]=DoIfFlankedFallback, \\ + Child[10]=TryShootOrReloadOrOverwatch,\\ + Child[11]=MoveChosenStayBack, \\ + Child[12]=HuntEnemyWithCover, \\ + Child[13]=TryCombatReadiness) +Behaviors=(BehaviorName=HunterReaction, NodeType=Selector, Child[0]=DoIfFlankedPrimeFallback, Child[1]=NeedsReload, Child[2]=TryCombatReadinessIfMobDebuffed, Child[3]=TryTriggerDamagedTeleportIfFlanked, Child[4]=TryCombatReadiness) @@ -1675,7 +1697,8 @@ MAX_SURPRISED_SCAMPER_PATH_LENGTH=7 ; Scamper paths longer than this number of +Behaviors=(BehaviorName=DoIfFlankedPrimeFallback, NodeType=Sequence, Child[0]=CheckIfNeedToMove, Child[1]=PrimeFallBackUnsafe) +Behaviors=(BehaviorName=PrimeFallBackUnsafe, NodeType=Sequence, Child[0]=IsAbilityAvailable-StandardMove, Child[1]=ResetDestinationSearch, Child[2]=IgnoreHazards, Child[3]=FindBestPrimeFallbackDestination, Child[4]=SelectAbility-StandardMove) -+Behaviors=(BehaviorName=FindBestPrimeFallbackDestination, NodeType=Selector, Child[0]=FindDestination-ChosenPrimeFallback, Child[1]=FindDestination-MWP_FallBack, Child[2]=FindDestination-MWP_Defensive) +; Added RandomCover and Fanatic movement profiles so the AI hopefully has a position to go. ++Behaviors=(BehaviorName=FindBestPrimeFallbackDestination, NodeType=Selector, Child[0]=FindDestination-ChosenPrimeFallback, Child[1]=FindDestinationWithLoS-MWP_Defensive, Child[2]=FindDestinationWithLoS-MWP_FallBack, Child[3]=FindDestination-MWP_FallBack, Child[4]=FindDestination-MWP_Defensive, Child[5]=FindDestination-MWP_RandomCover, Child[6]=FindDestination-MWP_Fanatic) +Behaviors=(BehaviorName=FindDestination-ChosenPrimeFallback, NodeType=Action) ; Allow ChosenSafeToMove to recognize new overwatch counter strengths diff --git a/LongWarOfTheChosen/Config/XComAIJobs.ini b/LongWarOfTheChosen/Config/XComAIJobs.ini index 40adb3d06..35a219af1 100644 --- a/LongWarOfTheChosen/Config/XComAIJobs.ini +++ b/LongWarOfTheChosen/Config/XComAIJobs.ini @@ -45,6 +45,7 @@ +MissionJobs=(MissionType=SupplyRaidTrain_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) +MissionJobs=(MissionType=SupplyRaidConvoy_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) +MissionJobs=(MissionType=TroopManeuvers_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) ++MissionJobs=(MissionType=CovertOpsTroopManeuvers_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) +MissionJobs=(MissionType=Rendezvous_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) +MissionJobs=(MissionType=SupplyConvoy_LW, Job[0]=Leader, Job[1]=Support, Job[2]=Scout, Job[3]=Artillery, Job[4]=Nerfer, Job[5]=Aggressor, Job[6]=Flanker, Job[7]=Soldier, Job[8]=Soldier, Job[9]=Scout, Job[10]=Artillery, Job[11]=Nerfer, Job[12]=Aggressor, Job[13]=Flanker, Job[14]=Soldier, Job[15]=Soldier, Job[16]=Scout, Job[17]=Artillery, Job[18]=Nerfer, Job[19]=Aggressor, Job[20]=Flanker, Job[21]=Soldier, Job[22]=Soldier, Job[23]=Soldier) diff --git a/LongWarOfTheChosen/Config/XComAcademyUnlocks.ini b/LongWarOfTheChosen/Config/XComAcademyUnlocks.ini index 6e37cb543..41266fada 100644 --- a/LongWarOfTheChosen/Config/XComAcademyUnlocks.ini +++ b/LongWarOfTheChosen/Config/XComAcademyUnlocks.ini @@ -1,4 +1,4 @@ -; Config file for the changed Parkour GTS ability -[LW_FactionBalance.X2StrategyElement_AcademyUnlocks_GrappleParkour] -PARKOUR_RANK=5 ; Rank of Skirmisher required to buy the perk, 1 is Squaddie, 5 is Captain, 7 is Colonel, etc +; Config file for the changed Parkour GTS ability +[LW_FactionBalance.X2StrategyElement_AcademyUnlocks_GrappleParkour] +PARKOUR_RANK=5 ; Rank of Skirmisher required to buy the perk, 1 is Squaddie, 5 is Captain, 7 is Colonel, etc PARKOUR_COST=75 ; Amount of Supplies required to buy the perk \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComCamera.ini b/LongWarOfTheChosen/Config/XComCamera.ini index ed3f3e3f1..d0121609a 100644 --- a/LongWarOfTheChosen/Config/XComCamera.ini +++ b/LongWarOfTheChosen/Config/XComCamera.ini @@ -1,3 +1,10 @@ +[XComGame.X2Camera_Cinescript] ++AbilityCameras=(AbilityCameraType="IRI_SoulShot", \\ + ShooterTeam=CinescriptShooterTeam_XCom, ExtraAbilityEndDelay=0, \\ + CameraCuts[0]=(CutAnimNotify="CameraStart", NewCameraType=CinescriptCameraType_Matinee, MatineeCommentPrefix="CIN_Quick_Wide"), \\ + CameraCuts[1]=(CutAnimNotify="CameraEnd", NewCameraType=CinescriptCameraType_Exit), \\ + CameraCuts[2]=(CutAfterPrevious=True, NewCameraType=CinescriptCameraType_Exit)) + [XComGame.X2Action_ApplyWeaponDamageToTerrain] CameraShakeIntensity_Large=0.00 diff --git a/LongWarOfTheChosen/Config/XComClassData.ini b/LongWarOfTheChosen/Config/XComClassData.ini index cc4374b2a..8f7dad96b 100644 --- a/LongWarOfTheChosen/Config/XComClassData.ini +++ b/LongWarOfTheChosen/Config/XComClassData.ini @@ -43,7 +43,7 @@ NumInDeck=0 [LWS_Technical X2SoldierClassTemplate] +bMultiplayerOnly=0 +ClassPoints=3 -+IconImage="img:///UILibrary_LW_Overhaul.class_Technical" ++IconImage="img:///UILibrary_LWOTC.class_Technical" +NumInForcedDeck=1 +NumInDeck=4 +bCanHaveBonds=true @@ -139,20 +139,20 @@ NumInDeck=0 ) ; CPL -+SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="BiggestBooms_LW" )), \\ ++SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="ConcussionRocket", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="Fortify" )), \\ (AbilityType=(AbilityName="NapalmX", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0)) \\ ) ; SGT -+SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="ConcussionRocket", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ ++SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="BiggestBooms_LW" )), \\ (AbilityType=(AbilityName="Shredder", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Burnout", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_HP,StatAmount=1))\\ ) @@ -300,7 +300,7 @@ NumInDeck=0 (AbilityType=(AbilityName="CoveringFire", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Interference", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_Hacking,StatAmount=5))\\ ) @@ -309,7 +309,7 @@ NumInDeck=0 (AbilityType=(AbilityName="ScanningProtocol", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="Trojan", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_Hacking,StatAmount=5))\\ ) @@ -454,7 +454,7 @@ NumInDeck=0 (AbilityType=(AbilityName="CenterMass", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Protector" )),\\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0)) \\ ) @@ -463,7 +463,7 @@ NumInDeck=0 (AbilityType=(AbilityName="Formidable" )), \\ (AbilityType=(AbilityName="BluescreenBombs", ApplyToWeaponSlot=eInvSlot_Unknown)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Strength,StatAmount=1)) \\ ) @@ -529,7 +529,7 @@ NumInDeck=0 (AbilityName="Flashbanger"), \\ (AbilityName="SmokeGrenade"), \\ (AbilityName="Salvo", ApplyToWeaponSlot=eInvSlot_Unknown), \\ - (AbilityName="WeaponHandling_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="DedicatedSuppression_LW"), \\ (AbilityName="DeepCover", ApplyToWeaponSlot=eInvSlot_Unknown), \\ (AbilityName="SteadyHands", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="DamnGoodGround", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ @@ -609,7 +609,7 @@ NumInDeck=0 (AbilityType=(AbilityName="Formidable" )), \\ (AbilityType=(AbilityName="Lockdown", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0)) \\ ) @@ -618,7 +618,7 @@ NumInDeck=0 (AbilityType=(AbilityName="Shredder", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Mayhem", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_Strength,StatAmount=1)) \\ ) @@ -724,7 +724,7 @@ NumInDeck=0 (AbilityName="Tradecraft", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="LightningReflexes_LW"), \\ (AbilityName="Predator_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ - (AbilityName="ScrapMetal_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="TacticalSense" ), \\ (AbilityName="Evasive"), \\ (AbilityName="Ruthless_LW", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon), \\ (AbilityName="Shredder", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ @@ -766,7 +766,7 @@ NumInDeck=0 (AbilityType=(AbilityName="PumpAction", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="CoveringFire", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_Will,StatAmount=0))\\ ) @@ -775,7 +775,7 @@ NumInDeck=0 (AbilityType=(AbilityName="CenterMass", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="CoolUnderPressure", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0))\\ ) @@ -799,7 +799,7 @@ NumInDeck=0 ) ; GSGT +SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="RapidFire", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ - (AbilityType=(AbilityName="TacticalSense" )), \\ + (AbilityType=(AbilityName="ScrapMetal_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="RapidReaction", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier3_XComAbilities"), \\ (AbilityType=(AbilityName="Faceoff", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ @@ -842,7 +842,7 @@ NumInDeck=0 (AbilityName="Flashbanger"), \\ (AbilityName="SmokeGrenade"), \\ (AbilityName="Salvo", ApplyToWeaponSlot=eInvSlot_Unknown), \\ - (AbilityName="Resilience", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="LongWatch", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="DeepCover"), \\ (AbilityName="SurvivalInstinct_LW"), \\ (AbilityName="HardTarget"), \\ @@ -859,7 +859,6 @@ NumInDeck=0 +RandomAbilityDecks=(DeckName="Tier2_XComAbilities", \\ Abilities=((AbilityName="RapidDeployment"), \\ - (AbilityName="WeaponHandling_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="TacticalSense"), \\ (AbilityName="LeadTheTarget_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="Shadowstrike_LW", ApplyToWeaponSlot=eInvSlot_Unknown), \\ @@ -870,8 +869,9 @@ NumInDeck=0 (AbilityName="CoolUnderPressure", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="CombatEngineer", ApplyToWeaponSlot=eInvSlot_Unknown), \\ (AbilityName="Concentration_LW"), \\ - (AbilityName="Reposition_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ - (AbilityName="Untouchable", ApplyToWeaponSlot=eInvSlot_Unknown) \\ + (AbilityName="Impulse_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="Untouchable", ApplyToWeaponSlot=eInvSlot_Unknown), \\ + (AbilityName="Resilience", ApplyToWeaponSlot=eInvSlot_Unknown) \\ )) +RandomAbilityDecks=(DeckName="Tier3_XComAbilities", \\ @@ -920,7 +920,7 @@ NumInDeck=0 (AbilityType=(AbilityName="Phantom", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="CenterMass", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_Will,StatAmount=0)) \\ ) @@ -929,14 +929,14 @@ NumInDeck=0 (AbilityType=(AbilityName="HDHolo", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="LoneWolf", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_HP,StatAmount=1)) \\ ) ; SSGT -+SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="LongWatch", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ ++SoldierRanks=( AbilitySlots=( (AbilityType=(AbilityName="LowProfile", )), \\ (AbilityType=(AbilityName="IndependentTracking", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ - (AbilityType=(AbilityName="LowProfile" )), \\ + (AbilityType=(AbilityName="Reposition_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ (AbilityType=(AbilityName="LightningHands", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ @@ -1075,7 +1075,7 @@ NumInDeck=0 (AbilityType=(AbilityName="EMPulser", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="CloseandPersonal", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0)) \\ ) @@ -1084,7 +1084,7 @@ NumInDeck=0 (AbilityType=(AbilityName="StunGunner", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="Fortify" )), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Strength,StatAmount=1)) \\ ) @@ -1231,7 +1231,7 @@ NumInDeck=0 (AbilityType=(AbilityName="Executioner_LW", ApplyToWeaponSlot=eInvSlot_Unknown)), \\ (AbilityType=(AbilityName="Combatives", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier1_XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_Dodge,StatAmount=1), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Hacking,StatAmount=5)) \\ ) @@ -1240,7 +1240,7 @@ NumInDeck=0 (AbilityType=(AbilityName="HardTarget" )), \\ (AbilityType=(AbilityName="Cutthroat", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (RandomDeckName="Tier2_XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol)) \\ ), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=0), (StatType=eStat_Dodge,StatAmount=1), (StatType=eStat_Strength,StatAmount=1), (StatType=eStat_Hacking,StatAmount=5)) \\ ) @@ -1609,7 +1609,7 @@ bHasClassMovie=true (AbilityType=(AbilityName="SkirmisherVengeance")), \\ (AbilityType=(AbilityName="PackMaster_LW", ApplyToWeaponSlot=eInvSlot_Unknown)), \\ (RandomDeckName="SkirmisherTier1XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Will,StatAmount=2))) ; SGT @@ -1617,7 +1617,7 @@ bHasClassMovie=true (AbilityType=(AbilityName="Implacable")), \\ (AbilityType=(AbilityName="ChainShot", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="SkirmisherTier2XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_Strength,StatAmount=1))) ; SSGT @@ -1675,6 +1675,7 @@ bHasClassMovie=true (AbilityName="FieldMedic", ApplyToWeaponSlot=eInvSlot_Unknown), \\ (AbilityName="Dedication_LW", ApplyToWeaponSlot=eInvSlot_Unknown) \\ )) + +RandomAbilityDecks=(DeckName="ReaperTier2XComAbilities", \\ Abilities=((AbilityName="LingeringShadow"), \\ (AbilityName="Needle", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ @@ -1692,6 +1693,7 @@ bHasClassMovie=true (AbilityName="HardTarget"), \\ (AbilityName="TrenchWarfare_LW", ApplyToWeaponSlot=eInvSlot_Unknown) \\ )) + +RandomAbilityDecks=(DeckName="ReaperTier3XComAbilities", \\ Abilities=((AbilityName="CenterMass", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="ReadyForAnything", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ @@ -1715,7 +1717,8 @@ bHasClassMovie=true (AbilityName="BulletShred", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="ApexPredator_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="RunAndGun_LW"), \\ - (AbilityName="Lethal", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon) \\ + (AbilityName="Lethal", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ + (AbilityName="DeathFromAbove", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon) \\ )) !SoldierRanks=() ; squaddie @@ -1737,7 +1740,7 @@ bHasClassMovie=true (AbilityType=(AbilityName="CripplingStrike", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ (AbilityType=(AbilityName="Paramedic_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="ReaperTier1XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=3), (StatType=eStat_Hacking,StatAmount=5))) ; SGT @@ -1745,7 +1748,7 @@ bHasClassMovie=true (AbilityType=(AbilityName="SilentKiller", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="GhostGrenade", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="ReaperTier2XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Strength,StatAmount=1))) ; SSGT @@ -1773,7 +1776,7 @@ bHasClassMovie=true aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Hacking,StatAmount=5))) ; MSGT -+SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="DeathFromAbove", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="TheBanisher_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="RendTheMarked", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="HomingMine", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="ReaperTier4XComAbilities"), \\ @@ -1783,11 +1786,17 @@ bHasClassMovie=true [Templar X2SoldierClassTemplate] +;NOTE ON TEMPLAR SHIELDS: If you want shields still, obtain your own class perk trees from older builds or from a rework such as Kiruka's. Then make the below changes noted as well + +;change the below to false if you want to use shields: +bNoSecondaryWeapon=true -AllowedWeapons=(SlotType=eInvSlot_SecondaryWeapon, WeaponType="sidearm") -+AllowedWeapons=(SlotType=eInvSlot_SecondaryWeapon, WeaponType="templarshield") +;If you want Templar Shields back, uncomment the below line: +;+AllowedWeapons=(SlotType=eInvSlot_SecondaryWeapon, WeaponType="templarshield") !RandomAbilityDecks=() + +RandomAbilityDecks=(DeckName="TemplarTier1XComAbilities", \\ Abilities=((AbilityName="Salvo"), \\ (AbilityName="Flashbanger"), \\ @@ -1798,7 +1807,7 @@ bHasClassMovie=true (AbilityName="SmokeGrenade", ApplyToWeaponSlot=eInvSlot_Unknown) \\ )) +RandomAbilityDecks=(DeckName="TemplarTier2XComAbilities", \\ - Abilities=((AbilityName="CombatEngineer"), \\ + Abilities=((AbilityName="Blademaster", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon), \\ (AbilityName="RapidDeployment"), \\ (AbilityName="FullKit"), \\ (AbilityName="LoneWolf"), \\ @@ -1833,36 +1842,39 @@ bHasClassMovie=true (AbilityName="LightningReflexes_LW", ApplyToWeaponSlot=eInvSlot_Unknown), \\ (AbilityName="LightningSlash_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon) \\ )) + + !SoldierRanks=() ; squaddie -+SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="Rend", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ ++SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="Rend_LW", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Volt", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ + (AbilityType=(AbilityName="IRI_TemplarShield", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="TemplarFocus", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Momentum"))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=0), (StatType=eStat_Strength,StatAmount=1), (StatType=eStat_PsiOffense,StatAmount=0), (StatType=eStat_CombatSims,StatAmount=1), (StatType=eStat_Will,StatAmount=5))) ; LCPL +SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="TemplarInvert")), \\ - (AbilityType=(AbilityName="Amplify")), \\ + (AbilityType=(AbilityName="Amplify", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Indomitable")), \\ (RandomDeckName="TemplarTier1XComAbilities"), \\ (AbilityType=(AbilityName="Magnum_LW", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ - aStatProgression=((StatType=eStat_Offense,StatAmount=1), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Will,StatAmount=5))) + aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Will,StatAmount=5))) ; CPL +SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="StunStrike")), \\ - (AbilityType=(AbilityName="ShieldBash_LW", ApplyToWeaponSlot=eInvSlot_SecondaryWeapon)), \\ + (AbilityType=(AbilityName="IRI_SoulShot", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="Brawler", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (RandomDeckName="TemplarTier1XComAbilities"), \\ - (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ - aStatProgression=((StatType=eStat_Offense,StatAmount=1))) + (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + aStatProgression=((StatType=eStat_Offense,StatAmount=2))) ; SGT +SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="Pillar", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ (AbilityType=(AbilityName="OverCharge_LW" )), \\ (AbilityType=(AbilityName="Sustain")), \\ (RandomDeckName="TemplarTier2XComAbilities"), \\ - (AbilityType=(AbilityName="ClutchShot", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ + (AbilityType=(AbilityName="Quickdraw", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ aStatProgression=((StatType=eStat_Offense,StatAmount=2), (StatType=eStat_HP,StatAmount=1), (StatType=eStat_Strength,StatAmount=1))) ; SSGT @@ -1875,7 +1887,7 @@ bHasClassMovie=true ; TSGT +SoldierRanks=(AbilitySlots=((AbilityType=(AbilityName="DoubleRendFocus", ApplyToWeaponSlot=eInvSlot_PrimaryWeapon)), \\ - (AbilityType=(AbilityName="ArcWavePassive")), \\ + (AbilityType=(AbilityName="ArcWavePassive_LW")), \\ (AbilityType=(AbilityName="CrusaderRage_LW")), \\ (RandomDeckName="TemplarTier3XComAbilities"), \\ (AbilityType=(AbilityName="Gunslinger", ApplyToWeaponSlot=eInvSlot_Pistol))), \\ diff --git a/LongWarOfTheChosen/Config/XComContent.ini b/LongWarOfTheChosen/Config/XComContent.ini index 70c00b7e9..825693c37 100644 --- a/LongWarOfTheChosen/Config/XComContent.ini +++ b/LongWarOfTheChosen/Config/XComContent.ini @@ -4,9 +4,18 @@ [Content.MapContent] .Map=CIN_Loading_Infiltration_CityCenter +.Package=UICollection_Dropship + .Map=CIN_Loading_Infiltration_SmallTown -+Package=UICollection_Dropship -+Package=LWSmashNGrab +.Package=UICollection_Dropship + +.Map=$ALL +.Package=UILibrary_Refs +.Package=UILibrary_SMG +.Package=UILibrary_LW_AlienPack +.Package=UILibrary_LW_Coilguns +.Package=UILibrary_LW_LaserPack +.Package=UILibrary_LWOTC [XComGame.X2BodyPartTemplateManager] ;; HAX fix for bad config in base-game diff --git a/LongWarOfTheChosen/Config/XComEncounterLists.ini b/LongWarOfTheChosen/Config/XComEncounterLists.ini index f193c15b1..744c9bcb9 100644 --- a/LongWarOfTheChosen/Config/XComEncounterLists.ini +++ b/LongWarOfTheChosen/Config/XComEncounterLists.ini @@ -1178,11 +1178,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="AdventFollowers_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1192,11 +1189,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="NoTerror_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1206,11 +1200,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="AdventRNFCandidates_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1220,11 +1211,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1234,11 +1222,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="NoBosses", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1248,11 +1233,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="AlienFollowers_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1262,11 +1244,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) +SpawnDistributionLists=(ListID="Open", \\ SpawnDistribution[0]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=2, SpawnWeight=1), \\ @@ -1276,11 +1255,8 @@ SpawnDistribution[4]=(Template="AdvMECArcherM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[5]=(Template="AdvMECArcherM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[6]=(Template="AdvMECArcherM1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4), \\ - SpawnDistribution[8]=(Template="AdvMECArcherM1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[9]=(Template="AdvMECArcherM1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvMECArcherM1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[11]=(Template="AdvMECArcherM1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=2)) + SpawnDistribution[7]=(Template="AdvMECArcherM1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=4) \\ + ) ;-------------------------- ; AdvMECArcherM2 @@ -1391,21 +1367,21 @@ ; AdvMEC_M1 ; +SpawnDistributionLists=(ListID="DefaultLeaders_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[4]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="AdventLeaders_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[4]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="DefaultFollowers_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1416,14 +1392,10 @@ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + ) +SpawnDistributionLists=(ListID="AdventFollowers_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1433,12 +1405,8 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) +SpawnDistributionLists=(ListID="AlienFollowers_LW", \\ SpawnDistribution[0]=(Template="AdvMECArcherM2", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=2), \\ @@ -1451,7 +1419,7 @@ SpawnDistribution[7]=(Template="AdvMECArcherM2", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=6)) +SpawnDistributionLists=(ListID="NoTerror_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1461,15 +1429,11 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) +SpawnDistributionLists=(ListID="AdventRNFCandidates_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1479,15 +1443,11 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1497,15 +1457,11 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) +SpawnDistributionLists=(ListID="NoBosses", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1515,15 +1471,11 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) +SpawnDistributionLists=(ListID="Open", \\ - SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[0]=(Template="AdvMEC_M1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=1, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="AdvMEC_M1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[2]=(Template="AdvMEC_M1", MinForceLevel=7, MaxForceLevel=7, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvMEC_M1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=2, SpawnWeight=4), \\ @@ -1533,12 +1485,8 @@ SpawnDistribution[7]=(Template="AdvMEC_M1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[8]=(Template="AdvMEC_M1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[9]=(Template="AdvMEC_M1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[11]=(Template="AdvMEC_M1", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[12]=(Template="AdvMEC_M1", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[13]=(Template="AdvMEC_M1", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ - SpawnDistribution[14]=(Template="AdvMEC_M1", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=2), \\ - SpawnDistribution[15]=(Template="AdvMEC_M1", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvMEC_M1", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=2, SpawnWeight=3) \\ + ) ;-------------------------- ; AdvMEC_M2 @@ -3599,7 +3547,7 @@ ; AdvStunLancerM1 ; +SpawnDistributionLists=(ListID="DefaultFollowers_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3613,7 +3561,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="AdventFollowers_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3627,7 +3575,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="NoTerror_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3641,7 +3589,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="AdventRNFCandidates_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3655,7 +3603,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3669,7 +3617,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="NoBosses", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3683,7 +3631,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="Open", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3697,7 +3645,7 @@ SpawnDistribution[11]=(Template="AdvStunLancerM1", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=2, SpawnWeight=1)) +SpawnDistributionLists=(ListID="RendezvousOperatives_LW", \\ - SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[0]=(Template="AdvStunLancerM1", MinForceLevel=3, MaxForceLevel=3, MaxCharactersPerGroup=1, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="AdvStunLancerM1", MinForceLevel=4, MaxForceLevel=4, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="AdvStunLancerM1", MinForceLevel=5, MaxForceLevel=5, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[3]=(Template="AdvStunLancerM1", MinForceLevel=6, MaxForceLevel=6, MaxCharactersPerGroup=2, SpawnWeight=7), \\ @@ -3893,7 +3841,7 @@ SpawnDistribution[5]=(Template="AdvStunLancerM3", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=7)) ;-------------------------- -; AdvTrooperM1 +; M1 ; +SpawnDistributionLists=(ListID="DefaultLeaders_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=1), \\ @@ -3918,9 +3866,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="AdventFollowers_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -3933,9 +3880,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="NoTerror_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -3948,9 +3894,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="AdventRNFCandidates_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -3963,9 +3908,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -3978,9 +3922,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="NoBosses", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -3993,9 +3936,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="Open", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -4008,9 +3950,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) +SpawnDistributionLists=(ListID="RendezvousOperatives_LW", \\ SpawnDistribution[0]=(Template="AdvTrooperM1", MinForceLevel=1, MaxForceLevel=1, MaxCharactersPerGroup=8, SpawnWeight=6), \\ @@ -4023,9 +3964,8 @@ SpawnDistribution[7]=(Template="AdvTrooperM1", MinForceLevel=8, MaxForceLevel=8, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[8]=(Template="AdvTrooperM1", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=4), \\ SpawnDistribution[9]=(Template="AdvTrooperM1", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=2), \\ - SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[11]=(Template="AdvTrooperM1", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=1), \\ - SpawnDistribution[12]=(Template="AdvTrooperM1", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=1)) + SpawnDistribution[10]=(Template="AdvTrooperM1", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=1) \\ + ) ;-------------------------- ; AdvTrooperM2 @@ -4684,6 +4624,7 @@ SpawnDistribution[9]=(Template="Chryssalid", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=8, SpawnWeight=5), \\ SpawnDistribution[10]=(Template="Chryssalid", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=8, SpawnWeight=5), \\ SpawnDistribution[11]=(Template="Chryssalid", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=8, SpawnWeight=5)) + +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ SpawnDistribution[0]=(Template="Chryssalid", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=2), \\ @@ -4699,6 +4640,35 @@ SpawnDistribution[10]=(Template="Chryssalid", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=8, SpawnWeight=6), \\ SpawnDistribution[11]=(Template="Chryssalid", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=8, SpawnWeight=6)) ++SpawnDistributionLists=(ListID="DefaultFollowers_LW", \\ + SpawnDistribution[0]=(Template="Chryssalid", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=2), \\ + SpawnDistribution[1]=(Template="Chryssalid", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=3), \\ + SpawnDistribution[2]=(Template="Chryssalid", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=4), \\ + SpawnDistribution[3]=(Template="Chryssalid", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=5), \\ + SpawnDistribution[4]=(Template="Chryssalid", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[5]=(Template="Chryssalid", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[6]=(Template="Chryssalid", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[7]=(Template="Chryssalid", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[8]=(Template="Chryssalid", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[9]=(Template="Chryssalid", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[10]=(Template="Chryssalid", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[11]=(Template="Chryssalid", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=8, SpawnWeight=6)) + ++SpawnDistributionLists=(ListID="NoTerror_LW", \\ + SpawnDistribution[0]=(Template="Chryssalid", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=2), \\ + SpawnDistribution[1]=(Template="Chryssalid", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=3), \\ + SpawnDistribution[2]=(Template="Chryssalid", MinForceLevel=11, MaxForceLevel=11, MaxCharactersPerGroup=8, SpawnWeight=4), \\ + SpawnDistribution[3]=(Template="Chryssalid", MinForceLevel=12, MaxForceLevel=12, MaxCharactersPerGroup=8, SpawnWeight=5), \\ + SpawnDistribution[4]=(Template="Chryssalid", MinForceLevel=13, MaxForceLevel=13, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[5]=(Template="Chryssalid", MinForceLevel=14, MaxForceLevel=14, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[6]=(Template="Chryssalid", MinForceLevel=15, MaxForceLevel=15, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[7]=(Template="Chryssalid", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[8]=(Template="Chryssalid", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[9]=(Template="Chryssalid", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[10]=(Template="Chryssalid", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=8, SpawnWeight=6), \\ + SpawnDistribution[11]=(Template="Chryssalid", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=8, SpawnWeight=6)) + + +SpawnDistributionLists=(ListID="NoBosses", \\ SpawnDistribution[0]=(Template="Chryssalid", MinForceLevel=9, MaxForceLevel=9, MaxCharactersPerGroup=8, SpawnWeight=2), \\ SpawnDistribution[1]=(Template="Chryssalid", MinForceLevel=10, MaxForceLevel=10, MaxCharactersPerGroup=8, SpawnWeight=3), \\ @@ -4740,12 +4710,27 @@ SpawnDistribution[6]=(Template="ChryssalidSoldier", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=4)) +SpawnDistributionLists=(ListID="NoBossesOrSentries_LW", \\ + SpawnDistribution[0]=(Template="ChryssalidSoldier", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[1]=(Template="ChryssalidSoldier", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[2]=(Template="ChryssalidSoldier", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ + SpawnDistribution[3]=(Template="ChryssalidSoldier", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=4), \\ + SpawnDistribution[4]=(Template="ChryssalidSoldier", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=5))\ + ++SpawnDistributionLists=(ListID="DefaultFollowers_LW", \\ SpawnDistribution[0]=(Template="ChryssalidSoldier", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="ChryssalidSoldier", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=2), \\ SpawnDistribution[2]=(Template="ChryssalidSoldier", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ SpawnDistribution[3]=(Template="ChryssalidSoldier", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=4), \\ SpawnDistribution[4]=(Template="ChryssalidSoldier", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=5)) ++SpawnDistributionLists=(ListID="NoTerror_LW", \\ + SpawnDistribution[0]=(Template="ChryssalidSoldier", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=1), \\ + SpawnDistribution[1]=(Template="ChryssalidSoldier", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=2), \\ + SpawnDistribution[2]=(Template="ChryssalidSoldier", MinForceLevel=18, MaxForceLevel=18, MaxCharactersPerGroup=2, SpawnWeight=3), \\ + SpawnDistribution[3]=(Template="ChryssalidSoldier", MinForceLevel=19, MaxForceLevel=19, MaxCharactersPerGroup=2, SpawnWeight=4), \\ + SpawnDistribution[4]=(Template="ChryssalidSoldier", MinForceLevel=20, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=5)) + + +SpawnDistributionLists=(ListID="NoBosses", \\ SpawnDistribution[0]=(Template="ChryssalidSoldier", MinForceLevel=16, MaxForceLevel=16, MaxCharactersPerGroup=2, SpawnWeight=1), \\ SpawnDistribution[1]=(Template="ChryssalidSoldier", MinForceLevel=17, MaxForceLevel=17, MaxCharactersPerGroup=2, SpawnWeight=2), \\ @@ -6902,6 +6887,30 @@ SpawnDistribution[67]=(Template="Faceless", MinForceLevel=7, MaxForceLevel=20, MaxCharactersPerGroup=2, SpawnWeight=20)) +;-------------------------- +; Sitreps: + ++SpawnDistributionLists=(ListID="PsionicLeaders", \\ + SpawnDistribution[0]=(Template="SectoidM2_LW", MinForceLevel=12, MaxForceLevel=99, MaxCharactersPerGroup=1, SpawnWeight=100), \\ + ) + ++SpawnDistributionLists=(ListID="PsionicFollowers", \\ + SpawnDistribution[0]=(Template="SectoidM2_LW", MinForceLevel=12, MaxForceLevel=99, MaxCharactersPerGroup=1, SpawnWeight=100), \\ + ) + ++SpawnDistributionLists=(ListID="AutomatedDefensesLeaders", \\ + SpawnDistribution[0]=(Template="AdvMEC_M3_LW", MinForceLevel=16, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + SpawnDistribution[1]=(Template="AdvMECArcherM1", MinForceLevel=9, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + SpawnDistribution[2]=(Template="AdvMECArcherM2", MinForceLevel=13, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + ) + ++SpawnDistributionLists=(ListID="AutomatedDefensesFollowers", \\ + SpawnDistribution[0]=(Template="AdvMEC_M3_LW", MinForceLevel=19, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + SpawnDistribution[1]=(Template="AdvMECArcherM1", MinForceLevel=10, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + SpawnDistribution[2]=(Template="AdvMECArcherM2", MinForceLevel=14, MaxForceLevel=99, MaxCharactersPerGroup=2, SpawnWeight=240), \\ + ) + + ;-------------------------- ; Normal Lost ; diff --git a/LongWarOfTheChosen/Config/XComEncounters.ini b/LongWarOfTheChosen/Config/XComEncounters.ini index e2e9ffe17..5788cb07a 100644 --- a/LongWarOfTheChosen/Config/XComEncounters.ini +++ b/LongWarOfTheChosen/Config/XComEncounters.ini @@ -280,6 +280,42 @@ ForceSpawnTemplateNames[2]="AdvGrenadierM3", \\ ForceSpawnTemplateNames[3]="AdvSentryM3") ++ConfigurableEncounters=(EncounterID="ADVx4_Weak_NoLancerteam_LW", \\ + MaxSpawnCount=4, \\ + MinRequiredForceLevel=1, \\ + MaxRequiredForceLevel=2, \\ + ForceSpawnTemplateNames[0]="AdvTrooperM1", \\ + ForceSpawnTemplateNames[1]="AdvGunnerM1", \\ + ForceSpawnTemplateNames[2]="AdvGrenadierM1", \\ + ForceSpawnTemplateNames[3]="AdvSentryM1") + ++ConfigurableEncounters=(EncounterID="ADVx4_Weak_Lancerteam_LW", \\ + MaxSpawnCount=4, \\ + MinRequiredForceLevel=3, \\ + MaxRequiredForceLevel=7, \\ + ForceSpawnTemplateNames[0]="AdvTrooperM1", \\ + ForceSpawnTemplateNames[1]="AdvGunnerM1", \\ + ForceSpawnTemplateNames[2]="AdvGrenadierM1", \\ + ForceSpawnTemplateNames[3]="AdvStunLancerM1") + ++ConfigurableEncounters=(EncounterID="ADVx4_Standard_Lancerteam_LW", \\ + MaxSpawnCount=4, \\ + MinRequiredForceLevel=8, \\ + MaxRequiredForceLevel=13, \\ + ForceSpawnTemplateNames[0]="AdvSergeantM1", \\ + ForceSpawnTemplateNames[1]="AdvGunnerM2", \\ + ForceSpawnTemplateNames[2]="AdvGrenadierM2", \\ + ForceSpawnTemplateNames[3]="AdvStunLancerM2") + ++ConfigurableEncounters=(EncounterID="ADVx4_Strong_Lancerteam_LW", \\ + MaxSpawnCount=4, \\ + MinRequiredForceLevel=14, \\ + MaxRequiredForceLevel=20, \\ + ForceSpawnTemplateNames[0]="AdvSergeantM2", \\ + ForceSpawnTemplateNames[1]="AdvGunnerM3", \\ + ForceSpawnTemplateNames[2]="AdvGrenadierM3", \\ + ForceSpawnTemplateNames[3]="AdvStunLancerM3") + +ConfigurableEncounters=(EncounterID="ADVx3_Early_RPGTeam_LW", \\ MaxSpawnCount=3, \\ MinRequiredForceLevel=1, \\ @@ -421,7 +457,6 @@ MaxRequiredForceLevel = 17, \\ ForceSpawnTemplateNames[0]="Andromedon", \\ ForceSpawnTemplateNames[1]="Archon", \\ - ForceSpawnTemplateNames[2]="Cyberus", \\ EncounterLeaderSpawnList="AlienLeaders_LW", \\ EncounterFollowerSpawnList="AlienFollowers_LW") @@ -432,7 +467,6 @@ ForceSpawnTemplateNames[0]="Gatekeeper", \\ ForceSpawnTemplateNames[1]="Andromedon", \\ ForceSpawnTemplateNames[2]="Archon", \\ - ForceSpawnTemplateNames[3]="Cyberus", \\ EncounterFollowerSpawnList="AlienFollowers_LW") +ConfigurableEncounters=(EncounterID="Small_Supply_Command_Pod_Early", \\ @@ -672,6 +706,8 @@ ; Forced Boss group +; NOTE: Chryssalids added to NoTerror_LW to allow proper Hive Queen pods. + +ConfigurableEncounters=(EncounterID="LIST_BOSSx2_Standard_LW", \\ MaxSpawnCount=2, \\ MinRequiredForceLevel=16, \\ @@ -779,6 +815,8 @@ ; Boss fill groups if FL is too low to allow boss +; NOTE: Chryssalids added to NoTerror_LW to allow proper Hive Queen pods, so may roll pods of normal chryssalids here now. + +ConfigurableEncounters=(EncounterID="LIST_BOSSx2_FillStandard_LW", \\ MaxSpawnCount=2, \\ MinRequiredForceLevel=1, \\ @@ -1973,6 +2011,13 @@ EncounterIDs[2]=(EncounterID="ADVx8_Late_Squad_LW") \\ ) ++EncounterBuckets=(EncounterBucketID="ADVENTLancerteamBucket_LW", \\ + EncounterIDs[0]=(EncounterID="ADVx4_Weak_NoLancerteam_LW"), \\ + EncounterIDs[1]=(EncounterID="ADVx4_Weak_Lancerteam_LW"), \\ + EncounterIDs[2]=(EncounterID="ADVx4_Standard_Lancerteam_LW"), \\ + EncounterIDs[3]=(EncounterID="ADVx4_Strong_Lancerteam_LW") \\ + ) + +EncounterBuckets=(EncounterBucketID="MutonBucket_LW", \\ EncounterIDs[0]=(EncounterID="Muton_Warband_Too_Early"), \\ EncounterIDs[1]=(EncounterID="Muton_Warband_Early_PROTECTED"), \\ @@ -2225,3 +2270,24 @@ ExcludeTacticalTag="Ruler_ArchonKingDead"), \\ EncounterIDs[3]=(EncounterID="OPNx4_Standard_LW") \\ ) + +; level 5 chosen encounters + ++ConfigurableEncounters=(EncounterID="CHOSENx1_AssassinM5", \\ + MaxSpawnCount=1, \\ + bDisableSpawn=true, \\ + ReinforcementCountdown=0, \\ + ForceSpawnTemplateNames[0]="ChosenAssassinM5") + ++ConfigurableEncounters=(EncounterID="CHOSENx1_WarlockM5", \\ + MaxSpawnCount=1, \\ + bDisableSpawn=true, \\ + ReinforcementCountdown=0, \\ + ForceSpawnTemplateNames[0]="ChosenWarlockM5") + ++ConfigurableEncounters=(EncounterID="CHOSENx1_SniperM5", \\ + MaxSpawnCount=1, \\ + bDisableSpawn=true, \\ + ReinforcementCountdown=0, \\ + ForceSpawnTemplateNames[0]="ChosenSniperM5") + \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComEngine.ini b/LongWarOfTheChosen/Config/XComEngine.ini index efabb506c..a8fdb03ea 100644 --- a/LongWarOfTheChosen/Config/XComEngine.ini +++ b/LongWarOfTheChosen/Config/XComEngine.ini @@ -60,6 +60,7 @@ bDisablePhysXHardwareSupport=true +ModClassOverrides=(BaseGameClass="UIStrategyMapItem_AlienNetworkComponent", ModClass="LW_Overhaul.UIStrategyMapItem_AlienNetworkComponent_LW") +ModClassOverrides=(BaseGameClass="UIAdventOperations", ModClass="LW_Overhaul.UIAdventOperations_LW") +ModClassOverrides=(BaseGameClass="UIMission_ChosenAmbush", ModClass="LW_Overhaul.UIMission_ChosenAmbush_LW") ++ModClassOverrides=(BaseGameClass="XGAIBehavior_Civilian", ModClass="LW_Overhaul.XGAIBehavior_Civilian_LW") ;+UIDynamicClassOverrides=(BaseGameClass="UIPersonnel_SoldierListItem", ModClass="LW_Toolbox_Integrated.UIPersonnel_SoldierListItem_LW") ; Perfect Information for LW2 diff --git a/LongWarOfTheChosen/Config/XComGame.ini b/LongWarOfTheChosen/Config/XComGame.ini index 2ef385d0e..dd4f8c4e9 100644 --- a/LongWarOfTheChosen/Config/XComGame.ini +++ b/LongWarOfTheChosen/Config/XComGame.ini @@ -34,6 +34,7 @@ LostTowersPOIForceLevel=5 [XComGame.CHHelpers] PreserveProxyUnitData=true UseTeamSwapFix=true +;bDontUnequipCovertOps=true UseNewPersonnelStatusBehavior=true PlaceEvacZoneAbilityName="PlaceDelayedEvacZone" DisableExtraLOSCheckForSmoke=true @@ -53,6 +54,9 @@ DisableSkipGroupOnScamper=true +ClassesExcludedFromAWCRoll=LWS_Sharpshooter +ClassesExcludedFromAWCRoll=LWS_Shinobi +ClassesExcludedFromAWCRoll=LWS_Assault ++ClassesExcludedFromAWCRoll=Reaper ++ClassesExcludedFromAWCRoll=Skirmisher ++ClassesExcludedFromAWCRoll=Templar +TickOnMindControlRemovalEffects=Stunned @@ -63,6 +67,11 @@ DisableSkipGroupOnScamper=true +AbilityTemplatePerksToLoad=LW_SoulStorm +AbilityTemplatePerksToLoad=XCOMHunterMark_LW +AbilityTemplatePerksToLoad=CloseCombatSpecialistAttack ++AbilityTemplatePerksToLoad=KnifeEncounters ++AbilityTemplatePerksToLoad=KnifeEncountersExtendedRange ++AbilityTemplatePerksToLoad=IRI_SoulShot ++AbilityTemplatePerksToLoad=IRI_TemplarShield ++AbilityTemplatePerksToLoad=Apotheosis +ClassesAllowPsiPCS=PsiOperative @@ -71,12 +80,16 @@ DisableSkipGroupOnScamper=true +GrenadesRequiringUnitsOnTargetedTiles=DenseSmokeGrenade +GrenadesRequiringUnitsOnTargetedTiles=DenseSmokeGrenadeMk2 +bDisableCivilianPreMoveYell = true +bDisableYellRedAlert = true + [BetterSecondWaveSupport.X2DownloadableContentInfo_BetterSecondWaveSupport] +AddSecondWave=(ID="DisableTutorial", DifficultyValue=0) +AddSecondWave=(ID="DisableChosen", DifficultyValue=0) +AddSecondWave=(ID="BabyChosen", DifficultyValue=0) +AddSecondWave=(ID="EnableResistanceOrders", DifficultyValue=0) +AddSecondWave=(ID="AllowSameRankAbilities", DifficultyValue=0) ++AddSecondWave=(ID="HybridDifficulty_LW", DifficultyValue=0) [DisableTutorial SecondWaveOptionObject] CanChangeInCampaign=true @@ -93,6 +106,9 @@ CanChangeInCampaign=true [BabyChosen SecondWaveOptionObject] CanChangeInCampaign=true +[HybridDifficulty_LW SecondWaveOptionObject] +CanChangeInCampaign=false + [robojumperSquadSelect.X2DownloadableContentInfo_robojumperSquadSelect] ; LWOTC should control the squad size @@ -100,7 +116,7 @@ bDontTouchSquadSize=true [LongWarOfTheChosen CHDLCRunOrder] ;+RunBefore="PrimarySecondaries" -;+RunAfter ++RunAfter="EncounterListReplacerWOTC" [LongWarOfTheChosen CHModDependency] DisplayName="Long War of the Chosen" diff --git a/LongWarOfTheChosen/Config/XComGameBoard.ini b/LongWarOfTheChosen/Config/XComGameBoard.ini index da8646fbe..7ed7e985d 100644 --- a/LongWarOfTheChosen/Config/XComGameBoard.ini +++ b/LongWarOfTheChosen/Config/XComGameBoard.ini @@ -745,6 +745,28 @@ MaxActionHours[1]=192 MaxActionHours[2]=216 MaxActionHours[3]=216 +[CovertAction_BigSupplyDepot X2CovertActionTemplate] +MinActionHours[0]=168 +MinActionHours[1]=168 +MinActionHours[2]=192 +MinActionHours[3]=192 + +MaxActionHours[0]=192 +MaxActionHours[1]=192 +MaxActionHours[2]=216 +MaxActionHours[3]=216 + +[CovertAction_FindAdventDetachment X2CovertActionTemplate] +MinActionHours[0]=144 +MinActionHours[1]=144 +MinActionHours[2]=168 +MinActionHours[3]=168 + +MaxActionHours[0]=168 +MaxActionHours[1]=168 +MaxActionHours[2]=192 +MaxActionHours[3]=192 + [CovertAction_CancelChosenActivity X2CovertActionTemplate] MinActionHours[0]=168 MinActionHours[1]=168 @@ -875,3 +897,22 @@ MaxScanIntelReward[3]=4 +CovertActionNarratives="CovertActionNarrative_RecruitRebels_Skirmishers" +CovertActionNarratives="CovertActionNarrative_RecruitRebels_Reapers" +CovertActionNarratives="CovertActionNarrative_RecruitRebels_Templars" ++CovertActionNarratives="CovertActionNarrative_FindBigDepot_Skirmishers" ++CovertActionNarratives="CovertActionNarrative_FindBigDepot_Reapers" ++CovertActionNarratives="CovertActionNarrative_FindBigDepot_Templars" ++CovertActionNarratives="CovertActionNarrative_FindAdventDetachment_Skirmishers" ++CovertActionNarratives="CovertActionNarrative_FindAdventDetachment_Reapers" ++CovertActionNarratives="CovertActionNarrative_FindAdventDetachment_Templars" + + +[CovertActionNarrative_FindAdventDetachment_Skirmishers X2CovertActionNarrativeTemplate] +AssociatedFaction="Faction_Skirmishers" +ActionImage = "img:///UILibrary_XPACK_StrategyImages.CovertOp_Facility_Lead" + +[CovertActionNarrative_FindAdventDetachment_Reapers X2CovertActionNarrativeTemplate] +AssociatedFaction="Faction_Reapers" +ActionImage = "img:///UILibrary_XPACK_StrategyImages.CovertOp_Facility_Lead" + +[CovertActionNarrative_FindAdventDetachment_Templars X2CovertActionNarrativeTemplate] +AssociatedFaction="Faction_Templars" +ActionImage = "img:///UILibrary_XPACK_StrategyImages.CovertOp_Facility_Lead" \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComGameCore.ini b/LongWarOfTheChosen/Config/XComGameCore.ini index e7bbb3d58..d1f5e6c1c 100644 --- a/LongWarOfTheChosen/Config/XComGameCore.ini +++ b/LongWarOfTheChosen/Config/XComGameCore.ini @@ -262,11 +262,59 @@ NUM_STARTING_SOLDIERS=22 -LootTables = ( TableName = "SupplyExtraction_Basic2", Loots[0]=(Chance=100,MinCount=23,MaxCount=30,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=100,MinCount=9,MaxCount=9,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=100,MinCount=4,MaxCount=5,TemplateName="EleriumDust",RollGroup=3) ) -LootTables = ( TableName = "SupplyExtraction_Basic3", Loots[0]=(Chance=100,MinCount=30,MaxCount=40,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=100,MinCount=12,MaxCount=12,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=100,MinCount=6,MaxCount=7,TemplateName="EleriumDust",RollGroup=3) ) -+LootTables = ( TableName = "SupplyExtraction_Basic1", Loots[0]=(Chance=100,MinCount=7,MaxCount=9,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=1,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=50,MinCount=1,MaxCount=1,TemplateName="EleriumDust",RollGroup=3) ) -+LootTables = ( TableName = "SupplyExtraction_Basic2", Loots[0]=(Chance=100,MinCount=8,MaxCount=9,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=60,MinCount=2,MaxCount=2,TemplateName="EleriumDust",RollGroup=3) ) -+LootTables = ( TableName = "SupplyExtraction_Basic3", Loots[0]=(Chance=100,MinCount=8,MaxCount=10,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=60,MinCount=2,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) -+LootTables = ( TableName = "SupplyExtraction_Basic4", Loots[0]=(Chance=100,MinCount=9,MaxCount=10,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=65,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) -+LootTables = ( TableName = "SupplyExtraction_Basic5", Loots[0]=(Chance=100,MinCount=10,MaxCount=11,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) ++LootTables = ( TableName = "SupplyExtraction_Basic1", Loots[0]=(Chance=100,MinCount=6,MaxCount=9,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=1,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=1,MaxCount=1,TemplateName="EleriumDust",RollGroup=3) ) ++LootTables = ( TableName = "SupplyExtraction_Basic2", Loots[0]=(Chance=100,MinCount=7,MaxCount=10,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="EleriumDust",RollGroup=3) ) ++LootTables = ( TableName = "SupplyExtraction_Basic3", Loots[0]=(Chance=100,MinCount=7,MaxCount=11,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=2,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) ++LootTables = ( TableName = "SupplyExtraction_Basic4", Loots[0]=(Chance=100,MinCount=8,MaxCount=11,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=2,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) ++LootTables = ( TableName = "SupplyExtraction_Basic5", Loots[0]=(Chance=100,MinCount=9,MaxCount=12,TemplateName="Supplies",RollGroup=1), Loots[1]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), Loots[2]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3) ) + +; Big Supply Extract Crates + ++LootTables = ( TableName = "SupplyExtraction_BigBasic1", \\ + Loots[0]=(Chance=100,MinCount=5,MaxCount=7,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=70,MinCount=1,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), \\ + Loots[2]=(Chance=70,MinCount=1,MaxCount=1,TemplateName="EleriumDust",RollGroup=3), \\ + Loots[3]=(Chance=25,MinCount=1,MaxCount=1,TableRef="PCSDropsEarly",RollGroup=4), \\ + Loots[4]=(Chance=25,MinCount=1,MaxCount=1,TableRef="MidADVENTWeaponUpgrades",RollGroup=5), \\ + Loots[5]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=5), \\ + Loots[6]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=5)) + ++LootTables = ( TableName = "SupplyExtraction_BigBasic2", \\ + Loots[0]=(Chance=100,MinCount=6,MaxCount=8,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), \\ + Loots[2]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="EleriumDust",RollGroup=3), \\ + Loots[3]=(Chance=20,MinCount=1,MaxCount=1,TableRef="PCSDropsMid",RollGroup=4), \\ + Loots[4]=(Chance=20,MinCount=1,MaxCount=1,TableRef="LateADVENTWeaponUpgrades",RollGroup=5), \\ + Loots[5]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=5), \\ + Loots[6]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=5) ) + ++LootTables = ( TableName = "SupplyExtraction_BigBasic3", \\ + Loots[0]=(Chance=100,MinCount=7,MaxCount=9,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=70,MinCount=2,MaxCount=2,TemplateName="AlienAlloy",RollGroup=2), \\ + Loots[2]=(Chance=70,MinCount=2,MaxCount=3,TemplateName="EleriumDust",RollGroup=3), \\ + Loots[3]=(Chance=25,MinCount=1,MaxCount=1,TableRef="PCSDropsMid",RollGroup=4), \\ + Loots[4]=(Chance=25,MinCount=1,MaxCount=1,TableRef="LateADVENTWeaponUpgrades",RollGroup=5), \\ + Loots[5]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=5), \\ + Loots[6]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=5) ) + ++LootTables = ( TableName = "SupplyExtraction_BigBasic4", \\ + Loots[0]=(Chance=100,MinCount=8,MaxCount=10,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=70,MinCount=2,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), \\ + Loots[2]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3), \\ + Loots[3]=(Chance=30,MinCount=1,MaxCount=1,TableRef="PCSDropsLate",RollGroup=4), \\ + Loots[4]=(Chance=30,MinCount=1,MaxCount=1,TableRef="LateADVENTWeaponUpgrades",RollGroup=5), \\ + Loots[5]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=5), \\ + Loots[6]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=5) ) + ++LootTables = ( TableName = "SupplyExtraction_BigBasic5", \\ + Loots[0]=(Chance=100,MinCount=9,MaxCount=11,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="AlienAlloy",RollGroup=2), \\ + Loots[2]=(Chance=70,MinCount=3,MaxCount=3,TemplateName="EleriumDust",RollGroup=3), \\ + Loots[3]=(Chance=30,MinCount=1,MaxCount=1,TableRef="PCSDropsLate",RollGroup=4), \\ + Loots[4]=(Chance=30,MinCount=1,MaxCount=1,TableRef="LateADVENTWeaponUpgrades",RollGroup=5), \\ + Loots[5]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=5), \\ + Loots[6]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=5) ) + ; This is for the entire mission ; First one is Gatecrasher loot (force level 0) @@ -308,6 +356,8 @@ NUM_STARTING_SOLDIERS=22 -LootTables = ( TableName = "Andromedon_TimedLoot",Loots[0]=(Chance=100,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), Loots[1]=(Chance=50,MinCount=1,MaxCount=1,TableRef="MidAlienWeaponUpgrades",RollGroup=2), Loots[2]=(Chance=50,MinCount=1,MaxCount=1,TableRef="LateAlienWeaponUpgrades",RollGroup=2), Loots[3]=(Chance=25,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=3) ) -LootTables = ( TableName = "Sectopod_TimedLoot", Loots[0]=(Chance=100,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), Loots[1]=(Chance=100,MinCount=1,MaxCount=1,TableRef="LateAlienWeaponUpgrades",RollGroup=2), Loots[2]=(Chance=50,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=3) ) -LootTables = ( TableName = "Gatekeeper_TimedLoot",Loots[0]=(Chance=100,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), Loots[1]=(Chance=100,MinCount=1,MaxCount=1,TableRef="LateAlienWeaponUpgrades",RollGroup=2), Loots[2]=(Chance=50,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=3) ) +-LootTables = ( TableName = "Spectre_TimedLoot", Loots[0]=(Chance=100,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), Loots[1]=(Chance=20,MinCount=1,MaxCount=1,TableRef="MidAlienWeaponUpgrades",RollGroup=2), Loots[2]=(Chance=34,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=3) ) + ; ALIEN TIMED LOOT -- generally add up to 80% so missions will have a mixed number of drops @@ -366,6 +416,12 @@ NUM_STARTING_SOLDIERS=22 Loots[4]=(Chance=10,MinCount=1,MaxCount=1,TableRef="EarlyAlienWeaponUpgrades",RollGroup=1), \\ Loots[5]=(Chance=20,MinCount=1,MaxCount=1,TableRef="MidAlienWeaponUpgrades",RollGroup=1) \\ ) ++LootTables = ( TableName = "Spectre_TimedLoot",\\ + Loots[0]=(Chance=35,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), \\ + Loots[1]=(Chance=20,MinCount=1,MaxCount=1,TableRef="EarlyAlienWeaponUpgrades",RollGroup=1), \\ + Loots[2]=(Chance=35,MinCount=1,MaxCount=1,TableRef="MidAlienWeaponUpgrades",RollGroup=1), \\ + Loots[3]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AlienDatapad",RollGroup=1) \\ + ) +LootTables = ( TableName = "Archon_TimedLoot", \\ Loots[0]=(Chance=35,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), \\ Loots[1]=(Chance=5,MinCount=1,MaxCount=1,TableRef="EarlyAlienWeaponUpgrades",RollGroup=1), \\ @@ -544,26 +600,32 @@ NUM_STARTING_SOLDIERS=22 ;; Smash N Grab Mission Loot (per crate) +LootTables = ( TableName = "SmashNGrab_LW_0", \\ Loots[0]=(Chance=30,MinCount=4,MaxCount=6,TemplateName="AlienAlloy",RollGroup=1), \\ - Loots[1]=(Chance=10,MinCount=4,MaxCount=6,TemplateName="EleriumDust",RollGroup=1), \\ - Loots[2]=(Chance=50,MinCount=25,MaxCount=30,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=10,MinCount=2,MaxCount=2,TemplateName="EleriumDust",RollGroup=1), \\ + Loots[2]=(Chance=50,MinCount=15,MaxCount=15,TemplateName="Supplies",RollGroup=1), \\ Loots[3]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), \\ - Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1) \\ + Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1), \\ + Loots[5]=(Chance=50,MinCount=10,MaxCount=15,TemplateName="Supplies",RollGroup=2), \\ + Loots[6]=(Chance=50,MinCount=1,MaxCount=2,TemplateName="EleriumDust",RollGroup=2) \\ ) +LootTables = ( TableName = "SmashNGrab_LW_3", \\ Loots[0]=(Chance=30,MinCount=5,MaxCount=7,TemplateName="AlienAlloy",RollGroup=1), \\ - Loots[1]=(Chance=10,MinCount=5,MaxCount=7,TemplateName="EleriumDust",RollGroup=1), \\ - Loots[2]=(Chance=50,MinCount=30,MaxCount=35,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=10,MinCount=2,MaxCount=2,TemplateName="EleriumDust",RollGroup=1), \\ + Loots[2]=(Chance=50,MinCount=20,MaxCount=20,TemplateName="Supplies",RollGroup=1), \\ Loots[3]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), \\ - Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1) \\ + Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1), \\ + Loots[5]=(Chance=50,MinCount=10,MaxCount=15,TemplateName="Supplies",RollGroup=2), \\ + Loots[6]=(Chance=50,MinCount=3,MaxCount=5,TemplateName="EleriumDust",RollGroup=2) \\ ) +LootTables = ( TableName = "SmashNGrab_LW_6", \\ Loots[0]=(Chance=30,MinCount=7,MaxCount=9,TemplateName="AlienAlloy",RollGroup=1), \\ - Loots[1]=(Chance=15,MinCount=7,MaxCount=9,TemplateName="EleriumDust",RollGroup=1), \\ - Loots[2]=(Chance=40,MinCount=35,MaxCount=40,TemplateName="Supplies",RollGroup=1), \\ + Loots[1]=(Chance=15,MinCount=4,MaxCount=4,TemplateName="EleriumDust",RollGroup=1), \\ + Loots[2]=(Chance=40,MinCount=25,MaxCount=25,TemplateName="Supplies",RollGroup=1), \\ Loots[3]=(Chance=10,MinCount=1,MaxCount=1,TemplateName="EleriumCore",RollGroup=1), \\ - Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1) \\ + Loots[4]=(Chance=5,MinCount=1,MaxCount=1,TemplateName="AdventDatapad",RollGroup=1), \\ + Loots[5]=(Chance=50,MinCount=10,MaxCount=15,TemplateName="Supplies",RollGroup=2), \\ + Loots[6]=(Chance=50,MinCount=3,MaxCount=5,TemplateName="EleriumDust",RollGroup=2) \\ ) +LootTables = ( TableName = "SmashNGrab_LW_9", \\ @@ -626,9 +688,9 @@ NUM_STARTING_SOLDIERS=22 +GlobalLootCarriers=(CarrierName="ChosenLoot", \\ LootReferences[0]=(LootTableName="ChosenLootM1", ForceLevel=0), \\ - LootReferences[1]=(LootTableName="ChosenLootM2", ForceLevel=9), \\ - LootReferences[2]=(LootTableName="ChosenLootM3", ForceLevel=14), \\ - LootReferences[3]=(LootTableName="ChosenLootM4", ForceLevel=20)) + LootReferences[1]=(LootTableName="ChosenLootM2", ForceLevel=7), \\ + LootReferences[2]=(LootTableName="ChosenLootM3", ForceLevel=11), \\ + LootReferences[3]=(LootTableName="ChosenLootM4", ForceLevel=16)) -GlobalLootCarriers=(CarrierName="POI", LootReferences[0]=(LootTableName="ADVENTEarlyTimedLoot", ForceLevel=0), LootReferences[1]=(LootTableName="ADVENTMidTimedLoot", ForceLevel=6), LootReferences[2]=(LootTableName="ADVENTLateTimedLoot", ForceLevel=9)) -GlobalLootCarriers=(CarrierName="BlackMarket", LootReferences[0]=(LootTableName="BlackMarketLoot_01", ForceLevel=0), LootReferences[1]=(LootTableName="BlackMarketLoot_02", ForceLevel=6), LootReferences[2]=(LootTableName="BlackMarketLoot_03", ForceLevel=9)) @@ -1229,11 +1291,11 @@ SATELLITE_DATA_SCAN_RATE_DURATION_HOURS=672 ENEMY_PROTOCOL_HACKING_BONUS=10 VIPER_ROUNDS_APPLICATION_CHANCE=12 --HackRewardNames="FacilityLead" --HackRewardNames="LootFacilityLead_T1" --HackRewardNames="LootFacilityLead_T2" --HackRewardNames="SatelliteData_T1" --HackRewardNames="SatelliteData_T2" +-HackRewardNames=FacilityLead +-HackRewardNames=LootFacilityLead_T1 +-HackRewardNames=LootFacilityLead_T2 +-HackRewardNames=SatelliteData_T1 +-HackRewardNames=SatelliteData_T2 +HackRewardNames="BuffEnemy_FullOverride" +HackRewardNames="ControlRobot_Mission" @@ -1454,9 +1516,9 @@ LootTemplateName=BigIntelCache [LootPCS_T1_LW X2HackRewardTemplate] RewardImagePath=img:///UILibrary_Common.HackReward_breachNetwork -MinHackSuccess=55 +MinHackSuccess=25 HackSuccessVariance=10 -bIsTier2Reward=true +bIsTier1Reward=true bPairWithLinkedReward=false bIsTacticalReward=true bIsStrategyReward=true @@ -2212,6 +2274,13 @@ EnableLWTrace=true EnableLWDebug=true EnableLWPMTrace=true +;This one is specifically for LW's pod diversity system. Turn on only for debugging, will generate significant lag whenver encounters are generated. +EnableLWDiversityTrace=false + +; This controls whether the infiltration estimates during squad select actually calc new missions based on changes you make, +; or whether they use estimates. Toggle this off if you get annoyed with lag during squad select. +bUseTrueDifficultyCalc = true + +EnableYellowAlert=true ; Disable updating of encounter zones based on XCOM's current position. @@ -2572,3 +2641,14 @@ DISRUPTOR_RIFLE_PSI_CRIT=100 +HideVisualizationOfResults=AA_UnitIsMindControlling +HideVisualizationOfResults=AA_NotWithAnObjectiveItem +HideVisualizationOfResults=AA_AlreadyAmplified + +[XComGame.X2Effect_ApplyWeaponDamage] + +;Temporarily add the config variable so the damage % change will work with local highlander +TRUNCATE_FINAL_DAMAGE_MODIFIER = true + +[XComGame.X2GrapplePuck] + +!GrappleDistanceModsByAbility=() +-GrappleDistanceModsByAbility[0]=(AbilityName="HunterGrapple", DistanceModMeters=10) ++GrappleDistanceModsByAbility[0]=(AbilityName="HunterGrapple", DistanceModMeters=-4) diff --git a/LongWarOfTheChosen/Config/XComGameData.ini b/LongWarOfTheChosen/Config/XComGameData.ini index f54ab1ad9..10b288789 100644 --- a/LongWarOfTheChosen/Config/XComGameData.ini +++ b/LongWarOfTheChosen/Config/XComGameData.ini @@ -202,49 +202,49 @@ BuildFacilityProject_TimeScalar[3]=1.0 ;Impossible !WoundSeverities=() -+WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=10, MinPointsToHeal=45000, MaxPointsToHeal=55000, Difficulty=0) ;Easy -+WoundSeverities=(MinHealthPercent=10, MaxHealthPercent=20, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=20, MaxHealthPercent=30, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=30, MaxHealthPercent=40, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=40, MaxHealthPercent=50, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=50, MaxHealthPercent=60, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=60, MaxHealthPercent=70, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=70, MaxHealthPercent=80, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=80, MaxHealthPercent=90, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=0) -+WoundSeverities=(MinHealthPercent=90, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=0) - -+WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=10, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=1) ;Veteran -+WoundSeverities=(MinHealthPercent=10, MaxHealthPercent=20, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=20, MaxHealthPercent=30, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=30, MaxHealthPercent=40, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=40, MaxHealthPercent=50, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=50, MaxHealthPercent=60, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=60, MaxHealthPercent=70, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=70, MaxHealthPercent=80, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=80, MaxHealthPercent=90, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=1) -+WoundSeverities=(MinHealthPercent=90, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=1) - -+WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=10, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=2) ;Commander -+WoundSeverities=(MinHealthPercent=10, MaxHealthPercent=20, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=20, MaxHealthPercent=30, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=30, MaxHealthPercent=40, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=40, MaxHealthPercent=50, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=50, MaxHealthPercent=60, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=60, MaxHealthPercent=70, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=70, MaxHealthPercent=80, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=80, MaxHealthPercent=90, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=2) -+WoundSeverities=(MinHealthPercent=90, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=2) - -+WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=10, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=3) ;Legend -+WoundSeverities=(MinHealthPercent=10, MaxHealthPercent=20, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=20, MaxHealthPercent=30, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=30, MaxHealthPercent=40, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=40, MaxHealthPercent=50, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=50, MaxHealthPercent=60, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=60, MaxHealthPercent=70, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=70, MaxHealthPercent=80, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=80, MaxHealthPercent=90, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=3) -+WoundSeverities=(MinHealthPercent=90, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=09, MinPointsToHeal=45000, MaxPointsToHeal=55000, Difficulty=0) ;Easy ++WoundSeverities=(MinHealthPercent=09, MaxHealthPercent=19, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=19, MaxHealthPercent=29, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=29, MaxHealthPercent=39, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=39, MaxHealthPercent=49, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=49, MaxHealthPercent=59, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=59, MaxHealthPercent=69, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=69, MaxHealthPercent=79, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=79, MaxHealthPercent=89, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=0) ++WoundSeverities=(MinHealthPercent=89, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=0) + ++WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=09, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=1) ;Veteran ++WoundSeverities=(MinHealthPercent=09, MaxHealthPercent=19, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=19, MaxHealthPercent=29, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=29, MaxHealthPercent=39, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=39, MaxHealthPercent=49, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=49, MaxHealthPercent=59, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=59, MaxHealthPercent=69, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=69, MaxHealthPercent=79, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=79, MaxHealthPercent=89, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=1) ++WoundSeverities=(MinHealthPercent=89, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=1) + ++WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=09, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=2) ;Commander ++WoundSeverities=(MinHealthPercent=09, MaxHealthPercent=19, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=19, MaxHealthPercent=29, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=29, MaxHealthPercent=39, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=39, MaxHealthPercent=49, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=49, MaxHealthPercent=59, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=59, MaxHealthPercent=69, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=69, MaxHealthPercent=79, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=79, MaxHealthPercent=89, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=2) ++WoundSeverities=(MinHealthPercent=89, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=2) + ++WoundSeverities=(MinHealthPercent=-10000, MaxHealthPercent=09, MinPointsToHeal=45000, MaxPointsToHeal=75000, Difficulty=3) ;Legend ++WoundSeverities=(MinHealthPercent=09, MaxHealthPercent=19, MinPointsToHeal=40000, MaxPointsToHeal=47500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=19, MaxHealthPercent=29, MinPointsToHeal=35000, MaxPointsToHeal=42500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=29, MaxHealthPercent=39, MinPointsToHeal=30000, MaxPointsToHeal=37500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=39, MaxHealthPercent=49, MinPointsToHeal=25000, MaxPointsToHeal=32500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=49, MaxHealthPercent=59, MinPointsToHeal=20000, MaxPointsToHeal=27500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=59, MaxHealthPercent=69, MinPointsToHeal=15000, MaxPointsToHeal=22500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=69, MaxHealthPercent=79, MinPointsToHeal=10000, MaxPointsToHeal=17500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=79, MaxHealthPercent=89, MinPointsToHeal=5000, MaxPointsToHeal=12500, Difficulty=3) ++WoundSeverities=(MinHealthPercent=89, MaxHealthPercent=10000, MinPointsToHeal=1000, MaxPointsToHeal=7500, Difficulty=3) ; Lightly Wounded, Wounded, Gravely Wounded WoundStates[0]=(WoundStateHealthPercents[0]=80, WoundStateHealthPercents[1]=30) ;Easy @@ -557,8 +557,8 @@ ReducedContactBaseModifier[3]=25 ;Impossible +SoldierRewardForceLevelGates=2; LCPL (3 weeks) +SoldierRewardForceLevelGates=4; CPL (9 weeks) +SoldierRewardForceLevelGates=8; SGT -+SoldierRewardForceLevelGates=12; SSGT -+SoldierRewardForceLevelGates=18; TSGT ++SoldierRewardForceLevelGates=14; SSGT ++SoldierRewardForceLevelGates=20; TSGT +SoldierRewardForceLevelGates=35; GSGT +SoldierRewardForceLevelGates=40; MSGT @@ -661,9 +661,11 @@ RURAL_CHECKPOINTS_SUPPLY_MULTIPLIER=0.5 [XComGame.X2AbilityTemplateManager] +EffectUpdatesOnMove="LWOfficerCommandAura" -+AbilityAvailabilityCodes="AA_UnitIsFocusssedOn" ++AbilityAvailabilityCodes="AA_UnitIsFocussed" +AbilityAvailabilityCodes="AA_InsufficientIntel" ++PreDeathCheckEffects="EmergencyLifeSupport" + SuperConcealShotMax=100 SuperConcealmentNormalLoss=0 SuperConcealmentMoveLoss=0 @@ -695,6 +697,7 @@ bSmokeCancelsFlankCritBonus=true +PerkPackage="LW_Perk_CloseEncounters" +PerkPackage="LW_Perk_CloseCombatSpecialist" +PerkPackage="LW_Perk_KnifeEncounters" ++PerkPackage="LW_Perk_KnifeEncountersExtendedRange" +PerkPackage="LW_Perk_OneForAll" +PerkPackage="LW_Perk_ZoC" @@ -708,6 +711,10 @@ bSmokeCancelsFlankCritBonus=true +PerkPackage=LW_PsiOverhaul_Perks +PerkPackage=HunterTrackingMark_LW ++PerkPackage = "IRISoulShotPerk" ++PerkPackage = "IRIParryReworkPerk" ++PerkPackage = "IRIApotheosisPerk" + [LW_Overhaul.X2StrategyElement_NewTechs_LW] RENDER_REWARD_ELERIUM_CORE=8 ; Elerium Dust RENDER_REWARD_SECTOID_CORPSE=3 ; Alien Alloy @@ -781,8 +788,10 @@ REPEAT_BASIC_ENGINEERING_INCREASE = 2800 +Loadouts=(LoadoutName="SquaddieSkirmisher", Items[0]=(Item="SkirmisherArmor"), Items[1]=(Item="Bullpup_CV"), Items[2]=(Item="WristBlade_CV"), Items[3]=(Item="FlashbangGrenade"), Items[4]=(Item="CeramicPlating")) -Loadouts=(LoadoutName="SquaddieTemplar", Items[0]=(Item="TemplarArmor"), Items[1]=(Item="ShardGauntlet_CV"), Items[2]=(Item="Sidearm_CV"), Items[3]=(Item="FragGrenade")) -+Loadouts=(LoadoutName="SquaddieTemplar", Items[0]=(Item="TemplarArmor"), Items[1]=(Item="ShardGauntlet_CV"), Items[2]=(Item="TemplarBallisticShield_CV"), Items[3]=(Item="FlashbangGrenade"), Items[4]=(Item="CeramicPlating")) +; If you want Templar Shields switch line is commented out below. +;+Loadouts=(LoadoutName="SquaddieTemplar", Items[0]=(Item="TemplarArmor"), Items[1]=(Item="ShardGauntlet_CV"), Items[2]=(Item="TemplarBallisticShield_CV"), Items[3]=(Item="FlashbangGrenade"), Items[4]=(Item="CeramicPlating")) ++Loadouts=(LoadoutName="SquaddieTemplar", Items[0]=(Item="TemplarArmor"), Items[1]=(Item="ShardGauntlet_CV"), Items[2]=(Item="FlashbangGrenade"), Items[3]=(Item="CeramicPlating")) +Loadouts=(LoadoutName="SquaddieLWS_Assault", Items[0]=(Item="Shotgun_CV"), Items[1]=(Item="Arcthrower_CV")) +Loadouts=(LoadoutName="SquaddieLWS_Shinobi", Items[0]=(Item="SMG_CV"), Items[1]=(Item="Sword_CV")) @@ -793,9 +802,6 @@ REPEAT_BASIC_ENGINEERING_INCREASE = 2800 +Loadouts=(LoadoutName="SquaddieLWS_Specialist", Items[0]=(Item="AssaultRifle_CV"), Items[1]=(Item="Gremlin_CV")) +Loadouts=(LoadoutName="SquaddieLWS_Technical", Items[0]=(Item="AssaultRifle_CV"), Items[1]=(Item="LWGauntlet_CV")) --Loadouts=(LoadoutName="RequiredSoldier", Items[0]=(Item="XPad")) -+Loadouts=(LoadoutName="RequiredSoldier", Items[0]=(Item="XPad"), Items[1]=(Item="EvacFlare")) - +Loadouts=(LoadoutName="ResistanceMecM1_Loadout", Items[0]=(Item="AdvMEC_M1_WPN"), Items[1]=(Item="ResistanceMEC_Shoulder_WPN")) +Loadouts=(LoadoutName="RebelSoldier", Items[0]=(Item="AssaultRifle_CV"), Items[1]=(Item="FragGrenade"), Items[2]=(Item="FlashbangGrenade"), Items[3]=(Item="EvacFlare")) @@ -890,6 +896,11 @@ REPEAT_BASIC_ENGINEERING_INCREASE = 2800 +Loadouts=(LoadoutName="ChosenSniperM2_Loadout", Items[0]=(Item="ChosenSniperRifle_MG"), Items[1]=(Item="ChosenSniperPistol_MG"), Items[2]=(Item="HunterFlashbang")) +Loadouts=(LoadoutName="ChosenSniperM3_Loadout", Items[0]=(Item="ChosenSniperRifle_BM"), Items[1]=(Item="ChosenSniperPistol_BM"), Items[2]=(Item="HunterFlashbang")) +Loadouts=(LoadoutName="ChosenSniperM4_Loadout", Items[0]=(Item="ChosenSniperRifle_T4"), Items[1]=(Item="ChosenSniperPistol_T4"), Items[2]=(Item="HunterFlashbang")) ++Loadouts=(LoadoutName="ChosenSniperM5_Loadout", Items[0]=(Item="ChosenSniperRifle_T5"), Items[1]=(Item="ChosenSniperPistol_T5"), Items[2]=(Item="HunterFlashbang")) + ++Loadouts=(LoadoutName="ChosenWarlockM5_Loadout", Items[0]=(Item="ChosenRifle_T5"), Items[1]=(Item="WarlockM5_PsiWeapon")) + ++Loadouts=(LoadoutName="ChosenAssassinM5_Loadout", Items[0]=(Item="ChosenShotgun_T5"), Items[1]=(Item="ChosenSword_T5"), Items[2]=(Item="MountainMistGrenade")) ; This is for PCS stat bumps @@ -1323,6 +1334,9 @@ TIER3_STRIKE_DMG=(Damage=12, Spread=0, PlusOne=0, Crit=6, Pierce=0, Shred=0, Tag RareChests[2]=(Type="RareLoot", Chance=2.0), \\ ) + +!ChestDistributions=() + +ChestDistributions=(MinForceLevel=1,\\ MaxForceLevel=4,\\ ChestTypeShuffleBag[0]="Basic1", \\ @@ -1349,8 +1363,62 @@ TIER3_STRIKE_DMG=(Damage=12, Spread=0, PlusOne=0, Crit=6, Pierce=0, Shred=0, Tag ) ++ChestDefinitions=(Type="Basic4", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_Basic4") ++ChestDefinitions=(Type="Basic5", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_Basic5") + +; The ones for the Big Supply Extract need to be here as well so rewards get given after the mission ++ChestDefinitions=(Type="BigBasic1", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic1") ++ChestDefinitions=(Type="BigBasic2", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic2") ++ChestDefinitions=(Type="BigBasic3", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic3") ++ChestDefinitions=(Type="BigBasic4", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic4") ++ChestDefinitions=(Type="BigBasic5", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic5") + + + +[LW_Overhaul.SeqAct_GetGatherSuppliesChestsBig] + ++BigChestDistributions=(MinForceLevel=1,\\ + MaxForceLevel=4,\\ + ChestTypeShuffleBag[0]="BigBasic1", \\ + ) + ++BigChestDistributions=(MinForceLevel=5,\\ + MaxForceLevel=8,\\ + ChestTypeShuffleBag[0]="BigBasic2", \\ + ) + ++BigChestDistributions=(MinForceLevel=9,\\ + MaxForceLevel=11,\\ + ChestTypeShuffleBag[0]="BigBasic3", \\ + ) + ++BigChestDistributions=(MinForceLevel=12,\\ + MaxForceLevel=15,\\ + ChestTypeShuffleBag[0]="BigBasic4", \\ + ) + ++BigChestDistributions=(MinForceLevel=16,\\ + MaxForceLevel=99,\\ + ChestTypeShuffleBag[0]="BigBasic5", \\ + ) + + ++BigChestDefinitions=(Type="BigBasic1", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic1") ++BigChestDefinitions=(Type="BigBasic2", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic2") ++BigChestDefinitions=(Type="BigBasic3", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic3") ++BigChestDefinitions=(Type="BigBasic4", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic4") ++BigChestDefinitions=(Type="BigBasic5", ArchetypePath="MissionAssets_SupplyExtraction.Archetypes.ARC_IA_SupplyCrate_Standard", LootTable="SupplyExtraction_BigBasic5") + + + [XComGame.X2StrategyGameRulesetDataStructures] +; override Bond training time modifiers. +BondProjectPoints[0]=0 +BondProjectPoints[1]=1 +BondProjectPoints[2]=1 +BondProjectPoints[3]=1 + ;-AbilityPointCosts[0]=0 ; Squaddie ;-AbilityPointCosts[1]=10 ; Corporal ;-AbilityPointCosts[2]=11 ; Sergeant @@ -1418,6 +1486,12 @@ MedicalModeHealRateScalar[3]=0.25 +SitReps=DarkEventSealedArmorSitRep +SitReps=DarkEventUndyingLoyaltySitRep +SitReps=DarkEventVigilanceSitRep ++Sitreps=LargeDepot_LW ++Sitreps=ChosenOnMissionSitrep + +[ChosenOnMissionSitrep X2SitrepTemplate] +bNegativeEffect=true +bExcludeFromStrategy=true [LocationScout X2SitRepTemplate] -TacticalGameplayTags="SITREP_LocationScout" @@ -1500,8 +1574,10 @@ bExcludeFromStrategy=false +ValidMissionTypes="Rescue_AdventCell_LW" +ValidMissionTypes="Rescue_Vehicle_LW" +ValidMissionTypes="SupplyExtraction_LW" ++ValidMissionTypes="BigSupplyExtraction_LW" +ValidMissionTypes="SabotageCC_LW" +ValidMissionTypes="TroopManeuvers_LW" ++ValidMissionTypes="CovertOpsTroopManeuvers_LW" +ValidMissionTypes="SupplyRaidATT_LW" +ValidMissionTypes="SupplyRaidTrain_LW" +ValidMissionTypes="SupplyRaidConvoy_LW" @@ -1531,6 +1607,7 @@ bExcludeFromStrategy=false +ValidMissionTypes="Rescue_AdventCell_LW" +ValidMissionTypes="Rescue_Vehicle_LW" +ValidMissionTypes="SupplyExtraction_LW" ++ValidMissionTypes="BigSupplyExtraction_LW" +ValidMissionTypes="SabotageCC_LW" +ExcludePlotTypes="Abandoned" @@ -1563,6 +1640,7 @@ bExcludeFromStrategy=false +ValidMissionTypes="Rescue_Vehicle_LW" +ValidMissionTypes="SmashNGrab_LW" +ValidMissionTypes="SupplyExtraction_LW" ++ValidMissionTypes="BigSupplyExtraction_LW" +ValidMissionTypes="SabotageCC_LW" +ValidMissionTypes="SupplyRaidATT_LW" +ValidMissionTypes="SupplyRaidTrain_LW" @@ -1686,26 +1764,43 @@ MinimumForceLevel=15 +ValidMissionTypes=AssaultAlienBase_LW +ValidMissionTypes=TroopManeuvers_LW +[LargeDepot_LW X2SitRepTemplate] +TacticalGameplayTags="LargeDepot_LW_Sitrep" +MinimumForceLevel=6 + ++ValidMissionTypes=SmashNGrab_LW + [XComGame.X2StrategyElement_XpackStaffSlots] RESISTANCE_RING_COVERT_ACTION_DURATION_MODIFIER=0.25 +[XComGame.XComGameState_AdventChosen] +TooltipBounds=(fLeft=-0.015, fTop=-0.025, fRight=0.015, fBottom=0.015) + +MaxScoreAtKnowledgeLevel[eChosenKnowledge_Start]=24 +MaxScoreAtKnowledgeLevel[eChosenKnowledge_Saboteur]=49 +MaxScoreAtKnowledgeLevel[eChosenKnowledge_Sentinel]=74 +MaxScoreAtKnowledgeLevel[eChosenKnowledge_Collector]=99 +MaxScoreAtKnowledgeLevel[eChosenKnowledge_Raider]=100 + [ChosenAction_Retribution X2ChosenActionTemplate] MaxPerMonth=3 IndividualCooldown=2 -ActionPriority=20 -MinXComKnowledge=1 -MinKnowledgeGain=5 -MaxKnowledgeGain=5 +ActionPriority=40 +MinXComKnowledge=3 +MinKnowledgeGain=8 +MaxKnowledgeGain=8 [ChosenAction_Training X2ChosenActionTemplate] MaxPerMonth=3 -ActionPriority=10 +ActionPriority=20 +IndividualCooldown=2 [ChosenAction_Sabotage X2ChosenActionTemplate] MaxPerMonth=3 -IndividualCooldown=3 -MinXComKnowledge=3 -ActionPriority=40 +IndividualCooldown=0 +MinXComKnowledge=0 +ActionPriority=10 +ActivationTime=(MinDays=10, MaxDays=20) [ChosenAction_DarkEvent X2ChosenActionTemplate] MaxPerMonth=1 @@ -1722,84 +1817,84 @@ MinXComKnowledge=4 ActivationTime=(MinDays=2, MaxDays=10) [XComGame.X2StrategyElement_XpackChosenActions] -SabotageChance[0]=100 -SabotageChance[1]=100 -SabotageChance[2]=100 -SabotageChance[3]=100 +SabotageChance[0]=40 +SabotageChance[1]=40 +SabotageChance[2]=40 +SabotageChance[3]=40 [XComGame.X2StrategyElement_DefaultSabotages] -CargoHoldPercentDecrease[0]=0.75f -CargoHoldPercentDecrease[1]=0.75f -CargoHoldPercentDecrease[2]=0.75f -CargoHoldPercentDecrease[3]=0.75f -CargoHoldMin[0]=150 -CargoHoldMin[1]=150 -CargoHoldMin[2]=150 -CargoHoldMin[3]=150 -ServerArrayPercentDecrease[0]=0.75f -ServerArrayPercentDecrease[1]=0.75f -ServerArrayPercentDecrease[2]=0.75f -ServerArrayPercentDecrease[3]=0.75f -ServerArrayMinimum[0]=150 -ServerArrayMinimum[1]=150 -ServerArrayMinimum[2]=150 -ServerArrayMinimum[3]=150 -ScannerArrayDays[0]=14 -ScannerArrayDays[1]=14 -ScannerArrayDays[2]=14 -ScannerArrayDays[3]=14 +CargoHoldPercentDecrease[0]=0.25f +CargoHoldPercentDecrease[1]=0.25f +CargoHoldPercentDecrease[2]=0.25f +CargoHoldPercentDecrease[3]=0.25f +CargoHoldMin[0]=25 +CargoHoldMin[1]=25 +CargoHoldMin[2]=25 +CargoHoldMin[3]=25 +ServerArrayPercentDecrease[0]=0.25f +ServerArrayPercentDecrease[1]=0.25f +ServerArrayPercentDecrease[2]=0.25f +ServerArrayPercentDecrease[3]=0.25f +ServerArrayMinimum[0]=25 +ServerArrayMinimum[1]=25 +ServerArrayMinimum[2]=25 +ServerArrayMinimum[3]=25 +ScannerArrayDays[0]=4 +ScannerArrayDays[1]=4 +ScannerArrayDays[2]=4 +ScannerArrayDays[3]=4 ; If you modify these values, update the localisation for ; [Sabotage_LongRangeComms X2SabotageTemplate] in XComGame.int. -LongRangeCommsHours[0]=336 -LongRangeCommsHours[1]=336 -LongRangeCommsHours[2]=336 -LongRangeCommsHours[3]=336 - -ResearchLabsDays[0]=12 -ResearchLabsDays[1]=12 -ResearchLabsDays[2]=12 -ResearchLabsDays[3]=12 -LabStorageMinDatapads[0]=5 -LabStorageMinDatapads[1]=5 -LabStorageMinDatapads[2]=5 -LabStorageMinDatapads[3]=5 -LabStorageMaxDatapads[0]=10 -LabStorageMaxDatapads[1]=10 -LabStorageMaxDatapads[2]=10 -LabStorageMaxDatapads[3]=10 -InfirmaryDays[0]=10 -InfirmaryDays[1]=10 -InfirmaryDays[2]=10 -InfirmaryDays[3]=10 -SoldierCommsNumSoldiers[0]=10 -SoldierCommsNumSoldiers[1]=10 -SoldierCommsNumSoldiers[2]=10 -SoldierCommsNumSoldiers[3]=10 -WoundStaffMinDays[0]=60 -WoundStaffMinDays[1]=60 -WoundStaffMinDays[2]=60 -WoundStaffMinDays[3]=60 -WoundStaffMaxDays[0]=60 -WoundStaffMaxDays[1]=60 -WoundStaffMaxDays[2]=60 -WoundStaffMaxDays[3]=60 -MinSecureStorageCores[0]=5 -MinSecureStorageCores[1]=5 -MinSecureStorageCores[2]=5 -MinSecureStorageCores[3]=5 -MaxSecureStorageCores[0]=10 -MaxSecureStorageCores[1]=10 -MaxSecureStorageCores[2]=10 -MaxSecureStorageCores[3]=10 -MinWeaponLockersMods[0]=8 -MinWeaponLockersMods[1]=8 -MinWeaponLockersMods[2]=8 -MinWeaponLockersMods[3]=8 -MaxWeaponLockersMods[0]=10 -MaxWeaponLockersMods[1]=10 -MaxWeaponLockersMods[2]=10 -MaxWeaponLockersMods[3]=10 +LongRangeCommsHours[0]=120 +LongRangeCommsHours[1]=120 +LongRangeCommsHours[2]=120 +LongRangeCommsHours[3]=120 + +ResearchLabsDays[0]=4 +ResearchLabsDays[1]=4 +ResearchLabsDays[2]=4 +ResearchLabsDays[3]=4 +LabStorageMinDatapads[0]=2 +LabStorageMinDatapads[1]=2 +LabStorageMinDatapads[2]=2 +LabStorageMinDatapads[3]=2 +LabStorageMaxDatapads[0]=4 +LabStorageMaxDatapads[1]=4 +LabStorageMaxDatapads[2]=4 +LabStorageMaxDatapads[3]=4 +InfirmaryDays[0]=5 +InfirmaryDays[1]=5 +InfirmaryDays[2]=5 +InfirmaryDays[3]=5 +SoldierCommsNumSoldiers[0]=3 +SoldierCommsNumSoldiers[1]=3 +SoldierCommsNumSoldiers[2]=3 +SoldierCommsNumSoldiers[3]=3 +WoundStaffMinDays[0]=15 +WoundStaffMinDays[1]=15 +WoundStaffMinDays[2]=15 +WoundStaffMinDays[3]=15 +WoundStaffMaxDays[0]=15 +WoundStaffMaxDays[1]=15 +WoundStaffMaxDays[2]=15 +WoundStaffMaxDays[3]=15 +MinSecureStorageCores[0]=2 +MinSecureStorageCores[1]=2 +MinSecureStorageCores[2]=2 +MinSecureStorageCores[3]=2 +MaxSecureStorageCores[0]=4 +MaxSecureStorageCores[1]=4 +MaxSecureStorageCores[2]=4 +MaxSecureStorageCores[3]=4 +MinWeaponLockersMods[0]=3 +MinWeaponLockersMods[1]=3 +MinWeaponLockersMods[2]=3 +MinWeaponLockersMods[3]=3 +MaxWeaponLockersMods[0]=5 +MaxWeaponLockersMods[1]=5 +MaxWeaponLockersMods[2]=5 +MaxWeaponLockersMods[3]=5 [XComGame.XComGameState_ResistanceFaction] MaxHeroesPerFaction=2 @@ -1855,7 +1950,7 @@ ChosenSpawningDistance = 20 [XComGame.XComGameState_AdventChosen] StartingNumStrengths=0 KnowledgePerCapture=4 -GuaranteedKnowledgeGainPerMonth=9 +GuaranteedKnowledgeGainPerMonth=0 ; No need to have Chosen increasing covert action risks with ; no real counterplay, particularly as it would make ambushes @@ -1873,17 +1968,49 @@ TargetSocket=FX_CHEST ChainDelay=0.25 ReactDelay=0.2 +;Uncomment the below for 1 handed guantlet animations [LW_WeaponsAndArmor.X2DownloadableContentInfo_LW_WeaponsAndArmor] -+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_CV -+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_MG -+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_BM - -+TEMPLAR_SHIELDS=TemplarBallisticShield_CV -+TEMPLAR_SHIELDS=TemplarBallisticShield_MG -+TEMPLAR_SHIELDS=TemplarBallisticShield_BM +;+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_CV +;+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_MG +;+TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE=ShardGauntlet_BM ;+AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED=gauntlet +AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED=sword +AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED=pistol +AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED=sidearm +AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED=sawedoff + +[Chosen_Assassin X2AdventChosenTemplate] + +ChosenImages[0]="img:///UILibrary_XPACK_Common.AdventChosen_Assassin_1" +ChosenImages[1]="img:///UILibrary_XPACK_Common.AdventChosen_Assassin_2" +ChosenImages[2]="img:///UILibrary_XPACK_Common.AdventChosen_Assassin_3" +ChosenImages[3]="img:///UILibrary_XPACK_Common.AdventChosen_Assassin_4" +;ChosenImages[4]="img:///UILibrary_XPACK_Common.AdventChosen_Assassin_4" + +;-ChosenProgressionData=(CharTemplates[0]="ChosenAssassin", CharTemplates[1]="ChosenAssassinM2", CharTemplates[2]="ChosenAssassinM3", CharTemplates[3]="ChosenAssassinM4", SpawningTags[0]="Chosen_AssassinActive", SpawningTags[1]="Chosen_AssassinActiveM2", SpawningTags[2]="Chosen_AssassinActiveM3", SpawningTags[3]="Chosen_AssassinActiveM4", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard")) +;+ChosenProgressionData=(CharTemplates[0]="ChosenAssassin", CharTemplates[1]="ChosenAssassinM2", CharTemplates[2]="ChosenAssassinM3", CharTemplates[3]="ChosenAssassinM4", CharTemplates[4]="ChosenAssassinM5", SpawningTags[0]="Chosen_AssassinActive", SpawningTags[1]="Chosen_AssassinActiveM2", SpawningTags[2]="Chosen_AssassinActiveM3", SpawningTags[3]="Chosen_AssassinActiveM4", SpawningTags[4]="Chosen_AssassinActiveM5", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard"), ReinforcementGroups[4]=(GroupNames[0]="CHSx4_Standard")) + + +[Chosen_Hunter X2AdventChosenTemplate] + +ChosenImages[0]="img:///UILibrary_XPACK_Common.AdventChosen_Hunter_1" +ChosenImages[1]="img:///UILibrary_XPACK_Common.AdventChosen_Hunter_2" +ChosenImages[2]="img:///UILibrary_XPACK_Common.AdventChosen_Hunter_3" +ChosenImages[3]="img:///UILibrary_XPACK_Common.AdventChosen_Hunter_4" +;ChosenImages[4]="img:///UILibrary_XPACK_Common.AdventChosen_Hunter_4" + +;-ChosenProgressionData=(CharTemplates[0]="ChosenSniper", CharTemplates[1]="ChosenSniperM2", CharTemplates[2]="ChosenSniperM3", CharTemplates[3]="ChosenSniperM4", SpawningTags[0]="Chosen_SniperActive", SpawningTags[1]="Chosen_SniperActiveM2", SpawningTags[2]="Chosen_SniperActiveM3", SpawningTags[3]="Chosen_SniperActiveM4", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard")) +;+ChosenProgressionData=(CharTemplates[0]="ChosenSniper", CharTemplates[1]="ChosenSniperM2", CharTemplates[2]="ChosenSniperM3", CharTemplates[3]="ChosenSniperM4", CharTemplates[4]="ChosenSniperM5", SpawningTags[0]="Chosen_SniperActive", SpawningTags[1]="Chosen_SniperActiveM2", SpawningTags[2]="Chosen_SniperActiveM3", SpawningTags[3]="Chosen_SniperActiveM4", SpawningTags[4]="Chosen_SniperActiveM5", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard"), ReinforcementGroups[4]=(GroupNames[0]="CHSx4_Standard")) + +[Chosen_Warlock X2AdventChosenTemplate] + +ChosenImages[0]="img:///UILibrary_XPACK_Common.AdventChosen_Warlock_1" +ChosenImages[1]="img:///UILibrary_XPACK_Common.AdventChosen_Warlock_2" +ChosenImages[2]="img:///UILibrary_XPACK_Common.AdventChosen_Warlock_3" +ChosenImages[3]="img:///UILibrary_XPACK_Common.AdventChosen_Warlock_4" +;ChosenImages[4]="img:///UILibrary_XPACK_Common.AdventChosen_Warlock_4" + +;-ChosenProgressionData=(CharTemplates[0]="ChosenWarlock", CharTemplates[1]="ChosenWarlockM2", CharTemplates[2]="ChosenWarlockM3", CharTemplates[3]="ChosenWarlockM4", SpawningTags[0]="Chosen_WarlockActive", SpawningTags[1]="Chosen_WarlockActiveM2", SpawningTags[2]="Chosen_WarlockActiveM3", SpawningTags[3]="Chosen_WarlockActiveM4", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard")) +;+ChosenProgressionData=(CharTemplates[0]="ChosenWarlock", CharTemplates[1]="ChosenWarlockM2", CharTemplates[2]="ChosenWarlockM3", CharTemplates[3]="ChosenWarlockM4", CharTemplates[4]="ChosenWarlockM5", SpawningTags[0]="Chosen_WarlockActive", SpawningTags[1]="Chosen_WarlockActiveM2", SpawningTags[2]="Chosen_WarlockActiveM3", SpawningTags[3]="Chosen_WarlockActiveM4", SpawningTags[4]="Chosen_WarlockActiveM5", ReinforcementGroups[0]=(GroupNames[0]="CHSx1_Standard"), ReinforcementGroups[1]=(GroupNames[0]="CHSx2_Standard"), ReinforcementGroups[2]=(GroupNames[0]="CHSx3_Standard"), ReinforcementGroups[3]=(GroupNames[0]="CHSx4_Standard"), ReinforcementGroups[4]=(GroupNames[0]="CHSx4_Standard")) + diff --git a/LongWarOfTheChosen/Config/XComGameData_CharacterStats.ini b/LongWarOfTheChosen/Config/XComGameData_CharacterStats.ini index 806db8015..717bac9c2 100644 --- a/LongWarOfTheChosen/Config/XComGameData_CharacterStats.ini +++ b/LongWarOfTheChosen/Config/XComGameData_CharacterStats.ini @@ -56,6 +56,7 @@ CharacterBaseStats[eStat_Mobility]=15 CharacterBaseStats[eStat_Will]=35 CharacterBaseStats[eStat_UtilityItems]=2 CharacterBaseStats[eStat_PsiOffense]=20 +CharacterBaseStats[eStat_Dodge]=5 [ReaperSoldier_Diff_0 X2CharacterTemplate] CharacterBaseStats[eStat_HP] = 5 @@ -82,6 +83,7 @@ CharacterBaseStats[eStat_Mobility]=15 CharacterBaseStats[eStat_Will]=35 CharacterBaseStats[eStat_UtilityItems]=2 CharacterBaseStats[eStat_PsiOffense]=20 +CharacterBaseStats[eStat_Dodge]=5 [SkirmisherSoldier_Diff_0 X2CharacterTemplate] CharacterBaseStats[eStat_HP] = 5 @@ -1769,7 +1771,7 @@ CharacterBaseStats[eStat_UtilityItems]=3 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=9 +CharacterBaseStats[eStat_Mobility]=11 -+CharacterBaseStats[eStat_Offense]=70 ++CharacterBaseStats[eStat_Offense]=65 +CharacterBaseStats[eStat_PsiOffense]=0 +CharacterBaseStats[eStat_ReserveActionPoints]=0 +CharacterBaseStats[eStat_SightRadius]=27 @@ -1793,14 +1795,14 @@ CharacterBaseStats[eStat_UtilityItems]=3 +CharacterBaseStats[eStat_Will]=90 +CharacterBaseStats[eStat_ArmorPiercing]=2 +CharacterBaseStats[eStat_HP]=14 -+CharacterBaseStats[eStat_Offense]=75 ++CharacterBaseStats[eStat_Offense]=70 [AdvGunnerM3_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_Will]=95 +CharacterBaseStats[eStat_ArmorPiercing]=2 +CharacterBaseStats[eStat_HP]=15 -+CharacterBaseStats[eStat_Offense]=75 ++CharacterBaseStats[eStat_Offense]=70 ; -------------------------------------------------------------------------------------------- ; ;----------------------------------- AdvSentryM1 ----------------------------------------------; @@ -5402,7 +5404,7 @@ CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_HP]=7 CharacterBaseStats[eStat_Mobility]=12.01 CharacterBaseStats[eStat_Offense]=70 -CharacterBaseStats[eStat_PsiOffense]=80 +CharacterBaseStats[eStat_PsiOffense]=15 CharacterBaseStats[eStat_ReserveActionPoints]=0 CharacterBaseStats[eStat_SightRadius]=27 CharacterBaseStats[eStat_DetectionRadius]=15 @@ -5461,7 +5463,7 @@ MaxCharactersPerGroup=4 [Sectoid_Diff_1 X2CharacterTemplate] CharacterBaseStats[eStat_HP]=8 CharacterBaseStats[eStat_Offense]=75 -CharacterBaseStats[eStat_PsiOffense]=90 +CharacterBaseStats[eStat_PsiOffense]=20 CharacterBaseStats[eStat_Mobility]=12 CharacterBaseStats[eStat_Will]=85 CharacterBaseStats[eStat_FlankingCritChance]=33 @@ -5470,7 +5472,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=33 CharacterBaseStats[eStat_HP]=8 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_CritChance]=10 -CharacterBaseStats[eStat_PsiOffense]=90 +CharacterBaseStats[eStat_PsiOffense]=25 CharacterBaseStats[eStat_Will]=85 CharacterBaseStats[eStat_FlankingCritChance]=40 @@ -5478,7 +5480,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 CharacterBaseStats[eStat_HP]=9 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_CritChance]=10 -CharacterBaseStats[eStat_PsiOffense]=90 +CharacterBaseStats[eStat_PsiOffense]=30 CharacterBaseStats[eStat_Will]=85 CharacterBaseStats[eStat_FlankingCritChance]=40 @@ -5605,7 +5607,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=12 +CharacterBaseStats[eStat_Mobility]=12 +CharacterBaseStats[eStat_Offense]=75 -+CharacterBaseStats[eStat_PsiOffense]=100 ++CharacterBaseStats[eStat_PsiOffense]=30 +CharacterBaseStats[eStat_ReserveActionPoints]=0 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_DetectionRadius]=18.01 @@ -5621,14 +5623,14 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [SectoidM2_LW_Diff_1 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=33 +CharacterBaseStats[eStat_HP]=14 -+CharacterBaseStats[eStat_PsiOffense]=110 ++CharacterBaseStats[eStat_PsiOffense]=35 +CharacterBaseStats[eStat_Will]=105 +CharacterBaseStats[eStat_Defense]=10 [SectoidM2_LW_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=16 -+CharacterBaseStats[eStat_PsiOffense]=120 ++CharacterBaseStats[eStat_PsiOffense]=40 +CharacterBaseStats[eStat_Will]=105 +CharacterBaseStats[eStat_Offense]=80 +CharacterBaseStats[eStat_Defense]=15 @@ -5636,7 +5638,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [SectoidM2_LW_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=18 -+CharacterBaseStats[eStat_PsiOffense]=130 ++CharacterBaseStats[eStat_PsiOffense]=45 +CharacterBaseStats[eStat_Will]=110 +CharacterBaseStats[eStat_Offense]=80 +CharacterBaseStats[eStat_Defense]=15 @@ -8636,7 +8638,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_Dodge]=25 +CharacterBaseStats[eStat_HP]=10 +CharacterBaseStats[eStat_Mobility]=14 -+CharacterBaseStats[eStat_Offense]=85 ++CharacterBaseStats[eStat_Offense]=80 +CharacterBaseStats[eStat_PsiOffense]=0 +CharacterBaseStats[eStat_ReserveActionPoints]=0 +CharacterBaseStats[eStat_SightRadius]=27 @@ -8654,7 +8656,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvCommando_Diff_1 X2CharacterTemplate] +CharacterBaseStats[eStat_HP]=12 -+CharacterBaseStats[eStat_Offense]=90 ++CharacterBaseStats[eStat_Offense]=85 +CharacterBaseStats[eStat_Dodge]=25 +CharacterBaseStats[eStat_Defense]=15 +CharacterBaseStats[eStat_Will]=85 @@ -8662,7 +8664,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvCommando_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=14 -+CharacterBaseStats[eStat_Offense]=90 ++CharacterBaseStats[eStat_Offense]=85 +CharacterBaseStats[eStat_Dodge]=25 +CharacterBaseStats[eStat_Defense]=15 +CharacterBaseStats[eStat_Will]=85 @@ -8670,7 +8672,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvCommando_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=15 -+CharacterBaseStats[eStat_Offense]=90 ++CharacterBaseStats[eStat_Offense]=85 +CharacterBaseStats[eStat_Dodge]=25 +CharacterBaseStats[eStat_Defense]=15 +CharacterBaseStats[eStat_Will]=85 @@ -8765,7 +8767,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_Dodge]=5 +CharacterBaseStats[eStat_HP]=6 +CharacterBaseStats[eStat_Mobility]=14 -+CharacterBaseStats[eStat_Offense]=70 ++CharacterBaseStats[eStat_Offense]=65 +CharacterBaseStats[eStat_PsiOffense]=0 +CharacterBaseStats[eStat_ReserveActionPoints]=0 +CharacterBaseStats[eStat_SightRadius]=27 @@ -8783,7 +8785,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvScout_Diff_1 X2CharacterTemplate] +CharacterBaseStats[eStat_HP]=7 -+CharacterBaseStats[eStat_Offense]=80 ++CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Dodge]=10 +CharacterBaseStats[eStat_Defense]=10 +CharacterBaseStats[eStat_Will]=55 @@ -8791,7 +8793,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvScout_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=7 -+CharacterBaseStats[eStat_Offense]=80 ++CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Dodge]=10 +CharacterBaseStats[eStat_Defense]=10 +CharacterBaseStats[eStat_Will]=55 @@ -8799,7 +8801,7 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [AdvScout_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_FlankingCritChance]=40 +CharacterBaseStats[eStat_HP]=7 -+CharacterBaseStats[eStat_Offense]=80 ++CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Dodge]=15 +CharacterBaseStats[eStat_Defense]=10 +CharacterBaseStats[eStat_Will]=55 @@ -9255,7 +9257,7 @@ CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_HP]=6 CharacterBaseStats[eStat_Offense]=70 -CharacterBaseStats[eStat_PsiOffense]=30 +CharacterBaseStats[eStat_PsiOffense]=20 CharacterBaseStats[eStat_Will]=70 ; Alien-pack supported followers @@ -9298,21 +9300,21 @@ CharacterBaseStats[eStat_Will]=70 [AdvPriestM1_Diff_0 X2CharacterTemplate] CharacterBaseStats[eStat_HP]=5 CharacterBaseStats[eStat_Offense]=65 -CharacterBaseStats[eStat_PsiOffense]=25 +CharacterBaseStats[eStat_PsiOffense]=15 CharacterBaseStats[eStat_Will]=65 [AdvPriestM1_Diff_2 X2CharacterTemplate] CharacterBaseStats[eStat_Dodge]=5 CharacterBaseStats[eStat_HP]=8 CharacterBaseStats[eStat_Offense]=70 -CharacterBaseStats[eStat_PsiOffense]=30 +CharacterBaseStats[eStat_PsiOffense]=20 CharacterBaseStats[eStat_Will]=70 [AdvPriestM1_Diff_3 X2CharacterTemplate] CharacterBaseStats[eStat_Dodge]=10 CharacterBaseStats[eStat_HP]=8 CharacterBaseStats[eStat_Offense]=75 -CharacterBaseStats[eStat_PsiOffense]=35 +CharacterBaseStats[eStat_PsiOffense]=25 CharacterBaseStats[eStat_Will]=70 ; Alien-pack supported followers @@ -9363,6 +9365,7 @@ CharacterBaseStats[eStat_Will]=100 [AdvPriestM2_Diff_0 X2CharacterTemplate] CharacterBaseStats[eStat_Offense]=70 +CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_PsiOffense]=30 CharacterBaseStats[eStat_Will]=95 @@ -9449,11 +9452,11 @@ CharacterBaseStats[eStat_PsiOffense]=45 CharacterBaseStats[eStat_Will]=105 [ChosenWarlock X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=27 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=20 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=70 @@ -9461,23 +9464,23 @@ CharacterBaseStats[eStat_Offense]=70 CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=20 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=15 +CharacterBaseStats[eStat_Mobility]=12 CharacterBaseStats[eStat_Offense]=65 [ChosenWarlock_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=34 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=25 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlock_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=41 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=31 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9485,34 +9488,34 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=41 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=28 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=70 [ChosenWarlockM2_Diff_0 X2CharacterTemplate] CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=34 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=21 +CharacterBaseStats[eStat_Mobility]=12 CharacterBaseStats[eStat_Offense]=65 [ChosenWarlockM2_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=47 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=33 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM2_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=61 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=41 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9520,35 +9523,35 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=47 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=37 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM3_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=41 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=28 +CharacterBaseStats[eStat_Mobility]=12 CharacterBaseStats[eStat_Offense]=65 [ChosenWarlockM3_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=61 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=44 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM3_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=74 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=55 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9556,9 +9559,9 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM4 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=68 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=44 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9566,34 +9569,86 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM4_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=54 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_HP]=34 +CharacterBaseStats[eStat_Mobility]=12 CharacterBaseStats[eStat_Offense]=65 [ChosenWarlockM4_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=101 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=53 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenWarlockM4_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=4 -CharacterBaseStats[eStat_HP]=122 -CharacterBaseStats[eStat_Mobility]=15 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=67 +CharacterBaseStats[eStat_Mobility]=14 +CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + + + +[ChosenWarlockM5 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=62 +CharacterBaseStats[eStat_Mobility]=14 +CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + +CharacterBaseStats[eStat_AlertLevel]=2 +CharacterBaseStats[eStat_PsiOffense]=60 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_DetectionRadius]=12 +CharacterBaseStats[eStat_UtilityItems]=2 +CharacterBaseStats[eStat_Will]=50 +CharacterBaseStats[eStat_HackDefense]=125 +CharacterBaseStats[eStat_FlankingCritChance]=33 +CharacterBaseStats[eStat_FlankingAimBonus]=0 +CharacterBaseStats[eStat_Strength]=50 + + + +[ChosenWarlockM5_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=47 +CharacterBaseStats[eStat_Mobility]=12 +CharacterBaseStats[eStat_Offense]=65 + +[ChosenWarlockM5_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=74 +CharacterBaseStats[eStat_Mobility]=14 +CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + +[ChosenWarlockM5_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=93 +CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=75 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 + [ChosenSniper X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 CharacterBaseStats[eStat_ArmorMitigation]=0 -CharacterBaseStats[eStat_HP]=27 +CharacterBaseStats[eStat_HP]=26 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9602,6 +9657,7 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniper_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_HP]=20 CharacterBaseStats[eStat_Mobility]=14 @@ -9612,8 +9668,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniper_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=34 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=31 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=85 CharacterBaseStats[eStat_Defense]=0 @@ -9622,9 +9679,10 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniper_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=41 -CharacterBaseStats[eStat_Mobility]=18 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=39 +CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=90 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9633,8 +9691,9 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=36 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=35 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9643,8 +9702,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM2_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 CharacterBaseStats[eStat_ArmorMitigation]=0 -CharacterBaseStats[eStat_HP]=31 +CharacterBaseStats[eStat_HP]=26 CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9653,8 +9713,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM2_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=47 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=42 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=85 CharacterBaseStats[eStat_Defense]=0 @@ -9663,9 +9724,10 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM2_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=57 -CharacterBaseStats[eStat_Mobility]=18 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=52 +CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=90 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9675,8 +9737,9 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 -CharacterBaseStats[eStat_HP]=47 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=46 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9685,8 +9748,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM3_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=41 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=35 CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9695,8 +9759,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM3_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=61 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=55 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=85 CharacterBaseStats[eStat_Defense]=0 @@ -9705,9 +9770,10 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM3_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=74 -CharacterBaseStats[eStat_Mobility]=18 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=69 +CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=90 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9716,8 +9782,9 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM4 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 -CharacterBaseStats[eStat_HP]=68 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=61 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9727,8 +9794,9 @@ CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM4_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 -CharacterBaseStats[eStat_HP]=54 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=46 CharacterBaseStats[eStat_Mobility]=14 CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 @@ -9737,8 +9805,9 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM4_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=4 -CharacterBaseStats[eStat_HP]=88 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=74 CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=85 CharacterBaseStats[eStat_Defense]=0 @@ -9747,9 +9816,10 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 [ChosenSniperM4_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=4 -CharacterBaseStats[eStat_HP]=108 -CharacterBaseStats[eStat_Mobility]=18 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=92 +CharacterBaseStats[eStat_Mobility]=16 CharacterBaseStats[eStat_Offense]=90 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 @@ -9757,41 +9827,97 @@ CharacterBaseStats[eStat_CritChance]=0 CharacterBaseStats[eStat_FlankingCritChance]=40 -[ChosenAssassin X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +[ChosenSniperM5 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=89 +CharacterBaseStats[eStat_Mobility]=16 +CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=18 -CharacterBaseStats[eStat_Mobility]=9 -CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_CritChance]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 -[ChosenAssassin_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_AlertLevel]=2 +CharacterBaseStats[eStat_PsiOffense]=60 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_DetectionRadius]=12 +CharacterBaseStats[eStat_UtilityItems]=2 +CharacterBaseStats[eStat_Will]=50 +CharacterBaseStats[eStat_HackDefense]=125 +CharacterBaseStats[eStat_FlankingCritChance]=33 +CharacterBaseStats[eStat_FlankingAimBonus]=0 +CharacterBaseStats[eStat_Strength]=50 + +[ChosenSniperM5_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=67 +CharacterBaseStats[eStat_Mobility]=14 +CharacterBaseStats[eStat_Offense]=80 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=15 -CharacterBaseStats[eStat_Mobility]=9 -CharacterBaseStats[eStat_Offense]=70 - +CharacterBaseStats[eStat_CritChance]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + +[ChosenSniperM5_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=106 +CharacterBaseStats[eStat_Mobility]=16 +CharacterBaseStats[eStat_Offense]=85 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=20 +CharacterBaseStats[eStat_CritChance]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + +[ChosenSniperM5_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_HP]=133 +CharacterBaseStats[eStat_Mobility]=16 +CharacterBaseStats[eStat_Offense]=90 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_CritChance]=0 +CharacterBaseStats[eStat_FlankingCritChance]=40 + + +[ChosenAssassin X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=18 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=75 + +[ChosenAssassin_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=14 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=70 + [ChosenAssassin_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=26 +CharacterBaseStats[eStat_HP]=22 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassin_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=30 +CharacterBaseStats[eStat_HP]=27 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=80 [ChosenAssassinM2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 CharacterBaseStats[eStat_HP]=24 @@ -9799,95 +9925,137 @@ CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM2_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=1 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=20 +CharacterBaseStats[eStat_HP]=18 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=70 [ChosenAssassinM2_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=34 +CharacterBaseStats[eStat_HP]=29 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM2_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=39 +CharacterBaseStats[eStat_HP]=36 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=80 [ChosenAssassinM3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=31 +CharacterBaseStats[eStat_HP]=32 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM3_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=25 +CharacterBaseStats[eStat_HP]=24 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=70 [ChosenAssassinM3_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=44 +CharacterBaseStats[eStat_HP]=38 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM3_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=4 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=50 +CharacterBaseStats[eStat_HP]=48 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=80 [ChosenAssassinM4 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=3 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=40 +CharacterBaseStats[eStat_HP]=32 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM4_Diff_0 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=2 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=32 +CharacterBaseStats[eStat_HP]=24 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=70 [ChosenAssassinM4_Diff_2 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=4 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=56 +CharacterBaseStats[eStat_HP]=40 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=75 [ChosenAssassinM4_Diff_3 X2CharacterTemplate] -CharacterBaseStats[eStat_ArmorMitigation]=6 +CharacterBaseStats[eStat_ArmorMitigation]=0 CharacterBaseStats[eStat_Defense]=0 CharacterBaseStats[eStat_Dodge]=0 -CharacterBaseStats[eStat_HP]=67 +CharacterBaseStats[eStat_HP]=64 CharacterBaseStats[eStat_Mobility]=9 CharacterBaseStats[eStat_Offense]=80 +[ChosenAssassinM5 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=56 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=75 + +CharacterBaseStats[eStat_AlertLevel]=2 +CharacterBaseStats[eStat_PsiOffense]=60 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_DetectionRadius]=12 +CharacterBaseStats[eStat_UtilityItems]=2 +CharacterBaseStats[eStat_Will]=50 +CharacterBaseStats[eStat_HackDefense]=125 +CharacterBaseStats[eStat_FlankingCritChance]=33 +CharacterBaseStats[eStat_FlankingAimBonus]=0 +CharacterBaseStats[eStat_Strength]=50 + +[ChosenAssassinM5_Diff_0 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=43 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=70 + +[ChosenAssassinM5_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=68 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=75 + +[ChosenAssassinM5_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=85 +CharacterBaseStats[eStat_Mobility]=9 +CharacterBaseStats[eStat_Offense]=80 [TheLostHP2 X2CharacterTemplate] CharacterBaseStats[eStat_Mobility]=14 @@ -10193,6 +10361,92 @@ CharacterBaseStats[eStat_Mobility]=14 +SupportedFollowers=TheLostGrapplerHP11_LW +SupportedFollowers=TheLostGrapplerHP12_LW +[TheLostBrute X2CharacterTemplate] ++CharacterBaseStats[eStat_AlertLevel]=2 ++CharacterBaseStats[eStat_ArmorChance]=0 ++CharacterBaseStats[eStat_ArmorMitigation]=0 ++CharacterBaseStats[eStat_ArmorPiercing]=0 ++CharacterBaseStats[eStat_CritChance]=0 ++CharacterBaseStats[eStat_Defense]=10 ++CharacterBaseStats[eStat_Dodge]=0 ++CharacterBaseStats[eStat_HP]=10 ++CharacterBaseStats[eStat_Mobility]=10 ++CharacterBaseStats[eStat_Offense]=80 ++CharacterBaseStats[eStat_PsiOffense]=0 ++CharacterBaseStats[eStat_ReserveActionPoints]=0 ++CharacterBaseStats[eStat_SightRadius]=27 ++CharacterBaseStats[eStat_DetectionRadius]=12 ++CharacterBaseStats[eStat_UtilityItems]=1 ++CharacterBaseStats[eStat_Will]=70 ++CharacterBaseStats[eStat_HackDefense]=0 ++CharacterBaseStats[eStat_FlankingCritChance]=33 ++CharacterBaseStats[eStat_FlankingAimBonus]=0 ++CharacterBaseStats[eStat_Strength]=50 ++XpKillscore=5.45 ++DirectXpAmount=10 + ++SupportedFollowers=TheLostHP2 ++SupportedFollowers=TheLostHP3 ++SupportedFollowers=TheLostHP4 ++SupportedFollowers=TheLostHP5 ++SupportedFollowers=TheLostHP6 ++SupportedFollowers=TheLostHP7 ++SupportedFollowers=TheLostHP8 ++SupportedFollowers=TheLostHP9 ++SupportedFollowers=TheLostHP10 ++SupportedFollowers=TheLostHP11 ++SupportedFollowers=TheLostHP12 ++SupportedFollowers=TheLostDasherHP2 ++SupportedFollowers=TheLostDasherHP3 ++SupportedFollowers=TheLostDasherHP4 ++SupportedFollowers=TheLostDasherHP5 ++SupportedFollowers=TheLostDasherHP6 ++SupportedFollowers=TheLostDasherHP7 ++SupportedFollowers=TheLostDasherHP8 ++SupportedFollowers=TheLostDasherHP9 ++SupportedFollowers=TheLostDasherHP10 ++SupportedFollowers=TheLostDasherHP11 ++SupportedFollowers=TheLostDasherHP12 ++SupportedFollowers=TheLostDasherHP13 ++SupportedFollowers=TheLostDasherHP14 ++SupportedFollowers=TheLostDasherHP15 ++SupportedFollowers=TheLostDasherHP16 ++SupportedFollowers=TheLostDasherHP17 ++SupportedFollowers=TheLostDasherHP18 ++SupportedFollowers=TheLostDasherHP19 ++SupportedFollowers=TheLostDasherHP20 ++SupportedFollowers=TheLostDasherHP21 ++SupportedFollowers=TheLostDasherHP22 ++SupportedFollowers=TheLostBruteHP10_LW ++SupportedFollowers=TheLostBruteHP11_LW ++SupportedFollowers=TheLostBruteHP12_LW ++SupportedFollowers=TheLostBruteHP14_LW ++SupportedFollowers=TheLostBruteHP15_LW ++SupportedFollowers=TheLostBruteHP16_LW ++SupportedFollowers=TheLostBruteHP18_LW ++SupportedFollowers=TheLostBruteHP21_LW ++SupportedFollowers=TheLostBruteHP23_LW ++SupportedFollowers=TheLostBruteHP25_LW ++SupportedFollowers=TheLostGrapplerHP2_LW ++SupportedFollowers=TheLostGrapplerHP3_LW ++SupportedFollowers=TheLostGrapplerHP4_LW ++SupportedFollowers=TheLostGrapplerHP5_LW ++SupportedFollowers=TheLostGrapplerHP6_LW ++SupportedFollowers=TheLostGrapplerHP7_LW ++SupportedFollowers=TheLostGrapplerHP8_LW ++SupportedFollowers=TheLostGrapplerHP9_LW ++SupportedFollowers=TheLostGrapplerHP10_LW ++SupportedFollowers=TheLostGrapplerHP11_LW ++SupportedFollowers=TheLostGrapplerHP12_LW + +[TheLostBrute_Diff_2 X2CharacterTemplate] ++CharacterBaseStats[eStat_Offense]=85 ++CharacterBaseStats[eStat_FlankingCritChance]=40 + +[TheLostBrute_Diff_3 X2CharacterTemplate] ++CharacterBaseStats[eStat_Offense]=90 ++CharacterBaseStats[eStat_FlankingCritChance]=40 + [TheLostBruteHP10_LW X2CharacterTemplate] +CharacterBaseStats[eStat_AlertLevel]=2 +CharacterBaseStats[eStat_ArmorChance]=0 @@ -11140,6 +11394,82 @@ CharacterBaseStats[eStat_Mobility]=14 +CharacterBaseStats[eStat_Offense]=90 +CharacterBaseStats[eStat_FlankingCritChance]=40 +[TheLostGrappler X2CharacterTemplate] +CharacterBaseStats[eStat_AlertLevel]=2 +CharacterBaseStats[eStat_ArmorChance]=0 +CharacterBaseStats[eStat_ArmorMitigation]=0 +CharacterBaseStats[eStat_ArmorPiercing]=0 +CharacterBaseStats[eStat_CritChance]=0 +CharacterBaseStats[eStat_Defense]=0 +CharacterBaseStats[eStat_Dodge]=0 +CharacterBaseStats[eStat_HP]=2 +CharacterBaseStats[eStat_Mobility]=10 +CharacterBaseStats[eStat_Offense]=75 +CharacterBaseStats[eStat_PsiOffense]=0 +CharacterBaseStats[eStat_ReserveActionPoints]=0 +CharacterBaseStats[eStat_SightRadius]=27 +CharacterBaseStats[eStat_DetectionRadius]=12 +CharacterBaseStats[eStat_UtilityItems]=1 +CharacterBaseStats[eStat_Will]=50 +CharacterBaseStats[eStat_HackDefense]=0 +CharacterBaseStats[eStat_FlankingCritChance]=33 +CharacterBaseStats[eStat_FlankingAimBonus]=0 +CharacterBaseStats[eStat_Strength]=50 +XpKillscore=5.45 +DirectXpAmount=10 +MaxCharactersPerGroup=2 ++SupportedFollowers=TheLostHP2 ++SupportedFollowers=TheLostHP3 ++SupportedFollowers=TheLostHP4 ++SupportedFollowers=TheLostHP5 ++SupportedFollowers=TheLostHP6 ++SupportedFollowers=TheLostHP7 ++SupportedFollowers=TheLostHP8 ++SupportedFollowers=TheLostHP9 ++SupportedFollowers=TheLostHP10 ++SupportedFollowers=TheLostHP11 ++SupportedFollowers=TheLostHP12 ++SupportedFollowers=TheLostDasherHP2 ++SupportedFollowers=TheLostDasherHP3 ++SupportedFollowers=TheLostDasherHP4 ++SupportedFollowers=TheLostDasherHP5 ++SupportedFollowers=TheLostDasherHP6 ++SupportedFollowers=TheLostDasherHP7 ++SupportedFollowers=TheLostDasherHP8 ++SupportedFollowers=TheLostDasherHP9 ++SupportedFollowers=TheLostDasherHP10 ++SupportedFollowers=TheLostDasherHP11 ++SupportedFollowers=TheLostDasherHP12 ++SupportedFollowers=TheLostDasherHP13 ++SupportedFollowers=TheLostDasherHP14 ++SupportedFollowers=TheLostDasherHP15 ++SupportedFollowers=TheLostDasherHP16 ++SupportedFollowers=TheLostDasherHP17 ++SupportedFollowers=TheLostDasherHP18 ++SupportedFollowers=TheLostDasherHP19 ++SupportedFollowers=TheLostDasherHP20 ++SupportedFollowers=TheLostDasherHP21 ++SupportedFollowers=TheLostDasherHP22 ++SupportedFollowers=TheLostGrapplerHP2_LW ++SupportedFollowers=TheLostGrapplerHP3_LW ++SupportedFollowers=TheLostGrapplerHP4_LW ++SupportedFollowers=TheLostGrapplerHP5_LW ++SupportedFollowers=TheLostGrapplerHP6_LW ++SupportedFollowers=TheLostGrapplerHP7_LW ++SupportedFollowers=TheLostGrapplerHP8_LW ++SupportedFollowers=TheLostGrapplerHP9_LW ++SupportedFollowers=TheLostGrapplerHP10_LW ++SupportedFollowers=TheLostGrapplerHP11_LW ++SupportedFollowers=TheLostGrapplerHP12_LW + +[TheLostGrappler_Diff_2 X2CharacterTemplate] +CharacterBaseStats[eStat_Offense]=85 +CharacterBaseStats[eStat_FlankingCritChance]=40 + +[TheLostGrappler_Diff_3 X2CharacterTemplate] +CharacterBaseStats[eStat_Offense]=90 +CharacterBaseStats[eStat_FlankingCritChance]=40 + [TheLostGrapplerHP2_LW X2CharacterTemplate] CharacterBaseStats[eStat_AlertLevel]=2 CharacterBaseStats[eStat_ArmorChance]=0 diff --git a/LongWarOfTheChosen/Config/XComGameData_SoldierSkills.ini b/LongWarOfTheChosen/Config/XComGameData_SoldierSkills.ini index 3ed5713af..c6bd687f3 100644 --- a/LongWarOfTheChosen/Config/XComGameData_SoldierSkills.ini +++ b/LongWarOfTheChosen/Config/XComGameData_SoldierSkills.ini @@ -12,6 +12,7 @@ VOLATILE_RADIUS=1.0f DEMO_HIT_BONUS=50 DEMOLITION_COOLDOWN=5 CHAINSHOT_HIT_MOD=-10 +CHAINSHOT_COOLDOWN=3 SATURATION_FIRE_COOLDOWN=7 SATURATION_TILE_WIDTH=5 SATURATION_DESTRUCTION_CHANCE=50 @@ -27,7 +28,7 @@ SCANNING_PROTOCOL_CHARGES=1 REVIVAL_PROTOCOL_CHARGES=2 [XComGame.X2Ability_PsiOperativeAbilitySet] -SOULFIRE_COOLDOWN=2 +SOULFIRE_COOLDOWN=3 STASIS_COOLDOWN=5 INSANITY_COOLDOWN=1 DOMINATION_COOLDOWN=7 @@ -124,17 +125,25 @@ FOCUS3MOBILITY=0 FOCUS3DODGE=0 FOCUS3RENDDAMAGE=0 +-FocusKillAbilities=IonicStorm +-FocusKillAbilities=ArcWave +-FocusKillAbilities=Rend +-FocusKillAbilities=ArcWave_LW +-FocusKillAbilities=Rend_LW + OVERCHARGE_FOCUS_CHANCE=100 -AmplifyBonusDamageMult=0.35f +AmplifyBonusDamageMult=0.5f AmplifyMinBonusDamage=1 AMPLIFY_COOLDOWN=3 ; Remove the semicolons behind the two lines below and add a value to the "+" line if you want to customize Pillar's cooldown. ;-PILLAR_COOLDOWN=1 ;+PILLAR_COOLDOWN= PILLAR_COOLDOWN = 4 -VoltHitMod=5 +VoltHitMod=15 +ChannelChance=33 +ChannelPsionicChance=50 INVERT_COOLDOWN=5 ; Customize the base hit chance in the "+" line all you want. StunStrikeHitChance=85 @@ -178,15 +187,14 @@ STUNSTRIKE_COOLDOWN=2 +AbilitiesGhostCantHave="GreaterPadding_BM" +AbilitiesGhostCantHave="Indomitable" +AbilitiesGhostCantHave="TemplarTerror" ++AbilitiesGhostCantHave="IRI_TemplarShield" VoidConduitInitialDamage=1 VoidConduitPerActionDamage=3 VoidConduitHPMod=1.0f +VOIDCONDUIT_COOLDOWN=3 --FocusKillAbilities=IonicStorm --FocusKillAbilities=ArcWave --FocusKillAbilities=Rend [XComGame.X2AbilityMultiTarget_Volt] ;DistanceBetweenTargets=230400.0f ; unreal units squared @@ -252,15 +260,15 @@ SOULSTEALER_HP_MOD=0.75f [XComGame.X2Ability_AdvPriest] HOLYWARRIOR_M1_MOBILITY=2 HOLYWARRIOR_M1_OFFENSE=15 -HOLYWARRIOR_M1_CRIT=25 +HOLYWARRIOR_M1_CRIT=15 HOLYWARRIOR_M1_HP=3 HOLYWARRIOR_M2_MOBILITY=4 HOLYWARRIOR_M2_OFFENSE=20 -HOLYWARRIOR_M2_CRIT=35 +HOLYWARRIOR_M2_CRIT=20 HOLYWARRIOR_M2_HP=6 HOLYWARRIOR_M3_MOBILITY=6 HOLYWARRIOR_M3_OFFENSE=25 -HOLYWARRIOR_M3_CRIT=50 +HOLYWARRIOR_M3_CRIT=25 HOLYWARRIOR_M3_HP=9 [LW_Overhaul.X2Effect_Sustain_LW] @@ -276,7 +284,16 @@ MIND_CONTROL_GLOBAL_COOLDOWN_AI=1 MIND_CONTROL_AI_TURNS_DURATION=2 [XComGame.X2Ability_ChosenWarlock] +WARLOCKLEVEL_M1=1 +WARLOCKLEVEL_M2=2 +WARLOCKLEVEL_M3=3 +WARLOCKLEVEL_M4=4 TELEPORTALLY_COOLDOWN_LOCAL=3 +SPECTRALARMY_COOLDOWN_LOCAL=6 +SPECTRALARMY_COOLDOWN_GLOBAL=6 +CORRESS_COOLDOWN_LOCAL=5 +CORRESS_COOLDOWN_GLOBAL=5 +MINDSCORCH_COOLDOWN_LOCAL=3 [XComGame.X2Ability_ChosenAssassin] PARTINGSILK_PUSH_APPLY_CHANCE_PERCENT=0 @@ -301,7 +318,7 @@ VANISHINGWIND_REVEAL_IGNORE_ABILITIES=PartingSilk LOSTANDABANDONED_HEALTH_THRESHOLD_PERCENT=0.5 [XComGame.X2Ability_ChosenSniper] -HUNTERGRAPPLE_COOLDOWN_NUM_TURNS=2 +HUNTERGRAPPLE_COOLDOWN_NUM_TURNS=3 [XComGame.X2Ability_Civilian] EasyToHitMod=0 \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComGameData_WeaponData.ini b/LongWarOfTheChosen/Config/XComGameData_WeaponData.ini index 9ae75278a..c275f3ec0 100644 --- a/LongWarOfTheChosen/Config/XComGameData_WeaponData.ini +++ b/LongWarOfTheChosen/Config/XComGameData_WeaponData.ini @@ -810,11 +810,11 @@ SNIPERRIFLE_COIL_ICLIPSIZE=3 SNIPERRIFLE_COIL_ISOUNDRANGE=30 SNIPERRIFLE_COIL_IENVIRONMENTDAMAGE=1 -AssaultRifle_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilRifle_Base" -SMG_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilSMG_Base" -Cannon_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilCannon_Base" -Shotgun_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_Base" -SniperRifle_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_Base" +AssaultRifle_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilRifle_Base" +SMG_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilSMG_Base" +Cannon_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilCannon_Base" +Shotgun_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilShotgun_Base" +SniperRifle_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilSniperRifle_Base" SHORT_COIL_RANGE[0] = 60 SHORT_COIL_RANGE[1] = 60 @@ -1375,7 +1375,7 @@ LWPISTOL_COIL_IENVIRONMENTDAMAGE=0 [LW_Overhaul.X2Item_LWGauntlet] ;*********** CONVENTIONAL TIER ************* -Gauntlet_CV_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Conv_LWGauntlet" +Gauntlet_CV_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Conv_LWGauntlet" Gauntlet_Primary_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=2, PlusOne=50, Crit=0, Pierce=0, Shred=2, Tag="", DamageType="Explosion") Gauntlet_Secondary_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=1, PlusOne=50, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Napalm") @@ -1399,7 +1399,7 @@ Gauntlet_Secondary_CONVENTIONAL_ISOUNDRANGE=20 ; ********** MAG TIER *********** -Gauntlet_MG_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_PlatedGauntlet" +Gauntlet_MG_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_PlatedGauntlet" Gauntlet_Primary_MAG_BASEDAMAGE=(Damage=6, Spread=2, PlusOne=50, Crit=0, Pierce=0, Shred=2, Tag="", DamageType="Explosion") Gauntlet_Secondary_MAG_BASEDAMAGE=(Damage=6, Spread=2, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Napalm") @@ -1418,7 +1418,7 @@ Gauntlet_Secondary_MAG_RADIUS=5 Gauntlet_Secondary_MAG_ISOUNDRANGE=20 ;*********** BEAM TIER ************* -Gauntlet_BM_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Beam_PowerGauntlet" +Gauntlet_BM_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Beam_PowerGauntlet" Gauntlet_Primary_BEAM_BASEDAMAGE=(Damage=8, Spread=3, PlusOne=50, Crit=0, Pierce=0, Shred=3, Tag="", DamageType="Explosion") Gauntlet_Secondary_BEAM_BASEDAMAGE=(Damage=9, Spread=2, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Napalm") @@ -1436,9 +1436,9 @@ Gauntlet_Secondary_BEAM_RADIUS=5 Gauntlet_Secondary_BEAM_ISOUNDRANGE=20 [LW_Overhaul.X2Item_LWHolotargeter] -Holotargeter_CV_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Conv_LWHolotargeter" -Holotargeter_MG_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_LWHolotargeter" -Holotargeter_BM_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Beam_LWHolotargeter" +Holotargeter_CV_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Conv_LWHolotargeter" +Holotargeter_MG_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_LWHolotargeter" +Holotargeter_BM_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Beam_LWHolotargeter" ; Damage is amount of bonus damage that Vital Point Targeting will provide, PlusOne is supported except in UI Holotargeter_CONVENTIONAL_BASEDAMAGE=(Damage=1, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Projectile_Conventional") @@ -1471,9 +1471,9 @@ Holotargeter_BEAM_ISOUNDRANGE=1 Holotargeter_BEAM_IENVIRONMENTDAMAGE = 0 [LW_Overhaul.X2Item_LWSawedOffShotgun] -SawedOffShotgun_CV_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Conv_SawedOffShotgun" -SawedOffShotgun_MG_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_SawedOffShotgun" -SawedOffShotgun_BM_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_SawedOffShotgun" +SawedOffShotgun_CV_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Conv_SawedOffShotgun" +SawedOffShotgun_MG_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_SawedOffShotgun" +SawedOffShotgun_BM_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_SawedOffShotgun" SawedOffShotgun_CONVENTIONAL_BASEDAMAGE=(Damage=6, Spread=2, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_Conventional") SawedOffShotgun_MAGNETIC_BASEDAMAGE=(Damage=10, Spread=3, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagXCom") SawedOffShotgun_BEAM_BASEDAMAGE=(Damage=14, Spread=4, PlusOne=0, Crit=7, Pierce=0, Shred=0, Tag="", DamageType="Projectile_BeamXCom") @@ -1515,9 +1515,9 @@ SAWED_OFF_RANGE[6]=-80 SAWED_OFF_RANGE[7]=-100 [LW_Overhaul.X2Item_ArcthrowerWeapon] -Arcthrower_CV_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Conv_Arcthrower" -Arcthrower_MG_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_Arcthrower" -Arcthrower_BM_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Beam_Arcthrower" +Arcthrower_CV_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Conv_Arcthrower" +Arcthrower_MG_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_Arcthrower" +Arcthrower_BM_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Beam_Arcthrower" ;damage only applies for EMPulser against mechanical units Arcthrower_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=1, PlusOne=50, Crit=0, Pierce=9999, Shred=0, Tag="", DamageType="Projectile_Conventional") @@ -1548,9 +1548,9 @@ Arcthrower_BEAM_IENVIRONMENTDAMAGE = 0 [LW_Overhaul.X2Item_LWCombatKnife] -CombatKnife_CV_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Conv_CombatKnife" -CombatKnife_MG_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_CombatKnife" -CombatKnife_BM_UIImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Mag_CombatKnife" +CombatKnife_CV_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Conv_CombatKnife" +CombatKnife_MG_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_CombatKnife" +CombatKnife_BM_UIImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Mag_CombatKnife" CombatKnife_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Melee") CombatKnife_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=75, Crit=5, Pierce=2, Shred=0, Tag="", DamageType="Melee") @@ -1699,9 +1699,9 @@ AdvGeneralM2_LW_WPN_BASEDAMAGE= (Damage=8, Spread = 2, PlusOne = 0, Crit = 4 [DLC_2.X2Item_DLC_Day60Weapons] -HUNTERRIFLE_CONVENTIONAL_BASEDAMAGE= (Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=0, Shred=1, Tag="", DamageType="Projectile_Conventional") -HUNTERRIFLE_MAGNETIC_BASEDAMAGE= (Damage=9, Spread=2, PlusOne=0, Crit=4, Pierce=0, Shred=1, Tag="", DamageType="Projectile_MagXCom") -HUNTERRIFLE_BEAM_BASEDAMAGE= (Damage=12, Spread=3, PlusOne=50, Crit=6, Pierce=0, Shred=1, Rupture=1, Tag="", DamageType="Projectile_BeamXCom") +HUNTERRIFLE_CONVENTIONAL_BASEDAMAGE= (Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=1, Shred=0, Tag="", DamageType="Projectile_Conventional") +HUNTERRIFLE_MAGNETIC_BASEDAMAGE= (Damage=9, Spread=2, PlusOne=0, Crit=4, Pierce=1, Shred=0, Tag="", DamageType="Projectile_MagXCom") +HUNTERRIFLE_BEAM_BASEDAMAGE= (Damage=12, Spread=3, PlusOne=50, Crit=6, Pierce=1, Shred=0, Rupture=1, Tag="", DamageType="Projectile_BeamXCom") HUNTERPISTOL_CONVENTIONAL_BASEDAMAGE=(Damage=2, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Projectile_Conventional") HUNTERPISTOL_MAGNETIC_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagXCom") @@ -1922,20 +1922,26 @@ SHARDGAUNTLET_CONVENTIONAL_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pi -SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") -SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") -+SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=75, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") -+SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=7, Spread=1, PlusOne=75, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=6, Spread=1, PlusOne=0, Crit=3, Pierce=0, Tag="IRI_SoulShot", DamageType="Psi") ++SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Tag="IRI_TemplarShield", DamageType="Psi") + ++SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=67, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") ++SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=67, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") +SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm", DamageType="Psi") +SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") ++SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=10, Spread=2, PlusOne=50, Crit=5, Pierce=0, Tag="IRI_SoulShot", DamageType="Psi") ++SHARDGAUNTLET_MAGNETIC_EXTRADAMAGE=(Damage=9, Spread=0, PlusOne=0, Crit=0, Pierce=0, Tag="IRI_TemplarShield", DamageType="Psi") -+SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") -+SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=11, Spread=1, PlusOne=50, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") ++SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=6, Spread=1, PlusOne=67, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") ++SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=6, Spread=1, PlusOne=67, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") +SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm", DamageType="Psi") +SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") - -+SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="Volt", DamageType="Psi") -+SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="Volt_Psi", DamageType="Psi") -+SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=2, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm", DamageType="Psi") -+SHARDGAUNTLET_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=0, Pierce=0, Tag="IonicStorm_Psi", DamageType="Psi") ++SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=15, Spread=2, PlusOne=0, Crit=7, Pierce=0, Tag="IRI_SoulShot", DamageType="Psi") ++SHARDGAUNTLET_BEAM_EXTRADAMAGE=(Damage=14, Spread=0, PlusOne=0, Crit=0, Pierce=0, Tag="IRI_TemplarShield", DamageType="Psi") SHARDGAUNTLET_CONVENTIONAL_AIM=20 SHARDGAUNTLET_CONVENTIONAL_CRITCHANCE=0 @@ -2097,44 +2103,44 @@ VEKTOR_BEAM_RANGE[25] = 0 -CHOSENSNIPERPISTOL_T4_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -CHOSENSNIPERPISTOL_XCOM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=5, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSWORD_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Melee") -+CHOSENSWORD_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") -+CHOSENSWORD_MAGNETIC_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Melee") -+CHOSENSWORD_MAGNETIC_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") -+CHOSENSWORD_BEAM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Melee") -+CHOSENSWORD_BEAM_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") -+CHOSENSWORD_T4_BASEDAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=3, Pierce=5, Shred=0, Tag="", DamageType="Melee") -+CHOSENSWORD_T4_EXTRADAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=3, Pierce=5, Shred=0, Tag = "PartingSilk", DamageType="Melee") +CHOSENSWORD_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_CONVENTIONAL_EXTRADAMAGE=(Damage=3, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") +CHOSENSWORD_MAGNETIC_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_MAGNETIC_EXTRADAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") +CHOSENSWORD_BEAM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_BEAM_EXTRADAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") +CHOSENSWORD_T4_BASEDAMAGE=(Damage=6, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_T4_EXTRADAMAGE=(Damage=6, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") -+CHOSENSWORD_XCOM_BASEDAMAGE=(Damage=9, Spread=2, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_XCOM_BASEDAMAGE=(Damage=9, Spread=2, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Melee") -+CHOSENRIFLE_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENRIFLE_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=50, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENRIFLE_BEAM_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=0, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENRIFLE_T4_BASEDAMAGE=(Damage=12, Spread=1, PlusOne=0, Crit=6, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENRIFLE_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENRIFLE_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENRIFLE_BEAM_BASEDAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENRIFLE_T4_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENRIFLE_XCOM_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENRIFLE_XCOM_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSHOTGUN_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=0, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSHOTGUN_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=0, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSHOTGUN_BEAM_BASEDAMAGE=(Damage=7, Spread=0, PlusOne=0, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSHOTGUN_T4_BASEDAMAGE=(Damage=10, Spread=0, PlusOne=75, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSHOTGUN_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=0, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSHOTGUN_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=0, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSHOTGUN_BEAM_BASEDAMAGE=(Damage=7, Spread=0, PlusOne=0, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSHOTGUN_T4_BASEDAMAGE=(Damage=8, Spread=0, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSHOTGUN_XCOM_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=25, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSHOTGUN_XCOM_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=25, Crit=8, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERRIFLE_CONVENTIONAL_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERRIFLE_MAGNETIC_BASEDAMAGE=(Damage=6, Spread=1, PlusOne=75, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERRIFLE_BEAM_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERRIFLE_T4_BASEDAMAGE=(Damage=13, Spread=1, PlusOne=75, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERRIFLE_CONVENTIONAL_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERRIFLE_MAGNETIC_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERRIFLE_BEAM_BASEDAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERRIFLE_T4_BASEDAMAGE=(Damage=8, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERRIFLE_XCOM_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=25, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERRIFLE_XCOM_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=25, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERPISTOL_CONVENTIONAL_BASEDAMAGE=(Damage=2, Spread=0, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERPISTOL_MAGNETIC_BASEDAMAGE=(Damage=3, Spread=0, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagXCom") -+CHOSENSNIPERPISTOL_BEAM_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERPISTOL_T4_BASEDAMAGE=(Damage=6, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERPISTOL_CONVENTIONAL_BASEDAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERPISTOL_MAGNETIC_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagXCom") +CHOSENSNIPERPISTOL_BEAM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERPISTOL_T4_BASEDAMAGE=(Damage=6, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") -+CHOSENSNIPERPISTOL_XCOM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") +CHOSENSNIPERPISTOL_XCOM_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") CHOSENRIFLE_CONVENTIONAL_ICLIPSIZE=6 CHOSENRIFLE_MAGNETIC_ICLIPSIZE=6 @@ -2181,9 +2187,52 @@ CHOSENRIFLE_BEAM_IENVIRONMENTDAMAGE=2 CHOSENRIFLE_T4_IENVIRONMENTDAMAGE=3 CHOSENRIFLE_XCOM_IENVIRONMENTDAMAGE=3 -CHOSENRIFLE_XCOM_AIM=10 +CHOSENRIFLE_XCOM_AIM=0 CHOSENRIFLE_XCOM_CRITCHANCE=0 + +[LW_Overhaul.X2Item_ChosenWeapons] + +CHOSENSHOTGUN_T5_BASEDAMAGE=(Damage=10, Spread=0, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") + +CHOSENSHOTGUN_T5_AIM=0 +CHOSENSHOTGUN_T5_CRITCHANCE=25 +CHOSENSHOTGUN_T5_ICLIPSIZE=4 +CHOSENSHOTGUN_T5_ISOUNDRANGE=30 +CHOSENSHOTGUN_T5_IENVIRONMENTDAMAGE=3 + +CHOSENSWORD_T5_BASEDAMAGE=(Damage=7, Spread=0, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Melee") +CHOSENSWORD_T5_EXTRADAMAGE=(Damage=7, Spread=0, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag = "PartingSilk", DamageType="Melee") + +CHOSENSWORD_T5_AIM=100 +CHOSENSWORD_T5_CRITCHANCE=150 +CHOSENSWORD_T5_ISOUNDRANGE=8 +CHOSENSWORD_T5_IENVIRONMENTDAMAGE=1 + +CHOSENRIFLE_T5_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") + +CHOSENRIFLE_T5_AIM=0 +CHOSENRIFLE_T5_CRITCHANCE=0 +CHOSENRIFLE_T5_ICLIPSIZE=4 +CHOSENRIFLE_T5_ISOUNDRANGE=27 +CHOSENRIFLE_T5_IENVIRONMENTDAMAGE=3 + +CHOSENSNIPERRIFLE_T5_BASEDAMAGE=(Damage=10, Spread=2, PlusOne=0, Crit=5, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") + +CHOSENSNIPERRIFLE_T5_CRITCHANCE=10 +CHOSENSNIPERRIFLE_T5_ICLIPSIZE=3 +CHOSENSNIPERRIFLE_T5_ISOUNDRANGE=27 +CHOSENSNIPERRIFLE_T5_IENVIRONMENTDAMAGE=3 + +CHOSENSNIPERPISTOL_T5_BASEDAMAGE=(Damage=7, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Projectile_MagAdvent") + +CHOSENSNIPERPISTOL_T5_AIM=0 +CHOSENSNIPERPISTOL_T5_CRITCHANCE=0 +CHOSENSNIPERPISTOL_T5_ICLIPSIZE=99 +CHOSENSNIPERPISTOL_T5_ISOUNDRANGE=15 +CHOSENSNIPERPISTOL_T5_IENVIRONMENTDAMAGE=3 + + [LW_WeaponsAndArmor.X2Item_FactionWeapons] ;Bukllpup stats BULLPUP_LASER_BASEDAMAGE=(Damage=4, Spread=1, PlusOne=75, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Projectile_BeamXCom") @@ -2363,7 +2412,7 @@ TEMPLAR_PISTOL_RANGE[24] = -90 TEMPLAR_PISTOL_RANGE[25] = -100 Bullpup_Laser_ImagePath="UILibrary_LW_LaserPack.LaserSMG_Base" -Bullpup_Coil_ImagePath="UILibrary_LW_Overhaul.InventoryArt.CoilSMG_Base" +Bullpup_Coil_ImagePath="UILibrary_LWOTC.InventoryArt.CoilSMG_Base" Vektor_Laser_ImagePath="UILibrary_WolfWeaponPack.UI_Laser_Strike_Rifle" Vektor_Coil_ImagePath="UILibrary_WolfWeaponPack.UI_Coil_Strike_Rifle" @@ -2482,10 +2531,13 @@ THELOST_BRUTE_TIER4_MELEEATTACK_BASEDAMAGE=(Damage=8, Spread = 2, PlusOne = 50, [LW_WeaponsAndArmor.X2Item_SecondaryThrowingKnives] THROWING_KNIFE_CHARGES=4 THROWING_KNIFE_AIM=10 -THROWING_KNIFE_CRITCHANCE=20 THROWING_KNIFE_ISOUNDRANGE=0 THROWING_KNIFE_IENVIRONMENTDAMAGE=0 +THROWING_KNIFE_CV_CRITCHANCE=20 +THROWING_KNIFE_MG_CRITCHANCE=25 +THROWING_KNIFE_BM_CRITCHANCE=30 + THROWING_KNIFE_CV_BASEDAMAGE=(Damage=2, Spread=0, PlusOne=50, Crit=2, Pierce=0, Shred=0, Tag="", DamageType="Melee") THROWING_KNIFE_MG_BASEDAMAGE=(Damage=5, Spread=1, PlusOne=0, Crit=3, Pierce=0, Shred=0, Tag="", DamageType="Melee") THROWING_KNIFE_BM_BASEDAMAGE=(Damage=7, Spread=1, PlusOne=50, Crit=4, Pierce=0, Shred=0, Tag="", DamageType="Melee") @@ -2502,8 +2554,10 @@ THROWING_KNIFE_BM_BLEED_CHANCE=70 THROWING_KNIFE_BM_BLEED_DURATION=2 THROWING_KNIFE_BM_BLEED_DAMAGE=1 - [LW_WeaponsAndArmor.X2Item_Shields_LW] + +ENABLE_SHIELDS=true + SHIELD_CV_BASEDAMAGE=(Damage=3, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Projectile_Conventional") SHIELD_CV_AIM=20 SHIELD_CV_CRITCHANCE=0 @@ -2536,4 +2590,4 @@ SHIELD_BM_NUM_UPGRADE_SLOTS=0 +SHIELD_BM_ABILITIES=OneForAll +SHIELD_BM_ABILITIES=TemplarBallisticShield_BM +SHIELD_BM_ABILITIES=TemplarBallisticShield_GenerateCover -+SHIELD_BM_ABILITIES=GreaterPadding_BM ++SHIELD_BM_ABILITIES=GreaterPadding_BM \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComLW_Activities.ini b/LongWarOfTheChosen/Config/XComLW_Activities.ini index e867a7222..ed10bc06d 100644 --- a/LongWarOfTheChosen/Config/XComLW_Activities.ini +++ b/LongWarOfTheChosen/Config/XComLW_Activities.ini @@ -7,7 +7,7 @@ AVATAR_DELAY_HOURS_PER_NET_GLOBAL_VIG=10 ; Infiltration percentage that disables negative sitreps INFILTRATION_TO_DISABLE_SIT_REPS=1.25 -CHOSEN_APPEARANCE_ALERT_MOD = -5 +CHOSEN_APPEARANCE_ALERT_MOD = -3 INFILTRATION_SIT_REPS[0]="InfilSitRep_Easy" INFILTRATION_SIT_REPS[1]="InfilSitRep_Moderate" @@ -15,7 +15,10 @@ INFILTRATION_SIT_REPS[2]="InfilSitRep_Hard" INFILTRATION_SIT_REPS[3]="InfilSitRep_UltraHard" +INFILTRATION_SIT_REP_MISSION_FAMILIES="TroopManeuvers_LW" ++INFILTRATION_SIT_REP_MISSION_FAMILIES="CovertOpsTroopManeuvers_LW" +INFILTRATION_SIT_REP_MISSION_FAMILIES="SupplyLineRaid_LW" ++INFILTRATION_SIT_REP_MISSION_FAMILIES="SecureUFO_LW" +;+INFILTRATION_SIT_REP_MISSION_FAMILIES="Ted_BigSmashNGrab_LW" [LW_Overhaul.X2LWActivityDetectionCalc_Terror] +RESISTANCE_INFORMANT_DETECTION_DIVIDER[0]=10.0 @@ -122,6 +125,15 @@ PER_FACELESS_TERROR_DETECTION_MODIFIER=0.75 +FORCE_LEVEL_DETECTION_MODIFIER_LEGENDARY[19]=0 +FORCE_LEVEL_DETECTION_MODIFIER_LEGENDARY[20]=0 +; New System for boosting detection at the start of campaign. +BOOST_EARLY_DETECTION=true + +; How many days the new boost should last. +EARLY_DETECTION_DAYS=5 + +; flat % per day to add to detection calcs during the boosted period. +EARLY_DETECTION_CHANCE_BOOST=5 + [LW_Overhaul.X2LWActivityCooldown_UFO] ; How many DAYS between UFOs that level-up aliens worldwide. +FORCE_UFO_COOLDOWN_DAYS[0]=15 @@ -136,10 +148,12 @@ PER_FACELESS_TERROR_DETECTION_MODIFIER=0.75 +ALERT_UFO_COOLDOWN_DAYS[3]=10 [LW_Overhaul.X2LWActivityCreation_Reinforce] -MAX_ALERT_FOR_REINFORCE=15 ; Aliens won't move troops by land to regions with this much alert +; Aliens won't move troops by land to regions with this much alert +MAX_ALERT_FOR_REINFORCE=15 [LW_Overhaul.X2LWAlienActivityTemplate] -HOURS_BETWEEN_ALIEN_ACTIVITY_DETECTION_UPDATES=6 ; This is the timer between updates to detect existing alien activities +; This is the timer between updates to detect existing alien activities +HOURS_BETWEEN_ALIEN_ACTIVITY_DETECTION_UPDATES=6 [LW_Overhaul.X2LWActivityCondition_ResearchFacility] ; These are governors on the construction of facilities, with facilities requiring a safer world (for ADVENT) @@ -148,8 +162,10 @@ MAX_UNOBSTRUCTED_FACILITIES=3 GLOBAL_ALERT_DELTA_PER_EXTRA_FACILITY=10 [LW_Overhaul.X2LWActivityCondition_FullOutpostJobBuckets] -CONTACTED_REGIONS_BASE_BUCKET_MOD=0.85 ; this lowers the accumulated rebel job-days to throttle back retaliation rate as resistance spreads. Formula is ActualDays * (this number ^ (contacted regions - 1)) -LIBERATED_REGIONS_BASE_BUCKET_MOD=0.85 ; this further lowers the accumulated rebel job-days to throttle back retaliation rate. a Formula is ActualDays * (this number ^ liberated regions) +; this lowers the accumulated rebel job-days to throttle back retaliation rate as resistance spreads. Formula is ActualDays * (this number ^ (contacted regions - 1)) +CONTACTED_REGIONS_BASE_BUCKET_MOD=0.85 +; this further lowers the accumulated rebel job-days to throttle back retaliation rate. a Formula is ActualDays * (this number ^ liberated regions) +LIBERATED_REGIONS_BASE_BUCKET_MOD=0.85 [LW_Overhaul.X2LWActivityCondition_GeneralOpsCap] ; This puts a cap on how many "general ops" missions (single-mission activities that provide bonuses if you go on them but no loss if missed) can happen per month in a region, basically to limit activity-cycling abuses @@ -215,8 +231,9 @@ MAX_VIG_DECAY_CHANGE_HOURS=48 BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE [LW_Overhaul.X2LWActivityCondition_RNG_Region] -; can vary based on difficulty setting -+FACELESS_ROLL_MODIFIER[0] = 0.5; If an activity roll is modified by the presence of a faceless in haven, each faceless adds this much +; can vary based on difficulty setting' +; If an activity roll is modified by the presence of a faceless in haven, each faceless adds this much ++FACELESS_ROLL_MODIFIER[0] = 0.5 +FACELESS_ROLL_MODIFIER[1] = 1.0 +FACELESS_ROLL_MODIFIER[2] = 1.0 +FACELESS_ROLL_MODIFIER[3] = 1.0 @@ -406,6 +423,17 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ ) ++MissionSettings=(MissionOrFamilyName="CovertOpsTroopManeuvers_LW", \\ + AlertName="eAlert_GOps", \\ + MissionSound="GeoscapeFanfares_GuerillaOps", \\ + EventTrigger="OnGOpsPopup", \\ + MissionUIType=eMissionUI_GuerrillaOps, \\ + OverworldMeshPath="UI_3D.Overwold_Final.GorillaOps", \\ + MissionIconPath="img:///UILibrary_StrategyImages.X2StrategyMap.MissionIcon_GOPS", \\ + MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ + ) + + +MissionSettings=(MissionOrFamilyName="AssaultAlienBase_LW", \\ AlertName="eAlert_CouncilComm", \\ MissionSound="GeoscapeFanfares_AlienFacility", \\ @@ -446,6 +474,40 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ ) ++MissionSettings=(MissionOrFamilyName="Ted_BigSmashNGrab_LW", \\ + AlertName="eAlert_GOps", \\ + MissionSound="Geoscape_NewResistOpsMissions", \\ + EventTrigger="OnGOpsPopup", \\ + MissionUIType=eMissionUI_GuerrillaOps, \\ + OverworldMeshPath="UI_3D.Overwold_Final.GorillaOps", \\ + MissionIconPath="img:///UILibrary_StrategyImages.X2StrategyMap.MissionIcon_GOPS", \\ + MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ + ) + ++MissionSettings=(MissionOrFamilyName="SupplyExtraction_LW", \\ + AlertName="eAlert_GOps", \\ + MissionSound="Geoscape_NewResistOpsMissions", \\ + EventTrigger="OnGOpsPopup", \\ + MissionUIType=eMissionUI_GuerrillaOps, \\ + OverworldMeshPath="UI_3D.Overwold_Final.GorillaOps", \\ + MissionIconPath="img:///UILibrary_StrategyImages.X2StrategyMap.MissionIcon_GOPS", \\ + MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ + ) + +;; New Covert Op Missions + ++MissionSettings=(MissionOrFamilyName="BigSupplyExtraction_LW", \\ + AlertName="eAlert_GOps", \\ + MissionSound="Geoscape_UFO_Landed", \\ + EventTrigger="OnGOpsPopup", \\ + MissionUIType=eMissionUI_GuerrillaOps, \\ + OverworldMeshPath="UI_3D.Overwold_Final.SupplyRaid_AdvTroopTrans", \\ + MissionIconPath="img:///UILibrary_StrategyImages.X2StrategyMap.MissionIcon_GOPS", \\ + MissionImagePath="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" \\ + ) + +;; Rendezvous + +MissionSettings=(MissionOrFamilyName="Rendezvous_LW", \\ AlertName="eAlert_CouncilMission", \\ MissionSound="Geoscape_NewResistOpsMissions", \\ @@ -496,7 +558,7 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ;; Golden Path Mission Settings +MissionSettings=(MissionOrFamilyName="GP_Blacksite_LW", \\ - AlertName=, \\ + AlertName="", \\ MissionSound="GeoscapeFanfares_GoldenPath", \\ EventTrigger="", \\ MissionUIType=eMissionUI_GoldenPath, \\ @@ -506,7 +568,7 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ) +MissionSettings=(MissionOrFamilyName="GP_Forge_LW", \\ - AlertName=, \\ + AlertName="", \\ MissionSound="GeoscapeFanfares_GoldenPath", \\ EventTrigger="", \\ MissionUIType=eMissionUI_GoldenPath, \\ @@ -516,7 +578,7 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ) +MissionSettings=(MissionOrFamilyName="GP_PsiGate_LW", \\ - AlertName=, \\ + AlertName="", \\ MissionSound="GeoscapeFanfares_GoldenPath", \\ EventTrigger="", \\ MissionUIType=eMissionUI_GoldenPath, \\ @@ -526,7 +588,7 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ) +MissionSettings=(MissionOrFamilyName="GP_Broadcast_LW", \\ - AlertName=, \\ + AlertName="", \\ MissionSound="GeoscapeFanfares_GoldenPath", \\ EventTrigger="", \\ MissionUIType=eMissionUI_GoldenPath, \\ @@ -536,7 +598,7 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ) +MissionSettings=(MissionOrFamilyName="GP_Fortress_LW", \\ - AlertName=, \\ + AlertName="", \\ MissionSound="GeoscapeFanfares_GoldenPath", \\ EventTrigger="", \\ MissionUIType=eMissionUI_GoldenPath, \\ @@ -550,22 +612,31 @@ BUSY_HAVENS_SLOW_VIGILANCE_DECAY=TRUE ; 3 weeks = 504 hours ; 4 weeks = 672 hours -ACTIVITY_LOGGING_ENABLED=true; +ACTIVITY_LOGGING_ENABLED=true -PROTECTREGION_RESET_LEVEL=1 ; mission level < this value will reset the protect region activity if failed (ie, set to 2 for fail on tower to reset; 3 for fail on base to reset) +; mission level < this value will reset the protect region activity if failed (ie, set to 2 for fail on tower to reset; 3 for fail on base to reset) +PROTECTREGION_RESET_LEVEL=1 LIBERATE_ADJACENT_VIGILANCE_INCREASE_BASE=1 -LIBERATE_ADJACENT_VIGILANCE_INCREASE_RAND=2 ; 1 + rand(2) is 2 to 3 +; 1 + rand(2) is 2 to 3 +LIBERATE_ADJACENT_VIGILANCE_INCREASE_RAND=2 + LIBERATION_ALERT_LEVELS_KILLED=5 -LIBERATION_ALERT_LEVELS_KILLED_RAND=0 ; 3 + rand(2) is 3 to 4 +LIBERATION_ALERT_LEVELS_KILLED_RAND=0 -XCOM_WIN_VIGILANCE_GAIN=1 ; base for all missions +; base for all missions +XCOM_WIN_VIGILANCE_GAIN=1 XCOM_LOSE_VIGILANCE_GAIN=0 ; Regional cooldown -COIN_MIN_COOLDOWN_HOURS=504 ; 1ce per month per region -COIN_MAX_COOLDOWN_HOURS=504 -ATTEMPT_COUNTERINSURGENCY_MIN_REBELS=5 ; Min Population of Haven (so missions aren't bare of civvies to rescue) -ATTEMPT_COUNTERINSURGENCY_MIN_WORKING_REBELS = 3 ; Min Population of Haven assigned jobs (allows hiding job to avoid retals) + +; 1ce per month per region +COIN_MIN_COOLDOWN_HOURS=504 +COIN_MAX_COOLDOWN_HOURS=504 + +; Min Population of Haven (so missions aren't bare of civvies to rescue) +ATTEMPT_COUNTERINSURGENCY_MIN_REBELS=5 +; Min Population of Haven assigned jobs (allows hiding job to avoid retals) +ATTEMPT_COUNTERINSURGENCY_MIN_WORKING_REBELS = 3 COIN_BUCKET=500 ; Days until the first force-level-up UFO (scheduled reinfs) launches after start of a campaign, by difficulty @@ -583,53 +654,78 @@ SUPEREMERGENCY_REINFORCEMENT_PRIMARY_REGION_ALERT_BONUS=2 SUPEREMERGENCY_REINFORCEMENT_ADJACENT_REGION_ALERT_BONUS=1 ADJACENT_REGIONS_REINFORCED_BY_SUPEREMERGENCY_ALERT_UFO=2 SUPEREMERGENCY_ALERT_UFO_GLOBAL_COOLDOWN_DAYS = 21 -SUPER_EMERGENCY_GLOBAL_VIG = 20 ; This is the trigger for an emergency UFO, if Global VIG + this value > ALERT -REINFORCE_DIFFERENCE_REQ_FOR_FORCELEVEL_TRANSFER=99 ; if difference between destination vigilance and alert is more than this, then also transfer a point of forcelevel. Disabled by this value +; This is the trigger for an emergency UFO, if Global VIG + this value > ALERT +SUPER_EMERGENCY_GLOBAL_VIG = 20 + +; if difference between destination vigilance and alert is more than this, then also transfer a point of forcelevel. Disabled by this value +REINFORCE_DIFFERENCE_REQ_FOR_FORCELEVEL_TRANSFER=99 + REINFORCEMENTS_STOPPED_ORIGIN_VIGILANCE_INCREASE=2 + REINFORCEMENTS_STOPPED_ADJACENT_VIGILANCE_BASE=0 -REINFORCEMENTS_STOPPED_ADJACENT_VIGILANCE_RAND=2 ; 0 + rand(2) = 0 to 1 +; 0 + rand(2) = 0 to 1 +REINFORCEMENTS_STOPPED_ADJACENT_VIGILANCE_RAND=2 ; Repression works only in uncontacted regions; it is simulating the Resistance without XCOM's assistance. It rolls several d100s once the cooldown is over. REPRESSION_REGIONAL_COOLDOWN_HOURS_MIN=336 REPRESSION_REGIONAL_COOLDOWN_HOURS_MAX=504 -REPRESSION_ADVENT_LOSS_CHANCE=2 ; -1 Alert, +1 Vig -REPRESSION_RECRUIT_REBEL_CHANCE=20 ; +1 rebel -REPRESSION_VIGILANCE_INCREASE_CHANCE=15 ; +1 vig -REPRESSION_REBEL_LOST_CHANCE=10 ; -1 nonfaceless rebel, min of 1 -REPRESSION_CLONES_RELEASED_CHANCE=0 ; +1 alert -REPRESSION_2ND_REBEL_LOST_CHANCE=10 ; -1 nonfaceless rebel, min of 1 +; -1 Alert, +1 Vig +REPRESSION_ADVENT_LOSS_CHANCE=2 +; +1 rebel +REPRESSION_RECRUIT_REBEL_CHANCE=20 +; +1 vig +REPRESSION_VIGILANCE_INCREASE_CHANCE=15 +; -1 nonfaceless rebel, min of 1 +REPRESSION_REBEL_LOST_CHANCE=10 +; +1 alert +REPRESSION_CLONES_RELEASED_CHANCE=0 +; -1 nonfaceless rebel, min of 1 +REPRESSION_2ND_REBEL_LOST_CHANCE=10 INVASION_REGIONAL_COOLDOWN_HOURS_MIN=864 INVASION_REGIONAL_COOLDOWN_HOURS_MAX=1080 -INVASION_MIN_LIBERATED_DAYS=21 ; Minimum days after a liberation that an invasion can pop +; Minimum days after a liberation that an invasion can pop +INVASION_MIN_LIBERATED_DAYS=21 -XCOM_WIN_PROPAGANDA_VIGILANCE_GAIN=3 ; This is in addition to standard mission vig gain +; This is in addition to standard mission vig gain +XCOM_WIN_PROPAGANDA_VIGILANCE_GAIN=3 PROPAGANDA_REGIONAL_COOLDOWN_HOURS_MIN=672 PROPAGANDA_REGIONAL_COOLDOWN_HOURS_MAX=1080 PROPAGANDA_ADJACENT_VIGILANCE_BASE=0 PROPAGANDA_ADJACENT_VIGILANCE_RAND=0 -PROP_REBEL_WEIGHT = 1 ; DEPRECATED -PROP_ROOKIE_WEIGHT = 0 ; DEPRECATED +; DEPRECATED +PROP_REBEL_WEIGHT = 1 +; DEPRECATED +PROP_ROOKIE_WEIGHT = 0 PROTECT_RESEARCH_REGIONAL_COOLDOWN_HOURS_MIN=336 PROTECT_RESEARCH_REGIONAL_COOLDOWN_HOURS_MAX=456 +PROTECT_RESEARCH_FIRST_MONTH_POSSIBLE=3 PROTECT_DATA_REGIONAL_COOLDOWN_HOURS_MIN=336 PROTECT_DATA_REGIONAL_COOLDOWN_HOURS_MAX=456 -TROOP_MANEUVERS_VIGILANCE_GAIN=0 ; This is in addition to standard mission vig gain +; This is in addition to standard mission vig gain +TROOP_MANEUVERS_VIGILANCE_GAIN=0 TROOP_MANEUVERS_NEIGHBOR_VIGILANCE_BASE=0 -TROOP_MANEUVERS_NEIGHBOR_VIGILANCE_RAND=2 ; 0 to 1 in neighbors +; 0 to 1 in neighbors +TROOP_MANEUVERS_NEIGHBOR_VIGILANCE_RAND=2 TROOP_MANEUVERS_REGIONAL_COOLDOWN_HOURS_MIN=504 TROOP_MANEUVERS_REGIONAL_COOLDOWN_HOURS_MAX=672 -TROOP_MANEUVERS_BONUS_DETECTION_PER_DAY_PER_ALERT=0.25 ; This is % detection per day, per alert level in region -TROOP_MANEUVERS_CHANCE_KILL_ALERT[0]=100 ; 1.5; This is the % chance winning a troop maneuvers mission will kill an alert point (rookie) -TROOP_MANEUVERS_CHANCE_KILL_ALERT[1]=100 ; Veteran -TROOP_MANEUVERS_CHANCE_KILL_ALERT[2]=100 ; Commander -TROOP_MANEUVERS_CHANCE_KILL_ALERT[3]=100 ; Legend +; This is % detection per day, per alert level in region +TROOP_MANEUVERS_BONUS_DETECTION_PER_DAY_PER_ALERT=0.25 + +; 1.5; This is the % chance winning a troop maneuvers mission will kill an alert point (rookie) +; Veteran +; Commander +; Legend +TROOP_MANEUVERS_CHANCE_KILL_ALERT[0]=100 +TROOP_MANEUVERS_CHANCE_KILL_ALERT[1]=100 +TROOP_MANEUVERS_CHANCE_KILL_ALERT[2]=100 +TROOP_MANEUVERS_CHANCE_KILL_ALERT[3]=100 HIGH_VALUE_PRISONER_REGIONAL_COOLDOWN_HOURS_MIN=432 HIGH_VALUE_PRISONER_REGIONAL_COOLDOWN_HOURS_MAX=588 @@ -643,8 +739,10 @@ POLITICAL_PRISONERS_REGIONAL_COOLDOWN_HOURS_MIN=336 POLITICAL_PRISONERS_REGIONAL_COOLDOWN_HOURS_MAX=456 POLITICAL_PRISONERS_REBEL_REWARD_MIN=3 ; Note the max is hardcoded to be limited for the first few months -POLITICAL_PRISONERS_REBEL_REWARD_MAX=6 ; Do not set to more than 6 without updating parcels to contain more rescue objectives. -MAX_CAPTURED_SOLDIER_REWARDS=3 ; Maximum number of captured soldiers that can be rescued in a Jailbreak +; Do not set to more than 6 without updating parcels to contain more rescue objectives. +POLITICAL_PRISONERS_REBEL_REWARD_MAX=6 +; Maximum number of captured soldiers that can be rescued in a Jailbreak +MAX_CAPTURED_SOLDIER_REWARDS=3 LOGISTICS_REGIONAL_COOLDOWN_HOURS_MIN=336 LOGISTICS_REGIONAL_COOLDOWN_HOURS_MAX=456 @@ -652,16 +750,20 @@ LOGISTICS_REGIONAL_COOLDOWN_HOURS_MAX=456 SNARE_GLOBAL_COOLDOWN_MIN=504 SNARE_GLOBAL_COOLDOWN_MAX=768 -COIN_OPS_GLOBAL_COOLDOWN=504 ; 21 days -COIN_RESEARCH_GLOBAL_COOLDOWN=240 ; 12 days +; 21 days +COIN_OPS_GLOBAL_COOLDOWN=504 +; 12 days +COIN_RESEARCH_GLOBAL_COOLDOWN=240 FOOTHOLD_GLOBAL_COOLDOWN_HOURS_MIN=240 FOOTHOLD_GLOBAL_COOLDOWN_HOURS_MAX=384 ATTEMPT_FOOTHOLD_MAX_ALIEN_REGIONS=0 -RENDEZVOUS_GLOBAL_COOLDOWN_HOURS_MIN=672 ; this is new a regional cooldown (despite name), and should be coordinated with activity duration +; this is new a regional cooldown (despite name), and should be coordinated with activity duration +RENDEZVOUS_GLOBAL_COOLDOWN_HOURS_MIN=672 RENDEZVOUS_GLOBAL_COOLDOWN_HOURS_MAX=696 -RENDEZVOUS_FL_MULTIPLIER=0.67 ; This is how much easier to make rendezvous missions against regional Force Level +; This is how much easier to make rendezvous missions against regional Force Level +RENDEZVOUS_FL_MULTIPLIER=0.67 VIGILANCE_DECREASE_ON_ADVENT_RAID_WIN=2 VIGILANCE_DECREASE_ON_ADVENT_RETAL_WIN=4 @@ -671,17 +773,25 @@ VIGILANCE_CHANGE_ON_XCOM_RAID_WIN=-1 VIGILANCE_CHANGE_ON_XCOM_RETAL_WIN=-1 ; Research time to add doom, for each difficulty, from the facilities. This is a biggie for campaign length/difficulty. Fortress doom is in GameData. -REGIONAL_AVATAR_RESEARCH_TIME_MIN[0]=960 ; 40 35 days // avg 45 -REGIONAL_AVATAR_RESEARCH_TIME_MAX[0]=1200 ; 50 days - -REGIONAL_AVATAR_RESEARCH_TIME_MIN[1]=864 ; 36 days // avg 40 -REGIONAL_AVATAR_RESEARCH_TIME_MAX[1]=1056 ; 44 days - -REGIONAL_AVATAR_RESEARCH_TIME_MIN[2]=768 ; 32 days // avg 36 -REGIONAL_AVATAR_RESEARCH_TIME_MAX[2]=960 ; 40 days - -REGIONAL_AVATAR_RESEARCH_TIME_MIN[3]=672 ; 28 days // avg 32 -REGIONAL_AVATAR_RESEARCH_TIME_MAX[3]=864 ; 36 days +; 40 35 days // avg 45 +REGIONAL_AVATAR_RESEARCH_TIME_MIN[0]=960 +; 50 days +REGIONAL_AVATAR_RESEARCH_TIME_MAX[0]=1200 + +; 36 days // avg 40 +REGIONAL_AVATAR_RESEARCH_TIME_MIN[1]=864 +; 44 days +REGIONAL_AVATAR_RESEARCH_TIME_MAX[1]=1056 + +; 32 days // avg 36 +REGIONAL_AVATAR_RESEARCH_TIME_MIN[2]=768 +; 40 days +REGIONAL_AVATAR_RESEARCH_TIME_MAX[2]=960 + +; 28 days // avg 32 +REGIONAL_AVATAR_RESEARCH_TIME_MIN[3]=672 +; 36 days +REGIONAL_AVATAR_RESEARCH_TIME_MAX[3]=864 ;chance to transfer a point of doom from regional facility to Alien HQ -- triggers when local doom timer triggers ;each chance to transfer is rolled independently (e.g. 3 10% chances is slightly less than 30%) @@ -705,9 +815,12 @@ INFILTRATION_BONUS_ON_LIBERATION[3]=50.0 ; Rebel raid mission config RAID_MISSION_MIN_REBELS=6 RAID_MISSION_MAX_REBELS=6 -MIN_REBELS_TO_TRIGGER_INTEL_RAID=3 ; Number of rebels on intel job to make this mission trigger -MIN_REBELS_TO_TRIGGER_SUPPLY_RAID=3 ; Number of rebels on supply job to make this mission trigger -MIN_REBELS_TO_TRIGGER_RECRUIT_RAID=6 ; Number of rebels on recruit job to make this mission trigger +; Number of rebels on intel job to make this mission trigger +MIN_REBELS_TO_TRIGGER_INTEL_RAID=3 +; Number of rebels on supply job to make this mission trigger +MIN_REBELS_TO_TRIGGER_SUPPLY_RAID=3 +; Number of rebels on recruit job to make this mission trigger +MIN_REBELS_TO_TRIGGER_RECRUIT_RAID=6 INTEL_RAID_REGIONAL_COOLDOWN_HOURS_MIN=504 INTEL_RAID_REGIONAL_COOLDOWN_HOURS_MAX=672 @@ -715,7 +828,8 @@ SUPPLY_RAID_REGIONAL_COOLDOWN_HOURS_MIN=504 SUPPLY_RAID_REGIONAL_COOLDOWN_HOURS_MAX=672 RECRUIT_RAID_REGIONAL_COOLDOWN_HOURS_MIN=504 RECRUIT_RAID_REGIONAL_COOLDOWN_HOURS_MAX=672 -PROHIBITED_JOB_DURATION = 21; days +; Below is in days +PROHIBITED_JOB_DURATION = 21 ; Minimum number of Rebel-Days on these jobs globally to trigger a raid INTEL_RAID_BUCKET=325 @@ -727,49 +841,57 @@ ALIEN_BASE_DOOM_REMOVAL=1 ;The FL at which the chosen activate CHOSEN_ACTIVATE_AT_FL=3 -CHOSEN_LEVEL_FL_THRESHOLDS[0]=9 -CHOSEN_LEVEL_FL_THRESHOLDS[1]=14 -CHOSEN_LEVEL_FL_THRESHOLDS[2]=20 +CHOSEN_LEVEL_FL_THRESHOLDS[0]=7 +CHOSEN_LEVEL_FL_THRESHOLDS[1]=11 +CHOSEN_LEVEL_FL_THRESHOLDS[2]=16 +CHOSEN_LEVEL_FL_THRESHOLDS[3]=20 -;new config for COINOps strength/vigilance +; new config for COINOps strength/vigilance COINOPS_MIN_ALERT=3 COINOPS_MIN_VIGILANCE=3 +; max alert for covert ops missions +BIGSUPPLYEXTRACTION_MAX_ALERT=8 + +; How much knowledge about XCOM a Chosen gains when a mission +; is completed in their region +CHOSEN_KNOWLEDGE_GAIN_MISSIONS=0 + [LW_Overhaul.X2LWActivityCreation_Invasion] INVASION_MIN_ALERT_TO_LAUNCH=8 [LW_Overhaul.X2LWActivityDetectionCalc_Rendezvous] ; this is the amount of "Intel Income" toward detecting the Rendezvous activity a soldier generates ; regular rebels do not generate any income toward the Rendezvous activity -+LIAISON_MISSION_INCOME_PER_RANK[0]=0f -+LIAISON_MISSION_INCOME_PER_RANK[1]=5f -+LIAISON_MISSION_INCOME_PER_RANK[2]=10f -+LIAISON_MISSION_INCOME_PER_RANK[3]=15f -+LIAISON_MISSION_INCOME_PER_RANK[4]=20f -+LIAISON_MISSION_INCOME_PER_RANK[5]=22.5f -+LIAISON_MISSION_INCOME_PER_RANK[6]=25f -+LIAISON_MISSION_INCOME_PER_RANK[7]=26f -+LIAISON_MISSION_INCOME_PER_RANK[8]=27f - -+LIAISON_MISSION_INCOME_PER_RANK_PSI[0]=0f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[1]=6f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[2]=12f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[3]=20f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[4]=25f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[5]=30f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[6]=35f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[7]=40f -+LIAISON_MISSION_INCOME_PER_RANK_PSI[8]=45f - -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[0]=0f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[1]=2.5f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[2]=5f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[3]=7.5f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[4]=10f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[5]=12f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[6]=14f -+LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[7]=15f ++LIAISON_MISSION_INCOME_PER_RANK[0]=0.0 ++LIAISON_MISSION_INCOME_PER_RANK[1]=5.0 ++LIAISON_MISSION_INCOME_PER_RANK[2]=10.0 ++LIAISON_MISSION_INCOME_PER_RANK[3]=15.0 ++LIAISON_MISSION_INCOME_PER_RANK[4]=20.0 ++LIAISON_MISSION_INCOME_PER_RANK[5]=22.5 ++LIAISON_MISSION_INCOME_PER_RANK[6]=25.0 ++LIAISON_MISSION_INCOME_PER_RANK[7]=26.0 ++LIAISON_MISSION_INCOME_PER_RANK[8]=27.0 + ++LIAISON_MISSION_INCOME_PER_RANK_PSI[0]=0.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[1]=6.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[2]=12.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[3]=20.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[4]=25.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[5]=30.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[6]=35.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[7]=40.0 ++LIAISON_MISSION_INCOME_PER_RANK_PSI[8]=45.0 + ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[0]=0.0 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[1]=2.5 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[2]=5.0 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[3]=7.5 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[4]=10.0 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[5]=12.0 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[6]=14.0 ++LIAISON_MISSION_INCOME_BONUS_PER_RANK_OFFICER[7]=15.0 ;------------------------------------------------------------------ ;------------------ ACTIVITY TEMPLATES ---------------------------- @@ -789,8 +911,10 @@ INVASION_MIN_ALERT_TO_LAUNCH=8 [ProtectRegionEarly X2LWAlienActivityTemplate] iPriority = 3 -RequiredRebelMissionIncome=110.0 ;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against -DiscoveryPctChancePerDayPerHundredMissionIncome=40 ; Higher means easier to detect +;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against +RequiredRebelMissionIncome=110.0 +; Higher means easier to detect +DiscoveryPctChancePerDayPerHundredMissionIncome=40 AlertLevelModifier=0 MissionTree[0] = ( MissionFamilies[0]="Recover_LW", \\ MissionFamilies[1]="Hack_LW", \\ @@ -801,8 +925,10 @@ MissionTree[0] = ( MissionFamilies[0]="Recover_LW", \\ [ProtectRegionMid X2LWAlienActivityTemplate] iPriority = 4 -RequiredRebelMissionIncome=135.0 ;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against -DiscoveryPctChancePerDayPerHundredMissionIncome=35 ; Higher means easier to detect +;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against +RequiredRebelMissionIncome=135.0 +; Higher means easier to detect +DiscoveryPctChancePerDayPerHundredMissionIncome=35 AlertLevelModifier=1 MissionTree[0] = ( MissionFamilies[0]="Extract_LW", \\ MissionFamilies[1]="Rescue_LW", \\ @@ -812,8 +938,10 @@ MissionTree[0] = ( MissionFamilies[0]="Extract_LW", \\ [ProtectRegion X2LWAlienActivityTemplate] iPriority = 5 -RequiredRebelMissionIncome=160.0 ;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against -DiscoveryPctChancePerDayPerHundredMissionIncome=30 ; Higher means easier to detect +;This is a cumulative total from rebels on the Intel job that must be met before discovery chances are rolled against +RequiredRebelMissionIncome=160.0 +; Higher means easier to detect +DiscoveryPctChancePerDayPerHundredMissionIncome=30 AlertLevelModifier=2 MissionTree[0] = ( MissionFamilies[0]="Neutralize_LW", \\ MissionFamilies[1]="DestroyObject_LW", \\ @@ -838,11 +966,12 @@ MissionTree[2] = ( MissionFamilies[0]="AssaultAlienBase_LW", \\ [Counterinsurgency X2LWAlienActivityTemplate] iPriority=30 ActivityCategory="COIN" -RequiredRebelMissionIncome=60.0 ; Rebels have to earn this before accumulation begins -DiscoveryPctChancePerDayPerHundredMissionIncome=31 ; +; Rebels have to earn this before accumulation begins +RequiredRebelMissionIncome=60.0 +DiscoveryPctChancePerDayPerHundredMissionIncome=31 MinVigilance=4 MinAlert=4 -AlertLevelModifier=2 +AlertLevelModifier=0 MissionTree[0] = ( MissionFamilies[0]="DestroyObject_LW", \\ Duration_Hours=144, \\ DurationRand_Hours=48 \\ @@ -926,7 +1055,7 @@ iPriority=25 RequiredRebelMissionIncome=100.0 DiscoveryPctChancePerDayPerHundredMissionIncome=5 ForceLevelModifier=1 -AlertLevelModifier=1 +AlertLevelModifier=2 MissionTree[0] = ( MissionFamilies[0]="Recover_LW", \\ MissionFamilies[1]="Hack_LW", \\ @@ -1054,7 +1183,8 @@ MissionTree[0] = ( MissionFamilies[0]="Hack_LW", \\ [TroopManeuvers X2LWAlienActivityTemplate] iPriority=55 RequiredRebelMissionIncome=20.0 -DiscoveryPctChancePerDayPerHundredMissionIncome=15; This is augmented by TROOP_MANEUVERS_BONUS_DETECTION_PER_DAY_PER_ALERT using alert level in region in code +; This is augmented by TROOP_MANEUVERS_BONUS_DETECTION_PER_DAY_PER_ALERT using alert level in region in code +DiscoveryPctChancePerDayPerHundredMissionIncome=15 MinAlert=4 MaxAlert=15 MinVigilance=3 @@ -1097,6 +1227,7 @@ DiscoveryPctChancePerDayPerHundredMissionIncome=60 MaxAlert=12 MissionTree[0] = ( MissionFamilies[0]="SmashNGrab_LW", \\ + MissionFamilies[1]="SupplyExtraction_LW", \\ Duration_Hours=216, \\ DurationRand_Hours=96 \\ ) @@ -1106,7 +1237,7 @@ MissionTree[0] = ( MissionFamilies[0]="SmashNGrab_LW", \\ iPriority=41 MinAlert=3 MinVigilance=2 -AlertLevelModifier=4 +AlertLevelModifier=2 MissionTree[0] = ( MissionFamilies[0]="IntelRaid_LW", \\ Duration_Hours=24, \\ @@ -1118,7 +1249,7 @@ MissionTree[0] = ( MissionFamilies[0]="IntelRaid_LW", \\ iPriority=42 MinAlert=4 MinVigilance=1 -AlertLevelModifier=3 +AlertLevelModifier=2 MissionTree[0] = ( MissionFamilies[0]="SupplyConvoy_LW", \\ Duration_Hours=24, \\ @@ -1130,7 +1261,7 @@ MissionTree[0] = ( MissionFamilies[0]="SupplyConvoy_LW", \\ iPriority=43 MinAlert=4 MinVigilance=2 -AlertLevelModifier=3 +AlertLevelModifier=1 MissionTree[0] = ( MissionFamilies[0]="RecruitRaid_LW", \\ Duration_Hours=24, \\ @@ -1156,8 +1287,10 @@ MissionTree[0] = ( MissionFamilies[0]="Hack_LW", \\ iPriority=3 RequiredRebelMissionIncome=0 DiscoveryPctChancePerDayPerHundredMissionIncome=70 -AlertLevelModifier=12 ; For this activity, this sets the actual alert level -ForceLevelModifier=18 ; For this activity, this sets the actual force level +; For this activity, this sets the actual alert level +AlertLevelModifier=12 +; For this activity, this sets the actual force level +ForceLevelModifier=18 MissionTree[0] = ( MissionFamilies[0]="SecureUFO_LW", \\ Duration_Hours=96, \\ diff --git a/LongWarOfTheChosen/Config/XComLW_AlienVariations.ini b/LongWarOfTheChosen/Config/XComLW_AlienVariations.ini index aa59052a0..a126b13db 100644 --- a/LongWarOfTheChosen/Config/XComLW_AlienVariations.ini +++ b/LongWarOfTheChosen/Config/XComLW_AlienVariations.ini @@ -2,11 +2,17 @@ ;struct LWUnitVariation ;{ - ;var array CharacterNames; // character that this can apply to - ;var LWObjectAppearance BodyAppearance; - ;var LWObjectAppearance WeaponAppearance; - ;var array StatUpgrades; - ;var array AbilityUpgrades; +; var array CharacterNames; // character that this can apply to +; var bool Automatic; +; var float Probability; // only one variation per unit +; var float Scale; // multiplicative proportional scaling +; var LWObjectAppearance BodyAppearance; +; var LWObjectAppearance PrimaryWeaponAppearance; +; var LWObjectAppearance SecondaryWeaponAppearance; +; var array AbilityUpgrades; +; var array StatUpgrades; +; var TAppearance BodyPartContent; +; var array GenericBodyPartArchetypes; ;}; ;+UnitVariations = ( CharacterNames = ("Archon"), \\ diff --git a/LongWarOfTheChosen/Config/XComLW_Content.ini b/LongWarOfTheChosen/Config/XComLW_Content.ini index 3ce366577..ff8b3236a 100644 --- a/LongWarOfTheChosen/Config/XComLW_Content.ini +++ b/LongWarOfTheChosen/Config/XComLW_Content.ini @@ -1,43 +1,43 @@ [LW_Overhaul.UIPersonnel_SquadBarracks] -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon0" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon1" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon2" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon3" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon4" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon5" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon6" -;+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon7" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon8" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon9" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon10" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon11" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon12" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon13" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon14" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon15" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon16" -;+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon17" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon18" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon19" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon20" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon21" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon22" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon23" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon24" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon25" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon26" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon27" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon28" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon29" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon30" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon31" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon32" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon33" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon34" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon35" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon36" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon37" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon38" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon39" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon40" -+SquadImagePaths="img:///UILibrary_LW_Overhaul.SampleSquadIcons.256pxPavonisLogoCirclefinalBold" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon0" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon1" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon2" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon3" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon4" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon5" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon6" +;+SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon7" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon8" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon9" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon10" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon11" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon12" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon13" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon14" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon15" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon16" +;+SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon17" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon18" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon19" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon20" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon21" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon22" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon23" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon24" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon25" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon26" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon27" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon28" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon29" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon30" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon31" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon32" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon33" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon34" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon35" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon36" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon37" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon38" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon39" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon40" ++SquadImagePaths="img:///UILibrary_LWOTC.SampleSquadIcons.256pxPavonisLogoCirclefinalBold" diff --git a/LongWarOfTheChosen/Config/XComLW_FactionBalance.ini b/LongWarOfTheChosen/Config/XComLW_FactionBalance.ini index 8fbe4354e..d20939ea0 100644 --- a/LongWarOfTheChosen/Config/XComLW_FactionBalance.ini +++ b/LongWarOfTheChosen/Config/XComLW_FactionBalance.ini @@ -1,154 +1,170 @@ -[LW_FactionBalance.X2Effect_ParryNew] -; These values control Reflect chance on Parry specifically -; I've set them to the same as the default for regular Reflect, but you can change it if you feel like it -ParryReflectPerFocusChance=10 -ParryReflectMinFocus=2 -ParryReflectBaseChance=20 - -[LW_FactionBalance.X2Effect_DeflectNew] -; These are the original Deflect/Reflect chances, I've left them as default, but you can tinker with them here too -DeflectMinFocus=1 -DeflectBaseChance=25 -DeflectPerFocusChance=5 -ReflectMinFocus=2 -ReflectBaseChance=75 - -; By the game's default you can Parry melee and area attacks, but not Deflect them; you can change that here -bCanDeflectMelee = false -bCanDeflectArea = false - - -[LW_FactionBalance.X2Ability_SkirmisherAbilitySet_LW] -RECKONING_LW_COOLDOWN=3 -RECKONING_LW_SLASH_COOLDOWN=4 -MANUAL_OVERRIDE_COOLDOWN=4 -REFLEX_COOLDOWN=1 -SKIRMISHER_INTERRUPT_COOLDOWN=2 -BATTLEFIELD_AWARENESS_COOLDOWN=4 -[LW_FactionBalance.X2Effect_PackMaster_LW] -PACKMASTER_KIT_BONUS=1 -+EXCLUDED_GRENADE_TYPES="GhostGrenade" - -[LW_FactionBalance.X2DownloadableContentInfo_LW_FactionBalance] -REAPER_DETECTION_RANGE_REDUCTION=0.25f - -[LW_FactionBalance.X2Ability_TemplarAbilitySet_LW] -SOLACE_ACTION_POINTS=1 -SOLACE_COOLDOWN=3 -GRAZE_MIN_FOCUS=1 -GRAZE_PER_FOCUS_CHANCE=5 -MEDITATION_FOCUS_RECOVERY=1 -MEDITATION_MAX_CHARGES=1 -BONUS_REND_DAMAGE_PER_TILE=0.1667f ; if 1/3, set to .334, extra will handle round-off errors -MAX_REND_FLECHE_DAMAGE=5 -VIGILANCE_MIN_POD_SIZE=3 ; Minimum number of pod members to trigger Vigilance -TERROR_STAT_CHECK_BASE_VALUE=75 -APOTHEOSIS_COOLDOWN=5 -APOTHEOSIS_DODGE_BONUS=20 -APOTHEOSIS_MOBILITY_BONUS=2 -APOTHEOSIS_DAMAGE_MULTIPLIER=0.5 - -; LWOTC Overcharge settings: bonus per level of focus -OVERCHARGE_AIM_BONUS=5 -OVERCHARGE_CRIT_BONUS=10 - -AMPLIFY_SHOTS = 3 - -[LW_FactionBalance.X2AbilityCooldown_Grapple] -GRAPPLE_COOLDOWN=3 ; Base cooldown of the Skirmisher's grapple -PARKOUR_COOLDOWN_REDUCTION=1 ; Turns of cooldown that are subtracted if the Skrimisher has Parkour - -; NOTE: changing the above does NOT change the game's text, -; so the GTS perk will still say that it only reduces the cooldown by 1, -; and the Grapple ability will still say its cooldown is 3, -; no matter what config settings you put. - -[LW_FactionBalance.X2Ability_ReaperAbilitySet_LW] -LINGERING_DURATION=1 -LINGERING_DEFENSE=15 -LINGERING_DODGE=30 - -CRIPPLING_STRIKE_COOLDOWN=2 - -TrackingRadius=21 - -DisablingShotCooldown=5 -DisablingShotAmmoCost=1 -DisablingShotBaseStunActions=2 -DisablingShotCritStunActions=2 -DisablingShotDamagePenalty=0.5 - -PARAMEDIC_BONUS_CHARGES=2 -+AlternativeMedikitNames=NanoMedikit -+AlternativeMedikitNames=BioMedikit - -+CHEAPSHOT_ABILITYNAMES=StandardShot -+CHEAPSHOT_ABILITYNAMES=LightEmUp -+CHEAPSHOT_ABILITYNAMES=SniperStandardFire -+CHEAPSHOT_ABILITYNAMES=SoulReaper -+CHEAPSHOT_ABILITYNAMES=ChainShot -[LW_FactionBalance.X2Effect_ManualOverride_LW] -OVERRIDE_REDUCTION=3 - -[LW_FactionBalance.X2Effect_BanishHitMod] -BANISH_HIT_MOD=-15 - -[LW_FactionBalance.X2LWModTemplate_ReaperAbilities] -SHADOW_DURATION=2 -SHADOW_DETECTION_RANGE_REDUCTION=0.9f - -REMOTE_START_CHARGES=1 -REMOTE_START_DEMOLITIONIST_CHARGES=1 - -BLOOD_TRAIL_ANTIDODGE_BONUS=40 - -PALE_HORSE_BASE_CRIT=10 -PALE_HORSE_PER_KILL_CRIT=4 -PALE_HORSE_MAX_CRIT=20 ; Max crit from the per-kill bonus (does not include base crit bonus) - -STING_RUPTURE=1 ; Rupture amount inflicted by Sting - -BANISH_COOLDOWN = 2 - -DEATH_DEALER_CRIT = 25 -SHADOW_FLAT_MOB_BONUS = 3 -[LW_FactionBalance.X2LWModTemplate_SkirmisherAbilities] -WRATH_COOLDOWN=4 -JUSTICE_COOLDOWN=4 -JUSTICE_IENVIRONMENT_DAMAGE=3 -WHIPLASH_COOLDOWN=4 -WHIPLASH_ACTION_POINT_COST=1 -FULL_THROTTLE_DURATION=2 -BATTLELORD_ACTION_POINT_COST=1 -BATTLELORD_COOLDOWN=5 -COMBAT_PRESENCE_COOLDOWN = 5 -REFLEX_CRIT_DEF = 15 -TOTAL_COMBAT_BONUS_RANGE = 3 -TOTAL_COMBAT_MOBILITY = 1 -TOTAL_COMBAT_AIM = 5 -[LW_FactionBalance.X2LWModTemplate_TemplarAbilities] -FOCUS4MOBILITY=0 -FOCUS4DODGE=0 -FOCUS4RENDDAMAGE=0 - -STUNSTRIKE_STUN_DURATION=2 -STUNSTRIKE_STUN_CHANCE=100 -VOLT_TILE_RADIUS=3 -VOLT_DANGER_ZONE_BONUS_RADIUS=2 - -ARCWAVE_T1_DAMAGE=4 -ARCWAVE_T2_DAMAGE=7 -ARCWAVE_T3_DAMAGE=10 - -GHOST_COOLDOWN=5 -[LW_FactionBalance.X2LWModTemplate_FactionItems] -+WHIPLASH_CONVENTIONAL_DAMAGE=(Damage=4, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") -+WHIPLASH_MAGNETIC_DAMAGE=(Damage=6, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") -+WHIPLASH_BEAM_DAMAGE=(Damage=8, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") - -+WHIPLASH_CONVENTIONAL_DAMAGE=(Damage=8, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") -+WHIPLASH_MAGNETIC_DAMAGE=(Damage=12, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") -+WHIPLASH_BEAM_DAMAGE=(Damage=14, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") - -[LW_FactionBalance.X2Effect_SkirmisherInterrupt_LW] -MAX_INTERRUPTS = 1 +[LW_FactionBalance.X2Effect_ParryNew] +; These values control Reflect chance on Parry specifically +; I've set them to the same as the default for regular Reflect, but you can change it if you feel like it +ParryReflectPerFocusChance=10 +ParryReflectMinFocus=2 +ParryReflectBaseChance=20 + +[LW_FactionBalance.X2Effect_DeflectNew] +; These are the original Deflect/Reflect chances, I've left them as default, but you can tinker with them here too +DeflectMinFocus=1 +DeflectBaseChance=25 +DeflectPerFocusChance=5 +ReflectMinFocus=2 +ReflectBaseChance=75 + +; By the game's default you can Parry melee and area attacks, but not Deflect them; you can change that here +bCanDeflectMelee = false +bCanDeflectArea = false + + +[LW_FactionBalance.X2Ability_SkirmisherAbilitySet_LW] +RECKONING_LW_COOLDOWN=3 +RECKONING_LW_SLASH_COOLDOWN=4 +MANUAL_OVERRIDE_COOLDOWN=4 +REFLEX_COOLDOWN=1 +SKIRMISHER_INTERRUPT_COOLDOWN=2 +BATTLEFIELD_AWARENESS_COOLDOWN=3 +[LW_FactionBalance.X2Effect_PackMaster_LW] +PACKMASTER_KIT_BONUS=1 ++EXCLUDED_GRENADE_TYPES="GhostGrenade" + +[LW_FactionBalance.X2DownloadableContentInfo_LW_FactionBalance] +REAPER_DETECTION_RANGE_REDUCTION=0.25f + +[LW_FactionBalance.X2Ability_TemplarAbilitySet_LW] +SOLACE_ACTION_POINTS=1 +SOLACE_COOLDOWN=3 +GRAZE_MIN_FOCUS=1 +GRAZE_PER_FOCUS_CHANCE=5 +MEDITATION_FOCUS_RECOVERY=1 +MEDITATION_MAX_CHARGES=1 +BONUS_REND_DAMAGE_PER_TILE=0.1667f ; if 1/3, set to .334, extra will handle round-off errors +MAX_REND_FLECHE_DAMAGE=5 +VIGILANCE_MIN_POD_SIZE=3 ; Minimum number of pod members to trigger Vigilance +TERROR_STAT_CHECK_BASE_VALUE=75 +APOTHEOSIS_COOLDOWN=5 +APOTHEOSIS_DODGE_BONUS=20 +APOTHEOSIS_MOBILITY_BONUS=2 +APOTHEOSIS_DAMAGE_MULTIPLIER=0.5 + +; LWOTC Overcharge settings: bonus per level of focus +OVERCHARGE_AIM_BONUS=10 +OVERCHARGE_CRIT_BONUS=15 + +AMPLIFY_SHOTS = 3 + +[LW_FactionBalance.X2AbilityCooldown_Grapple] +GRAPPLE_COOLDOWN=3 ; Base cooldown of the Skirmisher's grapple +PARKOUR_COOLDOWN_REDUCTION=1 ; Turns of cooldown that are subtracted if the Skrimisher has Parkour + +; NOTE: changing the above does NOT change the game's text, +; so the GTS perk will still say that it only reduces the cooldown by 1, +; and the Grapple ability will still say its cooldown is 3, +; no matter what config settings you put. + +[LW_FactionBalance.X2Ability_ReaperAbilitySet_LW] +LINGERING_DURATION=1 +LINGERING_DEFENSE=15 +LINGERING_DODGE=30 + +CRIPPLING_STRIKE_COOLDOWN=2 + +TrackingRadius=21 + +DisablingShotCooldown=5 +DisablingShotAmmoCost=1 +DisablingShotBaseStunActions=2 +DisablingShotCritStunActions=2 +DisablingShotDamagePenalty=0.5 + +PARAMEDIC_BONUS_CHARGES=2 ++AlternativeMedikitNames=NanoMedikit ++AlternativeMedikitNames=BioMedikit + ++CHEAPSHOT_ABILITYNAMES=StandardShot ++CHEAPSHOT_ABILITYNAMES=LightEmUp ++CHEAPSHOT_ABILITYNAMES=SniperStandardFire ++CHEAPSHOT_ABILITYNAMES=SoulReaper ++CHEAPSHOT_ABILITYNAMES=ChainShot + +[LW_FactionBalance.X2Effect_ManualOverride_LW] +OVERRIDE_REDUCTION=3 + +[LW_FactionBalance.X2Effect_BanishHitMod] +BANISH_INITIAL_HIT_MOD = 0 +BANISH_HIT_MOD=-20 +BANISH_DMG_MOD = -1 +THEBANISHER_HIT_BUFF = 5 + +[LW_FactionBalance.X2LWModTemplate_ReaperAbilities] +SHADOW_DURATION=2 +SHADOW_DETECTION_RANGE_REDUCTION=0.9f + +REMOTE_START_CHARGES=1 +REMOTE_START_DEMOLITIONIST_CHARGES=1 + +BLOOD_TRAIL_ANTIDODGE_BONUS=40 + +PALE_HORSE_BASE_CRIT=10 +PALE_HORSE_PER_KILL_CRIT=4 +PALE_HORSE_MAX_CRIT=20 ; Max crit from the per-kill bonus (does not include base crit bonus) + +STING_RUPTURE=1 ; Rupture amount inflicted by Sting + +USE_BANISH_CHARGES = false +BANISH_COOLDOWN = 5 + +DEATH_DEALER_CRIT = 25 + +;below is unused right now +THEBANISHER_DEATH_DEALER_CRIT = 15 + +SHADOW_FLAT_MOB_BONUS = 3 + +[LW_FactionBalance.X2LWModTemplate_SkirmisherAbilities] +WRATH_COOLDOWN=3 +JUSTICE_COOLDOWN=3 +JUSTICE_IENVIRONMENT_DAMAGE=3 +WHIPLASH_COOLDOWN=4 +WHIPLASH_ACTION_POINT_COST=1 +FULL_THROTTLE_DURATION=2 +BATTLELORD_ACTION_POINT_COST=1 +BATTLELORD_COOLDOWN=5 +COMBAT_PRESENCE_COOLDOWN = 5 +REFLEX_CRIT_DEF = 15 +TOTAL_COMBAT_BONUS_RANGE = 2 +TOTAL_COMBAT_MOBILITY = 1 +TOTAL_COMBAT_AIM = 5 +[LW_FactionBalance.X2LWModTemplate_TemplarAbilities] +FOCUS4MOBILITY=0 +FOCUS4DODGE=0 +FOCUS4RENDDAMAGE=0 + +STUNSTRIKE_STUN_DURATION=2 +STUNSTRIKE_STUN_CHANCE=100 +VOLT_TILE_RADIUS=3 +VOLT_DANGER_ZONE_BONUS_RADIUS=1 +VOLT_TERRORIZE_BONUS=1 + +ARCWAVE_T1_DAMAGE=4 +ARCWAVE_T2_DAMAGE=7 +ARCWAVE_T3_DAMAGE=10 + +GHOST_COOLDOWN=5 + +[LW_FactionBalance.X2Effect_TemplarShieldCritDefense] + +CritReduction = 20 + +[LW_FactionBalance.X2LWModTemplate_FactionItems] ++WHIPLASH_CONVENTIONAL_DAMAGE=(Damage=4, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") ++WHIPLASH_MAGNETIC_DAMAGE=(Damage=6, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") ++WHIPLASH_BEAM_DAMAGE=(Damage=8, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash", DamageType="Electrical") + ++WHIPLASH_CONVENTIONAL_DAMAGE=(Damage=8, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") ++WHIPLASH_MAGNETIC_DAMAGE=(Damage=12, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") ++WHIPLASH_BEAM_DAMAGE=(Damage=14, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="Whiplash_Robotic", DamageType="Electrical") + +[LW_FactionBalance.X2Effect_SkirmisherInterrupt_LW] +MAX_INTERRUPTS = 1 diff --git a/LongWarOfTheChosen/Config/XComLW_InfiltrationSettings.ini b/LongWarOfTheChosen/Config/XComLW_InfiltrationSettings.ini index 402ba958a..4a0c0ae7d 100644 --- a/LongWarOfTheChosen/Config/XComLW_InfiltrationSettings.ini +++ b/LongWarOfTheChosen/Config/XComLW_InfiltrationSettings.ini @@ -53,7 +53,7 @@ InfiltrationMissionIntroDefinition=( \\ ) [LW_Overhaul.XComGameState_LWPersistentSquad] -DefaultSquadImagePath="img:///UILibrary_LW_Overhaul.SampleSquadIcons.SquadIcon0" +DefaultSquadImagePath="img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon0" RequiredInfiltrationToLaunch=-0.0000001f @@ -183,7 +183,9 @@ RequiredInfiltrationToLaunch=-0.0000001f -+InfiltrationHaltPoints=100.0 ++InfiltrationHaltPoints=101.0 ++InfiltrationHaltPoints=125.0 ++InfiltrationHaltPoints=150.0 +InfiltrationHaltPoints=200.0 ;----------------------------------------------------- diff --git a/LongWarOfTheChosen/Config/XComLW_OfficerPack.ini b/LongWarOfTheChosen/Config/XComLW_OfficerPack.ini index 9ba3610e1..5d323b23c 100644 --- a/LongWarOfTheChosen/Config/XComLW_OfficerPack.ini +++ b/LongWarOfTheChosen/Config/XComLW_OfficerPack.ini @@ -62,10 +62,10 @@ TrainingDaysForRank[7] = 12.0f ;imagepaths to rank icons -- img:/// part not part of config file LWOfficerRankIcons[0]="UILibrary_Common.rank_rookie" LWOfficerRankIcons[1]="UILibrary_LW_OfficerPack.LWOfficers_RankLieutenant_resize" -LWOfficerRankIcons[2]="UILibrary_LW_Overhaul.LWOfficers_RankFirstLieutenant" +LWOfficerRankIcons[2]="UILibrary_LWOTC.LWOfficers_RankFirstLieutenant" LWOfficerRankIcons[3]="UILibrary_LW_OfficerPack.LWOfficers_RankCaptain_resize" LWOfficerRankIcons[4]="UILibrary_LW_OfficerPack.LWOfficers_RankMajor_resize" -LWOfficerRankIcons[5]="UILibrary_LW_Overhaul.LWOfficers_RankLieutenantColonel" +LWOfficerRankIcons[5]="UILibrary_LWOTC.LWOfficers_RankLieutenantColonel" LWOfficerRankIcons[6]="UILibrary_LW_OfficerPack.LWOfficers_RankColonel_resize" LWOfficerRankIcons[7]="UILibrary_LW_OfficerPack.LWOfficers_RankFieldCommander_resize" @@ -124,6 +124,11 @@ INTERVENTION_CHARGES[7]=1 INTERVENTION_EXTRA_TURNS=2 INTERVENTION_INTEL_COST=10 +; Timer names for Intervention ++KismetTimerVariableNames = "Timer.TurnsRemaining" ++KismetTimerVariableNames = "Mission.TimerTurnsRemaining" ++KismetTimerVariableNames = "Mission.TurnsRemaining" + INCOMING_COOLDOWN=5 INCOMING_EXPLOSIVES_DR=4 AIR_CONTROLLER_EVAC_TURN_REDUCTION=2 diff --git a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini index d66e7f2ad..81dd42c3b 100644 --- a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini +++ b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini @@ -39,7 +39,7 @@ DLCIdentifier="LongWarOfTheChosen" +AdditionalDLCResources="LWZ_PerkContent_BlasterLauncher.Archetypes.Perk_Gauntlet_FireBlasterLauncherProjectile" +AdditionalDLCResources="LWZ_PerkContent_RocketProjectile.Archetypes.Perk_Gauntlet_FireRocketProjectile" -; Sitreps +; Disable unwanted Sitreps from being rolled normally +SitrepsToDisable="Surgical" +SitrepsToDisable="TheHorde" +SitrepsToDisable="StealthInsertion" @@ -50,6 +50,123 @@ DLCIdentifier="LongWarOfTheChosen" +SitrepsToDisable="MentalFortitude" +SitrepsToDisable="ShadowSquad" +; switch this to True if you want shield templars still (you'll still need to config them yourself) +; this turns off the auto-respec if a Templar doesn't have the new psi shield yet. +bDisableRespeccingTemplars = false + +; this setting consoldiates Sewer maps into Subway category so sewer maps can be added, but don't spam the map generation with their own category. +bSewersToSubway=false + +; this setting enables the City Center HQ maps for testing: + +bEnableCityHQs = false + +; add maps you want to disable here: ++MapsToDisable=Plot_RFT_01 ++MapsToDisable=Plot_RFT_02 + +; ------------------------------------------------------------------ +; ------------------ Replacement Mission Defs ---------------------- +; ------------------------------------------------------------------ + ++ReplacementMissionDefs=(MissionName="ChosenAvengerDefense", sType="ChosenAvengerDefense", \\ + MapNames[0]="Obj_ChosenAvengerDefense_LW", \\ + MapNames[1]="CIN_XP_ChosenADTurrets", \\ + MapNames[2]="UMS_MissionCore", \\ + MapNames[3]="CIN_XP_ChosenADArtillery", \\ + MapNames[4]="UMS_LWCommon", \\ + RequiredPlotObjectiveTags[0]="ChosenAvengerDef", \\ + RequiredParcelObjectiveTags[0]="ChosenAvengerDefense", \\ + MissionObjectives[0]=(ObjectiveName="Defense", \\ + bIsTacticalObjective=false, bIsStrategyObjective=true, bIsTriadObjective=true), \\ + MissionSchedules[0]="ChosenAvengerDefense_LW", \\ + OverrideDefaultMissionIntro=true, \\ + MissionIntroOverride=( \\ + MatineePackage="CIN_AvDf_Intro", \\ + MatineeSequences[0]=(MatineeCommentPrefixes[0]="AvengerDefense_Intro"), \\ + MatineeBaseTag="AvengerDefenseIntroBase" ), \\ + AllowDeployWoundedUnits=true, \\ + DisallowCheckpointPCPs=true, \\ + DisallowUITimerSuspension=true, \\ + AliensAlerted=true, \\ + MaxSoldiers=10, \\ + ForcedTacticalTags[0]="NoVolunteerArmy", \\ + ForcedTacticalTags[1]="NoDoubleAgent") + + + ++ReplacementMissionDefs=(MissionName="ChosenShowdown_Warlock", sType="ChosenShowdown_Warlock", \\ + MissionFamily="ChosenShowdown_Warlock", \\ + MapNames[0]="Obj_ChosenShowdown_LW", \\ + MapNames[1]="UMS_MissionCore", \\ + MapNames[2]="UMS_NoMissionTimer", \\ + MapNames[3]="UMS_NoReinforcements", \\ + MapNames[4]="UMS_LWCommon", \\ + OverrideDefaultMissionIntro=true, \\ + MissionIntroOverride=( \\ + MatineePackage="CIN_XP_WarlockShowdownIntro", \\ + MatineeSequences[0]=(MatineeCommentPrefixes[0]="WarlockShowdown_Intro"), \\ + MatineeBaseTag="ShowdownIntroMatineeBase" ), \\ + RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ + RequiredParcelObjectiveTags[0]="WarlockShowdown", \\ + MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ + SuccessLootTables[0]=(LootTableName="ChosenWarlockShowdownArtifacts"), \\ + bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ + MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true \\ + ), \\ + MissionSchedules[0]="ChosenShowdown_Warlock", \\ + ForcedTacticalTags[0]="NoVolunteerArmy", \\ + ForcedTacticalTags[1]="NoDoubleAgent", ) + + ++ReplacementMissionDefs=(MissionName="ChosenShowdown_Assassin", sType="ChosenShowdown_Assassin", \\ + MissionFamily="ChosenShowdown_Assassin", \\ + MapNames[0]="Obj_ChosenShowdown_LW", \\ + MapNames[1]="UMS_MissionCore", \\ + MapNames[2]="UMS_NoMissionTimer", \\ + MapNames[3]="UMS_NoReinforcements", \\ + MapNames[4]="UMS_LWCommon", \\ + + OverrideDefaultMissionIntro=true, \\ + MissionIntroOverride=( \\ + MatineePackage="CIN_XP_AssassinShowdownIntro", \\ + MatineeSequences[0]=(MatineeCommentPrefixes[0]="AssassinShowdown_Intro"), \\ + MatineeBaseTag="ShowdownIntroMatineeBase" \\ + ), \\ + RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ + RequiredParcelObjectiveTags[0]="AssassinShowdown", \\ + MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ + SuccessLootTables[0]=(LootTableName="ChosenAssassinShowdownArtifacts"), \\ + bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ + MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ + MissionSchedules[0]="ChosenShowdown_Assassin", \\ + ForcedTacticalTags[0]="NoVolunteerArmy", \\ + ForcedTacticalTags[1]="NoDoubleAgent", ) + + ++ReplacementMissionDefs=(MissionName="ChosenShowdown_Hunter", sType="ChosenShowdown_Hunter", \\ + MissionFamily="ChosenShowdown_Hunter", \\ + MapNames[0]="Obj_ChosenShowdown_LW", \\ + MapNames[1]="UMS_MissionCore", \\ + MapNames[2]="UMS_NoMissionTimer", \\ + MapNames[3]="UMS_NoReinforcements", \\ + OverrideDefaultMissionIntro=true, \\ + MissionIntroOverride=( \\ + MatineePackage="CIN_XP_HunterShowdownIntro", \\ + MatineeSequences[0]=(MatineeCommentPrefixes[0]="HunterShowdown_Intro"), \\ + MatineeBaseTag="ShowdownIntroMatineeBase" \\ + ), \\ + RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ + RequiredParcelObjectiveTags[0]="HunterShowdown", \\ + MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ + SuccessLootTables[0]=(LootTableName="ChosenHunterShowdownArtifacts"), \\ + bIsTacticalObjective=true, \\ + bIsStrategyObjective=true, \\ + bIsTriadObjective=true), \\ + MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ + MissionSchedules[0]="ChosenShowdown_Hunter", \\ + ForcedTacticalTags[0]="NoVolunteerArmy", \\ + ForcedTacticalTags[1]="NoDoubleAgent", ) [LW_Overhaul.UIScreenListener_ShellDifficulty] @@ -90,6 +207,11 @@ MAX_REBELS_FOR_RENDEZVOUS=5 +NO_SIT_REP_MISSION_TYPES=Invasion_LW +NO_SIT_REP_MISSION_TYPES=ChosenAvengerDefense +; Config to add Large Map and Very Large Map sitreps if needed. + +; +LargeMaps=MapName +; +VeryLargeMaps=MapName2 + [LW_Overhaul.X2StrategyElement_LWMissionSources] ; Base chance for a sit rep to be added to a mission SIT_REP_CHANCE=0.3f @@ -107,6 +229,9 @@ NUM_SITREPS_TO_ROLL=1 ;change this to true if you want additional sitreps to roll even if you have a special sitrep ROLL_ADITIONAL_SITREPS_WITH_SPECIAL_SITREP=false +; for mod added dark events: Add your dark event name to sitrep name mapping here for use with LW's dark event system +; +DARK_EVENT_SITREP_NAMES=(DarkEventName="Dark Event Template Name", DarkEventSitrepName="Dark Event's Sitrep Template Name") + ; This config allows mission types to forbid certain sit reps ; +MISSION_TYPE_SIT_REP_EXCLUSIONS=(MissionType="Rendezvous_LW", SitRepNames[0]="ProjectMiranda") @@ -114,129 +239,86 @@ ROLL_ADITIONAL_SITREPS_WITH_SPECIAL_SITREP=false +SPECIAL_SIT_REPS=(SitRepName="ViperKing", Chance=0.5, Priority=50) +SPECIAL_SIT_REPS=(SitRepName="BerserkerQueen", Chance=0.5, Priority=55) +SPECIAL_SIT_REPS=(SitRepName="ArchonKing", Chance=0.5, Priority=60) ++SPECIAL_SIT_REPS=(SitRepName="LargeDepot_LW", Chance=0.1, Priority=90) [LW_Overhaul.X2DownloadableContentInfo_LongWarOfTheChosen] CHOSEN_RETRIBUTION_DURATION = 21 +ENCRYPTION_SERVER_CHANCE = 50 +ENCRYPTION_SERVER_MONTH = 3 -; FL5 -+HUNTER_STRENGTHS_T1=(Strength=Predator_LW, Weight=1.0f) +; For if you really dislike frost legion, this shuffles pods with them and if it's rolled, has a 50% chance to reroll. +bNerfFrostLegion = false + ++HUNTER_STRENGTHS_T1=(Strength=Predator_LW, Weight=2.0f) +HUNTER_STRENGTHS_T1=(Strength=ChosenBleedingRounds, Weight=1.0f) +HUNTER_STRENGTHS_T1=(Strength=BlastShield, Weight=1.0f) -+HUNTER_STRENGTHS_T1=(Strength=Overkill_LW, Weight=1.0f) +HUNTER_STRENGTHS_T1=(Strength=Executioner_LW, Weight=1.0f) -;+HUNTER_STRENGTHS_T1=(Strength=Infighter, Weight=1.0f) +HUNTER_STRENGTHS_T1=(Strength=InstantReactionTime, Weight=1.0f) -+HUNTER_STRENGTHS_T1=(Strength=MovingTarget_LW, Weight=4.0f) +HUNTER_STRENGTHS_T1=(Strength=ChosenHoloTargeting, Weight=1.0f) - ++HUNTER_STRENGTHS_T1=(Strength=ChosenVenomRounds, Weight=1.0f) ++HUNTER_STRENGTHS_T1=(Strength=DamageControl, Weight=1.0f) ; Fl10 +HUNTER_STRENGTHS_T2=(Strength=LightningHands, Weight=1.0f) -+HUNTER_STRENGTHS_T2=(Strength=HuntersInstinct, Weight=1.0f) -+HUNTER_STRENGTHS_T2=(Strength=ChosenVenomRounds, Weight=1.0f) -+HUNTER_STRENGTHS_T2=(Strength=DamageControl, Weight=1.0f) -+HUNTER_STRENGTHS_T2=(Strength=ApexPredator_LW, Weight=1.0f) -;;Important perks From Previous tiers -+HUNTER_STRENGTHS_T2=(Strength=MovingTarget_LW, Weight=5.0f) - ++HUNTER_STRENGTHS_T2=(Strength=ChosenDragonRounds, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=HazmatVestBonus_LW, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=PsychoticRage_LW, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=Faceoff, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=ChosenAllSeeing, Weight=3.0f) ++HUNTER_STRENGTHS_T2=(Strength=StingGrenades, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=RuptureImmunity, Weight=1.0f) ++HUNTER_STRENGTHS_T2=(Strength=HeroSlayer_LW, Weight=1.0f) ;FL 15 -+HUNTER_STRENGTHS_T3=(Strength=ChosenDragonRounds, Weight=8.0f) -+HUNTER_STRENGTHS_T3=(Strength=Faceoff, Weight=1.0f) -+HUNTER_STRENGTHS_T3=(Strength=Avenger_LW, Weight=2.0f) -;+HUNTER_STRENGTHS_T3=(Strength=FanFire, Weight=1.0f) -+HUNTER_STRENGTHS_T3=(Strength=YouCannotHide_LW, Weight=8.0f) -+HUNTER_STRENGTHS_T3=(Strength=PsychoticRage_LW, Weight=1.0f) -+HUNTER_STRENGTHS_T3=(Strength=HazmatVestBonus_LW, Weight=2.0f) - - -;;Important perks From Previous tiers -+HUNTER_STRENGTHS_T3=(Strength=MovingTarget_LW, Weight=8.0f) ++HUNTER_STRENGTHS_T3=(Strength=YouCannotHide_LW, Weight=1.0f) ++HUNTER_STRENGTHS_T3=(Strength=TriggerBot, Weight=1.0f) ++HUNTER_STRENGTHS_T3=(Strength=OverBearingSuperiority_LW, Weight=1.0f) ;FL5 -+ASSASSIN_STRENGTHS_T1=(Strength=Predator_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=ChosenVenomRounds, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=ChosenKineticPlating, Weight=1.0f) +ASSASSIN_STRENGTHS_T1=(Strength=BlastShield, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=Cutthroat, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=ChosenHoloTargeting, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=Grazingfire, Weight=1.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=MovingTarget_LW, Weight=4.0f) -+ASSASSIN_STRENGTHS_T1=(Strength=Stiletto_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T1=(Strength=DamageControl, Weight=1.0f) ++ASSASSIN_STRENGTHS_T1=(Strength=ChosenAllSeeing, Weight=1.0f) ++ASSASSIN_STRENGTHS_T1=(Strength=Sprinter, Weight=1.0f) ++ASSASSIN_STRENGTHS_T1=(Strength=InstantReactionTime, Weight=1.0f) ;FL10 -+ASSASSIN_STRENGTHS_T2=(Strength=ChosenImmuneMelee, Weight=2.0f) +ASSASSIN_STRENGTHS_T2=(Strength=PrimaryReturnFire, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=ChosenVenomRounds, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=ChosenBleedingRounds, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=OverKill_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=Concentration_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=DamageControl, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=PreciseStrike_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T2=(Strength=ChosenWatchful, Weight=1.0f) - -;;;important strengths from previous tier just in case they missed -+ASSASSIN_STRENGTHS_T2=(Strength=MovingTarget_LW, Weight=8.0f) ++ASSASSIN_STRENGTHS_T2=(Strength=CloseCombatSpecialist, Weight=1.0f) ++ASSASSIN_STRENGTHS_T2=(Strength=PsychoticRage_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T2=(Strength=MistyMadness_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T2=(Strength=HeroSlayer_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T2=(Strength=RuptureImmunity, Weight=1.0f) ;FL15 -+ASSASSIN_STRENGTHS_T3=(Strength=CloseCombatSpecialist, Weight=8.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=Avenger_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=HuntersInstinct, Weight=1.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=Fatality_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=PsychoticRage_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=YouCannotHide_LW, Weight=1.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=AssassinBladestorm, Weight=10.0f) -+ASSASSIN_STRENGTHS_T3=(Strength=ApexPredator_LW, Weight=1.0f) -;+ASSASSIN_STRENGTHS_T3=(Strength=HazmatVestBonus_LW, Weight=2.0f) - -;;;important strengths from previous tier just in case they missed - -+ASSASSIN_STRENGTHS_T3=(Strength=MovingTarget_LW, Weight=8.0f) ++ASSASSIN_STRENGTHS_T3=(Strength=AssassinBladestorm, Weight=1.0f) ++ASSASSIN_STRENGTHS_T3=(Strength=HazmatVestBonus_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T3=(Strength=BloodBath_LW, Weight=1.0f) ++ASSASSIN_STRENGTHS_T3=(Strength=Impenetrable_LW, Weight=1.0f) ;FL 5 -+WARLOCK_STRENGTHS_T1=(Strength=ChosenKineticPlating, Weight=1.0f) -+WARLOCK_STRENGTHS_T1=(Strength=Predator_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T1=(Strength=CoolUnderPressure, Weight=4.0f) +WARLOCK_STRENGTHS_T1=(Strength=BlastShield, Weight=1.0f) +WARLOCK_STRENGTHS_T1=(Strength=Infighter, Weight=1.0f) +WARLOCK_STRENGTHS_T1=(Strength=ChosenHoloTargeting, Weight=1.0f) -+WARLOCK_STRENGTHS_T1=(Strength=OverKill_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T1=(Strength=MovingTarget_LW, Weight=4.0f) - ++WARLOCK_STRENGTHS_T1=(Strength=SkirmisherStrike, Weight=1.0f) ++WARLOCK_STRENGTHS_T1=(Strength=DamageControl, Weight=1.0f) ++WARLOCK_STRENGTHS_T1=(Strength=InstantReactionTime, Weight=1.0f) ++WARLOCK_STRENGTHS_T1=(Strength=Concentration_LW, Weight=2.0f) ;FL 10 -+WARLOCK_STRENGTHS_T2=(Strength=MindScorchDangerZone, Weight=5.0f) +WARLOCK_STRENGTHS_T2=(Strength=ChosenImmuneMelee, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=LightemUp, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=Aggression, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=Concentration_LW, Weight=6.0f) -+WARLOCK_STRENGTHS_T2=(Strength=DamageControl, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=ApexPredator_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=InstantReactionTime, Weight=1.0f) -+WARLOCK_STRENGTHS_T2=(Strength=Fatality_LW, Weight=1.0f) - -;+WARLOCK_STRENGTHS_T2=(Strength=ReadyForAnything, Weight=1.0f) -;;;important strengths from previous tier just in case they missed -+WARLOCK_STRENGTHS_T2=(Strength=MovingTarget_LW, Weight=4.0f) - -+WARLOCK_STRENGTHS_T2=(Strength=ChosenWatchful, Weight=1.0f) - ++WARLOCK_STRENGTHS_T2=(Strength=ChosenAllSeeing, Weight=1.0f) ++WARLOCK_STRENGTHS_T2=(Strength=PsychoticRage_LW, Weight=1.0f) ++WARLOCK_STRENGTHS_T2=(Strength=OverBearingSuperiority_LW, Weight=1.0f) ++WARLOCK_STRENGTHS_T2=(Strength=RuptureImmunity, Weight=1.0f) ++WARLOCK_STRENGTHS_T2=(Strength=HeroSlayer_LW, Weight=1.0f) ;Fl 15 -+WARLOCK_STRENGTHS_T3=(Strength=Avenger_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T3=(Strength=MindScorchTerror, Weight=1.0f) -+WARLOCK_STRENGTHS_T3=(Strength=PrimaryReturnFire, Weight=1.0f) -+WARLOCK_STRENGTHS_T3=(Strength=OverBearingSuperiority_LW, Weight=8.0f) -+WARLOCK_STRENGTHS_T3=(Strength=Stiletto_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T3=(Strength=PsychoticRage_LW, Weight=1.0f) -+WARLOCK_STRENGTHS_T3=(Strength=YouCannotHide_LW, Weight=1.0f) ++WARLOCK_STRENGTHS_T3=(Strength=UnholyAscension_LW, Weight=1.0f) +WARLOCK_STRENGTHS_T3=(Strength=HazmatVestBonus_LW, Weight=2.0f) - -;;;important strengths from previous tier just in case they missed -+WARLOCK_STRENGTHS_T3=(Strength=MovingTarget_LW, Weight=8.0f) ++WARLOCK_STRENGTHS_T3=(Strength=MindScorchDangerZone, Weight=1.0f) ; Minimum force level before the Lost can start appearing (by difficulty) MIN_FL_FOR_LOST[0]=5 @@ -263,6 +345,8 @@ RULER_POD_SIZE_ALERT_THRESHOLDS[3]=999 +PrimaryWeaponAbilities=HitandSlither +PrimaryWeaponAbilities=Burnout +PrimaryWeaponAbilities=PrimaryReturnFire ++PrimaryWeaponAbilities=TriggerBot ++PrimaryWeaponAbilities=TriggerBotShot +PrimaryWeaponAbilities=HitAndRun +PrimaryWeaponAbilities=ReadyForAnything +PrimaryWeaponAbilities=ChosenVenomRounds @@ -309,6 +393,9 @@ ShouldCleanupObsoleteUnits=true +SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenAvengerDefense +SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenStrongholdLong +SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenStrongholdShort ++SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenShowdown_Assassin ++SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenShowdown_Warlock ++SKIP_CHOSEN_OVERRIDE_MISSION_TYPES=ChosenShowdown_Hunter ; Don't apply infiltration modifiers to faceless civilians despite them being technically ; aliens (bIsAlien = true). This prevents them from being easily distinguished from ordinary @@ -447,6 +534,12 @@ ShouldCleanupObsoleteUnits=true +PlotObjectiveMods=(MapName="Plot_CTY_LgObj_Civic_02", ObjectiveTags[0]="SmashNGrab_LW") +PlotObjectiveMods=(MapName="Plot_CTY_LgObj_Mixed_01", ObjectiveTags[0]="SmashNGrab_LW") +PlotObjectiveMods=(MapName="Plot_CTY_LgObj_Mixed_02", ObjectiveTags[0]="SmashNGrab_LW") ++PlotObjectiveMods=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted2", ObjectiveTags[0]="SmashNGrab_LW") ++PlotObjectiveMods=(MapName="Plot_WLD_SupplyExtract_LgObj_Stream_Ted", ObjectiveTags[0]="SmashNGrab_LW") + ++PlotObjectiveMods=(MapName="Plot_WLD_SupplyExtract_Train_01", ObjectiveTags[0]="BigSupplyExtraction") ++PlotObjectiveMods=(MapName="Plot_WLD_SupplyExtract_Convoy_01", ObjectiveTags[0]="BigSupplyExtraction") + ;; Parcels to remove from the game. @@ -552,7 +645,7 @@ TRIGGER_EMPOWER_BONUS=2; STOCK_BSC_SW_AIM_BONUS=15 STOCK_ADV_SW_AIM_BONUS=20 STOCK_SUP_SW_AIM_BONUS=25 -STOCK_EMPOWER_BONUS=2; +STOCK_EMPOWER_BONUS=5 STOCK_BSC_SUCCESS_CHANCE=25 STOCK_ADV_SUCCESS_CHANCE=30 @@ -563,7 +656,7 @@ ALLOY_PLATING_HP=3 CHITIN_PLATING_HP=4 CARAPACE_PLATING_HP=5 -NANOFIBER_CRITDEF_BONUS=25 +NANOFIBER_CRITDEF_BONUS=10 BONUS_COILGUN_SHRED=1 BLUESCREEN_DISORIENT_CHANCE=50 @@ -726,11 +819,11 @@ MEDIUM_PLATED_MITIGATION_AMOUNT=1 SHIELDWALL_MITIGATION_AMOUNT=5 SHIELDWALL_DEFENSE_AMOUNT=30 HAIL_OF_BULLETS_AMMO_COST=3 -DEMOLITION_AMMO_COST=4 +DEMOLITION_AMMO_COST=3 SATURATION_FIRE_AMMO_COST=4 THROW_GRENADE_COOLDOWN=2 AID_PROTOCOL_COOLDOWN=2 -FUSE_COOLDOWN=5 +FUSE_COOLDOWN=0 INSANITY_MIND_CONTROL_DURATION=2 INSANITY_ENDS_TURN=FALSE RUPTURE_CRIT_BONUS=50 @@ -748,10 +841,19 @@ COVERING_FIRE_TO_HIT_BONUS_AGAINST_COVER=10 FUSION_SWORD_FIRE_CHANCE=10 KILLZONE_CONE_LENGTH=18 KILLZONE_CONE_WIDTH=12 + +WORKSHOP_ENG_BONUS=5 + WARLOCKPSIM1_BASEDAMAGE = (Damage=1, Spread = 0, PlusOne = 0, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") WARLOCKPSIM2_BASEDAMAGE = (Damage=2, Spread = 0, PlusOne = 0, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") WARLOCKPSIM3_BASEDAMAGE = (Damage=4, Spread = 0, PlusOne = 0, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") -WARLOCKPSIM4_BASEDAMAGE = (Damage=7, Spread = 0, PlusOne = 0, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") +WARLOCKPSIM4_BASEDAMAGE = (Damage=5, Spread = 0, PlusOne = 50, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") +WARLOCKPSIM5_BASEDAMAGE = (Damage=7, Spread = 0, PlusOne = 0, Crit = 0, Pierce = 99, Tag = "", DamageType="Electrical") + +; Abilities to fix Stun going away on + ++AbilitiesToFixStun=HackRewardShutdownTurret ++AbilitiesToFixStun=HackRewardShutdownRobot ; This setting means you won't recover corpses from aliens when you kill them with explosives (unless you have needle grenades ability) ; Note that Codex and Avatar are not affected by this setting -- you always recover their remains regardless of how they were killed or if you evac the mission @@ -822,11 +924,11 @@ INSTANT_BUILD_TIMES=TRUE +ItemTable=(ItemTemplateName="Pistol_MG", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="MagnetizedWeapons", RequiredTech2="", SupplyCost=10, AlloyCost=1, CrystalCost=1, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=15, RequiredEngineeringScore=20, Tier = 155, Weight=1, PointsToComplete=100) +ItemTable=(ItemTemplateName="TLE_Pistol_MG", Slots=0, Starting=false, Infinite=false, Buildable=false, RequiredTech1="MagnetizedWeapons", RequiredTech2="", SupplyCost=10, AlloyCost=1, CrystalCost=1, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=15, RequiredEngineeringScore=20, Tier = 155, Weight=1, PointsToComplete=100) -+ItemTable=(ItemTemplateName="AssaultRifle_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=50, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 170, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_AssaultRifle") -+ItemTable=(ItemTemplateName="Cannon_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_Cannon") -+ItemTable=(ItemTemplateName="Shotgun_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_Shotgun") -+ItemTable=(ItemTemplateName="SniperRifle_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_SniperRifle") -+ItemTable=(ItemTemplateName="SMG_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=55, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_SMG") ++ItemTable=(ItemTemplateName="AssaultRifle_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=50, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 170, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_AssaultRifle") ++ItemTable=(ItemTemplateName="Cannon_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_Cannon") ++ItemTable=(ItemTemplateName="Shotgun_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_Shotgun") ++ItemTable=(ItemTemplateName="SniperRifle_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_SniperRifle") ++ItemTable=(ItemTemplateName="SMG_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=55, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_SMG") +ItemTable=(ItemTemplateName="LWPistol_CG", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=30, AlloyCost=2, CrystalCost=3, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=30, Tier = 165, Weight=1, PointsToComplete=100) +ItemTable=(ItemTemplateName="SparkRifle_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///EW_MEC_Weapons.UI.PPC") @@ -983,8 +1085,7 @@ INSTANT_BUILD_TIMES=TRUE +ItemTable=(ItemTemplateName="ThrowingKnife_MG_Secondary", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AutopsyAdventStunLancer", RequiredTech2="", SupplyCost=25, AlloyCost=2, CrystalCost=2, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=20, Tier = 150, PointsToComplete=100, InventoryImage="img:///CombatKnifeMod.UI.UI_Kunai_MG") ;Coil -+ItemTable=(ItemTemplateName="Bullpup_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=55, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_SMG") -+ItemTable=(ItemTemplateName="Vektor_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_WolfWeaponPack.Inv_Coil_Strike_Rifle") ++ItemTable=(ItemTemplateName="Bullpup_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="Coilguns", RequiredTech2="", SupplyCost=55, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_SMG") +ItemTable=(ItemTemplateName="Vektor_CG", Slots=3, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AdvancedCoilguns", RequiredTech2="", SupplyCost=60, AlloyCost=3, CrystalCost=5, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=25, RequiredEngineeringScore=30, Tier = 169, PointsToComplete=200, InventoryImage="img:///UILibrary_WolfWeaponPack.Inv_Coil_Strike_Rifle") ;Beam @@ -997,13 +1098,13 @@ INSTANT_BUILD_TIMES=TRUE +ItemTable=(ItemTemplateName="ThrowingKnife_BM_Secondary", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="AutopsyArchon", RequiredTech2="", SupplyCost=55, AlloyCost=5, CrystalCost=4, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=20, Tier = 150, PointsToComplete=100, InventoryImage="img:///CombatKnifeMod.UI.UI_Kunai_BM") ; Spider -+ItemTable=(ItemTemplateName="LightPlatedArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="SpiderSuit", RequiredTech2="", SupplyCost=70, AlloyCost=5, CrystalCost=1, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=15, Tier = 80, PointsToComplete=200) ++ItemTable=(ItemTemplateName="LightPlatedArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="SpiderSuit", RequiredTech2="", SupplyCost=50, AlloyCost=5, CrystalCost=1, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=15, Tier = 80, PointsToComplete=200) ; Predator +ItemTable=(ItemTemplateName="MediumPlatedArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="PlatedArmor", RequiredTech2="", SupplyCost=30, AlloyCost=5, CrystalCost=0, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=10, Tier = 80, PointsToComplete=100) ; EXO Suit +ItemTable=(ItemTemplateName="HeavyPlatedArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="EXOSuit", RequiredTech2="", SupplyCost=60, AlloyCost=6, CrystalCost=1, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=20, RequiredEngineeringScore=20, Tier = 80, PointsToComplete=150) ; Wraith -+ItemTable=(ItemTemplateName="LightPoweredArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="WraithSuit", RequiredTech2="", SupplyCost=120, AlloyCost=9, CrystalCost=15, CoreCost=1, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=40, RequiredEngineeringScore=35, Tier = 100, PointsToComplete=250) ++ItemTable=(ItemTemplateName="LightPoweredArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="WraithSuit", RequiredTech2="", SupplyCost=100, AlloyCost=9, CrystalCost=15, CoreCost=1, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=40, RequiredEngineeringScore=35, Tier = 100, PointsToComplete=250) ; Warden +ItemTable=(ItemTemplateName="MediumPoweredArmor", Slots=0, Starting=false, Infinite=false, Buildable=true, RequiredTech1="PoweredArmor", RequiredTech2="", SupplyCost=80, AlloyCost=10, CrystalCost=10, CoreCost=0, SpecialItemTemplateName="", SpecialItemCost=0, TradingPostValue=30, RequiredEngineeringScore=30, Tier = 100, PointsToComplete=150) ; WAR Suit @@ -1143,6 +1244,7 @@ INSTANT_BUILD_TIMES=TRUE +TechTable=(TechTemplateName="AutopsyViper", ProvingGround=false, ResearchPointCost=2500, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseViper", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) +TechTable=(TechTemplateName="AutopsyMuton", ProvingGround=false, ResearchPointCost=3500, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseMuton", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) +TechTable=(TechTemplateName="AutopsyBerserker", ProvingGround=false, ResearchPointCost=3500, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyMuton", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseBerserker", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) ++TechTable=(TechTemplateName="AutopsySpectre", ProvingGround=false, ResearchPointCost=3500, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseSpectre", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) +TechTable=(TechTemplateName="AutopsyArchon", ProvingGround=false, ResearchPointCost=4000, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseArchon", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=25) +TechTable=(TechTemplateName="AutopsyGatekeeper", ProvingGround=false, ResearchPointCost=5000, ModPointsToCompleteOnly=false, PrereqTech1="Psionics", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseGatekeeper", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=25) +TechTable=(TechTemplateName="AutopsyAndromedon", ProvingGround=false, ResearchPointCost=4000, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAndromedon", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=25) @@ -1150,6 +1252,8 @@ INSTANT_BUILD_TIMES=TRUE +TechTable=(TechTemplateName="AutopsyChryssalid", ProvingGround=false, ResearchPointCost=2500, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseChryssalid", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=20) +TechTable=(TechTemplateName="AutopsyAdventTrooper", ProvingGround=false, ResearchPointCost=2000, ModPointsToCompleteOnly=false, PrereqTech1="AlienBiotech", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventTrooper", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=20,ItemGranted="", RequiredScienceScore=5) +TechTable=(TechTemplateName="AutopsyAdventStunLancer", ProvingGround=false, ResearchPointCost=2000, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyAdventTrooper", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventStunLancer",ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) ++TechTable=(TechTemplateName="AutopsyAdventPriest", ProvingGround=false, ResearchPointCost=2000, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyAdventOfficer", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventPriest", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) ++TechTable=(TechTemplateName="AutopsyAdventPurifier", ProvingGround=false, ResearchPointCost=2000, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyAdventOfficer", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventPurifier",ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) +TechTable=(TechTemplateName="AutopsyAdventShieldBearer", ProvingGround=false, ResearchPointCost=2200, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyAdventTrooper", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventShieldbearer",ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=15) +TechTable=(TechTemplateName="AutopsyDrone", ProvingGround=false, ResearchPointCost=2000, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyAdventTrooper", PrereqTech2="HybridMaterials", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseDrone", ReqItemCost1=3, ReqItemTemplateName2="", ReqItemCost2=0,ItemGranted="", RequiredScienceScore=10) +TechTable=(TechTemplateName="AutopsyAdventMEC", ProvingGround=false, ResearchPointCost=2500, ModPointsToCompleteOnly=false, PrereqTech1="AutopsyDrone", PrereqTech2="", PrereqTech3="", SupplyCost=0, AlloyCost=0, CrystalCost=0, CoreCost=0, ReqItemTemplateName1="CorpseAdventMEC", ReqItemCost1=1, ReqItemTemplateName2="Instant", ReqItemCost2=10,ItemGranted="", RequiredScienceScore=20) @@ -1611,6 +1715,16 @@ AMBUSH_MISSION_REGION_ALERT_LEVEL=2 +TURN_COUNT_TO_CAVALRY_ALL_CASES_MOD[2]=-4 +TURN_COUNT_TO_CAVALRY_ALL_CASES_MOD[3]=-6 +; Global Reinforcement bucket fill value divisor. 1.0f is default +; values over 1.0f will reduce bucket fill rate, values below 1.0f will increase bucket fill rate; +; Example: 2.0f will cut RNF rate in half. + +REINFORCEMENT_BUCKET_FILL_MODIFIER = 1.0f + +; Reinforcement bucket fill divisor for when Beta Strike is on. 2.0 is default, cuts RNF rate in half. + +BETA_STRIKE_RNF_MOD = 2.0f + [LW_Overhaul.SeqAct_LWCallReinforcements] ; Reinforcement encounter schedules. Each schedule can be given a name and a list of encounters. Each reinforcement in a mission will pick the next encounter in the list. If ; you get to the end of the list, it will just keep spawning the final encounter over and over. The 'Default' schedule is used by default unless a mission specifies a different @@ -1637,17 +1751,17 @@ AMBUSH_MISSION_REGION_ALERT_LEVEL=2 +ReinforcementList=( \\ ScheduleName=Defend_LW, \\ EncounterList[1]=ADVx2_RNFStandard_LW, \\ - EncounterList[2]=OPNx3_WithTerror_LW, \\ - EncounterList[3]=ADVx4_RNFStandard_LW, \\ - EncounterList[4]=TerrorBucketx5_LW, \\ - EncounterList[5]=ADVx6_RNFStandard_LW, \\ - EncounterList[6]=TerrorBucketx7_LW, \\ - EncounterList[7]=OPNx7_Standard_LW, \\ - EncounterList[8]=ADVx7_RNFStandard_LW, \\ - EncounterList[9]=TerrorBucketx8_LW, \\ - EncounterList[10]=TerrorBucketx8_LW, \\ - EncounterList[11]=OPNx10_Standard_LW, \\ - EncounterList[12]=TerrorBucketx10_LW, \\ + EncounterList[2]=OPNx2_WithTerror_LW, \\ + EncounterList[3]=ADVx3_RNFStandard_LW, \\ + EncounterList[4]=TerrorBucketx4_LW, \\ + EncounterList[5]=ADVx5_RNFStandard_LW, \\ + EncounterList[6]=TerrorBucketx6_LW, \\ + EncounterList[7]=OPNx6_Standard_LW, \\ + EncounterList[8]=ADVx6_RNFStandard_LW, \\ + EncounterList[9]=TerrorBucketx7_LW, \\ + EncounterList[10]=TerrorBucketx7_LW, \\ + EncounterList[11]=OPNx8_Standard_LW, \\ + EncounterList[12]=TerrorBucketx8_LW, \\ EncounterList[13]=OPNx10_WithTerror_LW, \\ ) @@ -1678,6 +1792,7 @@ AMBUSH_MISSION_REGION_ALERT_LEVEL=2 EncounterList[9]=OPNx12_Standard_LW, \\ ) + ; This is the baseline distance from the EVAC point (not squad centerpoint) that reinforcements will arrive on the defend mission RANDOM_SPAWN_OFFSET = 5 DEFEND_SPAWN_DISTANCE_TILES_BEFORE_ZONE = 16 ; BEFORE Skyranger arrives @@ -1692,11 +1807,13 @@ REINF_SPAWN_DISTANCE_FROM_OBJECTIVE_WHEN_SQUAD_IS_CONCEALED = 50; (50 means the ; Initial mission timer values +InitialTurnCounts=(MissionType="SabotageTransmitter_LW", Turns=4) +InitialTurnCounts=(MissionType="SupplyExtraction_LW", Turns=7) ++InitialTurnCounts=(MissionType="BigSupplyExtraction_LW", Turns=8) +InitialTurnCounts=(MissionFamily="Recover_LW", Turns=8) +InitialTurnCounts=(MissionFamily="Hack_LW", Turns=8) +InitialTurnCounts=(MissionFamily="DestroyObject_LW", Turns=12) +InitialTurnCounts=(MissionFamily="SecureUFO_LW", Turns=12) +InitialTurnCounts=(MissionFamily="SmashNGrab_LW", Turns=12) ++InitialTurnCounts=(MissionFamily="BigSmashNGrab_LW", Turns=12) +InitialTurnCounts=(MissionFamily="Jailbreak_LW", Turns=18) +InitialTurnCounts=(MissionFamily="Extract_LW", Turns=16) +InitialTurnCounts=(MissionFamily="Neutralize_LW", Turns=18) @@ -1756,6 +1873,7 @@ SquadInfo_DelayedInit=0.75f ; in seconds +EvacFlareEscapeMissions=IntelRaid_LW +EvacFlareEscapeMissions=SupplyConvoy_LW +EvacFlareEscapeMissions=TroopManeuvers_LW ++EvacFlareEscapeMissions=CovertOpsTroopManeuvers_LW +EvacFlareEscapeMissions=AssaultAlienBase_LW +EvacFlareEscapeMissions=SabotageAdventMonument_LW +EvacFlareEscapeMissions=SabotageAlienFacility_LW @@ -1805,6 +1923,13 @@ SquadInfo_DelayedInit=0.75f ; in seconds +EvacTimerMissions=Jailbreak_LW [LW_Overhaul.X2LWAbilitiesModTemplate] + +; Combat Protocol Cooldown +COMBAT_PROTOCOL_COOLDOWN = 3 + +; Crit reduction for plated vests (aka Tactical Vests) + +PLATED_CRITDEF_BONUS=25 ; negative dodge creates chances for promotion of hit types, similar to crit ALLOW_NEGATIVE_DODGE=true ; allowing dodge to convert grazes to misses will reduce the overall hit chance, displaying a modifier @@ -1834,7 +1959,9 @@ SCANNING_PROTOCOL_INITIAL_CHARGES=2 MIND_SCORCH_RADIUS=3 MIND_SCORCH_BURNING_BASE_DAMAGE=2 MIND_SCORCH_BURNING_DAMAGE_SPREAD=1 -MIND_SCORCH_BURN_CHANCE=70 +MIND_SCORCH_BURN_CHANCE=40 + +SUSTAIN_WOUND_HP_REDUCTTION = 2 CHOSEN_REGENERATION_HEAL_VALUE_PCT=0.16f @@ -1851,9 +1978,16 @@ CHOSEN_REGENERATION_HEAL_VALUE_PCT=0.16f ; A list of multi-shot abilities that should be patched to fix a ; performance issue +MULTI_SHOT_ABILITIES=(AbilityName="RapidFire", FollowUpAbilityNames[0]="RapidFire2") ++MULTI_SHOT_ABILITIES=(AbilityName="RapidFireSnapShot", FollowUpAbilityNames[0]="RapidFireSnapShot2") +MULTI_SHOT_ABILITIES=(AbilityName="ChainShot", FollowUpAbilityNames[0]="ChainShot2") ++MULTI_SHOT_ABILITIES=(AbilityName="ChainShotSnapShot", FollowUpAbilityNames[0]="ChainShotSnapShot2") +MULTI_SHOT_ABILITIES=(AbilityName="CyclicFire", FollowUpAbilityNames[0]="CyclicFire2", FollowUpAbilityNames[1]="CyclicFire3") ++MELEE_ABILITIES_FOR_BLOODTHIRST="Slash_LW" ++MELEE_ABILITIES_FOR_BLOODTHIRST="SwordSlice_LW" ++MELEE_ABILITIES_FOR_BLOODTHIRST="CombativesCounterattack" ++MELEE_ABILITIES_FOR_BLOODTHIRST="LightningSlash_LW" + [LW_Overhaul.X2LWCovertActionsModTemplate] ; Required soldier ranks to go on the "Find Faction" covert actions FIND_SECOND_FACTION_REQ_RANK=4 ; SGT @@ -1960,6 +2094,17 @@ DEFAULT_MISSION_EXPERIENCE_WEIGHT=5.7f ; out at the end of missions ; CLASSES_INELIGIBLE_FOR_MISSION_XP="Spark" +[LW_Overhaul.X2EventListener_ChosenEndOfMonth] +; Chosen Knowledge per month gain settings for LW config +; NOTE: these values are in addition to the guaranteed knowledge gain per month in XComGameData.ini, set on [XComGame.XComGameState_AdventChosen] + +;knowledge gains for the starting chosen ++STARTING_CHOSEN_KNOWLEDGE_GAIN=9 + +;values randomly assigned to the other chosen. Make sure there are 2 values here. ++CHOSEN_KNOWLEDGE_GAINS=8 ++CHOSEN_KNOWLEDGE_GAINS=7 + [LW_Overhaul.X2EventListener_Reinforcements] LISTENER_PRIORITY=-1 ; Use default listener priority (LWListenerManager) @@ -2189,9 +2334,13 @@ LostSwarmIDsDiff3[17]=TheLostx10_With2Brutes_LW +MISSION_PLOT_OVERRIDES=(MissionType="TroopManeuvers_LW", PlotType="Tunnels_Subway", IsAllowed=false) +MISSION_PLOT_OVERRIDES=(MissionType="TroopManeuvers_LW", PlotType="Tunnels_Sewers", IsAllowed=false) ++MISSION_PLOT_OVERRIDES=(MissionType="CovertOpsTroopManeuvers_LW", PlotType="Tunnels_Subway", IsAllowed=false) ++MISSION_PLOT_OVERRIDES=(MissionType="CovertOpsTroopManeuvers_LW", PlotType="Tunnels_Sewers", IsAllowed=false) +MISSION_PLOT_OVERRIDES=(MissionType="CovertEscape_LW", PlotType="Tunnels_Sewers", IsAllowed=true) +MISSION_PLOT_OVERRIDES=(MissionType="CovertEscape_NonPCP_LW", PlotType="Tunnels_Sewers", IsAllowed=true) +numAdditionalCrateLargeDepot=2 + [LW_Overhaul.X2Ability_LW_DefaultAbilitySet] REACTION_FIRE_ANTI_COVER_BONUS=25 @@ -2202,3 +2351,7 @@ REGIONS_TO_BLACKSITE=3 [LW_Overhaul.XComGameState_LWOverhaulOptions] EnablePauseOnRecruit=true InitialGrazeBandWidth=10 + +[LW_Overhaul.X2StrategyElement_DefaultStaffSLots_LW] +LIMIT_INTENSE_TRAINING_OPS=true +NUM_INTENSE_TRAINING_OPS=2 diff --git a/LongWarOfTheChosen/Config/XComLW_SoldierSkills.ini b/LongWarOfTheChosen/Config/XComLW_SoldierSkills.ini index ab36fb4e0..b6db03727 100644 --- a/LongWarOfTheChosen/Config/XComLW_SoldierSkills.ini +++ b/LongWarOfTheChosen/Config/XComLW_SoldierSkills.ini @@ -40,7 +40,7 @@ COUNTERATTACK_DODGE_AMOUNT=90 ;This is the permanent stat increase COMBATIVES_DODGE=10 -FLUSH_DAMAGE_PENALTY=0.8 +FLUSH_DAMAGE_PENALTY=0.5 FLUSH_COOLDOWN=3 FLUSH_AMMO_COST=1 FLUSH_AIM_BONUS=30 @@ -65,7 +65,7 @@ COMBAT_FITNESS_MOBILITY=1 COMBAT_FITNESS_DODGE=4 COMBAT_FITNESS_WILL=4 COMBAT_FITNESS_DEFENSE=0 -FORTIFY_COOLDOWN=5 +FORTIFY_COOLDOWN=4 FORTIFY_DEFENSE=20 SPRINTER_MOBILITY=1 @@ -124,11 +124,15 @@ FLAMETHROWER_TILE_WIDTH=5 ROUST_RADIUS_MULTIPLIER = 0.5 ROUST_RANGE_MULTIPLIER = 1.5 -ROUST_DIRECT_APPLY_CHANCE=20 +ROUST_DIRECT_APPLY_CHANCE=50 ROUST_DAMAGE_PENALTY=0.5 ROUST_CHARGES=1 ROUST_HIGH_PRESSURE_CHARGES=1 +ROUST_STATEFFECT_DURATION=1 +ROUST_MOB_REDUCTION=6 +ROUST_DEF_REDUCTION=10 + INCINERATOR_RADIUS_MULTIPLIER = 1.2 INCINERATOR_RANGE_MULTIPLIER = 1.25 @@ -143,7 +147,7 @@ BURNOUT_RADIUS=1.5 FIRESTORM_NUM_CHARGES=1 FIRESTORM_RADIUS_METERS=8 FIRESTORM_DAMAGE_BONUS=2 -FIRESTORM_ENV_DAMAGE=10 +FIRESTORM_ENV_DAMAGE=20 FIRESTORM_HIGH_PRESSURE_CHARGES=0 SHOCK_AND_AWE_BONUS_CHARGES=1 JAVELIN_ROCKETS_BONUS_RANGE_TILES=6 @@ -152,9 +156,15 @@ BUNKER_BUSTER_RADIUS_METERS=8.0 BUNKER_BUSTER_ENV_DAMAGE=250 FIRE_AND_STEEL_DAMAGE_BONUS=1 CONCUSSION_ROCKET_RADIUS_TILES=5 + +USE_CONCUSSION_ROCKET_WILL_CALCS=false CONCUSSION_ROCKET_TARGET_WILL_MALUS_STUN=20 CONCUSSION_ROCKET_TARGET_WILL_MALUS_DISORIENT=100 -CONCUSSION_ROCKET_DAMAGE_VALUE=(Damage=2, Spread=1, PlusOne=0, Crit=1, Pierce=0, Shred=0, Tag="", DamageType="Explosion") + +CONCUSSION_ROCKET_STUN_CHANCE=20 +ENABLE_CONCUSSION_ROCKET_SMOKE=false + +CONCUSSION_ROCKET_DAMAGE_VALUE=(Damage=2, Spread=0, PlusOne=0, Crit=0, Pierce=0, Shred=0, Tag="", DamageType="Explosion") CONCUSSION_ROCKET_ENV_DAMAGE=5 MOVEMENT_SCATTER_AIM_MODIFIER=-30 MOVEMENT_SCATTER_TILE_MODIFIER=2 @@ -166,7 +176,7 @@ NUM_AIM_SCATTER_ROLLS=4 QUICKBURN_COOLDOWN=5 +QUICKBURN_ABILITIES="LWFlamethrower" +QUICKBURN_ABILITIES="Roust" -+QUICKBURN_ABILITIES="Firestorm" +;+QUICKBURN_ABILITIES="Firestorm" ;aim modifier for scatter, based on range +ROCKET_RANGE_PROFILE[0]=0 @@ -255,7 +265,7 @@ SOULSTORM_CHARGES = 0 SOULSTORM_CAN_BE_USED_WHILE_DISORIENTED = false SOULSTORM_CAN_BE_USED_WHILE_BURNING = false SOULSTORM_CAST_RANGE_TILES = 1 -SOULSTORM_CAST_RADIUS_METERS = 7 +SOULSTORM_CAST_RADIUS_METERS = 8 SOULSTORM_TARGET_TILE_MUST_BE_REVEALED = true SOULSTORM_CAN_TARGET_ALLIES = true @@ -300,6 +310,27 @@ MAX_SLICE_FLECHE_DAMAGE=5 +REQUIRED_OVERWATCH_TO_HIT_EXCLUDED_ABILITIES="LightningReflexes" +REQUIRED_OVERWATCH_TO_HIT_EXCLUDED_ABILITIES="LightningReflexes_LW" ++SNAP_SHOT_ABILITIES="SnapShot" ++SNAP_SHOT_ABILITIES="LongWatchShot" ++SNAP_SHOT_ABILITIES="DeadeyeSnapShot" ++SNAP_SHOT_ABILITIES="PrecisionShotSnapShot" ++SNAP_SHOT_ABILITIES="DisablingShotSnapShot" ++SNAP_SHOT_ABILITIES="RapidFireSnapShot" ++SNAP_SHOT_ABILITIES="RapidFireSnapShot2" ++SNAP_SHOT_ABILITIES="ChainShotSnapShot" ++SNAP_SHOT_ABILITIES="ChainShotSnapShot2" + +; Collateral Damage +; Cooldown +COLLATERAL_COOLDOWN = 3 +; Ammo Used +COLLATERAL_AMMO = 2 +;This is in Unreal Units, not XCOM Tiles (96 units = 1 tile) +COLLATERAL_RADIUS = 160 +;Environmental damage +COLLATERAL_ENVDMG = 30 + + [LW_PerkPack_Integrated.X2Condition_RequiredToHitChance] LowAbilityMinimumRequiredHitChance=25 ; FireControl25 perk MidAbilityMinimumRequiredHitChance=50 ; FireControl50 perk @@ -324,8 +355,8 @@ WALK_FIRE_MIN_ACTION_REQ = 1 PRECISION_SHOT_AMMO_COST=1 PRECISION_SHOT_COOLDOWN=4 PRECISION_SHOT_CRIT_BONUS=30 -CYCLIC_FIRE_COOLDOWN=2 -CYCLIC_FIRE_AIM_MALUS=10 +CYCLIC_FIRE_COOLDOWN=3 +CYCLIC_FIRE_AIM_MALUS=15 CYCLIC_FIRE_MIN_ACTION_REQ=2 CYCLIC_FIRE_SHOTS=3 CYCLIC_FIRE_AMMO=3 @@ -395,19 +426,22 @@ IRON_SKIN_MELEE_DAMAGE_REDUCTION=3 MIND_MERGE_MIN_ACTION_POINTS=1 MIND_MERGE_DURATION=2 ; This is number of "half-turns" MIND_MERGE_COOLDOWN=4 -MIND_MERGE_WILL_DIVISOR=5 -MIND_MERGE_SHIELDHP_DIVISOR=20 -MIND_MERGE_AMP_MG_WILL_BONUS=5 +SOUL_MERGE_COOLDOWN_REDUCTION=1 +MIND_MERGE_FLAT_SHIELDHP=1 +MIND_MERGE_FLAT_WILL=0 +MIND_MERGE_FLAT_CRIT=0 MIND_MERGE_AMP_MG_SHIELDHP_BONUS=1 -MIND_MERGE_AMP_BM_WILL_BONUS=10 +MIND_MERGE_AMP_MG_WILL_BONUS=5 +MIND_MERGE_AMP_MG_CRIT_BONUS=5 MIND_MERGE_AMP_BM_SHIELDHP_BONUS=2 -SOUL_MERGE_WILL_DIVISOR=5 -SOUL_MERGE_SHIELDHP_DIVISOR=20 -SOUL_MERGE_COOLDOWN_REDUCTION=1 +MIND_MERGE_AMP_BM_WILL_BONUS=10 +MIND_MERGE_AMP_BM_CRIT_BONUS=10 +MIND_MERGE_SHIELDHP_DIVISOR=20 +MIND_MERGE_WILL_DIVISOR=5 MIND_MERGE_CRIT_DIVISOR=5 +SOUL_MERGE_SHIELDHP_DIVISOR=20 +SOUL_MERGE_WILL_DIVISOR=5 SOUL_MERGE_CRIT_DIVISOR=7 -MIND_MERGE_AMP_MG_CRIT_BONUS=5 -MIND_MERGE_AMP_BM_CRIT_BONUS=10 FORMIDABLE_EXPLOSIVES_DR=0.5f FORMIDABLE_ARMOR_MITIGATION=0 FORMIDABLE_ABLATIVE_HP=2 @@ -424,6 +458,8 @@ NO_STANDARD_ATTACKS_WHEN_ON_FIRE=TRUE ; This applies to Standard Shot, Pistol Sh NO_MELEE_ATTACKS_WHEN_ON_FIRE=FALSE ; This applies to all Melee attacks (both XCOM and alien) BOMBARD_BONUS_RANGE_TILES=2 SHARPSHOOTERAIM_CRITBONUS = 20 +MACROPHAGES_HEAL_AMT = 1 + CE_MAX_TILES=4 CE_USES_PER_TURN=1 @@ -501,11 +537,16 @@ MAIM_DURATION = 1 SCRAP_METAL_AMMO_AMOUNT = 1 -MOVING_TARGET_DEFENSE = 30 +OVERBEARING_SUPERIORITY_CRIT = 20 + +TRIGGER_BOT_DAMAGE_PENALTY = 0.35 + +MOVING_TARGET_DEFENSE = 15 MOVING_TARGET_DODGE = 50 COMBATREADINESS_DEF = 10 COMBATREADINESS_AIM = 10 +COMBAT_READINESS_EXPLOSIVE_DR = 0.1f +COMBAT_READINESS_EFFECTS_TO_REMOVE = Maim_Immobilize @@ -548,11 +589,17 @@ IMPULSE_CRIT_BONUS = 10 FATALITY_AIM = 100 FATALITY_CRIT = 100 -FATALITY_THRESHOLD = 0.35f -CRUSADER_WOUND_HP_REDUCTTION = 8 +FATALITY_THRESHOLD = 0.5f +CRUSADER_WOUND_HP_REDUCTTION = 6 QUICKDRAW_MOBILITY_INCREASE = 1.0f + +HERO_SLAYER_DMG = 0.35 + +PSYCHOTIC_RAGE_BELOW_THRESHOLD = 51 +PSYCHOTIC_RAGE_DMG_BONUS = 35 + [LW_PerkPack_Integrated.X2Effect_HitandRun] +HNR_ABILITYNAMES=StandardShot +HNR_ABILITYNAMES=LightEmUp @@ -582,8 +629,8 @@ DGG_AIM_BONUS=10 DGG_DEF_BONUS=10 [LW_PerkPack_Integrated.X2Effect_Executioner_LW] -EXECUTIONER_AIM_BONUS=20 -EXECUTIONER_CRIT_BONUS=20 +EXECUTIONER_AIM_BONUS=15 +EXECUTIONER_CRIT_BONUS=15 [LW_PerkPack_Integrated.X2Effect_TacticalSense] TACTICAL_SENSE_DEF_BONUS_PER_ENEMY=3 @@ -649,11 +696,11 @@ PRECISION_SHOT_CRIT_DAMAGE_MODIFIER=0.34 COMMISSAR_HIT_BONUS=50 [LW_PerkPack_Integrated.X2Effect_HyperReactivePupils] -HYPERREACTIVE_PUPILS_AIM_BONUS=10 +HYPERREACTIVE_PUPILS_AIM_BONUS=15 [LW_PerkPack_Integrated.X2Effect_LockedOn] LOCKEDON_AIM_BONUS=20 -LOCKEDON_CRIT_BONUS=20 +LOCKEDON_CRIT_BONUS=10 [LW_PerkPack_Integrated.XComGameState_Effect_LastShotDetails] +SHOTFIRED_ABILITYNAMES=StandardShot @@ -834,52 +881,59 @@ NULLIFY_LONG_RANGE_PENALTY_MODIFIER=0.5 ; Set to below 1 to reduce the impact o [LW_Overhaul.X2Ability_LW_ChosenAbilities] COOLDOWN_AMMO_DUMP=1 -COOLDOWN_SHIELD_ALLY=2 +COOLDOWN_SHIELD_ALLY=3 MSTERROR_STAT_CHECK_BASE_VALUE=50 KIDNAP_COOLDOWN=1 SHIELDALLYM1_SHIELD=4 SHIELDALLYM2_SHIELD=6 -SHIELDALLYM3_SHIELD=8 -SHIELDALLYM4_SHIELD=15 - +SHIELDALLYM3_SHIELD=9 +SHIELDALLYM4_SHIELD=12 +SHIELDALLYM5_SHIELD=15 KIDNAP_ELIGIBLE_CHARTYPES[0]=Soldier KIDNAP_ELIGIBLE_CHARTYPES[1]=ReaperSoldier KIDNAP_ELIGIBLE_CHARTYPES[2]=SkirmisherSoldier KIDNAP_ELIGIBLE_CHARTYPES[3]=TemplarSoldier -CHOSEN_SUMMON_RNF_DATA[0]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[1]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[2]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[3]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[4]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[5]="CHSx3_LW" -CHOSEN_SUMMON_RNF_DATA[6]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[7]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[8]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[9]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[10]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[11]="CHSx4_LW" -CHOSEN_SUMMON_RNF_DATA[12]="CHSx5_LW" -CHOSEN_SUMMON_RNF_DATA[13]="CHSx5_LW" -CHOSEN_SUMMON_RNF_DATA[14]="CHSx5_LW" -CHOSEN_SUMMON_RNF_DATA[15]="CHSx6_LW" -CHOSEN_SUMMON_RNF_DATA[16]="CHSx6_LW" -CHOSEN_SUMMON_RNF_DATA[17]="CHSx6_LW" -CHOSEN_SUMMON_RNF_DATA[18]="CHSx8_LW" +CHOSEN_SUMMON_RNF_DATA[0]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[1]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[2]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[3]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[4]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[5]="CHSx2_LW" +CHOSEN_SUMMON_RNF_DATA[6]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[7]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[8]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[9]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[10]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[11]="CHSx3_LW" +CHOSEN_SUMMON_RNF_DATA[12]="CHSx4_LW" +CHOSEN_SUMMON_RNF_DATA[13]="CHSx4_LW" +CHOSEN_SUMMON_RNF_DATA[14]="CHSx4_LW" +CHOSEN_SUMMON_RNF_DATA[15]="CHSx5_LW" +CHOSEN_SUMMON_RNF_DATA[16]="CHSx5_LW" +CHOSEN_SUMMON_RNF_DATA[17]="CHSx5_LW" +CHOSEN_SUMMON_RNF_DATA[18]="CHSx6_LW" GREATEST_CHAMPION_AIM=15 GREATEST_CHAMPION_CRIT=25 GREATEST_CHAMPION_WILL=30 GREATEST_CHAMPION_PSIOFFENSE=30 -IMPACT_COMPENSATION_PCT_DR=0.2 -IMPACT_COMPENSATION_MAX_STACKS=3 +UNHOLY_ASCENSION_MOD = 2.0 + +IMPACT_COMPENSATION_PCT_DR=0.25 +IMPACT_COMPENSATION_MAX_STACKS=4 SHIELD_ALLY_PCT_DR=0.67 UNSTOPPABLE_MIN_MOB = 7 +; These are #.#x mobility, so 0.7x base mob, not minus 70% mobility +HUNTER_MOBILITY_DEBUFF = 0.625f +WARLOCK_MOBILITY_DEBUFF = 0.55f +HUNTER_MOB_PER_ATTACK=2 + [LW_Overhaul.X2Effect_DodgeModifier] ANTIDODGE_BONUS=150 @@ -901,7 +955,8 @@ DamageMultiplier=0.5f BLOODTHIRST_T1_DMG = 1 BLOODTHIRST_T2_DMG = 1 BLOODTHIRST_T3_DMG = 2 -BLOODTHIRST_T4_DMG = 3 +BLOODTHIRST_T4_DMG = 2 +BLOODTHIRST_T5_DMG = 3 [LW_Overhaul.X2Effect_Phosphorus] BONUS_CV_SHRED = 1 @@ -925,6 +980,7 @@ IMPERSONAL_EDGE_AIM=20 BLUESCREEN_KNIVES_PIERCE=2 KNIFE_ENCOUNTERS_MAX_TILES=5 +KNIFE_ENCOUNTERS_BANISHER_MAX_TILES=6 +KNIFE_ENCOUNTERS_ABILITY_NAMES=MusashiThrowKnifeSecondary_LW +KNIFE_ENCOUNTERS_ABILITY_NAMES=CripplingStrike diff --git a/LongWarOfTheChosen/Config/XComLW_UI.ini b/LongWarOfTheChosen/Config/XComLW_UI.ini index 85590ec21..de6fe8991 100644 --- a/LongWarOfTheChosen/Config/XComLW_UI.ini +++ b/LongWarOfTheChosen/Config/XComLW_UI.ini @@ -79,6 +79,7 @@ RECRUIT_FONT_SIZE_CTRL = 22 ; Recruit screen font size for controller users. RECRUIT_Y_OFFSET_CTRL = -3 ; Moves the stats up/down; negative numbers move up / positive numbers move down. RECRUIT_FONT_SIZE_MK = 20 ; Recruit screen font size for mouse & keyboard users. RECRUIT_Y_OFFSET_MK = -2; ; Moves the stats up/down; negative numbers move up / positive numbers move down. +RECRUIT_SHOW_PSI_TECH = "" ; The tech required to show Recruits' Psi stat. Use "AutopsySectoid" for old behaviour. [LW_Overhaul.UIScreenListener_UIStrategyMap] CYCLE_HAVENS_INSTANTLY = false ; When controller users cycle 'contacted' havens with the DPad, do we want the strategy map movement to be instantaneous or with acceleration/deceleration ? diff --git a/LongWarOfTheChosen/Config/XComMaps.ini b/LongWarOfTheChosen/Config/XComMaps.ini index 289e16727..c621ea9b5 100644 --- a/LongWarOfTheChosen/Config/XComMaps.ini +++ b/LongWarOfTheChosen/Config/XComMaps.ini @@ -29,9 +29,9 @@ +arrMapImageDefs=(MapName="md_RemoteScienceStation_01_LW" , ImagePath="UILibrary_MissionImages.Mission_MD_RemoteScience_01_Tundra", Biome="Tundra") ; Supply Convoy -+arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LW_Overhaul.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Arid", Biome="Arid") -+arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LW_Overhaul.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Temp", Biome="Temperate") -+arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LW_Overhaul.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Tundra", Biome="Tundra") ++arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LWOTC.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Arid", Biome="Arid") ++arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LWOTC.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Temp", Biome="Temperate") ++arrMapImageDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01" , ImagePath="UILibrary_LWOTC.MissionImages.Missions_PCP_WLD_SupplyConvoy_16x64_LW_01_Tundra", Biome="Tundra") ; Jailbreak +arrMapImageDefs=(MapName="lg_PropagandaCenter_02_LW" , ImagePath="UILibrary_MissionImages.Mission_lg_PropagandaCenter_02", Biome="") diff --git a/LongWarOfTheChosen/Config/XComMissionDefs.ini b/LongWarOfTheChosen/Config/XComMissionDefs.ini index 28e08b666..f1c07049a 100644 --- a/LongWarOfTheChosen/Config/XComMissionDefs.ini +++ b/LongWarOfTheChosen/Config/XComMissionDefs.ini @@ -2177,7 +2177,8 @@ MissionSchedules[21]="Alien_Base_D22_LW", \\ MissionSchedules[22]="Alien_Base_D23_LW", \\ MissionSchedules[23]="Alien_Base_D24_LW", \\ - MaxSoldiers=10 \\ + MaxSoldiers=10, \\ + MinCivilianCount=0 \\ ) ; Rendezvous @@ -2271,8 +2272,93 @@ MissionSchedules[44]="Troop_Column_D23_2_LW", \\ MissionSchedules[45]="Troop_Column_D24_LW", \\ MissionSchedules[46]="Troop_Column_D24_2_LW", \\ - MaxSoldiers=8) \\ - ) + MaxSoldiers=8 \\ + ) + + + +;covert ops troop column: + ++arrObjectiveSpawnInfo=(sMissionType="CovertOpsTroopManeuvers_LW", bUseObjectiveLocation=True, \\ + iMinObjectives=1, iMaxObjectives=1, iMinTilesBetweenObjectives=0, \\ + iMinTilesFromObjectiveCenter=0, iMaxTilesFromObjectiveCenter=10000, \\ + ArcToSpawn[0]=(ArchetypePath="XComInteractiveLevelActor'Mission_Assets.Archetypes.ARC_IA_GenericObjectiveMarker'"), \\ + bCanSpawnOutsideObjectiveParcel=False, bReplaceSwapActor=true) + + + ++arrMissions=(MissionName="CovertOpsTroopManeuvers_LW", sType="CovertOpsTroopManeuvers_LW", \\ + MissionFamily="CovertOpsTroopManeuvers_LW", \\ + MapNames[0]="Obj_TroopManeuvers_LW", \\ + RequiredPlotObjectiveTags[0]="GuerillaOps", \\ + RequiredParcelObjectiveTags[0]="Hack", \\ + MissionObjectives[0]=(ObjectiveName="Sweep", \\ + SuccessLootTables[0]=(LootTableName="TroopManeuversArtifacts_01", ForceLevel=0), \\ + SuccessLootTables[1]=(LootTableName="TroopManeuversArtifacts_02", ForceLevel=2), \\ + SuccessLootTables[2]=(LootTableName="TroopManeuversArtifacts_03", ForceLevel=5), \\ + SuccessLootTables[3]=(LootTableName="TroopManeuversArtifacts_04", ForceLevel=10), \\ + SuccessLootTables[4]=(LootTableName="TroopManeuversArtifacts_05", ForceLevel=15), \\ + bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=false), \\ + MissionSchedules[0]="COP_Troop_Column_D1_LW", \\ + MissionSchedules[1]="COP_Troop_Column_D2_LW", \\ + MissionSchedules[2]="COP_Troop_Column_D2_2_LW", \\ + MissionSchedules[3]="COP_Troop_Column_D3_LW", \\ + MissionSchedules[4]="COP_Troop_Column_D3_2_LW", \\ + MissionSchedules[5]="COP_Troop_Column_D4_LW", \\ + MissionSchedules[6]="COP_Troop_Column_D4_2_LW", \\ + MissionSchedules[7]="Troop_Column_D5_LW", \\ + MissionSchedules[8]="Troop_Column_D5_2_LW", \\ + MissionSchedules[9]="Troop_Column_D6_LW", \\ + MissionSchedules[10]="Troop_Column_D6_2_LW", \\ + MissionSchedules[11]="Troop_Column_D7_LW", \\ + MissionSchedules[12]="Troop_Column_D7_2_LW", \\ + MissionSchedules[13]="Troop_Column_D8_LW", \\ + MissionSchedules[14]="Troop_Column_D8_2_LW", \\ + MissionSchedules[15]="Troop_Column_D9_LW", \\ + MissionSchedules[16]="Troop_Column_D9_2_LW", \\ + MissionSchedules[17]="Troop_Column_D10_LW", \\ + MissionSchedules[18]="Troop_Column_D10_2_LW", \\ + MissionSchedules[19]="Troop_Column_D11_LW", \\ + MissionSchedules[20]="Troop_Column_D11_2_LW", \\ + MissionSchedules[21]="Troop_Column_D12_LW", \\ + MissionSchedules[22]="Troop_Column_D12_2_LW", \\ + MissionSchedules[23]="Troop_Column_D13_LW", \\ + MissionSchedules[24]="Troop_Column_D13_2_LW", \\ + MissionSchedules[25]="Troop_Column_D14_LW", \\ + MissionSchedules[26]="Troop_Column_D14_2_LW", \\ + MissionSchedules[27]="Troop_Column_D15_LW", \\ + MissionSchedules[28]="Troop_Column_D15_2_LW", \\ + MissionSchedules[29]="Troop_Column_D16_LW", \\ + MissionSchedules[30]="Troop_Column_D16_2_LW", \\ + MissionSchedules[31]="Troop_Column_D17_LW", \\ + MissionSchedules[32]="Troop_Column_D17_2_LW", \\ + MissionSchedules[33]="Troop_Column_D18_LW", \\ + MissionSchedules[34]="Troop_Column_D18_2_LW", \\ + MissionSchedules[35]="Troop_Column_D19_LW", \\ + MissionSchedules[36]="Troop_Column_D19_2_LW", \\ + MissionSchedules[37]="Troop_Column_D20_LW", \\ + MissionSchedules[38]="Troop_Column_D20_2_LW", \\ + MissionSchedules[39]="Troop_Column_D21_LW", \\ + MissionSchedules[40]="Troop_Column_D21_2_LW", \\ + MissionSchedules[41]="Troop_Column_D22_LW", \\ + MissionSchedules[42]="Troop_Column_D22_2_LW", \\ + MissionSchedules[43]="Troop_Column_D23_LW", \\ + MissionSchedules[44]="Troop_Column_D23_2_LW", \\ + MissionSchedules[45]="Troop_Column_D24_LW", \\ + MissionSchedules[46]="Troop_Column_D24_2_LW", \\ + MissionSchedules[47]="Supply_D1_1_LW", \\ + MissionSchedules[48]="Supply_D1_2_LW", \\ + MissionSchedules[49]="Supply_D2_1_LW", \\ + MissionSchedules[50]="Supply_D2_2_LW", \\ + MissionSchedules[51]="Supply_D3_1_LW", \\ + MissionSchedules[52]="Supply_D3_2_LW", \\ + MissionSchedules[53]="Supply_D4_1_LW", \\ + MissionSchedules[54]="Supply_D4_2_LW", \\ + MissionSchedules[55]="Supply_D4_3_LW", \\ + MaxSoldiers=6 \\ + ) + + ; Jailbreak +arrObjectiveSpawnInfo=(sMissionType="Jailbreak_LW", bUseObjectiveLocation=True, \\ @@ -2385,7 +2471,7 @@ bCanSpawnOutsideObjectiveParcel=false, bReplaceSwapActor=True) +arrMissions=(MissionName="SupplyExtraction_LW", sType="SupplyExtraction_LW", \\ - MissionFamily="SmashNGrab_LW", \\ + MissionFamily="SupplyExtraction_LW", \\ MapNames[0]="Obj_SupplyExtraction_LW", \\ MapNames[1]="UMS_MissionCore", \\ MapNames[2]="UMS_LWMissionTimer", \\ @@ -2482,8 +2568,113 @@ MaxSoldiers=8 \\ ) + ++arrObjectiveSpawnInfo=(sMissionType="BigSupplyExtraction_LW", bUseObjectiveLocation=True, \\ + iMinObjectives=1, iMaxObjectives=1, iMinTilesBetweenObjectives=0, \\ + iMinTilesFromObjectiveCenter=0, iMaxTilesFromObjectiveCenter=10000, \\ + ArcToSpawn[0]=(ArchetypePath="XComInteractiveLevelActor'Mission_Assets.Archetypes.ARC_IA_EvacZoneMarker'"), \\ + bCanSpawnOutsideObjectiveParcel=false, bReplaceSwapActor=True) + ++arrMissions=(MissionName="BigSupplyExtraction_LW", sType="BigSupplyExtraction_LW", \\ + MissionFamily="BigSupplyExtraction_LW", \\ + MapNames[0]="Obj_BigSupplyExtraction_LW", \\ + MapNames[1]="UMS_MissionCore", \\ + MapNames[2]="UMS_LWMissionTimer", \\ + MapNames[3]="CIN_XP_SupplyExtractionATTArrival", \\ + MapNames[4]="UMS_LWCommon", \\ + ForcedBiome="Xenoform", \\ + RequiredPlotObjectiveTags[0]="BigSupplyExtraction", \\ + RequiredParcelObjectiveTags[0]="BigSupplyExtraction", \\ + MissionObjectives[0]=(ObjectiveName="MinimumCrateRecovery", \\ + bIsTacticalObjective=false, bIsStrategyObjective=true, bIsTriadObjective=false), \\ + MissionSchedules[0]="Guerilla_D1_1_LW", \\ + MissionSchedules[1]="Guerilla_D1_2_LW", \\ + MissionSchedules[2]="Guerilla_D1_3_LW", \\ + MissionSchedules[3]="Guerilla_D1_4_LW", \\ + MissionSchedules[4]="Guerilla_D2_1_LW", \\ + MissionSchedules[5]="Guerilla_D2_2_LW", \\ + MissionSchedules[6]="Guerilla_D2_4_LW", \\ + MissionSchedules[7]="Guerilla_D3_1_LW", \\ + MissionSchedules[8]="Guerilla_D3_2_LW", \\ + MissionSchedules[9]="Guerilla_D3_3_LW", \\ + MissionSchedules[10]="Guerilla_D3_4_LW", \\ + MissionSchedules[11]="Guerilla_D4_1_LW", \\ + MissionSchedules[12]="Guerilla_D4_2_LW", \\ + MissionSchedules[13]="Guerilla_D4_3_LW", \\ + MissionSchedules[14]="Guerilla_D4_4_LW", \\ + MissionSchedules[15]="Guerilla_D4_5_LW", \\ + MissionSchedules[16]="Guerilla_D5_1_LW", \\ + MissionSchedules[17]="Guerilla_D5_2_LW", \\ + MissionSchedules[18]="Guerilla_D5_3_LW", \\ + MissionSchedules[19]="Guerilla_D5_4_LW", \\ + MissionSchedules[20]="Guerilla_D6_1_LW", \\ + MissionSchedules[21]="Guerilla_D6_2_LW", \\ + MissionSchedules[22]="Guerilla_D6_3_LW", \\ + MissionSchedules[23]="Guerilla_D6_4_LW", \\ + MissionSchedules[24]="Guerilla_D7_1_LW", \\ + MissionSchedules[25]="Guerilla_D7_2_LW", \\ + MissionSchedules[26]="Guerilla_D7_3_LW", \\ + MissionSchedules[27]="Guerilla_D7_4_LW", \\ + MissionSchedules[28]="Guerilla_D8_1_LW", \\ + MissionSchedules[29]="Guerilla_D8_2_LW", \\ + MissionSchedules[30]="Guerilla_D8_3_LW", \\ + MissionSchedules[31]="Guerilla_D8_4_LW", \\ + MissionSchedules[32]="Guerilla_D9_1_LW", \\ + MissionSchedules[33]="Guerilla_D9_2_LW", \\ + MissionSchedules[34]="Guerilla_D9_3_LW", \\ + MissionSchedules[35]="Guerilla_D9_4_LW", \\ + MissionSchedules[36]="Guerilla_D9_5_LW", \\ + MissionSchedules[37]="Guerilla_D10_1_LW", \\ + MissionSchedules[38]="Guerilla_D10_2_LW", \\ + MissionSchedules[39]="Guerilla_D10_3_LW", \\ + MissionSchedules[40]="Guerilla_D10_4_LW", \\ + MissionSchedules[41]="Guerilla_D10_5_LW", \\ + MissionSchedules[42]="Guerilla_D11_1_LW", \\ + MissionSchedules[43]="Guerilla_D11_2_LW", \\ + MissionSchedules[44]="Guerilla_D11_3_LW", \\ + MissionSchedules[45]="Guerilla_D11_4_LW", \\ + MissionSchedules[46]="Guerilla_D11_5_LW", \\ + MissionSchedules[47]="Guerilla_D12_1_LW", \\ + MissionSchedules[48]="Guerilla_D12_2_LW", \\ + MissionSchedules[49]="Guerilla_D12_3_LW", \\ + MissionSchedules[50]="Guerilla_D12_4_LW", \\ + MissionSchedules[51]="Guerilla_D12_5_LW", \\ + MissionSchedules[52]="Guerilla_D13_1_LW", \\ + MissionSchedules[53]="Guerilla_D13_2_LW", \\ + MissionSchedules[54]="Guerilla_D13_3_LW", \\ + MissionSchedules[55]="Guerilla_D13_4_LW", \\ + MissionSchedules[56]="Guerilla_D13_5_LW", \\ + MissionSchedules[57]="Guerilla_D14_1_LW", \\ + MissionSchedules[58]="Guerilla_D14_2_LW", \\ + MissionSchedules[59]="Guerilla_D14_3_LW", \\ + MissionSchedules[60]="Guerilla_D14_4_LW", \\ + MissionSchedules[61]="Guerilla_D14_5_LW", \\ + MissionSchedules[62]="Guerilla_D15_1_LW", \\ + MissionSchedules[63]="Guerilla_D15_2_LW", \\ + MissionSchedules[64]="Guerilla_D15_3_LW", \\ + MissionSchedules[65]="Guerilla_D15_4_LW", \\ + MissionSchedules[66]="Guerilla_D15_5_LW", \\ + MissionSchedules[67]="Guerilla_D16_1_LW", \\ + MissionSchedules[68]="Guerilla_D16_2_LW", \\ + MissionSchedules[69]="Guerilla_D17_1_LW", \\ + MissionSchedules[70]="Guerilla_D17_2_LW", \\ + MissionSchedules[71]="Guerilla_D18_1_LW", \\ + MissionSchedules[72]="Guerilla_D18_2_LW", \\ + MissionSchedules[73]="Guerilla_D19_1_LW", \\ + MissionSchedules[74]="Guerilla_D19_2_LW", \\ + MissionSchedules[75]="Guerilla_D20_1_LW", \\ + MissionSchedules[76]="Guerilla_D20_2_LW", \\ + MissionSchedules[77]="Guerilla_D21_1_LW", \\ + MissionSchedules[78]="Guerilla_D21_2_LW", \\ + MissionSchedules[79]="Guerilla_D22_1_LW", \\ + MissionSchedules[80]="Guerilla_D23_2_LW", \\ + MissionSchedules[81]="Guerilla_D23_1_LW", \\ + MissionSchedules[82]="Guerilla_D24_1_LW", \\ + MaxSoldiers=8 \\ +) + +arrObjectiveSpawnInfo=(sMissionType="SmashNGrab_LW", bUseObjectiveLocation=True, \\ - iMinObjectives=4, iMaxObjectives=6, iMinTilesBetweenObjectives=0, \\ + iMinObjectives=5, iMaxObjectives=6, iMinTilesBetweenObjectives=0, \\ iMinTilesFromObjectiveCenter=0, iMaxTilesFromObjectiveCenter=10000, \\ ArcToSpawn[0]=(ArchetypePath="XComInteractiveLevelActor'LWSmashNGrab.Archetypes.ARC_IA_AdventChestObjective_SmashNGrab_LW'"), \\ bCanSpawnOutsideObjectiveParcel=False, bReplaceSwapActor=true) @@ -3085,195 +3276,56 @@ MaxSoldiers=5 \\ ) --arrMissions=(MissionName="ChosenAvengerDefense", sType="ChosenAvengerDefense", \\ - MapNames[0]="Obj_ChosenAvengerDefense", \\ - MapNames[1]="CIN_XP_ChosenADTurrets", \\ - MapNames[2]="UMS_MissionCore", \\ - MapNames[3]="CIN_XP_ChosenADArtillery", \\ - RequiredPlotObjectiveTags[0]="ChosenAvengerDef", \\ - RequiredParcelObjectiveTags[0]="ChosenAvengerDefense", \\ - MissionObjectives[0]=(ObjectiveName="Defense", \\ - bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenAvengerDefense_Standard", \\ - MissionSchedules[1]="ChosenAvengerDefense_Hard", \\ - MissionSchedules[2]="ChosenAvengerDefense_Extreme", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_AvDf_Intro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="AvengerDefense_Intro"), \\ - MatineeBaseTag="AvengerDefenseIntroBase" \\ - ), \\ - AllowDeployWoundedUnits=true, \\ - DisallowCheckpointPCPs=true, \\ - DisallowUITimerSuspension=true, \\ - AliensAlerted=true, \\ - SquadCount=2, \\ - MaxSoldiers=5, \\ - SquadSizeMin[0]=1, \\ - SquadSizeMin[1]=0, \\ - SquadSpawnSizeOverride=4, \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent") - -+arrMissions=(MissionName="ChosenAvengerDefense", sType="ChosenAvengerDefense", \\ - MapNames[0]="Obj_ChosenAvengerDefense_LW", \\ - MapNames[1]="CIN_XP_ChosenADTurrets", \\ - MapNames[2]="UMS_MissionCore", \\ - MapNames[3]="CIN_XP_ChosenADArtillery", \\ - MapNames[4]="UMS_LWCommon", \\ - RequiredPlotObjectiveTags[0]="ChosenAvengerDef", \\ - RequiredParcelObjectiveTags[0]="ChosenAvengerDefense", \\ - MissionObjectives[0]=(ObjectiveName="Defense", \\ - bIsTacticalObjective=false, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenAvengerDefense_LW", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_AvDf_Intro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="AvengerDefense_Intro"), \\ - MatineeBaseTag="AvengerDefenseIntroBase" ), \\ - AllowDeployWoundedUnits=true, \\ - DisallowCheckpointPCPs=true, \\ - DisallowUITimerSuspension=true, \\ - AliensAlerted=true, \\ - MaxSoldiers=10, \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent") - --arrMissions=(MissionName="ChosenShowdown_Warlock", sType="ChosenShowdown_Warlock", \\ - MissionFamily="ChosenShowdown_Warlock", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_WarlockShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="WarlockShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="WarlockShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenWarlockShowdownArtifacts"), \\ - bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true \\ - ), \\ - MissionSchedules[0]="ChosenShowdown_Warlock", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) - -+arrMissions=(MissionName="ChosenShowdown_Warlock", sType="ChosenShowdown_Warlock", \\ - MissionFamily="ChosenShowdown_Warlock", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - MapNames[4]="UMS_LWCommon", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_WarlockShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="WarlockShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="WarlockShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenWarlockShowdownArtifacts"), \\ - bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true \\ - ), \\ - MissionSchedules[0]="ChosenShowdown_Warlock", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) - --arrMissions=(MissionName="ChosenShowdown_Assassin", sType="ChosenShowdown_Assassin", \\ - MissionFamily="ChosenShowdown_Assassin", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_AssassinShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="AssassinShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" \\ - ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="AssassinShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenAssassinShowdownArtifacts"), \\ - bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenShowdown_Assassin", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) - -+arrMissions=(MissionName="ChosenShowdown_Assassin", sType="ChosenShowdown_Assassin", \\ - MissionFamily="ChosenShowdown_Assassin", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - MapNames[4]="UMS_LWCommon", \\ - - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_AssassinShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="AssassinShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" \\ - ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="AssassinShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenAssassinShowdownArtifacts"), \\ - bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenShowdown_Assassin", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) - --arrMissions=(MissionName="ChosenShowdown_Hunter", sType="ChosenShowdown_Hunter", \\ - MissionFamily="ChosenShowdown_Hunter", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_HunterShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="HunterShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" \\ - ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="HunterShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenHunterShowdownArtifacts"), \\ - bIsTacticalObjective=true, \\ - bIsStrategyObjective=true, \\ - bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenShowdown_Hunter", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) - -+arrMissions=(MissionName="ChosenShowdown_Hunter", sType="ChosenShowdown_Hunter", \\ - MissionFamily="ChosenShowdown_Hunter", \\ - MapNames[0]="Obj_ChosenShowdown", \\ - MapNames[1]="UMS_MissionCore", \\ - MapNames[2]="UMS_NoMissionTimer", \\ - MapNames[3]="UMS_NoReinforcements", \\ - OverrideDefaultMissionIntro=true, \\ - MissionIntroOverride=( \\ - MatineePackage="CIN_XP_HunterShowdownIntro", \\ - MatineeSequences[0]=(MatineeCommentPrefixes[0]="HunterShowdown_Intro"), \\ - MatineeBaseTag="ShowdownIntroMatineeBase" \\ - ), \\ - RequiredPlotObjectiveTags[0]="ChosenShowdown", \\ - RequiredParcelObjectiveTags[0]="HunterShowdown", \\ - MissionObjectives[0]=(ObjectiveName="EliminateChosen", \\ - SuccessLootTables[0]=(LootTableName="ChosenHunterShowdownArtifacts"), \\ - bIsTacticalObjective=true, \\ - bIsStrategyObjective=true, \\ - bIsTriadObjective=true), \\ - MissionObjectives[1]=(ObjectiveName="DestroySarcophagus", bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ - MissionSchedules[0]="ChosenShowdown_Hunter", \\ - ForcedTacticalTags[0]="NoVolunteerArmy", \\ - ForcedTacticalTags[1]="NoDoubleAgent", ) +;-arrMissions=(MissionName="ChosenAvengerDefense", sType="ChosenAvengerDefense", \\ +; MapNames[0]="Obj_ChosenAvengerDefense", \\ +; MapNames[1]="CIN_XP_ChosenADTurrets", \\ +; MapNames[2]="UMS_MissionCore", \\ +; MapNames[3]="CIN_XP_ChosenADArtillery", \\ +; RequiredPlotObjectiveTags[0]="ChosenAvengerDef", \\ +; RequiredParcelObjectiveTags[0]="ChosenAvengerDefense", \\ +; MissionObjectives[0]=(ObjectiveName="Defense", \\ +; bIsTacticalObjective=true, bIsStrategyObjective=true, bIsTriadObjective=true), \\ +; MissionSchedules[0]="ChosenAvengerDefense_Standard", \\ +; MissionSchedules[1]="ChosenAvengerDefense_Hard", \\ +; MissionSchedules[2]="ChosenAvengerDefense_Extreme", \\ +; OverrideDefaultMissionIntro=true, \\ +; MissionIntroOverride=( \\ +; MatineePackage="CIN_AvDf_Intro", \\ +; MatineeSequences[0]=(MatineeCommentPrefixes[0]="AvengerDefense_Intro"), \\ +; MatineeBaseTag="AvengerDefenseIntroBase" \\ +; ), \\ +; AllowDeployWoundedUnits=true, \\ +; DisallowCheckpointPCPs=true, \\ +; DisallowUITimerSuspension=true, \\ +; AliensAlerted=true, \\ +; SquadCount=2, \\ +; MaxSoldiers=5, \\ +; SquadSizeMin[0]=1, \\ +; SquadSizeMin[1]=0, \\ +; SquadSpawnSizeOverride=4, \\ +; ForcedTacticalTags[0]="NoVolunteerArmy", \\ +; ForcedTacticalTags[1]="NoDoubleAgent") + +;+arrMissions=(MissionName="ChosenAvengerDefense", sType="ChosenAvengerDefense", \\ +; MapNames[0]="Obj_ChosenAvengerDefense_LW", \\ +; MapNames[1]="CIN_XP_ChosenADTurrets", \\ +; MapNames[2]="UMS_MissionCore", \\ +; MapNames[3]="CIN_XP_ChosenADArtillery", \\ +; MapNames[4]="UMS_LWCommon", \\ +; RequiredPlotObjectiveTags[0]="ChosenAvengerDef", \\ +; RequiredParcelObjectiveTags[0]="ChosenAvengerDefense", \\ +; MissionObjectives[0]=(ObjectiveName="Defense", \\ +; bIsTacticalObjective=false, bIsStrategyObjective=true, bIsTriadObjective=true), \\ +; MissionSchedules[0]="ChosenAvengerDefense_LW", \\ +; OverrideDefaultMissionIntro=true, \\ +; MissionIntroOverride=( \\ +; MatineePackage="CIN_AvDf_Intro", \\ +; MatineeSequences[0]=(MatineeCommentPrefixes[0]="AvengerDefense_Intro"), \\ +; MatineeBaseTag="AvengerDefenseIntroBase" ), \\ +; AllowDeployWoundedUnits=true, \\ +; DisallowCheckpointPCPs=true, \\ +; DisallowUITimerSuspension=true, \\ +; AliensAlerted=true, \\ +; MaxSoldiers=10, \\ +; ForcedTacticalTags[0]="NoVolunteerArmy", \\ +; ForcedTacticalTags[1]="NoDoubleAgent") diff --git a/LongWarOfTheChosen/Config/XComMissions.ini b/LongWarOfTheChosen/Config/XComMissions.ini index fd5d76893..6dd3c7b67 100644 --- a/LongWarOfTheChosen/Config/XComMissions.ini +++ b/LongWarOfTheChosen/Config/XComMissions.ini @@ -13,6 +13,7 @@ +arrMissionTypeAliases=(KeyMissionType="SupplyRaidTrain_LW", AltMissionTypes[0]="SupplyRaidTrain") +arrMissionTypeAliases=(KeyMissionType="SupplyRaidConvoy_LW", AltMissionTypes[0]="SupplyRaidConvoy") +arrMissionTypeAliases=(KeyMissionType="SupplyExtraction_LW", AltMissionTypes[0]="SupplyExtraction") ++arrMissionTypeAliases=(KeyMissionType="BigSupplyExtraction_LW", AltMissionTypes[0]="SupplyExtraction") +arrMissionTypeAliases=(KeyMissionType="DestroyRelay_LW", AltMissionTypes[0]="DestroyRelay") +arrMissionTypeAliases=(KeyMissionType="SabotageTransmitter_LW", AltMissionTypes[0]="SabotageTransmitter") +arrMissionTypeAliases=(KeyMissionType="ProtectDevice_LW", AltMissionTypes[0]="ProtectDevice") @@ -43,6 +44,7 @@ +arrMissionTypeAliases=(KeyMissionType="Jailbreak_LW", AltMissionTypes[0]="Rescue_AdventCell") +arrMissionTypeAliases=(KeyMissionType="Invasion_LW", AltMissionTypes[0]="DestroyRelay") +arrMissionTypeAliases=(KeyMissionType="TroopManeuvers_LW", AltMissionTypes[0]="Hack") ++arrMissionTypeAliases=(KeyMissionType="CovertOpsTroopManeuvers_LW", AltMissionTypes[0]="Hack") +arrMissionTypeAliases=(KeyMissionType="AssaultAlienBase_LW", AltMissionTypes[0]="Sabotage") ; Rendezvous uses Avenger defense objective tag for the definition of the LoP, but has no visible objective actor. @@ -54,6 +56,10 @@ ; when you open the cell. +ProxyRewardUnitMappings=(OriginalTemplate="FacelessRebel",ProxyTemplate="Rebel") +;ChosenSpawnTagToEncounterID[12]=(EncounterID="CHOSENx1_AssassinM5", SpawningTag="Chosen_AssassinActiveM5") +;ChosenSpawnTagToEncounterID[13]=(EncounterID="CHOSENx1_WarlockM5", SpawningTag="Chosen_WarlockActiveM5") +;ChosenSpawnTagToEncounterID[14]=(EncounterID="CHOSENx1_SniperM5", SpawningTag="Chosen_SniperActiveM5") + [HackWorkstation] ; Prevent aliens from hunting XCOM after objective has been hacked because it's ; cheesy having the aliens know exactly where you are. @@ -118,13 +124,91 @@ BaseTimerLength_Veteran=12 BaseTimerLength_Commander=12 BaseTimerLength_Legend=12 +TurnsRemainingForFinalTimerWarning=-1 +TurnsRemainingForSecondTimerWarning=-1 +TurnsRemainingForThirdTimerWarning=-1 + +[BigSmashNGrab_LW] +; Prevent aliens from hunting XCOM after objective has been destroyed because it's +; cheesy having the aliens know exactly where you are. +HardDisablePostObjectiveHunting=true + +EngageTimerAtMissionStart=true +EngageTimerWhenConcealmentLost=false +; If enabled, the timer never engages -- note that SitReps may toggle this on, but do not toggle it off +HardDisableTimer=false + +; *NOTE* These are ignored - see [LW_Overhaul.SeqAct_InitializeMissionTimer] block +; in XComLW_Overhaul.ini for the LWOTC override values. +BaseTimerLength_Rookie=12 +BaseTimerLength_Veteran=12 +BaseTimerLength_Commander=12 +BaseTimerLength_Legend=12 + + [SupplyExtraction] +;Reminder to me to check base game XComMissions.ini for more crate race settings + +; Note that you don't always get this number, if the crate spawning system can't find a legal spot it doesn't place a crate +NumberOfCrates_Rookie=12 +NumberOfCrates_Veteran=12 +NumberOfCrates_Commander=12 +NumberOfCrates_Legend=12 + ; Controls the number of crates the player must recover to qualify as mission success NumberOfCratesRequired_Rookie=4 NumberOfCratesRequired_Veteran=4 NumberOfCratesRequired_Commander=4 NumberOfCratesRequired_Legend=4 +TurnsRemainingForFinalTimerWarning=-1 +TurnsRemainingForSecondTimerWarning=-1 +TurnsRemainingForThirdTimerWarning=-1 + + +[BigSupplyExtraction_LW] +; If true, while in zip mode the camera pan to crates being marked by the Advent is skipped: +SkipAdventCrateMarkCameraPanInZipMode=true +; If true, zip mode will never play the LOS camera to XCOM Controlled crates when picked up +; I consider this disorienting, so its turned off, but a modder could activate this if desired +SkipCameraPanOnCrateExtractInZipMode=false +; If true, we do a cam pan on each crate pickup, we're trying to keep this brief +; If false, the camera will pan only to the first crate picked up +DoLOSCameraToAllXCOMCratePickups=true +; If enabled, the VO nag played when Advent mark crates is disabled +SkipAdventCrateRecoveryNagInZipMode=true +; If true, Advent can extract crates from the beginning of the mission. If false, they extract crates after the player has been seen +AdventExtractCratesFromMissionStart=false +; Controls the number of crates that Advent can mark for extraction at one time. Marked crates are extracted on the next turn. +NumberOfCratesAdventCanMark_Rookie=2 +NumberOfCratesAdventCanMark_Veteran=3 +NumberOfCratesAdventCanMark_Commander=3 +NumberOfCratesAdventCanMark_Legend=3 +; Controls the number of crates that are supposed spawn on the mission +; Note that you don't always get this number, if the crate spawning system can't find a legal spot it doesn't place a crate +NumberOfCrates_Rookie=18 +NumberOfCrates_Veteran=18 +NumberOfCrates_Commander=18 +NumberOfCrates_Legend=18 +; Controls the number of crates the player must recover to qualify as mission success +NumberOfCratesRequired_Rookie=6 +NumberOfCratesRequired_Veteran=6 +NumberOfCratesRequired_Commander=6 +NumberOfCratesRequired_Legend=6 +; If true, a squad viewer is added to each crate on generation, making them visible in the fog +; if false, only the last crate (and assumedly closest to the player) receives a viewer during the tactical intro +PlaceViewersOnCrates=false +; If true, the player loses concealment after marking any crate on the board +; If false, the player loses concealment only if they mark a crate already marked by Advent forces +MarkingAnyCrateBreaksConcealment=true +; If true, play an ATT arrival matinee when the first Advent crate pickup happens +UseATTArrivalMatinee=true + +TurnsRemainingForFinalTimerWarning=-1 +TurnsRemainingForSecondTimerWarning=-1 +TurnsRemainingForThirdTimerWarning=-1 + + [Defend_LW] EngageTimerAtMissionStart=true EngageTimerWhenConcealmentLost=false diff --git a/LongWarOfTheChosen/Config/XComPCPs.ini b/LongWarOfTheChosen/Config/XComPCPs.ini index 5ef432482..fc8c0fbb0 100644 --- a/LongWarOfTheChosen/Config/XComPCPs.ini +++ b/LongWarOfTheChosen/Config/XComPCPs.ini @@ -1,3 +1,49 @@ [XComGame.XComPlotCoverParcelManager] +arrAllPCPDefs=(MapName="WLD_SupplyConvoy_16x64_LW_01", arrPlotTypes[0]="Wilderness", strPCPType="AdventConvoy", strTurnType="SupplyLineRaid", iWidth=16, iLength=64, ObjectiveTags[0]="SupplyConvoy_LW") +; remove the IED-infested bridge plots and swap it with another +-arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01", arrPlotTypes[0]="Rooftops", \\ + strPCPType="Walkway", strTurnType="Optional", iWidth=6, iLength=6) + +-arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01", arrPlotTypes[0]="Rooftops", \\ + strPCPType="Walkway", strTurnType="Mandatory", iWidth=6, iLength=6) + +-arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01", arrPlotTypes[0]="Rooftops", strPCPType="Walkway", strTurnType="Optional", iWidth=6, iLength=6) + +-arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01", arrPlotTypes[0]="Rooftops", strPCPType="Walkway", strTurnType="Mandatory", iWidth=6, iLength=6) + ++arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01_fixed", arrPlotTypes[0]="Rooftops", \\ + strPCPType="Walkway", strTurnType="Optional", iWidth=6, iLength=6) + ++arrAllPCPDefs=(MapName="RFT_Walkway_06x06_Skybridge_01_fixed", arrPlotTypes[0]="Rooftops", \\ + strPCPType="Walkway", strTurnType="Mandatory", iWidth=6, iLength=6) + + +; fixed plot name: RFT_Walkway_06x06_Skybridge_01_fixed + +; mess with Sewer only PCPs so they can be used if Sewers to Subway is turned on + +-arrAllPCPDefs=(MapName="TUN_Sewer_Crn_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", \\ + strPCPType="Sewer", strTurnType="Crn", iWidth=16, iLength=16) +-arrAllPCPDefs=(MapName="TUN_Sewer_Crn_16x16_02", arrPlotTypes[0]="Tunnels_Sewer", \\ + strPCPType="Sewer", strTurnType="Crn", iWidth=16, iLength=16) +-arrAllPCPDefs=(MapName="TUN_Sewer_Str_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", \\ + strPCPType="Sewer", strTurnType="Str", iWidth=16, iLength=16) +-arrAllPCPDefs=(MapName="TUN_Sewer_Str_16x16_02", arrPlotTypes[0]="Tunnels_Sewer", \\ + strPCPType="Sewer", strTurnType="Str", iWidth=16, iLength=16) +-arrAllPCPDefs=(MapName="TUN_Sewer_Cap_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", \\ + strPCPType="Sewer", strTurnType="Cap", iWidth=16, iLength=16) + ++arrAllPCPDefs=(MapName="TUN_Sewer_Crn_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ + strPCPType="Sewer", strTurnType="Crn", iWidth=16, iLength=16) ++arrAllPCPDefs=(MapName="TUN_Sewer_Crn_16x16_02", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ + strPCPType="Sewer", strTurnType="Crn", iWidth=16, iLength=16) ++arrAllPCPDefs=(MapName="TUN_Sewer_Str_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ + strPCPType="Sewer", strTurnType="Str", iWidth=16, iLength=16) ++arrAllPCPDefs=(MapName="TUN_Sewer_Str_16x16_02", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ + strPCPType="Sewer", strTurnType="Str", iWidth=16, iLength=16) ++arrAllPCPDefs=(MapName="TUN_Sewer_Cap_16x16_01", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ + strPCPType="Sewer", strTurnType="Cap", iWidth=16, iLength=16) + +;+arrAllPCPDefs=(MapName="TUN_Wall_StrSewer_16x05_01", arrPlotTypes[0]="Tunnels_Sewer", arrPlotTypes[1]="Tunnels_Subway", \\ +; strPCPType="Wall", strTurnType="StrSewer", iWidth=5, iLength=16) \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComParcels.ini b/LongWarOfTheChosen/Config/XComParcels.ini index c2e07859e..54e52865d 100644 --- a/LongWarOfTheChosen/Config/XComParcels.ini +++ b/LongWarOfTheChosen/Config/XComParcels.ini @@ -5,6 +5,21 @@ +arrAllParcelDefinitions=(MapName="md_AdventLandingPad_03", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) +arrAllParcelDefinitions=(MapName="md_AdventLandingPad_04", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) +; remove base game one with bugged cover, add new one instead with tweaked cover +-arrAllParcelDefinitions=(MapName="md_AdventLandingPad_02", eSize=eParcelSizeType_Medium, \\ + arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="TroopTransport", eFacing=EParcelFacingType_E, \\ + ObjectiveTags[0]="SupplyLineRaid", ObjectiveTags[1]="RecoverFD", bAllowNonObjectiveOverride=true) + + ++arrAllParcelDefinitions=(MapName="md_AdventLandingPad_02_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) + +; City Center landing pads: ++arrAllParcelDefinitions=(MapName="md_AdventLandingPad_01_City", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_AdventLandingPad_02_City_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_AdventLandingPad_03_City", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_AdventLandingPad_04_City", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="TroopTransport", bHasEntranceS1=true, bAllowNonObjectiveOverride=true) + + ; for invasion missions +arrAllParcelDefinitions=(MapName="lg_Shopping_Center_01_LW_PD",eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="Retail", arrZoneTypes[1]="Announce_ShoppingCenter", eFacing=EParcelFacingType_N, ObjectiveTags[0]="Invasion_LW", bAllowNonObjectiveOverride=false) @@ -23,6 +38,16 @@ +arrAllParcelDefinitions=(MapName="lg_CloneStorage_01_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="AlienBase", bHasEntranceS1=true, bHasEntranceE2=true, ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) +arrAllParcelDefinitions=(MapName="md_RemoteScienceStation_01_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="AlienBase", ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) +; Modified parcels for city center HQ + ++arrAllParcelDefinitions=(MapName="lg_ChipTransmitter_01_City_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", bHasEntranceS1=true, ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="lg_RemoteScienceStation_01_City_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="lg_HumanBodyStorage_01_City_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", bHasEntranceN2=true, ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="lg_CloneStorage_01__City LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", bHasEntranceS1=true, bHasEntranceE2=true, ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_RemoteScienceStation_01_City_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", ObjectiveTags[0]="AssaultAlienBase_LW", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_ScienceStation_01_City_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), arrZoneTypes[0]="AlienBase", bAllowNonObjectiveOverride=true) + + ; Modded parcels for terror missions ; Replacement for "md_ShootingRange_01" with fire removed from a spawn point tile. @@ -31,7 +56,7 @@ arrAllParcelDefinitions=(MapName="md_ShootingRange_01_LW", eSize=eParcelSizeType ; Modded parcels for jailbreak missions +arrAllParcelDefinitions=(MapName="lg_PropagandaCenter_02_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), eFacing=EParcelFacingType_N, ObjectiveTags[0]="Jailbreak_LW", bAllowNonObjectiveOverride=false) -+arrAllParcelDefinitions=(MapName="lg_GeneClinic_01_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), eFacing=EParcelFacingType_N, ObjectiveTags[0]="Jailbreak_LW", ObjectiveTags[1]="SmashNGrab_LW", bAllowNonObjectiveOverride=false) ++arrAllParcelDefinitions=(MapName="lg_GeneClinic_01_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="CityCenter"), eFacing=EParcelFacingType_N, ObjectiveTags[0]="Jailbreak_LW", ObjectiveTags[1]="SmashNGrab_LW", ObjectiveTags[2]="BigSmashNGrab_LW",bAllowNonObjectiveOverride=false) ; md_Advent_Security_02 is purposefully not a "_LW" suffixed parcel. This is the only base map with sufficient cells for each rebel to get their own so it is unmodified. +arrAllParcelDefinitions=(MapName="md_Advent_Security_02", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), eFacing=EParcelFacingType_W, ObjectiveTags[0]="Jailbreak_LW", bAllowNonObjectiveOverride=false) +arrAllParcelDefinitions=(MapName="md_Advent_Security_03_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="CityCenter"), bHasEntranceE1=true, bForceEntranceCount=1, ObjectiveTags[0]="Jailbreak_LW", bAllowNonObjectiveOverride=false) @@ -47,17 +72,46 @@ arrAllParcelDefinitions=(MapName="md_ShootingRange_01_LW", eSize=eParcelSizeType +arrAllParcelDefinitions=(MapName="md_Boardroom_01_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Rooftops"), eFacing=EParcelFacingType_N, arrZoneTypes[0]="Boardroom") +arrAllParcelDefinitions=(MapName="md_Studio_01_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Rooftops"), eFacing=EParcelFacingType_N, arrZoneTypes[0]="Studio") +; modified rooftop parcels for network tower missions ++arrAllParcelDefinitions=(MapName="md_Studio_02_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Rooftops"), eFacing=EParcelFacingType_N, arrZoneTypes[0]="Studio_mid") ++arrAllParcelDefinitions=(MapName="md_Boardroom_02", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Rooftops"), eFacing=EParcelFacingType_S, arrZoneTypes[0]="Studio_mid") ++arrAllParcelDefinitions=(MapName="md_LandingPad_01_LW", eSize=eParcelSizeType_Medium, arrPlotTypes[0]=(strPlotType="Rooftops"), eFacing=EParcelFacingType_N, arrZoneTypes[0]="Open_mid") + ; Parcels for Smash 'n' Grab -+arrAllParcelDefinitions=(MapName="lg_Advent_Recruitment_01_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="SmallTown"), eFacing=EParcelFacingType_S, ObjectiveTags[0]="SmashNGrab_LW", bAllowNonObjectiveOverride=false) -+arrAllParcelDefinitions=(MapName="lg_RemoteScienceStation_01_SG_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="Wilderness"), ObjectiveTags[0]="SmashNGrab_LW", bAllowNonObjectiveOverride=false) ++arrAllParcelDefinitions=(MapName="lg_Advent_Recruitment_01_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="SmallTown"), eFacing=EParcelFacingType_S, ObjectiveTags[0]="SmashNGrab_LW", ObjectiveTags[1]="BigSmashNGrab_LW", bAllowNonObjectiveOverride=false) ++arrAllParcelDefinitions=(MapName="lg_RemoteScienceStation_01_SG_LW", eSize=eParcelSizeType_Large, arrPlotTypes[0]=(strPlotType="Wilderness"), ObjectiveTags[0]="SmashNGrab_LW", ObjectiveTags[1]="BigSmashNGrab_LW", bAllowNonObjectiveOverride=false) ; Jailbreak parcel lg_GeneClinic_01_LW above also includes S&G objectives + + ; New Parcels for Supply Extract +arrAllParcelDefinitions=(MapName="lg_TedAdventSupplyExtract_02", eSize=eParcelSizeType_Large, \\ arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="AdventDepot", \\ - eFacing=EParcelFacingType_S, ObjectiveTags[0]="SupplyExtraction", bAllowNonObjectiveOverride=true) + eFacing=EParcelFacingType_S, ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", bAllowNonObjectiveOverride=true) +arrAllParcelDefinitions=(MapName="lg_TedAdventSupplyExtract_03", eSize=eParcelSizeType_Large, \\ arrPlotTypes[0]=(strPlotType="Wilderness"), arrZoneTypes[0]="AdventDepot", \\ - eFacing=EParcelFacingType_S, ObjectiveTags[0]="SupplyExtraction", bAllowNonObjectiveOverride=true) \ No newline at end of file + eFacing=EParcelFacingType_S, ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", bAllowNonObjectiveOverride=true) + + +; modified Advent Security parcels for City Center HQs + ++arrAllParcelDefinitions=(MapName="md_AdventSecurity_01_City", eSize=eParcelSizeType_Medium, \\ + arrPlotTypes[0]=(strPlotType="CityCenter"), \\ + arrZoneTypes[0]="AdventSecurity", eFacing=EParcelFacingType_S, \\ + ObjectiveTags[0]="Hack", ObjectiveTags[1]="Recover", ObjectiveTags[2]="Advent", bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_AdventSecurity_02_City", eSize=eParcelSizeType_Medium, \\ + arrPlotTypes[0]=(strPlotType="CityCenter"), \\ + arrZoneTypes[0]="AdventSecurity", bHasEntranceS2=true, eFacing=EParcelFacingType_S, \\ + ObjectiveTags[0]="Hack", ObjectiveTags[1]="Recover", ObjectiveTags[2]="Advent", bAllowNonObjectiveOverride=true) + ++arrAllParcelDefinitions=(MapName="md_Advent_Security_04_LW", eSize=eParcelSizeType_Medium, \\ + arrPlotTypes[0]=(strPlotType="CityCenter"), \\ + arrZoneTypes[0]="AdventSecurity", eFacing=EParcelFacingType_S, \\ + bAllowNonObjectiveOverride=true) ++arrAllParcelDefinitions=(MapName="md_Advent_Security_02_LW", eSize=eParcelSizeType_Medium, \\ + arrPlotTypes[0]=(strPlotType="CityCenter"), \\ + arrZoneTypes[0]="AdventSecurity", bHasEntranceS2=true, eFacing=EParcelFacingType_S, \\ + bAllowNonObjectiveOverride=true) + diff --git a/LongWarOfTheChosen/Config/XComPlots.ini b/LongWarOfTheChosen/Config/XComPlots.ini index d3bdb3bcd..ae4109b9c 100644 --- a/LongWarOfTheChosen/Config/XComPlots.ini +++ b/LongWarOfTheChosen/Config/XComPlots.ini @@ -31,6 +31,12 @@ +arrPlots=(MapName="Plot_ALB_AlienBase_02_LW", strType="Wilderness", ExcludeFromStrategy=false, ValidBiomes[0]="Temperate", ValidBiomes[1]="Arid", ValidBiomes[2]="Tundra", ObjectiveTags[0]="AssaultAlienBase_LW") +arrPlots=(MapName="Plot_ALB_AlienBase_03_LW", strType="Wilderness", ExcludeFromStrategy=false, ValidBiomes[0]="Temperate", ValidBiomes[1]="Arid", ValidBiomes[2]="Tundra", ObjectiveTags[0]="AssaultAlienBase_LW") +; City Center variations ++arrPlots=(MapName="Plot_CTY_AlienBaseCity_01_LW", strType="CityCenter", ExcludeFromStrategy=false, ObjectiveTags[0]="AssaultAlienBase_LW") ++arrPlots=(MapName="Plot_CTY_AlienBaseCity_01_Fixed_LW", strType="CityCenter", ExcludeFromStrategy=false, ObjectiveTags[0]="AssaultAlienBase_LW") ++arrPlots=(MapName="Plot_CTY_AlienBaseCity_03_LW", strType="CityCenter", ExcludeFromStrategy=false, ObjectiveTags[0]="AssaultAlienBase_LW") + + ; Central Broadcast Tower plot(s) -- this is for the penultimate GoldenPatch mission +arrPlots=(MapName="Plot_RFT_CentralBroadcastTower_01_LW", strType="Rooftops", ObjectiveTags[0]="GP_Broadcast") @@ -40,6 +46,11 @@ +arrPlots=(MapName="Plot_RFT_01_LW", strType="Rooftops", ObjectiveTags[0]="AssaultNetworkTower_LW") +arrPlots=(MapName="Plot_RFT_02_LW", strType="Rooftops", ObjectiveTags[0]="AssaultNetworkTower_LW") +; new network tower plots ++arrPlots=(MapName="Plot_RFT_03_LW", strType="Rooftops", ObjectiveTags[0]="AssaultNetworkTower_LW") ++arrPlots=(MapName="Plot_RFT_04_LW", strType="Rooftops", ObjectiveTags[0]="AssaultNetworkTower_LW") ++arrPlots=(MapName="Plot_RFT_05_LW", strType="Rooftops", ObjectiveTags[0]="AssaultNetworkTower_LW") + ; New haven maps for rendezvous missions and covert escapes (CA ambush missions) +arrPlots=(MapName="Plot_RVS_Highway_LgObj_01_LW", strType="Wilderness", ValidBiomes[0]="Temperate", ValidBiomes[1]="Arid", ValidBiomes[2]="Tundra", ObjectiveTags[0]="Rendezvous", ObjectiveTags[1]="CovertEscape_NonPCP") @@ -71,8 +82,17 @@ ObjectiveTags[0]="Sabotage", ObjectiveTags[1]="SecureUFO", ObjectiveTags[2]="GP_PsiGate") ; new Supply Extraction plots -+arrPlots=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="LargePlot") -+arrPlots=(MapName="Plot_WLD_SupplyExtract_LgObj_Stream_Ted", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="LargePlot") ++arrPlots=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", ObjectiveTags[2]="LargePlot") ++arrPlots=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted_Trn", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", ObjectiveTags[2]="LargePlot") ++arrPlots=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted2", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", ObjectiveTags[2]="LargePlot") ++arrPlots=(MapName="Plot_WLD_SupplyExtract_Ravine_Ted2_Cnvy", strType="Wilderness", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="BigSupplyExtraction", ObjectiveTags[2]="LargePlot") ++arrPlots=(MapName="Plot_WLD_SupplyExtract_LgObj_Stream_Ted", strType="Wilderness", ValidBiomes[0]="Temperate", ValidBiomes[1]="Arid", ValidBiomes[2]="Tundra", ValidBiomes[3]="Xenoform", ObjectiveTags[0]="SupplyExtraction", ObjectiveTags[1]="LargePlot") + ++arrPlots=(MapName="Plot_ABN_SupplyExtract_Waterfront2_Ted", strType="Abandoned", ObjectiveTags[0]="SupplyExtraction") ++arrPlots=(MapName="Plot_ABN_SupplyExtract_Waterfront2_Train", strType="Abandoned", ObjectiveTags[0]="SupplyExtraction") ++arrPlots=(MapName="Plot_ABN_SupplyExtract_Waterfront_Train", strType="Abandoned", ObjectiveTags[0]="SupplyExtraction") ++arrPlots=(MapName="Plot_ABN_SupplyExtract_Waterfront_Train2", strType="Abandoned", ObjectiveTags[0]="SupplyExtraction") + ; SMALLTOWN Plots ; Large Objective Parcel Plots @@ -105,3 +125,15 @@ ObjectiveTags[0]="CityCenter", ObjectiveTags[1]="LargePlot", ObjectiveTags[2]="Vehicle") +arrPlots=(MapName="Plot_CTY_LgObj_Mixed_02", strType="CityCenter", \\ ObjectiveTags[0]="CityCenter", ObjectiveTags[1]="LargePlot") ++arrPlots=(MapName="Plot_CTY_LgObj_Mixed_03", strType="CityCenter", \\ + ObjectiveTags[0]="CityCenter", ObjectiveTags[1]="LargePlot", ObjectiveTags[2]="Vehicle") + +; flipped extract extract plots ++arrPlots=(MapName="Plot_CTY_Extract_LgObj_Park_2", strType="CityCenter", \\ + ObjectiveTags[0]="CityCenter", ObjectiveTags[1]="Extract") ++arrPlots=(MapName="Plot_CTY_Extract_LgObj_Plaza_2", strType="CityCenter", \\ + ObjectiveTags[0]="CityCenter", ObjectiveTags[1]="Extract") + +; new test sewer plot (for use with sewer to subway) ++arrPlots=(MapName="Plot_TUN_Sewer_Guerilla_03_LW", strType="Tunnels_Sewer", \\ + ObjectiveTags[0]="GuerillaOps", ObjectiveTags[1]="GOp_Tunnels", FloorCount=2) \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComSchedules.ini b/LongWarOfTheChosen/Config/XComSchedules.ini index 64b567101..ca46f0b04 100644 --- a/LongWarOfTheChosen/Config/XComSchedules.ini +++ b/LongWarOfTheChosen/Config/XComSchedules.ini @@ -8130,9 +8130,10 @@ PrePlacedEncounters[0]=(EncounterID="OPNx8_Standard_LW", EncounterZoneOffsetAlongLOP=7.0, EncounterZoneWidth=8.0), \\ PrePlacedEncounters[1]=(EncounterID="MutonBucket_LW", EncounterZoneOffsetAlongLOP=23.0, EncounterZoneWidth=45.0), \\ PrePlacedEncounters[2]=(EncounterID="SUPPLY_COMMAND_BUCKETx5_LW", EncounterZoneOffsetAlongLOP=38.0, EncounterZoneWidth=45.0), \\ - PrePlacedEncounters[3]=(EncounterID="DKVx1_Chryssalid", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=10.0, \\ - EncounterZoneDepthOverride=48.0, EncounterZoneOffsetFromLOP=0.0, IncludeTacticalTag="DarkEvent_InfiltratorChryssalid"), \\ + PrePlacedEncounters[3]=(EncounterID="OPNx2_Standard_LW", EncounterZoneOffsetAlongLOP=30.0, EncounterZoneWidth=45.0), \\ PrePlacedEncounters[4]=(EncounterID="DKVx1_Chryssalid", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=10.0, \\ + EncounterZoneDepthOverride=48.0, EncounterZoneOffsetFromLOP=0.0, IncludeTacticalTag="DarkEvent_InfiltratorChryssalid"), \\ + PrePlacedEncounters[5]=(EncounterID="DKVx1_Chryssalid", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=10.0, \\ EncounterZoneDepthOverride=48.0, EncounterZoneOffsetFromLOP=10.0, IncludeTacticalTag="DarkEvent_InfiltratorChryssalid") \\ ) @@ -14133,8 +14134,8 @@ +MissionSchedules=(ScheduleID="ChosenAvengerDefense_LW", \\ ExcludeTacticalTag="DisableStandardSchedules", \\ - DefaultEncounterLeaderSpawnList="TerrorLeaders_LW", \\ - DefaultEncounterFollowerSpawnList="TerrorFollowers_LW", \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="Open", \\ XComSquadStartsConcealed=false, \\ IdealXComSpawnDistance=80, \\ MinXComSpawnDistance=24, \\ @@ -14196,3 +14197,91 @@ IncludeTacticalTag="AvengerDefenseTurretsMk2_Upgrade"), \\ MinRequiredAlertLevel=0, \\ MaxRequiredAlertLevel=99) + +; covert ops troop column variants: + ++MissionSchedules=(ScheduleID="COP_Troop_Column_D1_LW", \\ + MinRequiredAlertLevel=0, MaxRequiredAlertLevel=1, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="OPNx4_Standard_LW", EncounterZoneOffsetAlongLOP=10.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="ADVENTLancerteamBucket_LW", EncounterZoneOffsetAlongLOP=-1.0, EncounterZoneWidth=15.0), \\ + PrePlacedEncounters[2]=(EncounterID="LIST_OPNx2_Special_LW", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=45.0) \\ + ) + +; 10 ++MissionSchedules=(ScheduleID="COP_Troop_Column_D2_LW", \\ + MinRequiredAlertLevel=2, MaxRequiredAlertLevel=2, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="LIST_BOSSx4_Standard", EncounterZoneOffsetAlongLOP=3.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="ADVENTLancerteamBucket_LW", EncounterZoneOffsetAlongLOP=10.0, EncounterZoneWidth=15.0), \\ + PrePlacedEncounters[2]=(EncounterID="LIST_OPNx3_Special_LW", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=45.0), \\ + ) + ++MissionSchedules=(ScheduleID="COP_Troop_Column_D2_2_LW", \\ + MinRequiredAlertLevel=2, MaxRequiredAlertLevel=2, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="ADVENTLancerteamBucket_LW", EncounterZoneOffsetAlongLOP=3.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="OPNx4_Standard_LW", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=15.0), \\ + PrePlacedEncounters[2]=(EncounterID="LIST_OPNx4_Special_LW", EncounterZoneOffsetAlongLOP=10.0, EncounterZoneWidth=45.0), \\ + ) + +;12 ++MissionSchedules=(ScheduleID="COP_Troop_Column_D3_LW", \\ + MinRequiredAlertLevel=3, MaxRequiredAlertLevel=3, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="ADVENTSquadBucket_LW", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="LIST_OPNx2_Special_LW", EncounterZoneOffsetAlongLOP=10.0, EncounterZoneWidth=24.0), \\ + PrePlacedEncounters[2]=(EncounterID="LIST_BOSSx2_Standard", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=45.0) \\ + ) + ++MissionSchedules=(ScheduleID="COP_Troop_Column_D3_2_LW", \\ + MinRequiredAlertLevel=3, MaxRequiredAlertLevel=3, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="ADVENTSquadBucket_LW", EncounterZoneOffsetAlongLOP=-4.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="LIST_BOSSx4_Standard", EncounterZoneOffsetAlongLOP=8.0, EncounterZoneWidth=24.0), \\ + ) + +; 14 ++MissionSchedules=(ScheduleID="COP_Troop_Column_D4_LW", \\ + MinRequiredAlertLevel=4, MaxRequiredAlertLevel=4, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="ADVENTSquadBucket_LW", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="LIST_BOSSx3_Standard", EncounterZoneOffsetAlongLOP=7.0, EncounterZoneWidth=24.0), \\ + PrePlacedEncounters[2]=(EncounterID="OPNx3_Standard_LW", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=45.0) \\ + ) + ++MissionSchedules=(ScheduleID="COP_Troop_Column_D4_2_LW", \\ + MinRequiredAlertLevel=4, MaxRequiredAlertLevel=4, \\ + IdealXComSpawnDistance=48, \\ + MinXComSpawnDistance=28, \\ + EncounterZonePatrolDepth=22.0, \\ + DefaultEncounterLeaderSpawnList="DefaultLeaders_LW", \\ + DefaultEncounterFollowerSpawnList="DefaultFollowers_LW", \\ + PrePlacedEncounters[0]=(EncounterID="TROOP_ALIEN_BUCKETx6_LW", EncounterZoneOffsetAlongLOP=0.0, EncounterZoneWidth=45.0), \\ + PrePlacedEncounters[1]=(EncounterID="LIST_OPNx4_Special_LW", EncounterZoneOffsetAlongLOP=7.0, EncounterZoneWidth=24.0), \\ + PrePlacedEncounters[2]=(EncounterID="OPNx4_Standard_LW", EncounterZoneOffsetAlongLOP=-15.0, EncounterZoneWidth=45.0) \\ + ) \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComStrategyTuning.ini b/LongWarOfTheChosen/Config/XComStrategyTuning.ini new file mode 100644 index 000000000..e2d5158e0 --- /dev/null +++ b/LongWarOfTheChosen/Config/XComStrategyTuning.ini @@ -0,0 +1,232 @@ +[ExperimentalWeapons_Diff_0 X2TechTemplate] +PointsToComplete=1000 + +[ExperimentalWeapons_Diff_1 X2TechTemplate] +PointsToComplete=1000 + +[ExperimentalWeapons_Diff_2 X2TechTemplate] +PointsToComplete=1000 + +[ExperimentalWeapons_Diff_3 X2TechTemplate] +PointsToComplete=1000 + +[AutopsyViperKing_Diff_3 X2TechTemplate] +PointsToComplete=3000 + +[AutopsyBerserkerQueen_Diff_3 X2TechTemplate] +PointsToComplete=4000 + +[AutopsyArchonKing_Diff_3 X2TechTemplate] +PointsToComplete=5200 + +[SerpentSuit_Diff_3 X2TechTemplate] +PointsToComplete=1000 +Cost=(ResourceCosts[0]=(ItemTemplateName="AlienAlloy", Quantity=10), ResourceCosts[1]=(ItemTemplateName="EleriumDust", Quantity=10), ArtifactCosts[0]=(ItemTemplateName="EleriumCore", Quantity=1)) + +[RAGESuit_Diff_3 X2TechTemplate] +PointsToComplete=1000 +Cost=(ResourceCosts[0]=(ItemTemplateName="AlienAlloy", Quantity=10), ResourceCosts[1]=(ItemTemplateName="EleriumDust", Quantity=10), ArtifactCosts[0]=(ItemTemplateName="EleriumCore", Quantity=1)) + +[IcarusArmor_Diff_3 X2TechTemplate] +PointsToComplete=1750 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=125), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=20), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=30), ArtifactCosts[0]=(ItemTemplateName="EleriumCore", Quantity=1)) + +[BoltCaster_Diff_0 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=45)) + +[BoltCaster_Diff_1 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=45)) + +[BoltCaster_Diff_2 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=45)) + +[BoltCaster_Diff_3 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=45)) + +[HuntersAxe_Diff_0 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40)) + +[HuntersAxe_Diff_1 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40)) + +[HuntersAxe_Diff_2 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40)) + +[HuntersAxe_Diff_3 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40)) + +[Shadowkeeper_Diff_0 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[Shadowkeeper_Diff_1 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[Shadowkeeper_Diff_2 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[Shadowkeeper_Diff_3 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[FrostBomb_Diff_0 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[FrostBomb_Diff_1 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[FrostBomb_Diff_2 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + +[FrostBomb_Diff_3 X2TechTemplate] +PointsToComplete=210 +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=35)) + + + +[HeavyAlienArmorMk2_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=100), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=20), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=10)) + +[LightAlienArmorMk2_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=100), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=15), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=15)) + +; bolt caster + +[HunterRifle_CV_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterRifle_CV_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterRifle_CV_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterRifle_CV_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterRifle_MG_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterRifle_MG_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterRifle_MG_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterRifle_MG_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterRifle_BM_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=75), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterRifle_BM_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=75), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterRifle_BM_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=75), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterRifle_BM_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=75), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +; shadowkeeper + +[HunterPistol_CV_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterPistol_CV_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterPistol_CV_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterPistol_CV_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=20)) + +[HunterPistol_MG_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterPistol_MG_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterPistol_MG_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterPistol_MG_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=40), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterPistol_BM_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=60), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterPistol_BM_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=60), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterPistol_BM_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=60), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterPistol_BM_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=60), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +; hunter axe + +[HunterAxe_CV_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[HunterAxe_CV_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[HunterAxe_CV_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[HunterAxe_CV_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[HunterAxe_MG_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterAxe_MG_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterAxe_MG_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterAxe_MG_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5)) + +[HunterAxe_BM_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=50), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterAxe_BM_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=50), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterAxe_BM_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=50), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +[HunterAxe_BM_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=50), ResourceCosts[1]=(ItemTemplateName="AlienAlloy", Quantity=5), ResourceCosts[2]=(ItemTemplateName="EleriumDust", Quantity=5)) + +; frost bomb + +[Frostbomb_Schematic_Diff_0 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[Frostbomb_Schematic_Diff_1 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[Frostbomb_Schematic_Diff_2 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) + +[Frostbomb_Schematic_Diff_3 X2SchematicTemplate] +Cost=(ResourceCosts[0]=(ItemTemplateName="Supplies", Quantity=30)) diff --git a/LongWarOfTheChosen/Config/XComUI.ini b/LongWarOfTheChosen/Config/XComUI.ini index b08dfe82c..0a548711d 100644 --- a/LongWarOfTheChosen/Config/XComUI.ini +++ b/LongWarOfTheChosen/Config/XComUI.ini @@ -59,3 +59,7 @@ CustomizationListY=840 ;NoStripWoundedInventory=false ;NoStripOnTraining=false ;AutoStripWoundedAllItems=false + +[XComGame.UIShellDifficulty] + +DifficultyConfigurations[4]=(TacticalDifficulty=75, StrategyDifficulty=50, GameLength=33) \ No newline at end of file diff --git a/LongWarOfTheChosen/Config/XComWOTC_DisplayHitChance_MCMDefaults.ini b/LongWarOfTheChosen/Config/XComWOTC_DisplayHitChance_MCMDefaults.ini new file mode 100644 index 000000000..edf79d18b --- /dev/null +++ b/LongWarOfTheChosen/Config/XComWOTC_DisplayHitChance_MCMDefaults.ini @@ -0,0 +1,2 @@ +[WOTC_DisplayHitChance.MCM_Defaults] +TH_AIM_ASSIST = false \ No newline at end of file diff --git a/LongWarOfTheChosen/Content/.gitignore b/LongWarOfTheChosen/Content/.gitignore deleted file mode 100644 index 2f95c300e..000000000 --- a/LongWarOfTheChosen/Content/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -*.upk -*.umap -*.bik -*.webm -*.bk2 -/*/*.txt -!/LW_FactionBalance/* -!/LW_PerkPack_Integrated/* -!/LW_Toolbox_Integrated/* -!/BaseGameMissionAssets/README.txt -!/Missions/* -!/Parcels/* -!/Plots/* -!/CIN_TroopTransport.upk -!/LW_Heavy_Dazed_Tile.upk -!/LW_Psi* -!/UILibrary_* -!/BstarsPerkPack_Icons.upk -!/LW_StrikeRifle.upk -!/WP_BeamGrenadeLauncher.upk -!/HunterTrackingMark_LW.upk -!/AutopistolRebalance_LW.upk -!/LWHolotargeter.upk -!/*_PerkContent.upk -!/LW_Perk_OneForAll.upk \ No newline at end of file diff --git a/LongWarOfTheChosen/Content/AutopistolRebalance_LW.upk b/LongWarOfTheChosen/Content/AutopistolRebalance_LW.upk deleted file mode 100644 index e66d5b51d..000000000 Binary files a/LongWarOfTheChosen/Content/AutopistolRebalance_LW.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/BstarsPerkPack_Icons.upk b/LongWarOfTheChosen/Content/BstarsPerkPack_Icons.upk deleted file mode 100644 index 5b7db294d..000000000 Binary files a/LongWarOfTheChosen/Content/BstarsPerkPack_Icons.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/CIN_TroopTransport.upk b/LongWarOfTheChosen/Content/CIN_TroopTransport.upk deleted file mode 100644 index 738d1286d..000000000 Binary files a/LongWarOfTheChosen/Content/CIN_TroopTransport.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/HunterTrackingMark_LW.upk b/LongWarOfTheChosen/Content/HunterTrackingMark_LW.upk deleted file mode 100644 index 398e635f1..000000000 Binary files a/LongWarOfTheChosen/Content/HunterTrackingMark_LW.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LWHoloTarget_PerkContent.upk b/LongWarOfTheChosen/Content/LWHoloTarget_PerkContent.upk deleted file mode 100644 index 77f0fe0e4..000000000 Binary files a/LongWarOfTheChosen/Content/LWHoloTarget_PerkContent.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LWHolotargeter.upk b/LongWarOfTheChosen/Content/LWHolotargeter.upk deleted file mode 100644 index ca2662801..000000000 Binary files a/LongWarOfTheChosen/Content/LWHolotargeter.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LWMultiTarget_PerkContent.upk b/LongWarOfTheChosen/Content/LWMultiTarget_PerkContent.upk deleted file mode 100644 index 12afb1823..000000000 Binary files a/LongWarOfTheChosen/Content/LWMultiTarget_PerkContent.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LWRapidTarget_PerkContent.upk b/LongWarOfTheChosen/Content/LWRapidTarget_PerkContent.upk deleted file mode 100644 index bfc0ab312..000000000 Binary files a/LongWarOfTheChosen/Content/LWRapidTarget_PerkContent.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_FactionBalance/HeroClassesReb.upk b/LongWarOfTheChosen/Content/LW_FactionBalance/HeroClassesReb.upk deleted file mode 100644 index f0c0911a5..000000000 Binary files a/LongWarOfTheChosen/Content/LW_FactionBalance/HeroClassesReb.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_FactionBalance/UICollection_SupremeFocus.upk b/LongWarOfTheChosen/Content/LW_FactionBalance/UICollection_SupremeFocus.upk deleted file mode 100644 index 026a76ccc..000000000 Binary files a/LongWarOfTheChosen/Content/LW_FactionBalance/UICollection_SupremeFocus.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseCombatSpecialist.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseCombatSpecialist.upk deleted file mode 100644 index e4daa55a0..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseCombatSpecialist.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseEncounters.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseEncounters.upk deleted file mode 100644 index cd2b540fb..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_CloseEncounters.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_KnifeEncounters.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_KnifeEncounters.upk deleted file mode 100644 index 0e8ab025a..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_KnifeEncounters.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_AbsorptionFields.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_AbsorptionFields.upk deleted file mode 100644 index 4276874f1..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_AbsorptionFields.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_BodyShield.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_BodyShield.upk deleted file mode 100644 index c234306a8..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_BodyShield.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_CombatRush.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_CombatRush.upk deleted file mode 100644 index 8273bb564..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_CombatRush.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DamageControl.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DamageControl.upk deleted file mode 100644 index c78556c26..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DamageControl.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DepthPerception.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DepthPerception.upk deleted file mode 100644 index d1ac3759e..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_PCS_DepthPerception.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_Bastion.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_Bastion.upk deleted file mode 100644 index f01fb685f..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_Bastion.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_MindMerge.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_MindMerge.upk deleted file mode 100644 index c84f02b1a..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_Psi_MindMerge.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_ZoC.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_ZoC.upk deleted file mode 100644 index 3ea977b5a..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/LW_Perk_ZoC.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/UILibrary_LW_PerkPack.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/UILibrary_LW_PerkPack.upk deleted file mode 100644 index 5b959dc6d..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/UILibrary_LW_PerkPack.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/gfxArmory_LW.upk b/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/gfxArmory_LW.upk deleted file mode 100644 index 67f0e74ad..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PerkPack_Integrated/gfxArmory_LW.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_Perk_OneForAll.upk b/LongWarOfTheChosen/Content/LW_Perk_OneForAll.upk deleted file mode 100644 index 1d37194cb..000000000 Binary files a/LongWarOfTheChosen/Content/LW_Perk_OneForAll.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PsiOverhaul.upk b/LongWarOfTheChosen/Content/LW_PsiOverhaul.upk deleted file mode 100644 index 8c6365167..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PsiOverhaul.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_PsiOverhaul_Perks.upk b/LongWarOfTheChosen/Content/LW_PsiOverhaul_Perks.upk deleted file mode 100644 index e3bde316a..000000000 Binary files a/LongWarOfTheChosen/Content/LW_PsiOverhaul_Perks.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_StrikeRifle.upk b/LongWarOfTheChosen/Content/LW_StrikeRifle.upk deleted file mode 100644 index 8b5e2320a..000000000 Binary files a/LongWarOfTheChosen/Content/LW_StrikeRifle.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/CIN_PostMission1.umap b/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/CIN_PostMission1.umap deleted file mode 100644 index 2e33acd25..000000000 Binary files a/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/CIN_PostMission1.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/UILibrary_LWToolbox.upk b/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/UILibrary_LWToolbox.upk deleted file mode 100644 index 8d81b97ec..000000000 Binary files a/LongWarOfTheChosen/Content/LW_Toolbox_Integrated/UILibrary_LWToolbox.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_AssaultAlienBase_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_AssaultAlienBase_LW.umap deleted file mode 100644 index 3f294a86e..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_AssaultAlienBase_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_AssaultNetworkTower_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_AssaultNetworkTower_LW.umap deleted file mode 100644 index 07aa06b0b..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_AssaultNetworkTower_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_Blacksite_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_Blacksite_LW.umap deleted file mode 100644 index 167d11ffb..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_Blacksite_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_ChosenAvengerDefense_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_ChosenAvengerDefense_LW.umap deleted file mode 100644 index 8a41e2ab6..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_ChosenAvengerDefense_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_CovertEscape_Evac_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_CovertEscape_Evac_LW.umap deleted file mode 100644 index 3f35ec5c5..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_CovertEscape_Evac_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_Defend_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_Defend_LW.umap deleted file mode 100644 index 2ca203fc2..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_Defend_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_DestroyObject_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_DestroyObject_LW.umap deleted file mode 100644 index f94aaefba..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_DestroyObject_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_DestroyTransmitter_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_DestroyTransmitter_LW.umap deleted file mode 100644 index 2a485c87a..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_DestroyTransmitter_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_Forge_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_Forge_LW.umap deleted file mode 100644 index f0b95be5b..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_Forge_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_HackWorkstation_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_HackWorkstation_LW.umap deleted file mode 100644 index ff288fc3f..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_HackWorkstation_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_IntelRaid_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_IntelRaid_LW.umap deleted file mode 100644 index 68c86a874..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_IntelRaid_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_Jailbreak_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_Jailbreak_LW.umap deleted file mode 100644 index d830f57d2..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_Jailbreak_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_LWAvengerDefense.umap b/LongWarOfTheChosen/Content/Missions/Obj_LWAvengerDefense.umap deleted file mode 100644 index 4d363586d..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_LWAvengerDefense.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_LWInvasion.umap b/LongWarOfTheChosen/Content/Missions/Obj_LWInvasion.umap deleted file mode 100644 index 2b0403b73..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_LWInvasion.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_LWNeutralizeTarget.umap b/LongWarOfTheChosen/Content/Missions/Obj_LWNeutralizeTarget.umap deleted file mode 100644 index 004f2cbcf..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_LWNeutralizeTarget.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_LWTerror.umap b/LongWarOfTheChosen/Content/Missions/Obj_LWTerror.umap deleted file mode 100644 index 0fd768a34..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_LWTerror.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_RecoverItem_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_RecoverItem_LW.umap deleted file mode 100644 index 4aad7c08f..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_RecoverItem_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_RecruitRaid_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_RecruitRaid_LW.umap deleted file mode 100644 index d76717e36..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_RecruitRaid_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_Rendezvous_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_Rendezvous_LW.umap deleted file mode 100644 index 2cbd7e3f4..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_Rendezvous_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_SabotageCC_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_SabotageCC_LW.umap deleted file mode 100644 index 8dfb9cd0a..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_SabotageCC_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_SecureUFO_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_SecureUFO_LW.umap deleted file mode 100644 index 94af39a92..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_SecureUFO_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_SmashNGrab_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_SmashNGrab_LW.umap deleted file mode 100644 index 3e1a94559..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_SmashNGrab_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_SupplyConvoy_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_SupplyConvoy_LW.umap deleted file mode 100644 index 7eb2bdeb3..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_SupplyConvoy_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_SupplyExtraction_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_SupplyExtraction_LW.umap deleted file mode 100644 index 7e7d420e1..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_SupplyExtraction_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/Obj_TroopManeuvers_LW.umap b/LongWarOfTheChosen/Content/Missions/Obj_TroopManeuvers_LW.umap deleted file mode 100644 index 41324ccd1..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/Obj_TroopManeuvers_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/SubSystem_ContinuousRNF.umap b/LongWarOfTheChosen/Content/Missions/SubSystem_ContinuousRNF.umap deleted file mode 100644 index a706fa638..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/SubSystem_ContinuousRNF.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/UMS_LWCommon.umap b/LongWarOfTheChosen/Content/Missions/UMS_LWCommon.umap deleted file mode 100644 index 063b17f02..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/UMS_LWCommon.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/UMS_LWContinuousReinforcements.umap b/LongWarOfTheChosen/Content/Missions/UMS_LWContinuousReinforcements.umap deleted file mode 100644 index 1d97e27f8..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/UMS_LWContinuousReinforcements.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Missions/UMS_LWMissionTimer.umap b/LongWarOfTheChosen/Content/Missions/UMS_LWMissionTimer.umap deleted file mode 100644 index 6c3a66738..000000000 Binary files a/LongWarOfTheChosen/Content/Missions/UMS_LWMissionTimer.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_Advent_Recruitment_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_Advent_Recruitment_01_LW.umap deleted file mode 100644 index c47319b25..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_Advent_Recruitment_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_ChipTransmitter_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_ChipTransmitter_01_LW.umap deleted file mode 100644 index 0a3199063..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_ChipTransmitter_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_CloneStorage_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_CloneStorage_01_LW.umap deleted file mode 100644 index 5e2a95ede..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_CloneStorage_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_GeneClinic_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_GeneClinic_01_LW.umap deleted file mode 100644 index f03d8b868..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_GeneClinic_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_HumanBodyStorage_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_HumanBodyStorage_01_LW.umap deleted file mode 100644 index e30a81ab3..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_HumanBodyStorage_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_Museum_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/lg_Museum_01_LW_PD.umap deleted file mode 100644 index d34cd4c9d..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_Museum_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_PropagandaCenter_02_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_PropagandaCenter_02_LW.umap deleted file mode 100644 index c4df85061..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_PropagandaCenter_02_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_LW.umap deleted file mode 100644 index ee40fb63a..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_SG_LW.umap b/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_SG_LW.umap deleted file mode 100644 index 683014077..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_RemoteScienceStation_01_SG_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_Shopping_Center_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/lg_Shopping_Center_01_LW_PD.umap deleted file mode 100644 index 66175e29d..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_Shopping_Center_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_02.umap b/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_02.umap index b7b610d45..631f71311 100644 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_02.umap and b/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_02.umap differ diff --git a/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_03.umap b/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_03.umap index bacdd6ac0..45918758e 100644 Binary files a/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_03.umap and b/LongWarOfTheChosen/Content/Parcels/lg_TedAdventSupplyExtract_03.umap differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_03.umap b/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_03.umap deleted file mode 100644 index 6fe6966d7..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_03.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_04.umap b/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_04.umap deleted file mode 100644 index ef87a4a30..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_AdventLandingPad_04.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Advent_Security_03_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_Advent_Security_03_LW.umap deleted file mode 100644 index 8858825df..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Advent_Security_03_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_AlienEntertainment_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_AlienEntertainment_01_LW.umap deleted file mode 100644 index 3e2d6908b..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_AlienEntertainment_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Bank_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/md_Bank_01_LW_PD.umap deleted file mode 100644 index 2e609f317..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Bank_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Boardroom_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_Boardroom_01_LW.umap deleted file mode 100644 index f4210f0c3..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Boardroom_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_ChosenArtillery_01.umap b/LongWarOfTheChosen/Content/Parcels/md_ChosenArtillery_01.umap deleted file mode 100644 index dac020b51..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_ChosenArtillery_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_ClothingStore_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/md_ClothingStore_01_LW_PD.umap deleted file mode 100644 index 38ebbb7c9..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_ClothingStore_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_GasStation_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/md_GasStation_01_LW_PD.umap deleted file mode 100644 index f195d1a8c..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_GasStation_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_GeneClinic_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_GeneClinic_01_LW.umap deleted file mode 100644 index 5e13ff74b..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_GeneClinic_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Office_03_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/md_Office_03_LW_PD.umap deleted file mode 100644 index 85920ced5..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Office_03_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_RegionalNetwork_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_RegionalNetwork_01_LW.umap deleted file mode 100644 index c3fce78e8..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_RegionalNetwork_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_RemoteScienceStation_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_RemoteScienceStation_01_LW.umap deleted file mode 100644 index eb2e98720..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_RemoteScienceStation_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Restaurant_01_LW_PD.umap b/LongWarOfTheChosen/Content/Parcels/md_Restaurant_01_LW_PD.umap deleted file mode 100644 index afb0cb6d0..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Restaurant_01_LW_PD.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_ShootingRange_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_ShootingRange_01_LW.umap deleted file mode 100644 index 6cac34be7..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_ShootingRange_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/md_Studio_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/md_Studio_01_LW.umap deleted file mode 100644 index 4cb6b353a..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/md_Studio_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_01.umap b/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_01.umap deleted file mode 100644 index a35d39243..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_02.umap b/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_02.umap deleted file mode 100644 index 05c8602ef..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/sm_ChosenBulwark_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/sm_ServerRoom_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/sm_ServerRoom_01_LW.umap deleted file mode 100644 index 7d35c8534..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/sm_ServerRoom_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Parcels/sm_VipOffice_01_LW.umap b/LongWarOfTheChosen/Content/Parcels/sm_VipOffice_01_LW.umap deleted file mode 100644 index 50d42a7be..000000000 Binary files a/LongWarOfTheChosen/Content/Parcels/sm_VipOffice_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_01_LW.umap deleted file mode 100644 index dabb656ca..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_02_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_02_LW.umap deleted file mode 100644 index 84757332e..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_02_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_03_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_03_LW.umap deleted file mode 100644 index ed51e54f7..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_ALB_AlienBase_03_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_01.umap deleted file mode 100644 index 2ebfc5e03..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_02.umap deleted file mode 100644 index a481c206d..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_10_LW.umap deleted file mode 100644 index fb6f87b50..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_11_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_11_LW.umap deleted file mode 100644 index e843ddb2a..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Civic_11_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_01.umap deleted file mode 100644 index 8eb6b5e5b..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_02.umap deleted file mode 100644 index 273432b4d..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_10_LW.umap deleted file mode 100644 index d2afc1e30..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_LgObj_Mixed_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_01_LW.umap deleted file mode 100644 index d611e2736..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_02_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_02_LW.umap deleted file mode 100644 index 75cbfb66f..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CTY_vlgObj_PedShoppingCenter_02_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_CVY_ResistanceConvoy_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_CVY_ResistanceConvoy_01_LW.umap deleted file mode 100644 index 63457d9bf..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_CVY_ResistanceConvoy_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_RFT_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_RFT_01_LW.umap deleted file mode 100644 index 77b1a33ed..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_RFT_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_RFT_02_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_RFT_02_LW.umap deleted file mode 100644 index e90b4d28e..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_RFT_02_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_RFT_CentralBroadcastTower_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_RFT_CentralBroadcastTower_01_LW.umap deleted file mode 100644 index 04995d479..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_RFT_CentralBroadcastTower_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_LgObj_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_LgObj_01_LW.umap deleted file mode 100644 index e947aec21..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_LgObj_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_MdObj_01_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_MdObj_01_LW.umap deleted file mode 100644 index c9f965267..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_RVS_Highway_MdObj_01_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_10_LW.umap deleted file mode 100644 index 7639fe8c6..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_11_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_11_LW.umap deleted file mode 100644 index ea5daf6fc..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_11_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_12_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_12_LW.umap deleted file mode 100644 index fdb58fa96..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_SLM_LgObj_12_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_SLM_MdObj_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_SLM_MdObj_10_LW.umap deleted file mode 100644 index 1dff3de70..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_SLM_MdObj_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_SLM_Overpass_LgObj_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_SLM_Overpass_LgObj_10_LW.umap deleted file mode 100644 index be6993cff..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_SLM_Overpass_LgObj_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_01.umap deleted file mode 100644 index 8f5c88d91..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_02.umap deleted file mode 100644 index d5df783e7..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_10_LW.umap deleted file mode 100644 index c84140190..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_11_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_11_LW.umap deleted file mode 100644 index e65134c51..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_11_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_20_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_20_LW.umap deleted file mode 100644 index 0d1d755f3..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_LgObj_20_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_MdObj_10_LW.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_MdObj_10_LW.umap deleted file mode 100644 index 89abc0123..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Mixed_MdObj_10_LW.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_01.umap deleted file mode 100644 index d81e0aa04..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_02.umap deleted file mode 100644 index 6a1a60db9..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Neigh_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_01.umap deleted file mode 100644 index 2b3c0e066..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_02.umap deleted file mode 100644 index 7b98cc21b..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_TWN_Retail_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_01.umap deleted file mode 100644 index 0c116c4cc..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_02.umap deleted file mode 100644 index 390e9a1bb..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Highway_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_01.umap deleted file mode 100644 index 59966af43..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_02.umap deleted file mode 100644 index 9b25c3861..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Ravine_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_01.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_01.umap deleted file mode 100644 index 797a3cdee..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_01.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_02.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_02.umap deleted file mode 100644 index e5de1c326..000000000 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_Stream_LgObj_02.umap and /dev/null differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_LgObj_Stream_Ted.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_LgObj_Stream_Ted.umap index 893426e0b..8d63bda91 100644 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_LgObj_Stream_Ted.umap and b/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_LgObj_Stream_Ted.umap differ diff --git a/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_Ravine_Ted.umap b/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_Ravine_Ted.umap index f040cecb6..57e6172b7 100644 Binary files a/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_Ravine_Ted.umap and b/LongWarOfTheChosen/Content/Plots/Plot_WLD_SupplyExtract_Ravine_Ted.umap differ diff --git a/LongWarOfTheChosen/Content/README.md b/LongWarOfTheChosen/Content/README.md deleted file mode 100644 index b54ec3834..000000000 --- a/LongWarOfTheChosen/Content/README.md +++ /dev/null @@ -1,4 +0,0 @@ -This directory contains many large files, so they are not stored on GitHub. -Download [this zip file][1] and unpack it into this directory. - - [1]: https://www.dropbox.com/s/5wtqt5xjg8mde02/lwotc-content.zip?dl=0 "LWOTC Content assets" diff --git a/LongWarOfTheChosen/Content/UILibrary_FavidsPerkPack.upk b/LongWarOfTheChosen/Content/UILibrary_FavidsPerkPack.upk deleted file mode 100644 index e50fd20fb..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_FavidsPerkPack.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_LW_Overhaul.upk b/LongWarOfTheChosen/Content/UILibrary_LW_Overhaul.upk deleted file mode 100644 index c13b3656b..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_LW_Overhaul.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_SOCombatEngineer.upk b/LongWarOfTheChosen/Content/UILibrary_SOCombatEngineer.upk deleted file mode 100644 index 1ff5d3c4c..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_SOCombatEngineer.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_SODragoon.upk b/LongWarOfTheChosen/Content/UILibrary_SODragoon.upk deleted file mode 100644 index ff51b1007..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_SODragoon.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_SOHunter.upk b/LongWarOfTheChosen/Content/UILibrary_SOHunter.upk deleted file mode 100644 index e7d36d053..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_SOHunter.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_WOTC_APA_Class_Pack.upk b/LongWarOfTheChosen/Content/UILibrary_WOTC_APA_Class_Pack.upk deleted file mode 100644 index f0538b436..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_WOTC_APA_Class_Pack.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_WeaponPerkIcons.upk b/LongWarOfTheChosen/Content/UILibrary_WeaponPerkIcons.upk deleted file mode 100644 index ce0c0070e..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_WeaponPerkIcons.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_WolfWeaponPack.upk b/LongWarOfTheChosen/Content/UILibrary_WolfWeaponPack.upk deleted file mode 100644 index 3c6fc7e73..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_WolfWeaponPack.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/UILibrary_XPerkIconPack.upk b/LongWarOfTheChosen/Content/UILibrary_XPerkIconPack.upk deleted file mode 100644 index 3ece0f742..000000000 Binary files a/LongWarOfTheChosen/Content/UILibrary_XPerkIconPack.upk and /dev/null differ diff --git a/LongWarOfTheChosen/Content/WP_BeamGrenadeLauncher.upk b/LongWarOfTheChosen/Content/WP_BeamGrenadeLauncher.upk deleted file mode 100644 index 46c38d489..000000000 Binary files a/LongWarOfTheChosen/Content/WP_BeamGrenadeLauncher.upk and /dev/null differ diff --git a/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultAlienBase_LW.umap b/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultAlienBase_LW.umap index 3f294a86e..2f0f0a341 100644 Binary files a/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultAlienBase_LW.umap and b/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultAlienBase_LW.umap differ diff --git a/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultNetworkTower_LW.umap b/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultNetworkTower_LW.umap index 07aa06b0b..f1db3d663 100644 Binary files a/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultNetworkTower_LW.umap and b/LongWarOfTheChosen/ContentForCook/Missions/Obj_AssaultNetworkTower_LW.umap differ diff --git a/LongWarOfTheChosen/ContentForCook/Missions/Obj_SmashNGrab_LW.umap b/LongWarOfTheChosen/ContentForCook/Missions/Obj_SmashNGrab_LW.umap index 3e1a94559..10c1d32c8 100644 Binary files a/LongWarOfTheChosen/ContentForCook/Missions/Obj_SmashNGrab_LW.umap and b/LongWarOfTheChosen/ContentForCook/Missions/Obj_SmashNGrab_LW.umap differ diff --git a/LongWarOfTheChosen/ContentOptions.json b/LongWarOfTheChosen/ContentOptions.json index dfd853c9f..2de6ffbe9 100644 --- a/LongWarOfTheChosen/ContentOptions.json +++ b/LongWarOfTheChosen/ContentOptions.json @@ -1,11 +1,125 @@ { + + "missingUncooked": [ + "FX_Glows_Env.upk", + "FX_Exhaust_Vapors_Env.upk" + ], + "sfMaps": [ + "AdventCrate_LoCov_1x1_SmashNGrab_LW", + "Obj_AssaultAlienBase_LW", + "Obj_AssaultNetworkTower_LW", + "Obj_Blacksite_LW", + "Obj_ChosenAvengerDefense_LW", + "Obj_CovertEscape_Evac_LW", + "Obj_Defend_LW", + "Obj_DestroyObject_LW", + "Obj_DestroyTransmitter_LW", + "Obj_Forge_LW", + "Obj_HackWorkstation_LW", + "Obj_IntelRaid_LW", + "Obj_Jailbreak_LW", + "Obj_LWAvengerDefense", + "Obj_LWInvasion", + "Obj_LWNeutralizeTarget", + "Obj_LWTerror", + "Obj_RecoverItem_LW", + "Obj_RecruitRaid_LW", + "Obj_Rendezvous_LW", + "Obj_SabotageCC_LW", + "Obj_SecureUFO_LW", + "Obj_SmashNGrab_LW", + "Obj_BigSmashNGrab_LW", + "Obj_SupplyConvoy_LW", + "Obj_SupplyExtraction_LW", + "Obj_BigSupplyExtraction_LW", + "Obj_TroopManeuvers_LW", + "SubSystem_ContinuousRNF", + "UMS_LWCommon", + "UMS_LWContinuousReinforcements", + "UMS_LWMissionTimer", + "Obj_ChosenShowdown_LW" + ], "sfStandalone": [ - "LWCombatKnife", - "LWMutonM3", + "AdvGrenadeLauncher", + "LW_Perk_MutonM3", + "LW_Perk_Psi_MassMindspin", + "LW_Perk_Psi_MassReanimation", + "LW_Perk_RepairServos", + "LWAdvGrenadier", + "LWAdvGunner", + "LWAdvMec", + "LWAdvMecArcher", + "LWAdvRocketeer", + "LWAdvSentry", + "LWDrone", + "LWDroneWeapon", + "LWDroneWeapon_alternate_beam", "LWHiveQueen", + "LWMutonM2", + "LWMutonM3", + "LWMutonM3Rifle", + "LWNaja", + "LWSectoidM2", + "LWSidewinder", + "LWSidewinderSMG", + "NajaRifle", + "XAdventTrooper", + + "AutopistolRebalance_LW", + "BRMeshPack_LW", + "Cannon_NoShake_LW", + "CrossbowVektor", + "GameUnit_AdvPurifier_Rusty", + "EW_MEC_Weapons", + "LW_PsiOverhaul", + "LWCombatKnife", + "LWGauntletWOTC", + "LWHoloTarget_PerkContent", + "LWHolotargeter", + "LWMultiTarget_PerkContent", + "LWRapidTarget_PerkContent", + "LWResistanceMEC", + "LWSawedoffShotgun", + "MusashiCombatKnifeMod_LW", + "WP_AdventFlamethrower_Rusty", + "WP_BeamGrenadeLauncher", + + "IRISoulShotPerk", + "IRIApotheosisPerk", + "IRIParryReworkPerk", + "IRIParryReworkAnims", + + "IRIPerkPack_UILibrary_LW", + + "OneHandedGauntlet_LW", "WoTC_Ballistic_Shield_LW", "WoTC_Plated_Shield_LW", "WoTC_Powered_Shield_LW", - "WoTC_Shield_Animations_LW" + "WoTC_Shield_Animations_LW", + + + "LWAssaultRifle_LS", + "LWCannon_LS", + "LWPistol_LS", + "LWShotgun_LS", + "LWSMG_LS", + "LWSniperRifle_LS", + + "LWAccessories_CG", + "LWAssaultRifle_CG", + "LWCannon_CG", + "LWPistol_CG", + "LWShotgun_CG", + "LWSMG_CG", + "LWSniperRifle_CG", + + "LWSMG_BM", + "LWSMG_CV", + "LWSMG_MG", + + "UILibrary_LWAlienPack", + "UILibrary_LW_Coilguns", + "UILibrary_LW_LaserPack", + "UILibrary_Refs" ] -} +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.chn b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.chn index 6e9607fa8..6b32c9bc9 100644 --- a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.chn +++ b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.chn @@ -24,4 +24,8 @@ Description="同阶技能:用能力点购买同军阶的多个职业技能。" [BabyChosen SecondWaveOptionObject] Tooltip="禁用天选者的主反应,使其更容易战斗。" Description="天选宝宝:天选者的主反应被禁用。" -; End Translation \ No newline at end of file +; End Translation + +[HybridDifficulty_LW SecondWaveOptionObject] +Tooltip="增加战术难度,比战略层难度高一级。适用于希望在战术层面更难但在战略层面较容易的情况。注意: 这仍处于早期测试阶段。如果已经在传奇难度上,该选项将不会产生任何效果,并且在战役进行中更改难度将破坏这一设定。目前不会对第一个任务应用这些更改。" +Description="[Beta] 混合难度: 增加战术难度" diff --git a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.deu b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.deu old mode 100755 new mode 100644 index a0237a61a..e38d38d74 Binary files a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.deu and b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.deu differ diff --git a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.esn b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.esn index 4fd41c4ed..7e48334c6 100644 --- a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.esn +++ b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.esn @@ -24,4 +24,10 @@ Description="Desbloquea habilidades del mismo rango: Concede a los soldados de X [BabyChosen SecondWaveOptionObject] Tooltip="Desactiva las reacciones principales en los Elegidos consiguiendo rebajar exponencialmente la dificultad al combatir contra ellos." Description="Elegidos nerfeados: Los Elegidos tienen sus reacciones principales deshabilitadas." -; End translated + + +[HybridDifficulty_LW SecondWaveOptionObject] +Tooltip="Aumenta la dificultad táctica un nivel por encima de la parte estratégica. Para cuando quieres una punto extra de complicadez táctico pero una capa de estrategia más fácil. No sirve si ya estás en Leyenda y, si cambias la dificultad en mitad de campaña, dejará de funcionar. Actualmente no se aplican los cambios a la primera misión (Operación Reventador)." +Description="[Beta] Dificultad Híbrida: Incrementa la dificultad táctica." + +; End translated \ No newline at end of file diff --git a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.int b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.int index 3e7df0470..1001dcf98 100644 --- a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.int +++ b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.int @@ -25,3 +25,7 @@ Description="Allow Same Rank Abilities: Allows XCOM soldiers to purchase multipl Tooltip="Disable the Prime reactions on the Chosen, making them significantly easier to fight." Description="Baby Chosen: Chosen have their Prime Reactions disabled." ; End Translation + +[HybridDifficulty_LW SecondWaveOptionObject] +Tooltip="Increases the Tactical Difficulty one level above the Strategy Layer Difficulty. For when you want a harder Tactical layer but easier Strategy layer. Note: This is still early in testing. Does nothing if you're already on Legend, and changing difficulty mid-campaign will break this. Currently does not apply the changes to Gatecrasher." +Description="[Beta] Hybrid Difficulty: Increases the Tactical Difficulty" diff --git a/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.pol b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.pol new file mode 100644 index 000000000..f745d7edb --- /dev/null +++ b/LongWarOfTheChosen/Localization/BetterSecondWaveSupport.pol @@ -0,0 +1,19 @@ +[DisableTutorial SecondWaveOptionObject] +Tooltip="Wyłącza samouczek Long War of the Chosen" +Description="Bez trzymania za rękę: Wyłącz samouczek LWOTC." + +[DisableChosen SecondWaveOptionObject] +Tooltip="Wyłącza Wybrańców, więc nie pojawią się w grze" +Description="Wybrańcy na wakacjach: Wyłącza Wybrańców." + +[EnableResistanceOrders SecondWaveOptionObject] +Tooltip="Włącza rozkazy ruchu oporu." +Description="Dominacja strategiczna: umożliwia wykonywanie rozkazów ruchu oporu w XCOM." + +[AllowSameRankAbilities SecondWaveOptionObject] +Tooltip="Umożliwia żołnierzom XCOM zakup wielu zdolności klasowych tej samej rangi za AP." +Description="Zezwalaj na zdolności tej samej rangi: Umożliwia żołnierzom XCOM zakup wielu zdolności klasowych tej samej rangi za AP po zbudowaniu Centrum Szkoleniowego." + +[BabyChosen SecondWaveOptionObject] +Tooltip="Wyłącza główne reakcje Wybrańców, dzięki czemu walka z nimi będzie znacznie łatwiejsza." +Description="Dziecinni Wybrańcy: Wybrańcy mają wyłączone główne reakcje" diff --git a/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.deu b/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.deu old mode 100755 new mode 100644 index 69224d38f..4e9f89d6d Binary files a/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.pol b/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.pol index 30f290429..eb1eb677f 100644 --- a/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.pol +++ b/LongWarOfTheChosen/Localization/LW_AlienPack_Integrated/XComGame.pol @@ -121,6 +121,7 @@ strCharacterName="Muton centurion" FriendlyName="Karabin centuriona" BriefSummary="XCOM zdobył wiele rodzajów standardowej broni osobistej piechoty. To najpopularniejsza wersja, zbliżona do karabinu używanego dwadzieścia lat temu. Nie dorównuje technologii magnetycznej ADVENT-u, ale można ją ulepszyć, korzystając z elementów zdobycznego uzbrojenia, gdy odblokuje się już standardowe podejście techniczne." TacticalText=" Oddanie strzału z broni głównej żołnierza zawsze kończy jego turę.\n Jeżeli żołnierz strzeli, mając dostępne obie akcje, padną trzy strzały o mniejszej celności, ale większej łącznej skuteczności.\n Używaj ulepszeń zdobytych na wrogach, żeby zwiększyć taktyczną przydatność karabinu szturmowego." +AbilityDescName="karabin plazmowy" [MutonM2_LWGrenade X2GrenadeTemplate] FriendlyName="Granat obcych" @@ -142,6 +143,7 @@ strCharacterName="Elitarny muton" [MutonM3_LW_Wpn X2WeaponTemplate] FriendlyName="Elitarne działko plazmowe" +AbilityDescName="działko plazmowe" [MutonM3_LWGrenade X2GrenadeTemplate] FriendlyName="Granat obcych" @@ -159,19 +161,22 @@ LaunchedAbilityHelpText="Wystrzel granat obcych we wskazane miejsce. Niszczy pan strCharacterName="Kobra" [NajaM2 X2CharacterTemplate] -strCharacterName="Kobra serpens" +strCharacterName="Kobra Serpens" [NajaM3 X2CharacterTemplate] -strCharacterName="Elitarna kobra" +strCharacterName="Elitarna Kobra" [NajaM1_WPN X2WeaponTemplate] -FriendlyName="Karabin snajperski kobry" +FriendlyName="Karabin snajperski Kobry" +AbilityDescName="karabin snajperski" [NajaM2_WPN X2WeaponTemplate] -FriendlyName="Karabin snajperski kobry" +FriendlyName="Karabin snajperski Kobry" +AbilityDescName="karabin snajperski" [NajaM3_WPN X2WeaponTemplate] -FriendlyName="Karabin snajperski kobry" +FriendlyName="Karabin snajperski Kobry" +AbilityDescName="karabin snajperski" ;;;;;;;;;;;;;;;;;;;;;;;;;; Sidewinder ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -182,16 +187,19 @@ strCharacterName="Grzechotnik" strCharacterName="Grzechotnik serpens" [SidewinderM3 X2CharacterTemplate] -strCharacterName="Elitarny grzechotnik" +strCharacterName="Elitarny Grzechotnik" [SidewinderM1_WPN X2WeaponTemplate] -FriendlyName="Znikacz grzechotnika" +FriendlyName="Strzelba Grzechotnika" +AbilityDescName="strzelba" [SidewinderM2_WPN X2WeaponTemplate] -FriendlyName="Znikacz grzechotnika" +FriendlyName="Strzelba Grzechotnika" +AbilityDescName="strzelba" [SidewinderM3_WPN X2WeaponTemplate] -FriendlyName="Znikacz grzechotnika" +FriendlyName="Strzelba Grzechotnika" +AbilityDescName="strzelba" ;;;;;;;;;;;;;;;;;;;;;;;;;; Viper ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -199,23 +207,25 @@ FriendlyName="Znikacz grzechotnika" strCharacterName="Żmija serpens" [ViperM3_LW X2CharacterTemplate] -strCharacterName="Elitarna żmija" +strCharacterName="Elitarna Żmija" [ViperM2_LW_WPN X2WeaponTemplate] FriendlyName="Karabin wiązkowy" +AbilityDescName="karabin plazmowy" [ViperM3_LW_WPN X2WeaponTemplate] FriendlyName="Karabin wiązkowy" +AbilityDescName="karabin plazmowy" ;;;;;;;;;;;;;;;;;;;;;;;;;; ArchonM2_LW ;;;;;;;;;;;;;;;;;;;;;;;;;;; [ArchonM2_LW X2CharacterTemplate] -strCharacterName="Wielki archon" +strCharacterName="Wielki Archon" ;;;;;;;;;;;;;;;;;;;;;;;;;; SectoidM2_LW ;;;;;;;;;;;;;;;;;;;;;;;;;;; [SectoidM2_LW X2CharacterTemplate] -strCharacterName="Dowódca sektoidów" +strCharacterName="Dowódzca Sektoidów" ;;;;;;;;;;;;;;;;;;;;;;;;;; AdvGunnerM1 ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -224,18 +234,21 @@ strCharacterName="Artylerzysta ADVENT-u" [AdvGunnerM1_WPN X2WeaponTemplate] FriendlyName="Automag" +AbilityDescName="działko" [AdvGunnerM2 X2CharacterTemplate] strCharacterName="Ciężki artylerzysta ADVENT-u" [AdvGunnerM2_WPN X2WeaponTemplate] FriendlyName="Automag" +AbilityDescName="działko" [AdvGunnerM3 X2CharacterTemplate] strCharacterName="Elitarny artylerzysta ADVENT-u" [AdvGunnerM3_WPN X2WeaponTemplate] FriendlyName="Automag" +AbilityDescName="działko" ;;;;;;;;;;;;;;;;;;;;;;;;;; AdvSentryM1-3 ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -245,18 +258,21 @@ strCharacterName="Wartownik ADVENT-u" [AdvSentryM1_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvSentryM2 X2CharacterTemplate] strCharacterName="Obrońca ADVENT-u" [AdvSentryM2_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvSentryM3 X2CharacterTemplate] strCharacterName="Strażnik ADVENT-u" [AdvSentryM3_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" ;;;;;;;;;;;;;;;;;;;;;;;;;; AdvGrenadierM1-3 ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -337,9 +353,11 @@ strCharacterName="Dron łowczy ADVENT-u" [LWDroneM1_WPN X2WeaponTemplate] FriendlyName="Wstrząs drona" +AbilityDescName="broń wstrząsowa" [LWDroneM2_WPN X2WeaponTemplate] FriendlyName="Elektrowstrząs drona" +AbilityDescName="broń wstrząsowa" ;;;;;;;;;;;;;;;;;;;;;;;;;; AdvMecArcherM1 ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -348,9 +366,11 @@ strCharacterName="MEC łucznik" [AdvMECArcher_WPN X2WeaponTemplate] FriendlyName="Minimag MEC-a" +AbilityDescName="minigun" [AdvMECArcher_Shoulder_WPN X2WeaponTemplate] FriendlyName="Artyleria rakietowa" +AbilityDescName="mikrorakiety" ;;;;;;;;;;;;;;;;;;;;;;;;;; AdvMecArcherM2 ;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -384,45 +404,53 @@ strCharacterName="Sierżant ADVENT-u" [AdvSergeantM1_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvSergeantM2 X2CharacterTemplate] strCharacterName="Starszy sierżant ADVENT-u" [AdvSergeantM2_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvShockTroop X2CharacterTemplate] strCharacterName="Uderzeniowiec ADVENT-u" [AdvShockTroop_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvCommando X2CharacterTemplate] strCharacterName="Komandos ADVENT-u" [AdvCommando_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvVanguard X2CharacterTemplate] strCharacterName="Gwardzista ADVENT-u" [AdvVanguard_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvScout X2CharacterTemplate] strCharacterName="Zwiadowca ADVENT-u" [AdvScout_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvGeneralM1_LW X2CharacterTemplate] strCharacterName="Generał ADVENT-u" [AdvGeneralM1_LW_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" [AdvGeneralM2_LW X2CharacterTemplate] strCharacterName="Generał ADVENT-u" [AdvGeneralM2_LW_WPN X2WeaponTemplate] FriendlyName="Karabin magnetyczny ADVENT-u" +AbilityDescName="karabin magnetyczny" diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.deu b/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.deu old mode 100755 new mode 100644 index 19e257acc..0a082cebe Binary files a/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.deu and b/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.pol b/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.pol new file mode 100644 index 000000000..5760b13a0 --- /dev/null +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/LW_FactionBalance.pol @@ -0,0 +1,5 @@ +[X2Effect_VoidConduitPatch] +ActionsLeftFlyoverText="Pozostałe akcje: " + +[X2LWModTemplate_ReaperAbilities] +ShadowExpiredFlyover="Cień wygasł" diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.chn b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.chn index 42761855e..9ec7fba1c 100644 --- a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.chn +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.chn @@ -40,6 +40,14 @@ LocHelpText="用精确的射击击晕敌人,如果暴击则造成额外的眩 LocPromotionPopupText=" 如果命中(包括擦伤)眩晕敌人行动点。
如果暴击额外眩晕敌人行动点, 但是射击不会造成暴击伤害。
阻断射击需要弹药。
阻断射击有回合冷却时间。
只有化身和灵能僵尸不能被眩晕。" ; End Translation (2) +[DisablingShotSnapShot X2AbilityTemplate] +LocFriendlyName="阻断射击(急射)" +LocLongDescription="用精确的射击击晕敌人,如果暴击则造成额外的眩晕持续时间。 射击不会造成暴击伤害。" +LocHelpText="用精确的射击击晕敌人,如果暴击则造成额外的眩晕持续时间。 射击不会造成暴击伤害。" +; LWOTC Needs Translation (2) +LocPromotionPopupText=" 如果命中(包括擦伤)眩晕敌人行动点。
如果暴击额外眩晕敌人行动点, 但是射击不会造成暴击伤害。
阻断射击需要弹药。
阻断射击有回合冷却时间。
只有化身和灵能僵尸不能被眩晕。" +; End Translation (2) + [Meditation X2AbilityTemplate] LocFriendlyName="冥想" LocLongDescription="圣殿骑士增加专注。" @@ -48,8 +56,8 @@ LocPromotionPopupText=" 圣殿骑士增加格范围内的敌人投掷飞刀后获得额外行动。不能在同一回合触发暗箭伤人。" LocPromotionPopupText=" 每回合一次,在向格范围内的敌人投掷飞刀后获得额外行动。
一个红环将标记该能力的范围。
刀锋相接不能与奔袭战术或者暗箭伤人同时使用。
" + +[KnifeEncountersExtendedRange X2AbilityTemplate] +LocFriendlyName="刀锋相接" +LocFlyOverText="刀锋相接" +LocLongDescription="每回合一次,在向格范围内的敌人投掷飞刀后获得额外行动。不能在同一回合触发暗箭伤人。" +LocHelpText="每回合一次,在向格范围内的敌人投掷飞刀后获得额外行动。不能在同一回合触发暗箭伤人。" +LocPromotionPopupText=" 每回合一次,在向格范围内的敌人投掷飞刀后获得额外行动。
一个红环将标记该能力的范围。
刀锋相接不能与奔袭战术或者暗箭伤人同时使用。
" + + [ImpersonalEdge X2AbilityTemplate] LocFriendlyName="冷漠边缘" LocFlyOverText="冷漠边缘" @@ -207,3 +224,7 @@ RendTheMarkedEffectName="撕裂标记" RendTheMarkedEffectDesc="在本回合剩余时间内从所有来源对目标的攻击获得投掷飞刀所施加的+暴击率。" ; End Translation +[TheBanisher_LW X2AbilityTemplate] +LocFriendlyName="真正捕食者" +LocLongDescription="放逐在每次射击时的命中惩罚减少5点,并将其冷却时间降低1回合。刀锋相接的范围增加1格。死亡贩子现在对无侧翼的目标也能生效。" +LocHelpText="放逐在每次射击时的命中惩罚减少5点,并将其冷却时间降低1回合。刀锋相接的范围增加1格。死亡贩子现在对无侧翼的目标也能生效。 注意: 刀锋相接的圆环视觉效果没有正确更新该技能。你在刀锋相接的圆环外还有2个格子的射程范围。" diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.cht b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.cht index e0da4a7e9..76cf23da1 100644 --- a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.cht +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.cht @@ -40,6 +40,14 @@ LocHelpText="用精確的射擊擊暈敵人,如果暴擊則造成額外的眩 LocPromotionPopupText=" 如果命中(包括擦傷)眩暈敵人 行動點。
如果暴擊額外眩暈敵人 行動點, 但是射擊不會造成暴擊傷害。
阻斷射擊需要 彈藥。
阻斷射擊有 回合冷卻時間。
只有化身和靈能殭屍不能被眩暈。" ; End Translation (2) +[DisablingShotSnapShot X2AbilityTemplate] +LocFriendlyName="阻斷射擊" +LocLongDescription="用精確的射擊擊暈敵人,如果暴擊則造成額外的眩暈持續時間。 射擊不會造成暴擊傷害。" +LocHelpText="用精確的射擊擊暈敵人,如果暴擊則造成額外的眩暈持續時間。 射擊不會造成暴擊傷害。" +; LWOTC Needs Translation (2) +LocPromotionPopupText=" 如果命中(包括擦傷)眩暈敵人 行動點。
如果暴擊額外眩暈敵人 行動點, 但是射擊不會造成暴擊傷害。
阻斷射擊需要 彈藥。
阻斷射擊有 回合冷卻時間。
只有化身和靈能殭屍不能被眩暈。" +; End Translation (2) + [Meditation X2AbilityTemplate] LocFriendlyName="冥想" LocLongDescription="聖殿騎士增加 專注。" @@ -146,6 +154,14 @@ LocLongDescription="每回合一次,在向格 LocHelpText="每回合一次,在向格範圍內的敵人投擲飛刀後獲得額外行動。不能在同一回合觸發暗箭傷人。" LocPromotionPopupText=" 每回合一次,在向格範圍內的敵人投擲飛刀後獲得額外行動。
一個紅環將標記該能力的範圍。
刀鋒相接不能與奔襲戰術或者暗箭傷人同時使用。
" +[KnifeEncountersExtendedRange X2AbilityTemplate] +LocFriendlyName="刀鋒相接" +LocFlyOverText="刀鋒相接" +LocLongDescription="每回合一次,在向格範圍內的敵人投擲飛刀後獲得額外行動。不能在同一回合觸發暗箭傷人。" +LocHelpText="每回合一次,在向格範圍內的敵人投擲飛刀後獲得額外行動。不能在同一回合觸發暗箭傷人。" +LocPromotionPopupText=" 每回合一次,在向格範圍內的敵人投擲飛刀後獲得額外行動。
一個紅環將標記該能力的範圍。
刀鋒相接不能與奔襲戰術或者暗箭傷人同時使用。
" + + [ImpersonalEdge X2AbilityTemplate] LocFriendlyName="冷漠邊緣" LocFlyOverText="冷漠邊緣" diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.deu b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.deu old mode 100755 new mode 100644 index bc0136737..671e8e7f5 Binary files a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.esn b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.esn index 7798e1816..9e852dee6 100644 --- a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.esn +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.esn @@ -38,6 +38,13 @@ LocLongDescription="Aturde a los enemigos con un disparo preciso; la duración d LocHelpText="Aturde a los enemigos con un disparo preciso; la duración del aturdimiento aumentará si el impacto es crítico (pero el disparo no podrá causar daño crítico)." LocPromotionPopupText=" Aturde a los enemigos durante acciones si el disparo impacta (incluso si roza).
Si el disparo es crítico acrecentará su duración en , pero el disparo no infligirá el daño crítico.
Sometimiento requiere de munición y tiene un tiempo de enfriamiento de turnos.
Solamente Avatares y Zombies Psiónicos no se verán afectados." +[DisablingShotSnapShot X2AbilityTemplate] +LocFriendlyName="Sometimiento" +LocLongDescription="Aturde a los enemigos con un disparo preciso; la duración del aturdimiento aumentará si el impacto es crítico (pero el disparo no podrá causar daño crítico)." +LocHelpText="Aturde a los enemigos con un disparo preciso; la duración del aturdimiento aumentará si el impacto es crítico (pero el disparo no podrá causar daño crítico)." +LocPromotionPopupText=" Aturde a los enemigos durante acciones si el disparo impacta (incluso si roza).
Si el disparo es crítico acrecentará su duración en , pero el disparo no infligirá el daño crítico.
Sometimiento requiere de munición y tiene un tiempo de enfriamiento de turnos.
Solamente Avatares y Zombies Psiónicos no se verán afectados." + + [Meditation X2AbilityTemplate] LocFriendlyName="Meditación" LocLongDescription="Añade al Templario hasta de concentración." @@ -46,8 +53,8 @@ LocPromotionPopupText=" Agrega al Templario Una vez por turno, benefíciate de una acción adicional después de lanzar un cuchillo a un enemigo en un radio de casillas.
Un círculo rojo marcará el alcance de esta habilidad.
Encuentros a cuchillo no se puede utilizar en el mismo turno que Apresurarse y Correr y disparar.
" ; LWOTC translated +[KnifeEncountersExtendedRange X2AbilityTemplate] +LocFriendlyName="Encuentros a cuchillo" +LocFlyOverText="Encuentros a cuchillo" +;LWOTC needs Translation(2) +LocLongDescription="Una vez por turno, gana una acción adicional después de lanzar un cuchillo a un enemigo en un radio de casillas. No se puede utilizar en el mismo turno que Apresurarse." +LocHelpText="Una vez por turno, gana una acción adicional después de lanzar un cuchillo a un enemigo en un radio de casillas. No se puede utilizar en el mismo turno que Apresurarse." +LocPromotionPopupText=" Una vez por turno, benefíciate de una acción adicional después de lanzar un cuchillo a un enemigo en un radio de casillas.
Un círculo rojo marcará el alcance de esta habilidad.
Encuentros a cuchillo no se puede utilizar en el mismo turno que Apresurarse y Correr y disparar.
" +; LWOTC translated ; LWOTC translated @@ -208,4 +223,10 @@ LocHelpText="Una vez por turno obtén una acción de movimiento después de disp LocPromotionPopupText=" Apresurarse se activa si el objetivo fue previamente dañado desde el último turno del jugador por cualquier tipo de impacto, por ejemplo, con una guardia o daño periódico.
Adicionalmente al disparo estándar, también funciona con Dáles caña, Disparo en cadena y Desterrar.
La acción de movimiento se puede utilizar para entrar en Sombra si está fuera de tiempo de reutilización.
" ; End translated +; LWOTC translated +[TheBanisher_LW X2AbilityTemplate] +LocFriendlyName="Superdepredador" +LocLongDescription="Reduce la penalidad de acierto por tiro en y el tiempo de enfriamiento en 1. Incrementa en el rango de Encuentros a cuchillo. Distribuidor de Muerte ahora dobla el daño de golpes críticos contra enemigos flanqueados." +LocHelpText="Reduce la penalidad de acierto por tiro en y el tiempo de enfriamiento en 1. Incrementa en el rango de Encuentros a cuchillo. Distribuidor de Muerte ahora dobla el daño de golpes críticos contra enemigos flanqueados." +; End translated \ No newline at end of file diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.fra b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.fra index e7fe58558..aa6cdbb33 100644 --- a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.fra +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.fra @@ -40,6 +40,14 @@ LocHelpText="Étourdit les ennemis à l'aide d'un tir précis. La durée de l'é LocPromotionPopupText=" Étourdit les ennemis durant action(s) si le tir touche (même s'il ne s'agit que d'une écorchure).
En cas de coup critique, la cible sera étourdie durant action(s) de plus, mais le tir n'infligera pas de dégâts critiques.
Nécessite munition(s) et un temps de rechargement de tour(s).
Seuls les avatars et les zombies psi ne peuvent pas être étourdis." ; End translated (2) +[DisablingShotSnapShot X2AbilityTemplate] +LocFriendlyName="Tir neutralisant" +LocLongDescription="Étourdit les ennemis à l'aide d'un tir précis. La durée de l'étourdissement augmente en cas de coup critique. Ce tir ne peut pas infliger de dégâts critiques." +LocHelpText="Étourdit les ennemis à l'aide d'un tir précis. La durée de l'étourdissement augmente en cas de coup critique. Ce tir ne peut pas infliger de dégâts critiques." +; LWOTC translated (2) +LocPromotionPopupText=" Étourdit les ennemis durant action(s) si le tir touche (même s'il ne s'agit que d'une écorchure).
En cas de coup critique, la cible sera étourdie durant action(s) de plus, mais le tir n'infligera pas de dégâts critiques.
Nécessite munition(s) et un temps de rechargement de tour(s).
Seuls les avatars et les zombies psi ne peuvent pas être étourdis." +; End translated (2) + [Meditation X2AbilityTemplate] LocFriendlyName="Méditation" LocLongDescription="Augmente de point(s) le niveau de concentration du Templier." @@ -153,6 +161,15 @@ LocHelpText="Une fois par tour, gagnez une action bonus après avoir attaqué au LocPromotionPopupText=" Une fois par tour, gagnez une action bonus après avoir attaqué au couteau un ennemi situé dans un rayon de cases autour de votre position. Ne peut pas se déclencher durant le même tour que Tir sournois.
Cette capacité ne peut pas être combinée avec la capacité Course et tir.
" ; End translated (2) +[KnifeEncountersExtendedRange X2AbilityTemplate] +LocFriendlyName="Duel au couteau" +LocFlyOverText="Duel au couteau" +; LWOTC translated (2) +LocLongDescription="Une fois par tour, gagnez une action bonus après avoir attaqué au couteau un ennemi situé dans un rayon de cases autour de votre position. Ne peut pas se déclencher durant le même tour que Tir sournois." +LocHelpText="Une fois par tour, gagnez une action bonus après avoir attaqué au couteau un ennemi situé dans un rayon de cases autour de votre position. Ne peut pas se déclencher durant le même tour que Tir sournois." +LocPromotionPopupText=" Une fois par tour, gagnez une action bonus après avoir attaqué au couteau un ennemi situé dans un rayon de cases autour de votre position. Ne peut pas se déclencher durant le même tour que Tir sournois.
Cette capacité ne peut pas être combinée avec la capacité Course et tir.
" +; End translated (2) + ; LWOTC translated (2) [ImpersonalEdge X2AbilityTemplate] LocFriendlyName="Ombre évanescente" diff --git a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.int b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.int index 136bd7d4b..a63e084aa 100644 --- a/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.int +++ b/LongWarOfTheChosen/Localization/LW_FactionBalance/XComGame.int @@ -40,6 +40,15 @@ LocHelpText="Stun enemies with a precise shot, with a bonus stun duration if the LocPromotionPopupText=" Stuns enemies for actions if the shot hits (including if it grazes).
Stuns for an extra actions if the shot crits, but the shot won't inflict the critical damage.
Disabling Shot requires ammo to use.
Disabling Shot has a turn cooldown.
Only Avatars and Psi Zombies can not be stunned." ; End Translation (2) + +[DisablingShotSnapShot X2AbilityTemplate] +LocFriendlyName="Disabling Shot (Snap Shot)" +LocLongDescription="Stun enemies with a precise shot, with a bonus stun duration if the shot crits. The shot can not do critical damage." +LocHelpText="Stun enemies with a precise shot, with a bonus stun duration if the shot crits. The shot can not do critical damage." +; LWOTC Needs Translation (2) +LocPromotionPopupText=" Stuns enemies for actions if the shot hits (including if it grazes).
Stuns for an extra actions if the shot crits, but the shot won't inflict the critical damage.
Disabling Shot requires ammo to use.
Disabling Shot has a turn cooldown.
Only Avatars and Psi Zombies can not be stunned." +; End Translation (2) + [Meditation X2AbilityTemplate] LocFriendlyName="Meditation" LocLongDescription="Adds up to focus to the Templar." @@ -48,8 +57,8 @@ LocPromotionPopupText=" Adds points [Overcharge_LW X2AbilityTemplate] LocFriendlyName="Overcharge" -LocLongDescription="Gain bonus aim and crit chance for each point of focus the Templar has." -LocHelpText="Gain bonus aim and crit chance for each point of focus the Templar has." +LocLongDescription="Gain bonus aim and crit chance on melee attacks for each point of focus the Templar has." +LocHelpText="Gain bonus aim and crit chance on melee attacks for each point of focus the Templar has." LocPromotionPopupText=" Each point of focus provides + aim and + crit chance.
Based on the current focus, not max focus." [VoltDangerZone X2AbilityTemplate] @@ -70,8 +79,8 @@ LocPromotionPopupText=" Adds 1 focus to the Templar when an enemy pod s [TemplarTerror X2AbilityTemplate] LocFriendlyName="Terrorize" -LocLongDescription="Adds a chance to panic enemies hit by Volt." -LocHelpText="Adds a chance to panic enemies hit by Volt." +LocLongDescription="Gain -tile bonus radius for Volt. Adds a chance to panic enemies hit by Volt." +LocHelpText="Gain -tile bonus radius for Volt. Adds a chance to panic enemies hit by Volt." ; LWOTC Needs Translation (2) LocPromotionPopupText=" Volt can now panic the enemy.
The chance to panic is % and is affected by both the Templar's Will and the target's Will." ; End Translation (2) @@ -130,8 +139,8 @@ LocPromotionPopupText=" Improves the Skirmisher's mobility around the m ; LWOTC Needs Translation [Executioner X2AbilityTemplate] LocFriendlyName="Death Dealer" -LocLongDescription="Grants + crit chance. Critical shots against a flanked target while in Shadow will deal double critical damage." -LocHelpText="Grants + crit chance. Critical shots against a flanked target while in Shadow will deal double critical damage." +LocLongDescription="Grants + crit chance. When shooting flanked targets in Shadow, the critical damage bonus of your weapon is doubled." +LocHelpText="Grants + crit chance. When shooting flanked targets in Shadow, the critical damage bonus of your weapon is doubled." LocPromotionPopupText=" Use Shadow's increased mobility and smaller enemy detection radii to flank enemies and deal massive damage.
" ; End Translation @@ -150,9 +159,18 @@ LocPromotionPopupText=" Throwing knives apply a stacking + клеток." LocPromotionPopupText=" Один раз за ход дает бонусное действие после метания ножа по цели в пределах клеток.
Красный круг покажет дальность действия способности.
Не может быть использовано в один ход со Стрельбой на бегу.
" +[KnifeEncountersExtendedRange X2AbilityTemplate] +LocFriendlyName="Поножовщина" +LocFlyOverText="Поножовщина" +LocLongDescription="Один раз за ход дает бонусное действие после метания ножа по цели в пределах клеток." +LocHelpText="Один раз за ход дает бонусное действие после метания ножа по цели в пределах клеток." +LocPromotionPopupText=" Один раз за ход дает бонусное действие после метания ножа по цели в пределах клеток.
Красный круг покажет дальность действия способности.
Не может быть использовано в один ход со Стрельбой на бегу.
" + + [ImpersonalEdge X2AbilityTemplate] LocFriendlyName="Смертельное лезвие" LocFlyOverText="Смертельное лезвие" @@ -196,3 +211,10 @@ LocHelpText="Способность нельзя активировать, по [CombatPresence X2AbilityTemplate] LocPromotionPopupText=" Эффект Присутствия можно использовать, чтобы помочь товарищам в трудной ситуации, когда им нужно дополнительное движение или атака.
Ходов до перезарядки: .
" + +; lwotc translated +[TheBanisher_LW X2AbilityTemplate] +LocFriendlyName="Настоящий охотник" +LocLongDescription="Уменьшает штраф каждого выстрела способности Разгром на 5 и уменьшает перезарядку этой способности на 1. Увеличен радиус способности Поножовщина на 1. Торговец смертью теперь работает и на противников, не умеющих использовать укрытия." +LocHelpText="Уменьшает штраф каждого выстрела способности Разгром на 5 и уменьшает перезарядку этой способности на 1. Увеличен радиус способности Поножовщина на 1. Торговец смертью теперь работает и на противников, не использующих укрытия. Примечание: отображение круга дальности действия способности Поножовщина отображается без обновленного увеличения радиуса." +; end translated diff --git a/LongWarOfTheChosen/Localization/LW_LaserPack_Integrated/XComGame.deu b/LongWarOfTheChosen/Localization/LW_LaserPack_Integrated/XComGame.deu old mode 100755 new mode 100644 index 315bb7b93..75d07c8f8 Binary files a/LongWarOfTheChosen/Localization/LW_LaserPack_Integrated/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_LaserPack_Integrated/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.deu b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.deu old mode 100755 new mode 100644 index 1b1d9d460..214948a42 Binary files a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.deu and b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.pol b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.pol index efbabe2d2..d54d58f59 100644 --- a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.pol +++ b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/LW_OfficerPack_Integrated.pol @@ -22,15 +22,15 @@ strAutoFillTooltip="Automatyczne uzupełnianie drużyny." strCommandRangeToggleTooltip="Kliknij, żeby przełączyć zasięg dowodzenia." [X2StrategyElement_LW_OTS_OfficerStaffSlot] -;strOTSLocationDisplayString= Training - -;[UIArmory_LWOfficerMenu] -;m_strSelectAbility=SELECT Officer ABILITY: -;m_strAbilityHeader=Officer ABILITIES: -;m_strConfirmAbilityTitle=CONFIRM ABILITY SELECTION -;m_strConfirmAbilityText=You can't remove or change abilities. Are you sure you want to learn ? -;m_strAbilityLockedTitle=LOCKED -;m_strAbilityLockedDescription=Get more combat experience to learn new abilities. +;strOTSLocationDisplayString= Trening + +[UIArmory_LWOfficerPromotion] +m_strSelectAbility="WYBIERZ ZDOLNOŚĆ:" +m_strAbilityHeader="ZDOLNOŚCI:" +m_strConfirmAbilityTitle="ZATWIERDŹ WYBÓR ZDOLNOŚCI" +m_strConfirmAbilityText="Nie możesz usuwać ani zmieniać zdolności. Na pewno chcesz się nauczyć: ?" +m_strAbilityLockedTitle="ZABLOKOWANE" +m_strAbilityLockedDescription="Zdobądź więcej doświadczenia w walce, żeby nauczyć się nowych zdolności." [UIArmory_LWOfficerPromotion] m_strSelectAbility="WYBIERZ ZDOLNOŚĆ:" diff --git a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/XComGame.deu b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/XComGame.deu old mode 100755 new mode 100644 index 9d04b6924..d451cbf6b Binary files a/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_OfficerPack_Integrated/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.chn b/LongWarOfTheChosen/Localization/LW_Overhaul.chn index 21414e146..84accfc63 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.chn +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.chn @@ -165,6 +165,7 @@ ActivityObjectives[0]="营救被俘反抗军" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="夺取变种人补给箱" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="反抗军找到一个含有重要资源的变种人补给站,我们可以将这些资源作为己用", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="反抗军找到一个含有重要资源的变种人补给站,我们可以将这些资源作为己用", MissionIndex=0) [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.cht b/LongWarOfTheChosen/Localization/LW_Overhaul.cht index d7d7d6fe9..08012e991 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.cht +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.cht @@ -165,6 +165,7 @@ ActivityObjectives[0]="營救被俘反抗軍" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="奪取變種人補給箱" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="反抗軍找到一個含有重要資源的變種人補給站,我們可以將這些資源作為己用", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="反抗軍找到一個含有重要資源的變種人補給站,我們可以將這些資源作為己用", MissionIndex=0) [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.deu b/LongWarOfTheChosen/Localization/LW_Overhaul.deu old mode 100755 new mode 100644 index a69f1c1f3..c2f95efa6 Binary files a/LongWarOfTheChosen/Localization/LW_Overhaul.deu and b/LongWarOfTheChosen/Localization/LW_Overhaul.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.esn b/LongWarOfTheChosen/Localization/LW_Overhaul.esn index afa36dd15..549e85cc7 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.esn +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.esn @@ -83,7 +83,7 @@ ActivityObjectives[0]="Atacar un laboratorio de investigación alienígena" [ScheduledOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="ScheduledOffworldReinforcementsActivity" -ActivityObjectives[0]="Localizar rutas de vuelo enemigas" +ActivityObjectives[0]="Localizar rutas de vuelo de Refuerzos de ADVENT" ActivityObjectives[1]="Recuperar artefactos de OVNI" +MissionDescriptions=(MissionFamily="Recover_LW", Description="Hemos descubierto una pista potencial sobre las actividades de ADVENT. Deberíamos investigarla.", MissionIndex=0) @@ -92,7 +92,7 @@ ActivityObjectives[1]="Recuperar artefactos de OVNI" [EmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="EmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Localizar rutas de vuelo enemigas" +ActivityObjectives[0]="Localizar rutas de vuelo de Refuerzos de emergencia de ADVENT" ActivityObjectives[1]="Recuperar artefactos de OVNI" +MissionDescriptions=(MissionFamily="Recover_LW", Description="Hemos descubierto una pista potencial sobre las actividades de ADVENT. Deberíamos investigarla.", MissionIndex=0) +MissionDescriptions=(MissionFamily="Hack_LW", Description="Hemos descubierto una pista potencial sobre las actividades de ADVENT. Deberíamos investigarla.", MissionIndex=0) @@ -100,7 +100,7 @@ ActivityObjectives[1]="Recuperar artefactos de OVNI" [SuperEmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="SuperEmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Localizar rutas de vuelo enemigas" +ActivityObjectives[0]="Localizar rutas de vuelo de Refuerzos de emergencia de ADVENT de gran escala" ActivityObjectives[1]="Recuperar artefactos de OVNI" +MissionDescriptions=(MissionFamily="Recover_LW", Description="Hemos descubierto una pista potencial sobre las actividades de ADVENT. Deberíamos investigarla.", MissionIndex=0) @@ -153,6 +153,12 @@ ActivityName="TroopManeuversActivity" ActivityObjectives[0]="Reducir la fuerza del enemigo" +MissionDescriptions=(MissionFamily="TroopManeuvers_LW", Description="ADVENT ha dejado una de sus unidades de combate vulnerable a un ataque de nuestras fuerzas.") +[CovertOpsTroopManeuvers X2LWAlienActivityTemplate] +ActivityName="CovertOpsTroopManeuversActivity" +ActivityObjectives[0]="Destruir un grupo de exploración" ++MissionDescriptions=(MissionFamily="CovertOpsTroopManeuvers_LW", Description="ADVENT ha dejado una de sus unidades de exploración vulnerable a una incursión de nuestras fuerzas.") + + [HighValuePrisoner X2LWAlienActivityTemplate] ActivityName="HighValuePrisonerActivity" ActivityObjectives[0]="Liberar a un prisionero importante" @@ -164,6 +170,24 @@ ActivityName="PoliticalPrisonersActivity" ActivityObjectives[0]="Liberar a los rebeldes capturados" +MissionDescriptions=(MissionFamily="Jailbreak_LW", Description="Un grupo de miembros de la resistencia está preso en una instalación de seguridad. Tenemos una oportunidad limitada de rescatarlos.", MissionIndex=0) + + + +; End translated + +[Logistics X2LWAlienActivityTemplate] +ActivityObjectives[0]="Apodérate de alijos de recursos ADVENT" ++MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="La resistencia ha aprendido la ubicación de recursos enemigos vitales que podemos adquirir para nuestros propios usos.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="La resistencia ha aprendido la ubicación de recursos enemigos vitales que podemos adquirir para nuestros propios usos.", MissionIndex=0) + +[BigSupplyExtraction_LW X2LWAlienActivityTemplate] +ActivityObjectives[0]="Apodérate de una gran cantidad de alijos de recursos ADVENT" ++MissionDescriptions=(MissionFamily="BigSupplyExtraction_LW", Description="La resistencia ha aprendido la ubicación de recursos enemigos vitales que podemos adquirir para nuestros propios usos.", MissionIndex=0) + + +; LWOTC translated + + [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" ActivityObjectives[0]="Proteger los recursos de la resistencia" @@ -659,13 +683,9 @@ m_strNextHaven="REFUGIO SIGUIENTE" ; LWOTC translated m_strVIPCaptureReward="(Captura de VIP solamente)" [UIListener_CampaignStartMenu] -; End translated -[Logistics X2LWAlienActivityTemplate] -ActivityObjectives[0]="Apodérate de alijos de recursos ADVENT" -+MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="La resistencia ha aprendido la ubicación de recursos enemigos vitales que podemos adquirir para nuestros propios usos.", MissionIndex=0) -; LWOTC translated + [UIListener_CampaignStartMenu] strDisabledTutorialTooltip="El tutorial está deshabilitado mientras se ejecuta Long War of the Chosen" @@ -691,6 +711,23 @@ strCovertActionFailed="FALLIDA" ScrollObjectiveDescriptionStr="EXAMINA EN LA DESCRIPCIÓN DEL OBJETIVO" ; End translated +; LWOTC translated + [X2Effect_ChosenLoot] m_strChosenLoot=" Recompensa por matar al Elegido: ¡() !" -; End translated + + + +[UISL_Shell_LWoTCVersion] +strMessage_Title = "Long War Of The Chosen" +strMessage_Header = "Long War Of The Chosen ha sido actualizado! +strMessage_Body = "La versión 1.1.0 ha sido lanzada, con muchas características y mejoras, que incluyen:
  • Nuevo sistema de Los Elegidos con 5 tiers para una mejor progresión
  • Nuevas operaciones encubiertas que recompensan las misiones de infiltración
  • Nuevos mapas para las misiones de la Torre de Red y de recolección de cajas
  • Templario rediseñado con escudo psi de Iridar (un modder muy popular), entre otros detalles
  • Mejoras en la "calidad de vida (QOL)"
  • Mejorada la compatibilidad con mods
  • Ajustes de equilibrio para clases, héroes y más
  • Y muchos más cambios de los que podemos incluir aquí a menos que quieras una barra de desplazamiento gigante (se la han sacado los desarrolladores xD)
¡Consulta el documento de google vinculado a las novedades en Steam, o visita el discord de LWoTC!" +strDismiss_Button = "OK" + +[UISL_Shell_BetaPatchNotes] +strMessage_Title = "Long War Of The Chosen" +strMessage_Header = "Cambios Build RC35:" +strMessage_Body = "
  • Se solucionó el problema por el cual el Elegido reaparecía con la barra de vida al completo después de destruir el sarcófago.
  • Se rehicieron los mapas personalizados de obtención de cajas para evitar que aparecieran en los techos de los camiones.
  • Se reparó el error por el cual Fusión de mentes no proporcionaba bonificación de crítico con amplificador psi avanzado.
  • Se arregló por el cual algunos elementos de misiones usaban el nivel tecnológico del cuartel general ADVENT en lugar del nivel de fuerza regional de LW..
  • Las operaciones encubiertas recibieron ajustes: se redujeron un poco las recompensas de suministro, y se agregaron a las cajas simuladores de combate personal (SCP), mejoras de armas, núcleos de elerio y datapads.
  • Solucionado el bug por el cual la omnivisión del Elegido Cazador no se eliminaba de todas las variantes de dificultad.
  • Se corrigió la inconsistencia en los requisitos de cadáveres para las autopsias instantáneas de espectro, sacerdote y purificador.
  • Con el fin de realizar pruebas si se desea, se agregó un interruptor de configuración para habilitar/deshabilitar los mapas del cuartel general.
  • Otra ronda de actualizaciones de localización de Copyrite (un miembro de discord).
" +strDismiss_Button = "OK" + +; End translated \ No newline at end of file diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.fra b/LongWarOfTheChosen/Localization/LW_Overhaul.fra index 8d29437f0..30c449efe 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.fra +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.fra @@ -167,6 +167,8 @@ ActivityObjectives[0]="Libérer les rebelles captifs" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="Capturer des caches de ressources ADVENT" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="La Résistance a découvert la localisation de ressources ennemies vitales que nous pourrions récupérer pour notre propre usage.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="La Résistance a découvert la localisation de ressources ennemies vitales que nous pourrions récupérer pour notre propre usage.", MissionIndex=0) + [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.int b/LongWarOfTheChosen/Localization/LW_Overhaul.int index 0d596e356..6ad27f397 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.int +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.int @@ -81,9 +81,10 @@ ActivityObjectives[0]="Ambush an ADVENT Construction Unit" ActivityObjectives[0]="Assault an Alien Research Lab" +MissionDescriptions=(MissionFamily="Sabotage_LW", Description="We have uncovered an important alien research facility. Let's burn it to the ground.", MissionIndex=0) +; LWOTC Needs Translation [ScheduledOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="ScheduledOffworldReinforcementsActivity" -ActivityObjectives[0]="Find Enemy Flight Paths" +ActivityObjectives[0]="Find Enemy Flight Paths: Force Level UFO" ActivityObjectives[1]="Recover UFO artifacts" +MissionDescriptions=(MissionFamily="Recover_LW", Description="We have discovered a potential lead on ADVENT activities. We should investigate.", MissionIndex=0) @@ -92,7 +93,7 @@ ActivityObjectives[1]="Recover UFO artifacts" [EmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="EmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Find Enemy Flight Paths" +ActivityObjectives[0]="Find Enemy Flight Paths: Standard UFO" ActivityObjectives[1]="Recover UFO artifacts" +MissionDescriptions=(MissionFamily="Recover_LW", Description="We have discovered a potential lead on ADVENT activities. We should investigate.", MissionIndex=0) +MissionDescriptions=(MissionFamily="Hack_LW", Description="We have discovered a potential lead on ADVENT activities. We should investigate.", MissionIndex=0) @@ -100,9 +101,11 @@ ActivityObjectives[1]="Recover UFO artifacts" [SuperEmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="SuperEmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Find Enemy Flight Paths" +ActivityObjectives[0]="Find Enemy Flight Paths: Super UFO" ActivityObjectives[1]="Recover UFO artifacts" +; End Translation + +MissionDescriptions=(MissionFamily="Recover_LW", Description="We have discovered a potential lead on ADVENT activities. We should investigate.", MissionIndex=0) +MissionDescriptions=(MissionFamily="Hack_LW", Description="We have discovered a potential lead on ADVENT activities. We should investigate.", MissionIndex=0) +MissionDescriptions=(MissionFamily="Rescue_LW", Description="We discovered an ADVENT prisoner who may be a potential lead on enemy activities.", MissionIndex=0) @@ -153,6 +156,11 @@ ActivityName="TroopManeuversActivity" ActivityObjectives[0]="Reduce Enemy Strength" +MissionDescriptions=(MissionFamily="TroopManeuvers_LW", Description="ADVENT has left one of its combat units vulnerable to a raid by our forces.") +[CovertOpsTroopManeuvers X2LWAlienActivityTemplate] +ActivityName="CovertOpsTroopManeuversActivity" +ActivityObjectives[0]="Destroy a Scouting Party" ++MissionDescriptions=(MissionFamily="CovertOpsTroopManeuvers_LW", Description="ADVENT has left one of its scouting units vulnerable to a raid by our forces.") + [HighValuePrisoner X2LWAlienActivityTemplate] ActivityName="HighValuePrisonerActivity" ActivityObjectives[0]="Free an Important Prisoner" @@ -167,6 +175,11 @@ ActivityObjectives[0]="Free Captured Rebels" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="Seize ADVENT resource cache" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="The Resistance has learned the location of vital enemy resources that we can acquire for our own uses.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="The Resistance has learned the location of vital enemy resources that we can acquire for our own uses.", MissionIndex=0) + +[BigSupplyExtraction_LW X2LWAlienActivityTemplate] +ActivityObjectives[0]="Seize large ADVENT resource cache" ++MissionDescriptions=(MissionFamily="BigSupplyExtraction_LW", Description="The Resistance has learned the location of vital enemy resources that we can acquire for our own uses.", MissionIndex=0) [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" @@ -712,3 +725,14 @@ ScrollObjectiveDescriptionStr="SCROLL OBJECTIVE DESCRIPTION" [X2Effect_ChosenLoot] m_strChosenLoot="() Rewarded for Killing the Chosen." +[UISL_Shell_LWoTCVersion] +strMessage_Title = "Long War Of The Chosen" +strMessage_Header = "Long War Of The Chosen has been Updated! +strMessage_Body = "Version 1.1.0 is now released, with lots of features and improvements, including:
  • New 5 Tier Chosen system for Better Progression
  • New Covert Actions that Reward Infiltration Missions
  • New Maps for Network Tower and Crate Race Missions
  • Reworked Templar with Iridar's Psi Shield
  • QOL Improvements
  • Improved Mod Compatibility
  • Balance Tweaks for Classes, Heros, and More
  • Way more than I can fit here unless you want a giant scrollbar
Check out the google doc linked on the Steam change notes, or visit the LWoTC discord!" +strDismiss_Button = "OK" + +[UISL_Shell_BetaPatchNotes] +strMessage_Title = "Long War Of The Chosen" +strMessage_Header = "RC35 Changes:" +strMessage_Body = "
  • Fixed issue where Chosen respawned at full HP after killing the Sarcophagus.
  • Redid custom wilderness crate race maps to prevent crates from spawning on the roofs of trucks.
  • Fixed issue where Mind Merge provided no crit bonus with beam tier psi amp.
  • Fixed issue where some mission elements used AlienHQ Force Level instead of LW's regional Force Level.
  • Covert op version of the crate race mission rewards adjusted: Reduced supply rewards a bit, added PCSs, Weapon Upgrades, Elerium Cores, and Datapads to the crates.
  • Fixed issue where Hunter omnivision was not removed from all difficulty variants.
  • Fixed corpse requirement inconsistency for instant Spectre, Priest, and Purifier Autopsies.
  • Added a configuration toggle to enable/disable the City Center HQ maps for testing. Flipping it off doesn't change existing HQ's if they spawned with City Center maps, but future HQs will not use them.
  • Another round of Localization updates from Copyrite.
" +strDismiss_Button = "OK" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.ita b/LongWarOfTheChosen/Localization/LW_Overhaul.ita index 1ab2fb44b..42708a535 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.ita +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.ita @@ -167,6 +167,8 @@ ActivityObjectives[0]="Libera i Ribelli Catturati" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="Appropriati dei Contenitori di Risorse ADVENT" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="La resistenza è venuta a conoscenza della posizione di alcune risorse essenziali al nemico, che potremmo acquisire e utilizzare a nostro vantaggio.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="La resistenza è venuta a conoscenza della posizione di alcune risorse essenziali al nemico, che potremmo acquisire e utilizzare a nostro vantaggio.", MissionIndex=0) + [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.jpn b/LongWarOfTheChosen/Localization/LW_Overhaul.jpn index e76575634..48b89bb3d 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.jpn +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.jpn @@ -611,6 +611,8 @@ m_strNextHaven="次 解放区" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="アドヴェントの物資を奪取せよ" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="我々が入手して使うことのできる敵の重要な物資の場所をレジスタンスが察知した", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="我々が入手して使うことのできる敵の重要な物資の場所をレジスタンスが察知した", MissionIndex=0) + [UICovertActionReport_LW] strCovertActionFailed="失敗" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.kor b/LongWarOfTheChosen/Localization/LW_Overhaul.kor index 000286cd0..748b78ba9 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.kor +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.kor @@ -611,6 +611,8 @@ m_strNextHaven="다음 피난처" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="어드밴트 자원 캐시를 확보하시오" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="저항군이 우리가 확보하여 사용할 수 있는 적의 중요자원위치를 알아냈습니다.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="저항군이 우리가 확보하여 사용할 수 있는 적의 중요자원위치를 알아냈습니다.", MissionIndex=0) + [UICovertActionReport_LW] strCovertActionFailed="실패함" diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.pol b/LongWarOfTheChosen/Localization/LW_Overhaul.pol index 3aa2a33f1..237bebebf 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.pol +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.pol @@ -90,47 +90,47 @@ ActivityObjectives[1]="Zdobądź artefakty z UFO" [EmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="EmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Znajdź trop" -ActivityObjectives[1]="Zdobądź artefakty z UFO" -+MissionDescriptions=(MissionFamily="Recover_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Hack_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Nasz wywiad doprowadził nas do słabo chronionego UFO stojącego na ziemi.", MissionIndex=1) +ActivityObjectives[0]="Znajdź ścieżki lotu wroga" +ActivityObjectives[1]="Odzyskaj artefakty UFO" ++MissionDescriptions=(MissionFamily="Recover_LW", Description="Odkryliśmy potencjalny trop w sprawie zajęć ADVENT-u. Powinniśmy zbadać sprawę.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Hack_LW", Description="Odkryliśmy potencjalny trop w sprawie zajęć ADVENT-u. Powinniśmy zbadać sprawę.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Nasze dane wywiadowcze doprowadziły nas do podatnego na ataki UFO na ziemi.", MissionIndex=1) [SuperEmergencyOffworldReinforcements X2LWAlienActivityTemplate] ActivityName="SuperEmergencyOffworldReinforcementsActivity" -ActivityObjectives[0]="Znajdź trop" -ActivityObjectives[1]="Zdobądź artefakty z UFO" +ActivityObjectives[0]="Znajdź ścieżki lotu wroga" +ActivityObjectives[1]="Odzyskaj artefakty UFO" -+MissionDescriptions=(MissionFamily="Recover_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Hack_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Rescue_LW", Description="Dowiedzieliśmy się o więźniu ADVENT-u, który może dysponować informacjami na temat działalności wroga.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Nasz wywiad doprowadził nas do słabo chronionego UFO stojącego na ziemi.", MissionIndex=1) ++MissionDescriptions=(MissionFamily="Recover_LW", Description="Odkryliśmy potencjalny trop w sprawie zajęć ADVENT-u. Powinniśmy zbadać sprawę.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Hack_LW", Description="Odkryliśmy potencjalny trop w sprawie zajęć ADVENT-u. Powinniśmy zbadać sprawę.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Rescue_LW", Description="Odkryliśmy więźnia ADVENT-u, który może być potencjalnym tropem działań wroga.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Nasze dane wywiadowcze doprowadziły nas do podatnego na ataki UFO na ziemi.", MissionIndex=1) [Invasion X2LWAlienActivityTemplate] ActivityName="InvasionActivity" -ActivityObjectives[0]="Przeprowadź zasadzkę na wysunięty oddział ADVENT-u" -ActivityObjectives[1]="Broń rządu tymczasowego" +ActivityObjectives[0]="Zaatakuj siły natarcia ADVENT-u" +ActivityObjectives[1]="Broń Rząd Tymczasowy" -+MissionDescriptions=(MissionFamily="SupplyLineRaid_LW", Description="Wykryliśmy siły ADVENT-u wkraczające do tego regionu. Musimy je powstrzymać za wszelką cenę.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Invasion_LW", Description="ADVENT najeżdża ten region i atakuje tymczasowy rząd. Jeśli nie obronimy naszych ludzi, obcy znowu przejmą kontrolę nad tym obszarem.", MissionIndex=1) ++MissionDescriptions=(MissionFamily="SupplyLineRaid_LW", Description="Wykryliśmy siły ADVENT-u wkraczające w ten region. Ważne jest, abyśmy powstrzymali ich natarcie.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Invasion_LW", Description="ADVENT dokonuje inwazji na ten region i atakuje Rząd Tymczasowy. Broń naszych ludzi, inaczej kosmici ponownie przejmą kontrolę nad regionem.", MissionIndex=1) [Foothold X2LWAlienActivityTemplate] ActivityName="FootholdActivity" -ActivityObjectives[0]="Zaatakuj transportowiec szturmowy obcych" -ActivityObjectives[1]="Broń rządu tymczasowego" +ActivityObjectives[0]="Atak na lotniskowiec szturmowy UFO" +ActivityObjectives[1]="Broń Rząd Tymczasowy" -+MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Obcy znów próbują zdobyć jakiś punkt zaczepienia na Ziemi. Możemy ich powstrzymać, atakując jeden z lądujących transportowców szturmowych.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Invasion_LW", Description="Obcy najeżdżają ten region i atakują tymczasowy rząd. Jeśli nie obronimy naszych ludzi, obcy znowu przejmą kontrolę nad tym obszarem.", MissionIndex=1) ++MissionDescriptions=(MissionFamily="SecureUFO_LW", Description="Obcy próbują odzyskać przyczółek na Ziemi. Możemy ich powstrzymać, atakując jeden z ich lotniskowców szturmowych, gdy ten wyląduje.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Invasion_LW", Description="Obcy atakują ten region i atakują Rząd Tymczasowy. Broń naszych ludzi, inaczej kosmici ponownie przejmą kontrolę nad regionem.", MissionIndex=1) [Propaganda X2LWAlienActivityTemplate] ActivityName="PropagandaActivity" ActivityObjectives[0]="Przyciągnij uwagę ADVENT-u" -+MissionDescriptions=(MissionFamily="SabotageCC_LW", Description="Obcy pozostawili ośrodek miejski niemal bez ochrony. Możemy zaatakować jeden z ich pomników, żeby dać im coś do zrozumienia, ale musimy się liczyć z odpowiedzią ADVENT-u.", MissionIndex=0) -+MissionDescriptions=(MissionFamily="Neutralize_LW", Description="Dowiedzieliśmy się, że wkrótce jeden z wysoko postawionych ludzkich przedstawicieli ADVENT-u przez krótki okres będzie słabiej chroniony. Możemy go wyeliminować, musimy jednak się liczyć z reakcją ADVENT-u.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SabotageCC_LW", Description="Obcy opuścili centrum miejskie stosunkowo bez ochrony. Możemy uderzyć w jeden z ich pomników, aby wysłać wiadomość, ale ADVENT z pewnością odpowie.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="Neutralize_LW", Description="Dowiedzieliśmy się, że urzędnik zajmujący wysokie stanowiska w administracji ADVENT-u będzie w najbliższej przyszłości stosunkowo pozbawiony ochrony przez krótki okres. Możemy go wyeliminować, ale ADVENT z pewnością to zauważy.", MissionIndex=0) [ProtectResearch X2LWAlienActivityTemplate] ActivityName="ProtectResearchActivity" -ActivityObjectives[0]="Znajdź trop" +ActivityObjectives[0]="Znajdź trop obiektu" +MissionDescriptions=(MissionFamily="Recover_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) +MissionDescriptions=(MissionFamily="Hack_LW", Description="Odkryliśmy trop potencjalnej działalności ADVENT-u. Powinniśmy go sprawdzić.", MissionIndex=0) +MissionDescriptions=(MissionFamily="DestroyObject_LW", Description="Odkryliśmy urządzenie ADVENT-u, które zakłóca komunikację ruchu oporu. Jeśli je zniszczymy, to być może zdobędziemy nowe informacje i źródła danych wywiadowczych.", MissionIndex=0) @@ -162,6 +162,10 @@ ActivityName="PoliticalPrisonersActivity" ActivityObjectives[0]="Uwolnij pojmanych rebeliantów" +MissionDescriptions=(MissionFamily="Jailbreak_LW", Description="Grupa członków ruchu oporu jest przetrzymywana w zabezpieczonym ośrodku. Mamy szansę, by ją uwolnić.", MissionIndex=0) +[Logistics X2LWAlienActivityTemplate] +ActivityObjectives[0]="Przejmij pamięć podręczną zasobów ADVENT-u" ++MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="Ruch Ruchu Oporu poznał lokalizację kluczowych zasobów wroga, które możemy zdobyć na własny użytek.", MissionIndex=0) + [IntelRaid X2LWAlienActivityTemplate] ActivityName="IntelRaidActivity" ActivityObjectives[0]="Broń zasobów ruchu oporu" @@ -238,6 +242,13 @@ strDaysAndHours=" d., godz." strMinusDaysAndHours="- d., godz." strPlusDaysAndHours="+ d., godz." strMissionIndefinite="Nieograniczony czas trwania" +strLiberationTitle="Modyfikator postępu wyzwolenia:" + +UpToText="Do" +ExpectedActivityTextStr="Oczekiwana aktywność" +BoostedActivityText="Oczekiwana aktywność (zwiększona)" +BoostTextPre="Z" +BoostTextPost="Wzmocnienie" [UIScreenListener_DropShipBriefing_MissionStart] strLaunchingInfiltration="WKRÓTCE NASTĄPI KONTAKT" @@ -252,6 +263,10 @@ AblativeHPLabel="Ablacyjne PZ" [X2Ability_LW_TechnicalAbilitySet] strMaxScatter="\nMaksymalny rozrzut (w polach):" +[X2Ability_LW_ChosenAbilities] +ShieldedStatBuffsLocDescription="Dodatkowy cel, szansa na trafienie krytyczne, wola i atak psi." +ImpactCompensationBuffDescription="Zmniejszenie wszystkich otrzymywanych obrażeń o %" + [XComGameState_LWListenerManager] ResistanceHQBodyText="Uzyskaj dostęp do informacji kryjówki ruchu oporu" @@ -269,6 +284,11 @@ m_strTooltipAutofillSquad="Automatyczne uzupełnienie pustych miejsc w drużynie strTimeRemainingHoursOnly=" godz." strTimeRemainingDaysAndHours=" d., godz." +strDarkEventExpiredTitle="Ciemne wydarzenie wygasło" +strDarkEventExpiredText="wygasło" +OpenResistanceManagementStr="OTWARTE ZARZĄDZANIE RUCHEM OPORU" +OpenHavenManagementStr="OTWARTE ZARZĄDZANIE KRYJÓWKĄ" + [X2EventListener_Soldiers] OnLiaisonDuty="Doradca kryjówki" OnInfiltrationMission="Infiltruje" @@ -276,9 +296,7 @@ UnitAlreadyInSquad="Jednostka przypisana do innej drużyny" UnitInSquad="Jednostka jest już w drużynie" RankTooLow="Zbyt niska ranga" CannotModifyOnMissionSoldierTooltip="Nie można modyfikować żołnierza wykonującego misję" - -[X2Effect_LWHolotarget] -HoloTargetEffectName="Na celowniku holograficznym" +ReasonClassAbilityPickedAtRank="Wybrałeś już zdolność klasową tej rangi" [XComGameState_LWPersistentSquad] +DefaultSquadNames="Widmo" @@ -318,7 +336,7 @@ HoloTargetEffectName="Na celowniku holograficznym" +TempSquadNames="Foxtrot" +TempSquadNames="Golf" +TempSquadNames="Hotel" -+TempSquadNames="Indie" ++TempSquadNames="India" +TempSquadNames="Juliet" +TempSquadNames="Kilo" +TempSquadNames="Lima" @@ -335,7 +353,6 @@ HoloTargetEffectName="Na celowniku holograficznym" +TempSquadNames="Yankee" +TempSquadNames="Zulu" - BackupSquadName="Drużyna XCOML " BackupTempSquadName="Tymczasowa drużyna: " @@ -356,7 +373,8 @@ m_strInvasionConfirm="ZOBACZ MIEJSCE INWAZJI" m_strRepeatResearch="POWTÓRZ BADANIA" [UIScreenListener_ArmoryWeaponUpgrade_LW] -strStripWeaponUpgradesButton="Usuń ulepszenia broni" +strStripWeaponUpgradesButton="Usuń ulepszenia" +StripAllWeaponUpgradesStr="Usuń ulepszenia nieaktywnych żołnierzy" strStripWeaponUpgradesTooltip="Usuwa wszystkie ulepszenia oraz modyfikacje broni i przenosi je do wspólnej puli" strStripWeaponUpgradeDialogueTitle="POTWIERDZENIE USUNIĘCIA WSZYSTKICH ULEPSZEŃ" strStripWeaponUpgradeDialogueText="Na pewno chcesz zdjąć wszystkie ulepszenia z tej broni i zwrócić je do wspólnej puli?" @@ -392,6 +410,8 @@ strSquad="Drużyna" strStart="Start" strInfiltration="Infiltracja" +strAreaOfOperations="Obszar operacji:" + [UIScreenListener_SkyrangerArrives_LW] strLaunchInfiltration="ROZPOCZNIJ INFILTRACJĘ" strAbortInfiltration="PRZERWIJ INFILTRACJĘ" @@ -403,6 +423,7 @@ TooltipBarracks_SquadManagement="Zarządzanie stałymi drużynami żołnierzy" [UIStrategyMapItem_Mission_LW] strRecon="Infiltr." +InfiltrationTooltipString="INFILTRACJA" [UIMission_LWLaunchDelayedMission] m_strMission="INFILTRACJA" @@ -470,7 +491,7 @@ m_strAdviserLabel="DK" m_strIncomeLabel="DOCHÓD" m_strRebelCountLabel="KRYJÓWKA" m_strADVENTUnitSingular="Legion" -m_strADVENTUnitPlural="Legion." +m_strADVENTUnitPlural="Legiony" m_strGlobalAlert="Globalna siła ADVENT-u:" m_strGlobalInsurgency="• Globalne zagrożenie ruchu oporu:" @@ -482,6 +503,8 @@ m_strThreatHigh="Wysokie" m_strThreatVeryHigh="Bardzo wysokie" m_strLiberated="Wyzwolony" m_strResistanceManagementLevels=" (C:)" +ViewHavenStr="ZOBACZ KRYJÓWKĘ" +FlyToHavenStr="LEĆ DO KRYJÓWKI" [UIOutpostManagement] m_strTitle="ZARZĄDZANIE KRYJÓWKĄ" @@ -490,12 +513,16 @@ m_strName="Nazwisko" m_strMission="Misja" m_strBuildRadioRelay="Zbuduj przekaźnik radiowy" m_strLiaisonTitle="Doradca kryjówki" +m_strEditLoadout="Zestaw doradców" ; 0=Alert, 1=Vigilance, 2=Force m_strRegionalInfo="Siła ADVENT-u: " m_strResistanceMecs="MEC-i ruchu oporu: " m_strProhibited="Zabronione" m_strCannotChangeLiaisonTitle="Nie można przenieść doradcy" m_strCannotChangeLiaison="W związku z aktywnymi misjami w regionie zmiana doradcy jest w tej chwili niemożliwa" +ChangeJobStr="ZAMIEŃ PRACĘ" +ChangeAllJobsStr="ZMIEŃ WSZYSTKIE PRACE" +PerksStr="ATUTY" [UIScreenListener_TacticalHUD] strEvacRequestTitle="Zgłoszono potrzebę ewakuacji" @@ -559,6 +586,7 @@ m_strLiberatedCityPrefix="(Wyzwolone)" [XComGameState_LWOutPost] m_strProhibitedJobAlert="Z powodu ataku ADVENT-u członkom ruchu oporu w regionie o nazwie przez dni nie można przypisać zadań następującego typu: . Wszyscy członkowie ruchu oporu wykonujący zadanie tego typu ukrywają się." m_strProhibitedJobEnded="Region: - rebelianci wracają do realizacji wyznaczonych zadań (typ zadania: )." +m_strRetributionEnded="Członkowie ruchu oporu w otrząsnęli się po jednej z kar Wybranych" [X2StrategyElement_DefaultAlienActivities] m_strInsufficientRebels="Potrzeba co najmniej rebeliantów w kryjówce, aby nawiązać kontakt z sąsiadami" @@ -570,36 +598,74 @@ m_strInvasionBody="Dowódco, ADVENT podjął próbę odbicia wyzwolonego regionu m_strInvasionFlare="PILNA WIADOMOŚĆ" m_strInvasionConfirm="ZOBACZ MIEJSCE INWAZJI" -[UIUtilities_LW] -m_strStripWeaponUpgrades=ZDEJMIJ WSZYSTKIE ULEPSZENIA BRONI -m_strStripWeaponUpgradesLower=Zdejmij Wszystkie Ulepszenia Broni -m_strStripWeaponUpgradesConfirm=POTWIERDŹ ZDJĘCIE WSZYSTKICH ULEPSZEŃ -m_strStripWeaponUpgradesConfirmDesc=Potwierdź zdjęcie wszystkich ulepszeń ze wszystkich broni głównych, poza tymi używanymi przez żołnierzy wyznaczonych do obecnej misji. Ten sprzęt stanie się natychmiast dostępny dla wszystkich żołnierzy. -m_strTooltipStripWeapons=Usuń wszystkie ulepszenia broni u wszystkich żołnierzy NIE WYBRANYCH do obecnej misji. - -m_strVIPCaptureReward=(Tylko pojmanie VIP-a) +[UIScreenListener_ShellDifficulty] +.Credits="" +.Credits=Design Lead +.Credits=John "JohnnyLump" Lumpkin +.Credits="" +.Credits=Technical Lead +.Credits=Rachel "Amineri" Norman +.Credits="" +.Credits=Programmers +.Credits=Jonathan "tracktwo" Emmett +.Credits=Chris "chrisb" Boertien +.Credits="" +.Credits=Artists +.Credits=James "JCLewis" Karlson +.Credits=Chris "CapnBubs" Mansell +.Credits=Dana "lfish" Henderson +.Credits=Robert "BazserMazser" Bakos +.Credits=Alexander "XMarksTheSpot" Behne +.Credits=Percy Parache +.Credits="" +.Credits=Quality Assurance Lead +.Credits=Tim "Bilfdoffle" Evans +.Credits="" +.Credits=Quality Assurance and Design Advisers +.Credits=Matt "WyMANderly" Price +.Credits=Xavier Wynns +.Credits=Stephen "JoINrbs" Flavall +.Credits=Tim "deaconivory" Douglas +.Credits=Caitlin McDonald, Paul "Kordolius" Massip, Benedict Jacka "Saph" +.Credits=Colin "Thrair" Hendershot, Paul "Plockets" Giles, Gimrah, Ronar +.Credits="" +.Credits="Special Thanks" +.Credits="Garrett Bittner, Casey Coleman, Garth DeAngelis" +.Credits="Brian Hess, Sajjad Majid, Ryan McFall" +.Credits="Kevin Schultz, Jake Solomon, Brittany Steiner, Iain Willows" +.Credits="McDenny's 09, The Community Highlander Project" +.Credits="RoboJumper, Bountygiver, xylthixlm, Beaglerush" +.Credits="Our herd of spot translators on the PI forums" +.Credits="" -m_strInfiltrationMission="Infiltracja" -m_strQuickResponseMission="Szybka reakcja" -m_strFixedEvacLocation="Stały punkt ewakuacji" -m_strFlareEvac="Wybór punktu ewakuacji" +[UIUtilities_LW] +m_strInfiltrationMission="Misja infiltracyjna" +m_strQuickResponseMission="Misja szybkiego reagowania" +m_strFixedEvacLocation="Naprawiono ewakuację" +m_strFlareEvac="Ewakuacja z flarą" m_strDelayedEvac="Opóźniona ewakuacja" m_strNoEvac="Brak ewakuacji" -m_strMaxSquadSize="Maks. wielkość drużyny" -m_strConcealedStart="Start w ukryciu" -m_strRevealedStart="Start bez ukrycia" -m_strObjectiveTimer="Czas na zadanie:" -m_strExtractionTimer="Czas na ewakuację:" +m_strMaxSquadSize="Maksymalny rozmiar oddziału" +m_strConcealedStart="Ukryty początek" +m_strRevealedStart="Ujawniony początek" +m_strObjectiveTimer="Licznik celu misji:" +m_strExtractionTimer="Licznik czasu ekstrakcji:" m_strEvacTimer="Przybycie Skyrangera:" -m_strGetCorpses="Można zebrać ciała" -m_strSweepObjective="Zniszcz siły wroga" +m_strGetCorpses="Pełne odzyskanie" +m_strSweepObjective="Cel przeszukiwania" m_strEvacRequired="Wymagana ewakuacja" m_strTurnSingular="Tura" -m_strTurnPlural="Tur" -m_strMinimumInfiltration="Wymaga % Infiltracji" -m_strYellowAlert="Wysoka gotowość bojowa wroga" +m_strTurnPlural="Tury" +m_strMinimumInfiltration="Wymagana % infiltracja" +m_strYellowAlert="Wrogowie w stanie najwyższej gotowości" +m_sAverageScatterText="± pola" +m_strBullet="•" -m_sAverageScatterText="Rozrzut ± " +m_strStripWeaponUpgrades=ZDEJMIJ WSZYSTKIE ULEPSZENIA BRONI +m_strStripWeaponUpgradesLower=Zdejmij Wszystkie Ulepszenia Broni +m_strStripWeaponUpgradesConfirm=POTWIERDŹ ZDJĘCIE WSZYSTKICH ULEPSZEŃ Z NIEAKTYWNYCH ŻOŁNIERZY +m_strStripWeaponUpgradesConfirmDesc=Potwierdź usunięcie ulepszeń broni ze wszystkich niewyposażonych broni głównych, a także wszystkich broni głównych trzymanych przez nieaktywnych żołnierzy. Nie będzie to miało wpływu na broń podstawową trzymaną przez żołnierzy tajnych działań, a także żołnierzy wybranych do bieżących obowiązków misyjnych. Należy pamiętać, że to usunięcie jest trwałe; następnym razem, gdy zostanie wyposażona „pozbawiona” broń główna, konieczne będzie ponowne dodanie do niej ulepszeń broni. +m_strTooltipStripWeapons=Usuń wszystkie ulepszenia broni z niewyposażonej broni głównej, a także broni głównej trzymanej przez nieaktywnych żołnierzy. m_strAllHandsToHangar=WSZYSCY DO HANGARU m_strAllHandsToHangarConfirm=POTWIERDŹ ROZKAZ "WSZYSCY DO HANGARU" @@ -609,9 +675,20 @@ m_strTooltipAllHandsToHangar=Przerwij szkolenie wszystkich żołnierzy ze Szkoł m_strPrevHaven="POPRZ. KRYJÓWKA" m_strNextHaven="NAST. KRYJÓWKA" -[Logistics X2LWAlienActivityTemplate] -ActivityObjectives[0]="Przechwyć zapasy ADVENT-u" -+MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="Ruch Oporu zdobył wiedzę na temat umiejscowienia istotnych dla przeciwnika zasobów, które możemy przechwycić i wykorzystać do naszych potrzeb.", MissionIndex=0) +m_strVIPCaptureReward="(Tylko pojmanie VIP-a)" + +[UIListener_CampaignStartMenu] + +strDisabledTutorialTooltip="Samouczek jest wyłączony podczas grania w Long War of the Chosen" +strDisabledNarrativeContentTooltip="Lost and Abandoned jest wyłączone podczas grania w Long War of the Chosen" +strDisabledPrecisionExplosivesTooltip="Precyzyjne materiały wybuchowe są wyłączone podczas grania w Long War of the Chosen" [UICovertActionReport_LW] -strCovertActionFailed="NIE WYKONANO" +strCovertActionFailed="PORAŻKA" + +[UIScreenListener_ViewObjectives] +ScrollObjectiveDescriptionStr="PRZEWIŃ OPIS CELÓW" + +[X2Effect_ChosenLoot] +m_strChosenLoot="() Nagrodza za zabicie Wybrańca." + diff --git a/LongWarOfTheChosen/Localization/LW_Overhaul.rus b/LongWarOfTheChosen/Localization/LW_Overhaul.rus index ca7610818..6c09b1387 100644 --- a/LongWarOfTheChosen/Localization/LW_Overhaul.rus +++ b/LongWarOfTheChosen/Localization/LW_Overhaul.rus @@ -635,6 +635,8 @@ m_strNextHaven="СЛЕД. УБЕЖИЩЕ" [Logistics X2LWAlienActivityTemplate] ActivityObjectives[0]="Захватить набор ресурсов \"Адвента\"" +MissionDescriptions=(MissionFamily="SmashnGrab_LW", Description="Сопротивление обнаружило расположение ценных ресурсов противника которые мы можем заполучить для своих потребностей.", MissionIndex=0) ++MissionDescriptions=(MissionFamily="SupplyExtraction_LW", Description="Сопротивление обнаружило расположение ценных ресурсов противника которые мы можем заполучить для своих потребностей.", MissionIndex=0) + ; LWOTC Translated [UIListener_CampaignStartMenu] diff --git a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.deu b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.deu old mode 100755 new mode 100644 index b39105139..18e31c141 Binary files a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.deu and b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.pol b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.pol index dd261fa08..f84da9317 100644 --- a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.pol +++ b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/LW_PerkPack_Integrated.pol @@ -37,9 +37,22 @@ TrojanVirusTriggered=" uruchamia wirus typu trojan [X2Effect_Savior] strSavior_WorldMessage="Zbawca: leczenie dodatkowych pkt. zdrowia." +[X2Effect_LWHolotarget] +HoloTargetEffectName="Namierzony holograficznie" + [X2Item_DenseSmokeGrenade] DenseSmokeGrenadeEffectDisplayName="Gęsty dym" DenseSmokeGrenadeEffectDisplayDesc="Gęsty dym daje tej jednostce premię do obrony." [X2Ability_PerkPackAbilitySet] LocCoveringFire="Ogień osłonowy" +LocCoveringFireMalus="Ta jednostka została wybrana przez jednostkę nadzorującą ze zdolnością Ognia Osłaniającego, która przyznaje -10 do celowania przez resztę tury." +LocSoulStealBuff="Kradzież duszy" +LocSoulStealBuffHelpText="Kradzież duszy zapewnia ablacyjne punkty wytrzymałości, gdy się zagoi" + +[X2Effect_RegeneracjaPCT] +HealedMessage="+ Zregenerowano HP" + +[X2StatusEffects_LW] +MaimedFriendlyName="Okaleczony" +MaimedFriendlyDesc="Mobilność jednostki jest zredukowana do zera i dlatego nie może się ona poruszać. Nadal może strzelać i wykonywać inne zdolności niezwiązane z ruchem." diff --git a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/XComGame.chn b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/XComGame.chn index 86e6b01af..e443d5dc8 100644 --- a/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/XComGame.chn +++ b/LongWarOfTheChosen/Localization/LW_PerkPack_Integrated/XComGame.chn @@ -232,6 +232,14 @@ LocLongDescription="进行一次+暴击率 LocHelpText="进行一次+暴击率和%暴击伤害加成的射击。冷却时间回合。" LocPromotionPopupText=" 进行一次+暴击率和%暴击伤害加成的射击。冷却时间回合。
" +[PrecisionShotSnapShot X2AbilityTemplate] +LocFriendlyName="精准射击(急射)" +LocFlyOverText="精准射击" +LocLongDescription="进行一次+暴击率和%暴击伤害加成的射击。冷却时间回合。" +LocHelpText="进行一次+暴击率和%暴击伤害加成的射击。冷却时间回合。" +LocPromotionPopupText=" 进行一次+暴击率和%暴击伤害加成的射击。冷却时间回合。
" + + [CyclicFire X2AbilityTemplate] LocFriendlyName="循环火力" LocFlyOverText="循环火力" @@ -1031,469 +1039,16 @@ LocHelpText="连续向敌人开火两次。每次射击暴擊率和%暴擊傷害加成的射擊。冷卻時間回合。" LocPromotionPopupText="進行一次+暴擊率和%暴擊傷害加成的射擊。冷卻時間回合。
" +[PrecisionShotSnapShot X2AbilityTemplate] +LocFriendlyName="精準射擊" +LocFlyOverText="精準射擊" +LocLongDescription="進行一次+暴擊率和%暴擊傷害加成的射擊。冷卻時間回合。" +LocHelpText="進行一次+暴擊率和%暴擊傷害加成的射擊。冷卻時間回合。" +LocPromotionPopupText="進行一次+暴擊率和%暴擊傷害加成的射擊。冷卻時間回合。
" + + [CyclicFire X2AbilityTemplate] LocFriendlyName="循環火力" LocFlyOverText="循環火力" @@ -1031,469 +1039,16 @@ LocHelpText="連續向敵人開火兩次。每次射擊 к шансу нанести критический урон и +% к критическому урону. Ходов до перезарядки: ." LocPromotionPopupText=" Особый выстрел: + к шансу нанести критический урон и +% к критическому урону.
Ходов до перезарядки: ." +[PrecisionShotSnapShot X2AbilityTemplate] +LocFriendlyName="Точный выстрел" +LocFlyOverText="Точный выстрел" +LocLongDescription="Особый выстрел: + к шансу нанести критический урон и +% к критическому урону. Ходов до перезарядки: ." +LocHelpText="Особый выстрел: + к шансу нанести критический урон и +% к критическому урону. Ходов до перезарядки: ." +LocPromotionPopupText=" Особый выстрел: + к шансу нанести критический урон и +% к критическому урону.
Ходов до перезарядки: ." + + [CyclicFire X2AbilityTemplate] LocFriendlyName="Серия выстрелов" LocFlyOverText="Серия выстрелов" @@ -1029,464 +1037,3 @@ LocPromotionPopupText=" Ваши атаки с использовани RankNames[8]="Магистр" ShortNames[8]="Мгст." RankIcons[8]="UILibrary_LW_PerkPack.psirank_Master" - -[LW_Sharpshooter X2SoldierClassTemplate] -DisplayName="Снайпер" -ClassSummary="Снайперы атакуют цель с огромных расстояний при помощи сверхточного оружия. Также они могут поддерживать огнем отряд, отказавшись от большой дальности в пользу мобильности." -LeftAbilityTreeTitle="Охота" -RightAbilityTreeTitle="Стрелок" - -;ALPHABETICAL ORDER -RandomNickNames[0]="Точка" -RandomNickNames[1]="Козырь" -RandomNickNames[2]="Некролог" -RandomNickNames[3]="Альфа" -RandomNickNames[4]="Флэш-рояль" -RandomNickNames[5]="Яблочко" -RandomNickNames[6]="Штуцер" -RandomNickNames[7]="Гаубица" -RandomNickNames[8]="Тихий час" -RandomNickNames[9]="На все деньги" -RandomNickNames[10]="Босс" -RandomNickNames[11]="Яблочко" -RandomNickNames[12]="Гамбит" -RandomNickNames[13]="Хан" -RandomNickNames[14]="Кольт" -RandomNickNames[15]="Даллас" -RandomNickNames[16]="Верняк" -RandomNickNames[17]="Меткий глаз" -RandomNickNames[18]="Капкан" -RandomNickNames[19]="Лесник" -RandomNickNames[20]="Мертвец" -RandomNickNames[21]="Зоркий глаз" -RandomNickNames[22]="Приговор" -RandomNickNames[23]="Борозда" -RandomNickNames[24]="Шпильман" -RandomNickNames[25]="Гангстер" -RandomNickNames[26]="Гробокопатель" -RandomNickNames[27]="Хет-трик" -RandomNickNames[28]="Индеец" -RandomNickNames[29]="Батарея" -RandomNickNames[30]="Полдень" -RandomNickNames[31]="Леон" -RandomNickNames[32]="Голливуд" -RandomNickNames[33]="Звезда" -RandomNickNames[34]="Позер" -RandomNickNames[35]="Шакал" -RandomNickNames[36]="Судья" -RandomNickNames[37]="Туши свет" -RandomNickNames[38]="Ловушка" -RandomNickNames[39]="Дальнобой" -RandomNickNames[40]="Бродяга" -RandomNickNames[41]="Жало" -RandomNickNames[42]="Бледный всадник" -RandomNickNames[43]="Жнец" -RandomNickNames[44]="Шрам" -RandomNickNames[45]="Серия" -RandomNickNames[46]="Шериф" -RandomNickNames[47]="Вестерн" -RandomNickNames[48]="Праздник" -RandomNickNames[49]="Ловкач" -RandomNickNames[50]="Рогатка" -RandomNickNames[51]="Отморозок" -RandomNickNames[52]="Дворник" -RandomNickNames[53]="Пацан" -RandomNickNames[54]="Правда" -RandomNickNames[55]="Могила" -RandomNickNames[56]="Призер" -RandomNickNames[57]="Крыша" -RandomNickNames[58]="Два пальца" -RandomNickNames[59]="Похоронка" -RandomNickNames[60]="Валентинка" -;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Ковбой" -RandomNickNames_Male[1]="Крестный отец" -RandomNickNames_Male[2]="Почтальон" -RandomNickNames_Male[3]="Морфей" -RandomNickNames_Male[4]="Карась" -RandomNickNames_Male[5]="Счетчик" -RandomNickNames_Male[6]="Зевс" -RandomNickNames_Female[0]="Принцесса" -RandomNickNames_Female[1]="Черная вдова" -RandomNicknames_Female[2]="Авария" -RandomNicknames_Female[3]="Пчелка" -;ALPHABETICAL ORDER - -[LW_Gunner X2SoldierClassTemplate] -DisplayName="Пушка" -ClassSummary="Пулеметчик использует тяжелое автоматическое оружие, встречая противника шквалом огня." -LeftAbilityTreeTitle="Поддержка отряда" -RightAbilityTreeTitle="Пулеметы" - -RandomNickNames[0]="Косяк" -RandomNickNames[1]="Баха" -RandomNickNames[2]="Задира" -RandomNickNames[3]="Жесткач" -RandomNickNames[4]="Бензопила" -RandomNickNames[5]="Камбала" -RandomNickNames[6]="Финалист" -RandomNickNames[7]="Дичь" -RandomNickNames[8]="Барыга" -RandomNickNames[9]="Лунатик" -RandomNickNames[10]="Завтрак" -RandomNickNames[11]="Живодер" -RandomNickNames[12]="Крюк" -RandomNickNames[13]="Лось" -RandomNickNames[14]="Чукча" -RandomNickNames[15]="Золотце" -RandomNickNames[16]="Нюк" -RandomNickNames[17]="Людоед" -RandomNickNames[18]="Пирожок" -RandomNickNames[19]="Панцирь" -RandomNickNames[20]="Пистон" -RandomNickNames[21]="Рогатка" -RandomNickNames[22]="Воробей" -RandomNickNames[23]="Гвоздь" -RandomNickNames[24]="Йог" -RandomNickNames[25]="Зачет" -RandomNickNames_Male[0]="Анекдот" -RandomNickNames_Male[1]="Приблуда" -RandomNickNames_Male[2]="Маньяк" -RandomNickNames_Male[3]="Кулак" -RandomNickNames_Male[4]="Морж" -RandomNickNames_Female[0]="Пузырь" -RandomNickNames_Female[1]="Гаечка" -RandomNickNames_Female[2]="Ржака" -RandomNickNames_Female[3]="Манго" -RandomNickNames_Female[4]="Перчик" - -[LW_Ranger X2SoldierClassTemplate] -DisplayName="Рейнджер" -ClassSummary="Рейнджер - мастер винтовки, способный проявить себя как в атаке, так и в обороне." -LeftAbilityTreeTitle="Пехота" -RightAbilityTreeTitle="Защита" - -RandomNickNames[0]="Пони" -RandomNickNames[1]="Олень" -RandomNickNames[2]="Каштанка" -RandomNickNames[3]="Кобальт" -RandomNickNames[4]="Ковбой" -RandomNickNames[5]="Диггер" -RandomNickNames[6]="Бродяга" -RandomNickNames[7]="Морозко" -RandomNickNames[8]="Пехота" -RandomNickNames[9]="Голливуд" -RandomNickNames[10]="Спец" -RandomNickNames[11]="Волчок" -RandomNickNames[12]="Простофиля" -RandomNickNames[13]="Чудила" -RandomNickNames[14]="Судья" -RandomNickNames[15]="Шило" -RandomNickNames[16]="Мустанг" -RandomNickNames[17]="Дедуля" -RandomNickNames[18]="Художник" -RandomNickNames[19]="Пинта" -RandomNickNames[20]="Зараза" -RandomNickNames[21]="Рокки" -RandomNickNames[22]="Скутер" -RandomNickNames[23]="Мошка" -RandomNickNames[24]="Занос" -RandomNickNames[25]="Растяжка" -RandomNickNames[26]="Бомбила" -RandomNickNames[27]="Оборотень" -RandomNickNames_Male[0]="Грязнуля" -RandomNickNames_Male[1]="Голландец" -RandomNickNames_Male[2]="Початок" -RandomNickNames_Male[3]="Ловкач" -RandomNickNames_Male[4]="Папаша" -RandomNickNames_Female[0]="Тетушка" -RandomNickNames_Female[1]="Вечерняя заря" -RandomNickNames_Female[2]="Медуза" -RandomNickNames_Female[3]="Сладкая" - -[LW_Shinobi X2SoldierClassTemplate] -DisplayName="Ниндзя" -ClassSummary="Ниндзя прекрасно справляются с разведывательными задачами и используют смертоносный меч в ближнем бою." -LeftAbilityTreeTitle="Саботаж" -RightAbilityTreeTitle="Кенси" -;ALPHABETICAL ORDER -RandomNickNames[0]="Хват" -RandomNickNames[1]="Кобра" -RandomNickNames[2]="Стилет" -RandomNickNames[3]="Танцор" -RandomNickNames[4]="Спринтер" -RandomNickNames[5]="Ловкач" -RandomNickNames[6]="Дракон" -RandomNickNames[7]="Дуэлянт" -RandomNickNames[8]="Ласты" -RandomNickNames[9]="Валик" -RandomNickNames[10]="Суслик" -RandomNickNames[11]="Дубина" -RandomNickNames[12]="Полночь" -RandomNickNames[13]="Нейтрон" -RandomNickNames[14]="Художник" -RandomNickNames[15]="Раджа" -RandomNickNames[16]="Браконьер" -RandomNickNames[17]="Болтун" -RandomNickNames[18]="Бритва" -RandomNickNames[19]="Потрошитель" -RandomNickNames[20]="Рояль" -RandomNickNames[21]="Шухер" -RandomNickNames[22]="Палка" -RandomNickNames[23]="Пробел" -RandomNickNames[24]="Сплинтер" -RandomNickNames[25]="Сталкер" -RandomNickNames[26]="Коготь" -RandomNickNames[27]="Похоронка" -RandomNickNames[28]="Рысь" -;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Бендер" -RandomNickNames_Male[1]="Вождь" -RandomNickNames_Male[2]="Карась" -RandomNickNames_Male[3]="Жокей" -RandomNickNames_Male[4]="Морфей" -RandomNickNames_Male[5]="Мечник" -;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Пантера" -RandomNickNames_Female[1]="Сирена" -RandomNickNames_Female[2]="Свеча" -RandomNickNames_Female[3]="Злюка" -;ALPHABETICAL ORDER - -[LW_Specialist X2SoldierClassTemplate] -DisplayName="Специалист" -ClassSummary="Специалисты - операторы наиболее сложного оборудования - боевых дронов, способных вести огонь или оказывать медицинскую помощь." -LeftAbilityTreeTitle="Медик" -RightAbilityTreeTitle="Хакер" - -;ALPHABETICAL ORDER -RandomNickNames[0]="Ангел" -RandomNickNames[1]="Бета" -RandomNickNames[2]="Епископ" -RandomNickNames[3]="Скелет" -RandomNickNames[4]="Предохранитель" -RandomNickNames[5]="Пиджак" -RandomNickNames[6]="Шифровка" -RandomNickNames[7]="Кибер" -RandomNickNames[8]="Шифр" -RandomNickNames[9]="Точка отсчета" -RandomNickNames[10]="Диакон" -RandomNickNames[11]="Айболит" -RandomNickNames[12]="Док" -RandomNickNames[13]="Отходняк" -RandomNickNames[14]="Шлагбаум" -RandomNickNames[15]="Голова" -RandomNickNames[16]="Гаджет" -RandomNickNames[17]="Глюк" -RandomNickNames[18]="Гоп-стоп" -RandomNickNames[19]="Вредитель" -RandomNickNames[20]="Клоун" -RandomNickNames[21]="Гром" -RandomNickNames[22]="Молния" -RandomNickNames[23]="Беда" -RandomNickNames[24]="Мега" -RandomNickNames[25]="Ньютон" -RandomNickNames[26]="Овердрайв" -RandomNickNames[27]="Пластырь" -RandomNickNames[28]="Профессор" -RandomNickNames[29]="Контрабас" -RandomNickNames[30]="Зараза" -RandomNickNames[31]="Болтун" -RandomNickNames[32]="Красный свет" -RandomNickNames[33]="Пропасть" -RandomNickNames[34]="Шнур" -RandomNickNames[35]="Жулик" -RandomNickNames[36]="Шашлык" -RandomNickNames[37]="Сторож" -RandomNickNames[38]="Шухер" -RandomNickNames[39]="Лихорадка" -RandomNickNames[40]="Кардан" -RandomNickNames[41]="Мозговед" -RandomNickNames[42]="Подкат" -RandomNickNames[43]="Загар" -RandomNickNames[44]="Соник" -RandomNickNames[45]="Вспышка" -RandomNickNames[46]="Тролль" -RandomNickNames[47]="Дятел" -RandomNickNames[48]="Плакса" -RandomNickNames[49]="Механик" -RandomNickNames[50]="Турбо" -RandomNickNames[51]="Отрава" -RandomNickNames[52]="Дымок" -RandomNickNames[53]="Жар-птица" -RandomNickNames[54]="Надзиратель" -RandomNickNames[55]="Виски" -RandomNickNames[56]="Оторва" -RandomNickNames[57]="Зулус" -;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Кондитер" -RandomNickNames_Male[1]="Шаман" -RandomNickNames_Male[2]="Монах" -RandomNickNames_Male[3]="Аутист" -RandomNickNames_Male[4]="Хвост" -RandomNickNames_Female[0]="Жрица" -RandomNickNames_Female[1]="Волчица" -RandomNickNames_Female[2]="Черная вдова" -RandomNickNames_Female[4]="Герцогиня" -;ALPHABETICAL ORDER - -[LW_Grenadier X2SoldierClassTemplate] -DisplayName="Гранатометчик" -ClassSummary="Гранатометчики, специалисты по тяжелому вооружению, обеспечивают нашим силам огневую поддержку на поле боя. Они также могут использовать гранаты поддержки, способные защищать своих и вредить врагам." -LeftAbilityTreeTitle="Взрывное дело" -RightAbilityTreeTitle="Поддержка" - -;ALPHABETICAL ORDER -RandomNickNames[0]="Трудяга" -RandomNickNames[1]="Ва-банк" -RandomNickNames[2]="Животное" -RandomNickNames[3]="Игрок" -RandomNickNames[4]="Деревня" -RandomNickNames[5]="Толстосум" -RandomNickNames[6]="Мерзота" -RandomNickNames[7]="Палево" -RandomNickNames[8]="Бабах" -RandomNickNames[9]="Бомбер" -RandomNickNames[10]="Братюня" -RandomNickNames[11]="Бульдог" -RandomNickNames[12]="Бык" -RandomNickNames[13]="Клеймор" -RandomNickNames[14]="Подрыв" -RandomNickNames[15]="Тревога" -RandomNickNames[16]="Морпех" -RandomNickNames[17]="Дизель" -RandomNickNames[18]="На бис" -RandomNickNames[19]="Метеор" -RandomNickNames[20]="Чудак" -RandomNickNames[21]="Пушка" -RandomNickNames[22]="Молоток" -RandomNickNames[23]="Геенна" -RandomNickNames[24]="Каланча" -RandomNickNames[25]="Спец" -RandomNickNames[26]="Вулкан" -RandomNickNames[27]="Ураган" -RandomNickNames[28]="Мусорщик" -RandomNickNames[29]="Джаггернаут" -RandomNickNames[30]="Нокаут" -RandomNickNames[31]="Конг" -RandomNickNames[32]="Бешеный пес" -RandomNickNames[33]="Крах" -RandomNickNames[34]="Лось" -RandomNickNames[35]="Нова" -RandomNickNames[36]="Пошляк" -RandomNickNames[37]="Нитро" -RandomNickNames[38]="Начальник" -RandomNickNames[39]="Питбуль" -RandomNickNames[40]="Пиротехник" -RandomNickNames[41]="Форсаж" -RandomNickNames[42]="Носорог" -RandomNickNames[43]="Ракета" -RandomNickNames[44]="Ветерок" -RandomNickNames[45]="Верзила" -RandomNickNames[46]="Громила" -RandomNickNames[47]="Злюка" -RandomNickNames[48]="Дымка" -RandomNickNames[49]="Кикимора" -RandomNickNames[50]="Тромбон" -RandomNickNames[51]="Ти-рекс" -RandomNickNames[52]="Танк" -RandomNickNames[53]="Бомбила" -RandomNickNames[54]="Гроза" -RandomNickNames[55]="Щекотка" -RandomNickNames[56]="Кроха" -RandomNickNames[57]="Титан" -RandomNickNames[58]="Динамит" -RandomNickNames[59]="Фонарь" -RandomNickNames[60]="Вояка" -RandomNickNames[61]="Ветеран" -RandomNickNames[62]="Непоседа" -;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Варвар" -RandomNickNames_Male[1]="Великан" -RandomNicknames_Male[2]="Босс" -RandomNickNames_Male[3]="Ковбой" -RandomNickNames_Male[4]="Качок" -RandomNickNames_Male[5]="Нерон" -RandomNickNames_Male[6]="Медведик" -RandomNickNames_Male[7]="Дикий" -RandomNickNames_Female[0]="Амазонка" -RandomNicknames_Female[1]="Начальница" -RandomNickNames_Female[2]="Ковбойша" -RandomNicknames_Female[3]="Домино" -RandomNickNames_Female[4]="Фрейя" -RandomNickNames_Female[5]="Медведица" -RandomNickNames_Female[6]="Каюк" -RandomNickNames_Female[7]="Бестия" -;ALPHABETICAL ORDER - -[LW_Assault X2SoldierClassTemplate] -DisplayName="Штурмовик" -ClassSummary="Штурмовики специализируются на ближнем бою, встречая противника на малых дистанциях." -LeftAbilityTreeTitle="Налетчик" -RightAbilityTreeTitle="Штурм" -;ALPHABETICAL ORDER -RandomNickNames[0]="Бандит" -RandomNickNames[1]="Блиц" -RandomNickNames[2]="Кирпич" -RandomNickNames[3]="Мясник" -RandomNickNames[4]="Фреза" -RandomNickNames[5]="Реднек" -RandomNickNames[6]="Клещи" -RandomNickNames[7]="Кобра" -RandomNickNames[8]="Пума" -RandomNickNames[9]="Койот" -RandomNickNames[10]="Облом" -RandomNickNames[11]="Бриллиант" -RandomNickNames[12]="Мордоворот" -RandomNickNames[13]="Фаталист" -RandomNickNames[14]="Вспышка" -RandomNickNames[15]="Фурия" -RandomNickNames[16]="Аллигатор" -RandomNickNames[17]="Призрак" -RandomNickNames[18]="Пушка" -RandomNickNames[19]="Кобель" -RandomNickNames[20]="Зима" -RandomNickNames[21]="Ледоруб" -RandomNickNames[22]="Челюсть" -RandomNickNames[23]="Апокалипсис" -RandomNickNames[24]="Фрик" -RandomNickNames[25]="Монстр" -RandomNickNames[26]="Мустанг" -RandomNickNames[27]="Паладин" -RandomNickNames[28]="Питбуль" -RandomNickNames[29]="Следопыт" -RandomNickNames[30]="Ринго" -RandomNickNames[31]="Самурай" -RandomNickNames[32]="Скорпион" -RandomNickNames[33]="Сёгун" -RandomNickNames[34]="Тень" -RandomNickNames[35]="Тесак" -RandomNickNames[36]="Змей" -RandomNickNames[37]="Змеиный глаз" -RandomNickNames[38]="Соло" -RandomNickNames[39]="Спектр" -RandomNickNames[40]="Паук" -RandomNickNames[41]="Сталкер" -RandomNickNames[42]="Точило" -RandomNickNames[43]="Жало" -RandomNickNames[44]="Тамплиер" -RandomNickNames[45]="Вирус" -RandomNickNames[46]="Вандал" -RandomNickNames[47]="Викинг" -RandomNickNames[48]="Надзиратель" -RandomNickNames[49]="Атаман" -RandomNickNames[50]="Росомаха" -RandomNickNames[51]="Непоседа" -RandomNickNames[52]="Дичок" -RandomNickNames[53]="Зулус" -;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Дровосек" -RandomNickNames_Male[1]="Дюк" -RandomNickNames_Male[2]="Рокки" -RandomNickNames_Male[3]="Жеребец" -RandomNickNames_Male[4]="Волколак" -;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Афина" -RandomNickNames_Female[1]="Герцогиня" -RandomNicknames_Female[2]="Железная леди" -RandomNicknames_Female[3]="Железная дева" -RandomNicknames_Female[4]="Воительница" -RandomNickNames_Female[5]="Валькирия" -;ALPHABETICAL ORDER - - diff --git a/LongWarOfTheChosen/Localization/LW_SMGPack_Integrated/XComGame.deu b/LongWarOfTheChosen/Localization/LW_SMGPack_Integrated/XComGame.deu old mode 100755 new mode 100644 index 76499a6bd..4d51709f9 Binary files a/LongWarOfTheChosen/Localization/LW_SMGPack_Integrated/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_SMGPack_Integrated/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/LW_Toolbox_Integrated.deu b/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/LW_Toolbox_Integrated.deu old mode 100755 new mode 100644 index 881a7399a..5e11b0d18 Binary files a/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/LW_Toolbox_Integrated.deu and b/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/LW_Toolbox_Integrated.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/XComGame.deu b/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/XComGame.deu old mode 100755 new mode 100644 index 3ceed2a44..ed0788fd3 Binary files a/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_Toolbox_Integrated/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Tutorial.deu b/LongWarOfTheChosen/Localization/LW_Tutorial.deu old mode 100755 new mode 100644 index bb570c27e..043e5332f Binary files a/LongWarOfTheChosen/Localization/LW_Tutorial.deu and b/LongWarOfTheChosen/Localization/LW_Tutorial.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_Tutorial.esn b/LongWarOfTheChosen/Localization/LW_Tutorial.esn index 86654e2c1..9d82a3088 100644 --- a/LongWarOfTheChosen/Localization/LW_Tutorial.esn +++ b/LongWarOfTheChosen/Localization/LW_Tutorial.esn @@ -21,16 +21,16 @@ CommandersQuartersEnteredBody="LWOTC agrega varias entradas a los Archivos XCOM ; LWOTC translated GeneralChosenTitle="Los Elegidos" -GeneralChosenBody="Un Elegido aparecerá en esta misión. En LWOTC responden a la actividad de XCOM participando sólo en represalias y misiones de la historia principal (Sitio Secreto, etc). No aparecerán en otras misiones.

"Su objetivo sigue siendo conocer la ubicación del Avenger y asaltarlo. ¡Cuidado, defenderse de él no será fácil!" +GeneralChosenBody="Un Elegido aparecerá en esta misión. En LWOTC responden a la actividad de XCOM participando sólo en represalias (de datos, suministros, reclutar, de rescatar miembros de la Resistencia e invasión). No aparecerán en otras misiones.

"Su objetivo sigue siendo conocer la ubicación del Avenger y asaltarlo. ¡Cuidado, defenderse de él no será fácil!" -TacticalChosenTitle="Los Elegidos en Combate" +TacticalChosenTitle="Los Elegidos en combate" TacticalChosenBody="Los Elegidos son mucho más peligrosos en LWOTC:
  • Son casi inmunes a los golpes críticos.
  • Toman una acción de movimiento o se preparan para el combate cada vez que las tropas les dañan durante el turno de XCOM.
  • Poseen la cualidad de secuestrar soldados desangrados que estén a su alcance a costa de un turno completo.
  • Obtienen atributos significativos al subir de nivel (usa F1 cuando les apuntes para recabar información detallada).
" AssassinSightedTitle="La Asesina" AssassinSightedBody="La Asesina reduce el daño recibido con cada golpe consecutivo que soporta en un turno. Si bien el daño de su Katana y Maremoto comienza bajo, aumentará su poder a medida que las use hasta que capture a un soldado.

Fíjate bien dónde ubicas las unidades, ya que puede usar su reacción principal para atacar a un soldado adyacente." WarlockSightedTitle="El Brujo" -WarlockSightedBody="El Brujo tiene la habilidad \"El más grande Campeón del Brujo\" que otorga beneficios al usarse en un aliado. Mientras esa unidad permanezca con vida, el brujo sufrirá significativamente menos daño. También debes tener cuidado de su Arrasar mentes, ya que aplica una ola de energía psiónica aldededor de un objetivo.

Si un soldado es controlado mentalmente ten en cuenta que en LWOTC el resto puede usar Golpe incapacitante en él." +WarlockSightedBody="El Brujo tiene la habilidad \"El más grande Campeón del Brujo\" que otorga beneficios en un aliado. Mientras esa unidad permanezca con vida, el brujo sufrirá significativamente menos daño. También debes tener cuidado de su Arrasar mentes, ya que aplica una ola de energía psiónica aldededor de un objetivo.

Si un soldado es controlado mentalmente, ten en cuenta que en LWOTC el resto del grupo puede usar Golpe incapacitante en él." HunterSightedTitle="El Cazador" HunterSightedBody="El Cazador mantendrá su distancia e intentará eliminar a los soldados desde una posición segura. Ten cuidado al acercarte: su disparo de pistola ahora desactivará las armas XCOM y también podrá lanzar sus granadas cegadoras como acción gratuita." diff --git a/LongWarOfTheChosen/Localization/LW_Tutorial.pol b/LongWarOfTheChosen/Localization/LW_Tutorial.pol new file mode 100644 index 000000000..55a7dc92d --- /dev/null +++ b/LongWarOfTheChosen/Localization/LW_Tutorial.pol @@ -0,0 +1,66 @@ +[LWTutorial] +CampaignStartTitle="Witaj w Long War of the Chosen" +CampaignStartBody="LWOTC to całkowita modyfikacja XCOM 2 WOTC, która sprawia, że kampania jest trudniejsza i przypomina wojnę partyzancką.

Możesz wyłączyć ten samouczek, wybierając opcję Zmień poziom trudności > Opcje zaawansowane w menu gry." + +[X2EventListener_Tutorial] +DroneSightedTitle="Nowy wróg: Dron" +DroneSightedBody="Drony ADVENT-u to wytrzymałe roboty-zwiadowcy o dużym zasięgu wykrywania i broni do kontroli tłumu. Często można je spotkać samotnie patrolując i mogą pojawiać się wewnątrz budynków i na dachach." +RainbowTrooperSightedTitle="Nowi wrogowie: piechota ADVENT-u" +RainbowTrooperSightedBody="Oprócz podstawowego żołnierza ADVENT dysponuje teraz różnymi jednostkami piechoty:
  • Strażnicy (niebiescy) specjalizują się w Warcie
  • Strzelcy (zieleni) noszą armatę zadającą duże obrażenia z możliwością tłumienia
  • Grenadierzy (czerwony) używają granatnika do kontroli tłumu i zadawania obrażeń
  • Rakietierzy (pomarańczowi) strzelają rakietami o dużej celności
" +HavenHighlightTitle="Przejrzyj kryjówkę" +HavenHighlightBody="Kryjówki są niezbędne w Twojej kampanii, ponieważ służą do wyszukiwania misji w regionie. Ponadto możesz kontaktować się tylko z regionami, które są połączone z istniejącą kryjówką.

Kliknij przycisk pokazany po lewej stronie, aby otworzyć ekran zarządzania Kryjówką." +FirstMissionDiscoveredTitle="Odkryto pierwszą misję" +FirstMissionDiscoveredBody="Wykryłeś swoją pierwszą misję! Następnym krokiem jest przydzielenie oddziału do infiltracji.

Większość misji ma datę ważności, a infiltracja wymaga czasu. Zwiększ swoje szanse na osiągnięcie 100% infiltracji, wysyłając więcej rebeliantów do zadań wywiadowczych. Skanowanie przystani za pomocą Avengera dostarczy informacji wywiadowczych wartych 4 rebeliantów." +FirstRetaliationTitle="Odwet ADVENT-u" +FirstRetaliationBody="ADVENT bierze odwet! Są to misje szybkiego reagowania, których nie powinieneś ignorować.

Istnieje pełny odwet, który w przypadku zignorowania lub przegrania niszczy kryjówkę, oraz odwet specyficzny dla danego zadania, który, jeśli zostanie zignorowany, zabije rebeliantów wtym zadaniu. Twój doradca kryjówki będzie dostępny podczas misji wraz z grupą rebeliantów." +CommandersQuartersEnteredTitle="LWOTC Help" +CommandersQuartersEnteredBody="LWOTC dodaje kilka wpisów do Archiwów XCOM, które bardziej szczegółowo wyjaśniają niektóre podstawowe koncepcje, takie jak infiltracja i zarządzanie kryjówką.

Możesz także przeglądać wszystkie swoje kryjówki na jednym ekranie poprzez menu Zarządzanie ruchem oporu." + +GeneralChosenTitle="Wybrańcy" +GeneralChosenBody="W tej misji pojawi się Wybraniec. W LWOTC odpowiadają na działalność XCOM, biorąc udział jedynie w odwecie (wywiad, zaopatrzenie, rekrutacja, pełne i inwazja). Nie pojawią się w innych misjach.

Ich celem w dalszym ciągu jest zdobycie wiedzy o lokalizacji Avengera i zaatakowanie go. Uwaga, obrona przed tym nie będzie łatwa!" + +TacticalChosenTitle="Wybrańcy w bitwie" +TacticalChosenBody="Wybrańcy są znacznie bardziej niebezpieczni osobiście w LWOTC:
  • Są prawie odporni na trafienia krytyczne
  • Podejmują akcję („głowna reakcja”) za każdym razem, gdy XCOM zadaje im obrażenia podczas tury XCOM
  • Mogą porywać wykrwawiających się żołnierzy z dużej odległości, kosztem pełnej tury
  • Zyskują znaczną siłą na wyższym poziomie (użyj F1, gdy namierzasz ich aby zobaczyć dokładne informacje).
" + +AssassinSightedTitle="Zabójczyni" +AssassinSightedBody="Zabójczyni zmniejsza otrzymywane obrażenia z każdym kolejnym trafieniem, jakie otrzymuje w turze. Choć jej obrażenia od Miecza i Fal są początkowo niskie, w miarę ich używania będą zwiększać swoją moc, aż do momentu, gdy schwyta żołnierza.

Uważaj na rozmieszczenie jednostek, ponieważ może ona wykorzystać swoją główną reakcję, aby ciąć sąsiadującego żołnierza." + +WarlockSightedTitle="Czarnoksiężnik" +WarlockSightedBody="Czarnoksiężnik posiada zdolność Największy Czempion Czarnoksiężnika, która może obrać za cel sojuszników. Dopóki ten sojusznik pozostanie przy życiu, Czarnoksiężnik otrzyma znacznie mniej obrażeń. Powinieneś także uważać na jego Spalenie Umysłem, które powoduje podpalenie obszaru wokół celu.

Jeśli umysł żołnierza jest kontrolowany, pamiętaj, że twoi żołnierze mogą użyć na nim Uderzenia Kolbą w LWOTC." + +HunterSightedTitle="Łowczy" +HunterSightedBody="Łowczy będzie zachowywał dystans i próbował dobijać żołnierzy z bezpiecznej pozycji. Bądź ostrożny, gdy się zbliżysz: jego strzał z pistoletu wyłączy teraz broń XCOM, a on sam może rzucać swoimi granatami błyskowymi w ramach darmowej akcji." + + +[UIScreenListener_HavenManagementTutorial] +HavenManagementTitle="Zarządzanie kryjówką" +HavenManagementBody="Kryjówki są domem dla grupy rebeliantów, którzy mogą podjąć się kilku zadań:
  • Wywiad – wykrywa misje
  • Rekrutacja – rekrutuje rebeliantów i nowicjuszy
  • Zaopatrzenie – generuje zaopatrzenie

Im więcej rebeliantów jest na służbie, tym więcej z niej zyskasz. Na razie zatrzymaj swoich rebeliantów na Wywiadzie." +; LWOTC Needs Translation (2) +HavenAdvisersTitle="Doradcy kryjówki" +HavenAdvisersBody="Kliknij pole oznaczone (1) po lewej stronie, aby przypisać doradcę do kryjówki. Możesz przypisać jednego z:
  • Żołnierza — wykrywa Beztwarzowych i pomaga w rekrutacji
  • Naukowca — zwiększa wydajność pracy Wywiadu, ale nie uczestniczy już w badaniach
  • Inżynier – zwiększa wydajność pracy Zaopatrzenia.

Wykrywanie Bezimiennych pozwala na ich eksmisję." + +[UIScreenListener_PromotionScreenTutorial] +PistolAbilitiesTutorialTitle="Umiejętności pistoletów" +PistolAbilitiesTutorialBody="Umiejętności pistoletu są dostępne dla wszystkich twoich żołnierzy po zbudowaniu Centrum szkoleniowego, z wyjątkiem SPARKów i agentów Psi. Działają z pistoletami i pistoletami automatycznymi.\n\nPrzewiń ekran w dół, aby je zobaczyć!" + +[UIScreenListener_CovertActionsTutorial] +CovertActionsTutorialTitle="Tajne działania" +CovertActionsTutorialBody="W przeciwieństwie do zwykłego WOTC, Twoim agentom może się nie udać tajne działanie. Ryzyko niepowodzenia jest zmniejszane w zależności od liczby żołnierzy biorących udział w operacji. Im wyższe rangi, tym mniejsze ryzyko niepowodzenia.

Również ryzyko zasadzki wzrasta, im bardziej tajne działania są wykonywane bez wpadnięcia w zasadzkę. Ryzyko zostaje zresetowane, gdy ktoś wpadnie w zasadzkę." + +[UIScreenListener_InitialHavenTutorial] +HavenHighlightTitle="Przejrzyj kryjówkę" +HavenHighlightBody="Kryjówki są niezbędne w Twojej kampanii, ponieważ służą do wyszukiwania misji w regionie. Ponadto możesz kontaktować się tylko z regionami, które są połączone z istniejącą kryjówką.

Kliknij przycisk pokazany po lewej stronie, aby otworzyć ekran zarządzania Kryjówką." + +[UIScreenListener_MissionBriefTutorial] +MissionBriefTutorialTitle="Odprawy Misji" +MissionBriefTutorialBody="Wygaśnięcie misji określa, jak długo będziesz musiał infiltrować misję. Im więcej informacji wywiadowczych o misji wygenerujesz dzięki pracy wywiadowczej rebeliantów, tym wcześniej wykryjesz misje i tym dłużej będziesz musiał infiltrować.

Nie musisz wykonywać każdej misji, ale powinieneś zrobić ich tyle, ile możesz. Jeśli nie masz oddziału lub nie masz wystarczająco dużo czasu, nie bój się pominąć misji." +MissionEnemyCountTitle="Liczebność wrogów" +MissionEnemyCountBody="Liczba wrogów pokazana po lewej stronie jest przybliżoną liczbą wrogów, którzy będą na misji, jeśli osiągniesz 100% infiltracji.

Niedostateczna infiltracja (nieosiągająca 100%) skutkuje większą liczbą wrogów na misji. Nadmierna infiltracja ma szansę zmniejszyć liczebność wroga." + +[UIScreenListener_SquadSelectTutorial] +SquadSelectInfiltrationTitle="Wybór oddziału" +SquadSelectInfiltrationBody="Oprócz wyboru członków drużyny, którzy są wystarczająco silni do wykonania misji, musisz także wziąć pod uwagę czas infiltracji w LWOTC.

Każdy dodatkowy członek drużyny wykładniczo wydłuża czas infiltracji wykładniczo po czwartym żołnierzu. Niektóre zdolności i przedmioty takie jak Tłumiki mogą nieco skrócić czas infiltracji." + +[UIScreenListener_InfiltratingMissionTutorial] +InfiltratingMissionTitle="Infiltruj misję" +InfiltratingMissionBody="Misję możesz infiltrować w dowolnym momencie, ale niedostateczna infiltracja utrudnia misję. Możesz wydać Wywiad, aby przyspieszyć infiltrację, dzięki czemu zakończy się ona szybciej.

Możesz przerwać infiltrację w dowolnym momencie i uruchomić ją ponownie później, jeśli misja jeszcze nie wygasła. Ponowne uruchomienie ustawia infiltrację z powrotem na 0%." diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.deu b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.deu old mode 100755 new mode 100644 index b4b49a31e..00a084341 Binary files a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.deu and b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.pol b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.pol new file mode 100644 index 000000000..cf4360662 --- /dev/null +++ b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/LW_WeaponsAndArmor.pol @@ -0,0 +1,3 @@ +[X2Ability_ThrowingKnifeAbilitySet] +RendTheMarkedEffectName="Naznaczenie" +RendTheMarkedEffectDesc="Rzut nożami nakłada kumulującą się + szansę na trafienie krytyczne przeciwko celowi ze wszystkich źródeł przez pozostałą część tury." diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.deu b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.deu old mode 100755 new mode 100644 index a9a5af63b..a894aa365 Binary files a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.deu and b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.deu differ diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.esn b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.esn index aa384c868..cc1b42b0b 100644 --- a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.esn +++ b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.esn @@ -2,8 +2,8 @@ [MusashiThrowKnifeSecondary_LW X2AbilityTemplate] LocFriendlyName="Cuchillo arrojadizo" LocFlyOverText="Cuchillo arrojadizo" -LocLongDescription="Lanza un cuchillo arrojadizo a un enemigo. No revela al Segador mientras permanece en Sombra." -LocHelpText="Lanza un cuchillo arrojadizo a un enemigo. No revela al Segador mientras permanece en Sombra." +LocLongDescription="Lanza un cuchillo arrojadizo a un enemigo. Rompe la ocultación normal pero no la de Sombra." +LocHelpText="Lanza un cuchillo arrojadizo a un enemigo. Rompe la ocultación normal pero no la de Sombra." LocPromotionPopupText=" Lanzar un cuchillo no romperá Sombra ni atraerá a los perdidos..
Esta habilidad sin embargo sí rompe la ocultación normal." [KnifeJuggler_LW X2AbilityTemplate] @@ -34,21 +34,21 @@ LocPromotionPopupText=" Tiene sólo una carga y no consume ninguna carg FriendlyName="Cuchillo arrojadizo" FriendlyNamePlural="Cuchillos arrojadizos" BriefSummary="Un cuchillo arrojadizo fabricado con nuestras aleaciones de acero convencionales más avanzadas." -TacticalText=" Lanzar un cuchillo no romperá Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." +TacticalText=" Lanzar un cuchillo romperá la ocultación básica, pero no la de Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." AbilityDescName="cuchillo arrojadizo" [ThrowingKnife_MG_Secondary X2WeaponTemplate] FriendlyName="Cuchillo arrojadizo de aleación" FriendlyNamePlural="Cuchillos arrojadizos de aleaciones" BriefSummary="Un cuchillo arrojadizo fabricado en aleaciones alienígenas." -TacticalText=" Lanzar un cuchillo no romperá Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." +TacticalText=" Lanzar un cuchillo romperá la ocultación básica, pero no la de Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." AbilityDescName="cuchillo arrojadizo" [ThrowingKnife_BM_Secondary X2WeaponTemplate] FriendlyName="Cuchillo arrojadizo de plasma" FriendlyNamePlural="Cuchillos arrojadizos de plasma" BriefSummary="Un cuchillo arrojadizo con un filo de plasma que atraviesa la armadura como si fuera mantequilla." -TacticalText=" Lanzar un cuchillo no romperá Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." +TacticalText=" Lanzar un cuchillo romperá la ocultación básica, pero no la de Sombra.
Probabilidad del % en causar sangrado, generando de daño cada turno durante turno(os)." AbilityDescName="cuchillo arrojadizo" ; End translated diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.int b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.int index 906a6a4d8..009ba1c7f 100644 --- a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.int +++ b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.int @@ -2,8 +2,8 @@ [MusashiThrowKnifeSecondary_LW X2AbilityTemplate] LocFriendlyName="Throw Knife" LocFlyOverText="Throw Knife" -LocLongDescription="Throws a single throwing knife at the target. Guaranteed to remain in Shadow." -LocHelpText="Throws a single throwing knife at the target. Guaranteed to remain in Shadow." +LocLongDescription="Throws a single throwing knife at the target. Breaks concealment, but not Shadow." +LocHelpText="Throws a single throwing knife at the target. Breaks concealment, but not Shadow." LocPromotionPopupText=" Throwing a knife will not break Shadow or attract the Lost.
This ability will break concealment." [KnifeJuggler_LW X2AbilityTemplate] @@ -34,21 +34,21 @@ LocPromotionPopupText=" Has just one charge and does not consume any st FriendlyName="Throwing Knife" FriendlyNamePlural="Throwing Knives" BriefSummary="A throwing knife made of our most advanced conventional steel alloys." -TacticalText=" Throwing a knife will not break Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." +TacticalText=" Throwing a knife breaks concealment, but not Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." AbilityDescName="throwing knife" [ThrowingKnife_MG_Secondary X2WeaponTemplate] FriendlyName="Alloy Throwing Knife" FriendlyNamePlural="Alloy Throwing Knives" BriefSummary="A throwing knife made of alien alloys." -TacticalText=" Throwing a knife will not break Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." +TacticalText=" Throwing a knife breaks concealment, but not Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." AbilityDescName="throwing knife" [ThrowingKnife_BM_Secondary X2WeaponTemplate] FriendlyName="Plasma Throwing Knife" FriendlyNamePlural="Plasma Throwing Knives" BriefSummary="A throwing knife with a plasma edge that cuts through armor like butter." -TacticalText=" Throwing a knife will not break Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." +TacticalText=" Throwing a knife breaks concealment, but not Shadow.
Has a % chance to cause bleeding, which deals damage each turn for turn(s)." AbilityDescName="throwing knife" ; End Translation (2) diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.pol b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.pol new file mode 100644 index 000000000..45c53648d --- /dev/null +++ b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.pol @@ -0,0 +1,48 @@ +[MusashiThrowKnifeSecondary_LW X2AbilityTemplate] +LocFriendlyName="Rzuć nożem" +LocFlyOverText="Rzuć nożem" +LocLongDescription="Rzuca w cel jednym nożem do rzucania. Gwarantowane pozostanie w Cieniu." +LocHelpText="Rzuca w cel jednym nożem do rzucania. Gwarantowane pozostanie w Cieniu." +LocPromotionPopupText=" Rzucenie nożem nie złamie Cienia ani nie przyciągnie Zagubionych.
Ta umiejętność przełamie ukrycie." + +[KnifeJuggler_LW X2AbilityTemplate] +LocFriendlyName="Żongler nożami" +LocFlyOverText="Żongler nożami" +LocLongDescription="Dodaje + dodatkowe obrażenia do noży do rzucania i zapewnia dodatkowe noże do rzucania. Każde zabicie bronią główną zapewnia ładunek noża." +LocHelpText="Dodaje + dodatkowe obrażenia do noży do rzucania i zapewnia dodatkowe noże do rzucania. Każde zabicie bronią główną zapewnia ładunek noża." +LocPromotionPopupText=" Dodaje + dodatkowe obrażenia do noży do rzucania.
Dodaje dodatkowe ładunki za noże do rzucania.
Każde zabicie bronią główną zapewnia ładunek noża.
" + +[Hailstorm_LW X2AbilityTemplate] +LocFriendlyName="Gradobicie" +LocFlyOverText="Gradobicie" +LocLongDescription="Rzuca trzy noże w krótkim odstępie czasu w cel. Gwarantowane pozostanie w Cieniu." +LocHelpText="Rzuca trzy noże w krótkim odstępie czasu w cel. Gwarantowane pozostanie w Cieniu." +LocPromotionPopupText=" Każdy nóż zachowuje wszelkie bonusy, takie jak obrażenia i efekty statusu, jakie ma pojedynczy rzut nożem.
Noże nie korzystają z efektów zależnych od HP celu, chyba że ograniczenie zostało spełnione zanim rzucono pierwszy nóż." + +[ThrowingKnifeFaceoff_LW X2AbilityTemplate] +LocFriendlyName="Walka z nożem" +LocFlyOverText="Walka nożem" +LocLongDescription="Rzuca nożem w każdy cel w zasięgu. Gwarantowane pozostanie w Cieniu." +LocHelpText="Rzuca nożem w każdy cel w zasięgu. Gwarantowane pozostanie w Cieniu." +LocPromotionPopupText=" Ma tylko jeden ładunek i nie zużywa żadnych standardowych ładunków noża do rzucania.
Idealny podczas flankowania wielu wrogów.
" + +[ThrowingKnife_CV_Secondary X2WeaponTemplate] +FriendlyName="Nóż do rzucania" +FriendlyNamePlural="Noże do rzucania" +BriefSummary="Nóż do rzucania wykonany z naszych najbardziej zaawansowanych konwencjonalnych stopów stali." +TacticalText=" Rzut nożem nie złamie Cienia.
Ma % szansy na wywołanie krwawienia, które zadaje obrażeń w każdej turze przez < Ability:THROWING_KNIFE_CV_BLEED_DURATION/> turę(y).” +AbilityDescName="nóż do rzucania" + +[ThrowingKnife_MG_Secondary X2WeaponTemplate] +FriendlyName="Nóż do rzucania z obcych stopów" +FriendlyNamePlural="Noże do rzucania z obcych stopów" +BriefSummary="Nóż do rzucania wykonany z obcych stopów." +TacticalText=" Rzut nożem nie złamie Cienia.
Ma % szansy na wywołanie krwawienia, które zadaje obrażeń w każdej turze przez < Ability:THROWING_KNIFE_MG_BLEED_DURATION/> tura(y).” +AbilityDescName="nóż do rzucania" + +[ThrowingKnife_BM_Secondary X2WeaponTemplate] +FriendlyName="Plazmowy nóż do rzucania" +FriendlyNamePlural="Plazmowe noże do rzucania" +BriefSummary="Nóż do rzucania z plazmowym ostrzem, który przecina zbroję jak masło." +TacticalText=" Rzut nożem nie złamie Cienia.
Ma % szansy na wywołanie krwawienia, które zadaje obrażeń w każdej turze przez tura(y).” +AbilityDescName="nóż do rzucania" diff --git a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.rus b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.rus index 9194ec93c..a3f0741d8 100644 --- a/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.rus +++ b/LongWarOfTheChosen/Localization/LW_WeaponsAndArmor/XComGame.rus @@ -9,9 +9,9 @@ LocPromotionPopupText=" Бросок ножа не снимает Те [KnifeJuggler_LW X2AbilityTemplate] LocFriendlyName="Мастер ножей" LocFlyOverText="Мастер ножей" -LocLongDescription="Добавляет + урона к броскам ножей и добавляет дополнительных." -LocHelpText="Добавляет + урона к броскам ножей и добавляет дополнительных." -LocPromotionPopupText=" Добавляет + урона к броскам ножей.
И добавляет дополнительных." +LocLongDescription="Добавляет + урона к броскам ножей и добавляет дополнительно к запасу ножей и ещё 1 за каждое убийство из основного оружия." +LocHelpText="Добавляет + урона к броскам ножей и добавляет дополнительно к запасу ножей и ещё 1 за каждое убийство из основного оружия." +LocPromotionPopupText=" Добавляет + урона к броскам ножей.
И добавляет дополнительно к запасу ножей и ещё 1 за каждое убийство из основного оружия." [Hailstorm_LW X2AbilityTemplate] LocFriendlyName="Железный ливень" diff --git a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.deu b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.deu old mode 100755 new mode 100644 index e2cbff196..37ad6ac65 Binary files a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.deu and b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.deu differ diff --git a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.fra b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.fra index b3275dd13..c36cea03c 100644 Binary files a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.fra and b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.fra differ diff --git a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.pol b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.pol index 3c61e4c79..a45180e94 100644 --- a/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.pol +++ b/LongWarOfTheChosen/Localization/PI_Integrated/PerfectInformation.pol @@ -1,13 +1,60 @@ +[PI_MCMListener] +MOD_NAME="Perfect Information" +OPTIONS_HEADER="Opcje" + +DURATION_TITLE_DAMAGE="Czas trwania uszkodzeń" +DURATION_DESCRIPTION_DAMAGE="Gwarantowany czas trwania uszkodzeń" + +FLYOVER_TITLE_XCOM="Pokaż uszkodzenia dla XCom" +FLYOVER_TITLE_ENEMY="Pokaż uszkodzenia dla przeciwników" + +REACTION_FLYOVERS_TITLE="Pokaż tylko uszkodzenia z reakcji" +AIM_ASSIST_FLYOVER_TITLE="Pokaż uszkodzenia wspomagania celowania" + +HIT_CHANCE_TITLE="Pokaż szansę na trafienie" +CRIT_CHANCE_TITLE="Pokaż szansę na trafienie krytyczne" +DODGE_CHANCE_TITLE="Pokaż szansę na unik" +MISS_CHANCE_TITLE="Pokaż szansę na pudło" + +SHORT_STRING_TITLE="użyj krótkich linii" + +SHOW_GUARANTEED_HITS_TITLE="Pokaż gwarantowane trafienia" +SHOW_GUARANTEED_MISS_TITLE="Pokaż gwarantowane pudła" + +REPEATER_TITLE="Pokaż powtarzane obrażenia" + +SHOW_ENEMY_STATS_TITLE="Pokaż podpowiedź dotyczącą statystyk wroga" + +SHOW_EXTRA_WEAPONSTATS_TITLE="Pokaż dodatkowe statystyki broni" + +SHOW_AIM_ASSIST_MAIN_HUD_TITLE="Pokaż wspomaganie celowania w oknie strzału" +SHOW_MISS_CHANCE_MAIN_HUD_TITLE="Pokaż szansę na pudło w oknie strzału" + +AIM_LEFT_OF_CRIT_TITLE="Pokaż pozostałe celowanie krytyczne na pasku strzału" +PREVIEW_MINIMUM_TITLE="Podgląd uszkodzeń pokazuje minimum" +SHOW_DODGE_TITLE="Pokaż unik w oknie strzału" +SHOW_CRIT_DMG_TITLE="Pokaż obrażenia krytyczne w oknie strzału" +PREVIEW_HACKING_TITLE="Podgląd hackowania" + +SHOW_AIM_ASSIST_OVER_ENEMY_ICON_TITLE="Pokaż asysty celowania nad ikoną wroga" +SHOW_MISS_CHANCE_OVER_ENEMY_ICON_TITLE="Pokaż ikonę nieudanej szansy nad wrogiem" + +SHOW_ALWAYS_SHOT_breakDOWN_HUD_TITLE="Zawsze pokazuj zestawienie strzałów" +SHOW_MISS_CHANCE_breakDOWN_HUD_TITLE="Pokaż zestawienie szans na wygraną" +SHOW_AIM_ASSIST_breakDOWN_HUD_TITLE="Pokaż zestawienie wspomagania celowania" + [XCom_Perfect_Information_X2Action_ApplyWeaponDamageToUnit] +//HIT_CHANCE_MSG ="TRAFIENIE:"; HIT_CHANCE_MSG ="TRAFIENIE:"; CRIT_CHANCE_MSG ="TRAF. KRYTYCZNE:"; +//DODGE_CHANCE_MSG ="UNIK:"; DODGE_CHANCE_MSG ="UNIK:"; MISS_CHANCE_MSG ="PUDŁO:"; -GUARANTEED_HIT_MSG ="- GWARANTOWANE TRAFIENIE"; -GUARANTEED_MISS_MSG ="- GWARANTOWANE PUDŁO"; +GUARANTEED_HIT_MSG =" - GWARANTOWANE TRAFIENIE"; +GUARANTEED_MISS_MSG =" - GWARANTOWANE PUDŁO"; -REPEATER_KILL_MSG ="- Automat:"; +REPEATER_KILL_MSG =" - Seria zabójstw: "; [XCom_Perfect_Information_UITacticalHUD_ShotWings] LOWER_DIFFICULTY_MSG = "NISKI POZ. TRUDNOŚCI"; @@ -16,8 +63,13 @@ SOLDIER_LOST_BONUS = "BONUS ZA UTRATĘ ŻOŁNIERZA"; [XCom_Perfect_Information_UITacticalHUD_SoldierInfoTooltip] KILLS_LABEL = "Zabójstwa"; -ASSIST_LABEL = "Asysta"; +ASSIST_LABEL = "Asysty"; FLANKING_CRIT_LABEL = "Traf. kryt. z flanki"; +[XCom_Perfect_Information_UITacticalHUD_EnemyTooltip] +PrimaryBase = „Podstawa obrażeń” +PrimarySpread = „Rozprzestrzenianie się obrażeń” +PrimaryPlusOne = „Obrażenia +1” + [XCom_Perfect_Information_UIEffectListItem] TURNS_REMAINING = "POZOSTAŁO TUR" diff --git a/LongWarOfTheChosen/Localization/Parcels/lg_GeneClinic_01_LW.fra b/LongWarOfTheChosen/Localization/Parcels/lg_GeneClinic_01_LW.fra index 7988f26e9..aa3674d9c 100644 Binary files a/LongWarOfTheChosen/Localization/Parcels/lg_GeneClinic_01_LW.fra and b/LongWarOfTheChosen/Localization/Parcels/lg_GeneClinic_01_LW.fra differ diff --git a/LongWarOfTheChosen/Localization/Parcels/lg_PropagandaCenter_02_LW.fra b/LongWarOfTheChosen/Localization/Parcels/lg_PropagandaCenter_02_LW.fra index 1d73aa84d..d10d0d744 100644 Binary files a/LongWarOfTheChosen/Localization/Parcels/lg_PropagandaCenter_02_LW.fra and b/LongWarOfTheChosen/Localization/Parcels/lg_PropagandaCenter_02_LW.fra differ diff --git a/LongWarOfTheChosen/Localization/Parcels/md_Advent_Security_03_LW.fra b/LongWarOfTheChosen/Localization/Parcels/md_Advent_Security_03_LW.fra index b0d75b874..255d1e390 100644 Binary files a/LongWarOfTheChosen/Localization/Parcels/md_Advent_Security_03_LW.fra and b/LongWarOfTheChosen/Localization/Parcels/md_Advent_Security_03_LW.fra differ diff --git a/LongWarOfTheChosen/Localization/Parcels/md_AlienEntertainment_01_LW.fra b/LongWarOfTheChosen/Localization/Parcels/md_AlienEntertainment_01_LW.fra index 9eebeb066..1e6cbc2a5 100644 Binary files a/LongWarOfTheChosen/Localization/Parcels/md_AlienEntertainment_01_LW.fra and b/LongWarOfTheChosen/Localization/Parcels/md_AlienEntertainment_01_LW.fra differ diff --git a/LongWarOfTheChosen/Localization/Parcels/md_geneclinic_01_LW.fra b/LongWarOfTheChosen/Localization/Parcels/md_geneclinic_01_LW.fra index 187302bc9..fec15ebb7 100644 Binary files a/LongWarOfTheChosen/Localization/Parcels/md_geneclinic_01_LW.fra and b/LongWarOfTheChosen/Localization/Parcels/md_geneclinic_01_LW.fra differ diff --git a/LongWarOfTheChosen/Localization/XComGame.chn b/LongWarOfTheChosen/Localization/XComGame.chn index e0eef68b5..73c909faa 100644 --- a/LongWarOfTheChosen/Localization/XComGame.chn +++ b/LongWarOfTheChosen/Localization/XComGame.chn @@ -188,7 +188,7 @@ LocFriendlyName="驱逐" LocFlyOverText="驱逐" LocLongDescription="特殊的火焰喷射器射击,只能造成有限的伤害,但是能迫使敌人移动位置。" LocHelpText="特殊的火焰喷射器射击,迫使敌人移动位置。" -LocPromotionPopupText=" 造成有限的伤害,有20%的几率使区域内的敌人着火。
狭窄的火焰喷射对环境影响较小。
被击中的单位将被迫移动,会触发反应射击。
每个任务可用一次,但是能够通过更高级的装备来获得额外的使用次数。
隐蔽状态时不能使用。" +LocPromotionPopupText=" 造成有限的伤害,有75%的概率使区域内的敌人着火。
狭窄的火焰喷射对环境影响较小。
被击中的单位将被迫移动,会触发反应射击。
每个任务可用一次,但是能够通过更高级的装备来获得额外的使用次数。
隐蔽状态时不能使用。" ; LWOTC Needs Translation (2) [Burnout X2AbilityTemplate] @@ -268,13 +268,14 @@ LocLongDescription="用你的臂套造成的攻击以及臂套武器制造的火 LocHelpText="用你的臂套造成的攻击以及臂套武器制造的火焰,能造成+1的伤害。" LocPromotionPopupText=" 用你的臂套造成的攻击以及臂套武器制造的火焰,能造成+1的伤害。
该加成适用与火箭发射器和火焰喷射器武器,以及它们造成的火焰。
" -; LWOTC Needs Translation (2) +; LWOTC Translated (4) [ConcussionRocket X2AbilityTemplate] LocFriendlyName="震荡火箭" LocFlyOverText="震荡火箭" -LocLongDescription="发射一枚特殊的火箭,造成的伤害有限但是有几率使范围内的有机体敌人眩晕或混乱,并留下烟雾。" -LocHelpText="一种特殊的火箭能够使目标眩晕或混乱,并留下烟雾。" -LocPromotionPopupText=" 每次任务1充能。
眩晕几率基于目标的意志和士兵臂套的层级。
混乱几率基于目标的意志。
需要1个行动点并结束士兵的回合。
精英原典和灵能僵尸免疫所有效果,包括伤害。
外星人免疫此伤害。
" +LocLongDescription="发射一枚特殊的火箭,造成的伤害有限但是有几率使范围内的有机敌人眩晕或混乱。" +LocHelpText="一种特殊的火箭,能够使目标眩晕或混乱" +LocPromotionPopupText=" 每次任务1充能。
眩晕几率为20%。
混乱几率为100%,无视混乱抵抗(但不会无视免疫)。
需要1个行动点并结束士兵的回合。
精英原典和灵能僵尸免疫所有效果,包括伤害。
盟友不会受到这次攻击的伤害。
" +; End Translated ;;;;;;;;;;;;;;;;;;;; SHINOBI ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; @@ -463,6 +464,11 @@ LocPromotionPopupText=" 枪林弹雨消耗弹药 [ChainShot X2AbilityTemplate] LocPromotionPopupText=" 连环射击消耗弹药。
连环射击有回合冷却时间。
连环射击可以对无掩体敌人(如狂战士,机械敌人)造成毁灭性的打击,或者增加命中加成。
" +[ChainShotSnapShot X2AbilityTemplate] +LocFriendlyName="连环射击(急射)" +LocPromotionPopupText=" 连环射击消耗弹药。
连环射击有回合冷却时间。
连环射击可以对无掩体敌人(如狂战士,机械敌人)造成毁灭性的打击,或者增加命中加成。
" + + [SaturationFire X2AbilityTemplate] LocPromotionPopupText=" 饱和火力消耗弹药。
饱和火力有回合冷却时间。
饱和火力将对锥型范围内的每一个敌人进行标准射击,并将损坏或摧毁锥型范围内随机的掩体。
" ;End Translation @@ -1507,74 +1513,74 @@ RightAbilityTreeTitle="爆破员" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="天使" -RandomNickNames[1]="贝塔" -RandomNickNames[2]="主教" -RandomNickNames[3]="骨头" -RandomNickNames[4]="粉碎者" -RandomNickNames[5]="中间人" -RandomNickNames[6]="秘密成员" -RandomNickNames[7]="网络" -RandomNickNames[8]="密码" -RandomNickNames[9]="数据" -RandomNickNames[10]="执事" -RandomNickNames[11]="兴奋剂博士" -RandomNickNames[12]="医生" -RandomNickNames[13]="反噬" -RandomNickNames[14]="防火墙" -RandomNickNames[15]="天才" -RandomNickNames[16]="发明家" -RandomNickNames[17]="故障" -RandomNickNames[18]="劫匪" -RandomNickNames[19]="干扰机" -RandomNickNames[20]="小丑" -RandomNickNames[21]="震动" -RandomNickNames[22]="闪电" -RandomNickNames[23]="求救" -RandomNickNames[24]="百万" -RandomNickNames[25]="牛顿" -RandomNickNames[26]="极限超载" -RandomNickNames[27]="补丁" -RandomNickNames[28]="教授" -RandomNickNames[29]="拉格泰姆" -RandomNickNames[30]="流氓" -RandomNickNames[31]="话痨" -RandomNickNames[32]="赤红" -RandomNickNames[33]="裂痕" -RandomNickNames[34]="开伞索" -RandomNickNames[35]="无赖" -RandomNickNames[36]="焦痕" -RandomNickNames[37]="哨兵" -RandomNickNames[38]="阴暗" -RandomNickNames[39]="奶昔" -RandomNickNames[40]="变形怪" -RandomNickNames[41]="畏缩" -RandomNickNames[42]="滑块" -RandomNickNames[43]="太阳能" -RandomNickNames[44]="声呐" -RandomNickNames[45]="火花" -RandomNickNames[46]="缝合" -RandomNickNames[47]="敲击者" -RandomNickNames[48]="泪珠" -RandomNickNames[49]="修理工" -RandomNickNames[50]="漩涡" -RandomNickNames[51]="毒液" -RandomNickNames[52]="蒸汽" -RandomNickNames[53]="军机" -RandomNickNames[54]="典狱长" -RandomNickNames[55]="威士忌" -RandomNickNames[56]="野小子" -RandomNickNames[57]="祖鲁" ++RandomNickNames="天使" ++RandomNickNames="贝塔" ++RandomNickNames="主教" ++RandomNickNames="骨头" ++RandomNickNames="粉碎者" ++RandomNickNames="中间人" ++RandomNickNames="秘密成员" ++RandomNickNames="网络" ++RandomNickNames="密码" ++RandomNickNames="数据" ++RandomNickNames="执事" ++RandomNickNames="兴奋剂博士" ++RandomNickNames="医生" ++RandomNickNames="反噬" ++RandomNickNames="防火墙" ++RandomNickNames="天才" ++RandomNickNames="发明家" ++RandomNickNames="故障" ++RandomNickNames="劫匪" ++RandomNickNames="干扰机" ++RandomNickNames="小丑" ++RandomNickNames="震动" ++RandomNickNames="闪电" ++RandomNickNames="求救" ++RandomNickNames="百万" ++RandomNickNames="牛顿" ++RandomNickNames="极限超载" ++RandomNickNames="补丁" ++RandomNickNames="教授" ++RandomNickNames="拉格泰姆" ++RandomNickNames="流氓" ++RandomNickNames="话痨" ++RandomNickNames="赤红" ++RandomNickNames="裂痕" ++RandomNickNames="开伞索" ++RandomNickNames="无赖" ++RandomNickNames="焦痕" ++RandomNickNames="哨兵" ++RandomNickNames="阴暗" ++RandomNickNames="奶昔" ++RandomNickNames="变形怪" ++RandomNickNames="畏缩" ++RandomNickNames="滑块" ++RandomNickNames="太阳能" ++RandomNickNames="声呐" ++RandomNickNames="火花" ++RandomNickNames="缝合" ++RandomNickNames="敲击者" ++RandomNickNames="泪珠" ++RandomNickNames="修理工" ++RandomNickNames="漩涡" ++RandomNickNames="毒液" ++RandomNickNames="蒸汽" ++RandomNickNames="军机" ++RandomNickNames="典狱长" ++RandomNickNames="威士忌" ++RandomNickNames="野小子" ++RandomNickNames="祖鲁" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="甜心" -RandomNickNames_Male[1]="魔术师" -RandomNickNames_Male[2]="牧师" -RandomNickNames_Male[3]="雨人" -RandomNickNames_Male[4]="公鸡" -RandomNickNames_Female[0]="女祭司" -RandomNickNames_Female[1]="狼母" -RandomNickNames_Female[2]="黑寡妇" -RandomNickNames_Female[4]="公爵夫人" ++RandomNickNames_Male="甜心" ++RandomNickNames_Male="魔术师" ++RandomNickNames_Male="牧师" ++RandomNickNames_Male="雨人" ++RandomNickNames_Male="公鸡" ++RandomNickNames_Female="女祭司" ++RandomNickNames_Female="狼母" ++RandomNickNames_Female="黑寡妇" ++RandomNickNames_Female="公爵夫人" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1590,74 +1596,74 @@ RightAbilityTreeTitle="黑客" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="天使" -RandomNickNames[1]="贝塔" -RandomNickNames[2]="主教" -RandomNickNames[3]="骨头" -RandomNickNames[4]="粉碎者" -RandomNickNames[5]="中间人" -RandomNickNames[6]="秘密成员" -RandomNickNames[7]="网络" -RandomNickNames[8]="密码" -RandomNickNames[9]="数据" -RandomNickNames[10]="执事" -RandomNickNames[11]="兴奋剂博士" -RandomNickNames[12]="医生" -RandomNickNames[13]="反噬" -RandomNickNames[14]="防火墙" -RandomNickNames[15]="天才" -RandomNickNames[16]="发明家" -RandomNickNames[17]="故障" -RandomNickNames[18]="劫匪" -RandomNickNames[19]="干扰机" -RandomNickNames[20]="小丑" -RandomNickNames[21]="震动" -RandomNickNames[22]="闪电" -RandomNickNames[23]="求救" -RandomNickNames[24]="百万" -RandomNickNames[25]="牛顿" -RandomNickNames[26]="极限超载" -RandomNickNames[27]="补丁" -RandomNickNames[28]="教授" -RandomNickNames[29]="拉格泰姆" -RandomNickNames[30]="流氓" -RandomNickNames[31]="话痨" -RandomNickNames[32]="赤红" -RandomNickNames[33]="裂痕" -RandomNickNames[34]="开伞索" -RandomNickNames[35]="无赖" -RandomNickNames[36]="焦痕" -RandomNickNames[37]="哨兵" -RandomNickNames[38]="阴暗" -RandomNickNames[39]="奶昔" -RandomNickNames[40]="变形怪" -RandomNickNames[41]="畏缩" -RandomNickNames[42]="滑块" -RandomNickNames[43]="太阳能" -RandomNickNames[44]="声呐" -RandomNickNames[45]="火花" -RandomNickNames[46]="缝合" -RandomNickNames[47]="敲击者" -RandomNickNames[48]="泪珠" -RandomNickNames[49]="修理工" -RandomNickNames[50]="漩涡" -RandomNickNames[51]="毒液" -RandomNickNames[52]="蒸汽" -RandomNickNames[53]="军机" -RandomNickNames[54]="典狱长" -RandomNickNames[55]="威士忌" -RandomNickNames[56]="野小子" -RandomNickNames[57]="祖鲁" ++RandomNickNames="天使" ++RandomNickNames="贝塔" ++RandomNickNames="主教" ++RandomNickNames="骨头" ++RandomNickNames="粉碎者" ++RandomNickNames="中间人" ++RandomNickNames="秘密成员" ++RandomNickNames="网络" ++RandomNickNames="密码" ++RandomNickNames="数据" ++RandomNickNames="执事" ++RandomNickNames="兴奋剂博士" ++RandomNickNames="医生" ++RandomNickNames="反噬" ++RandomNickNames="防火墙" ++RandomNickNames="天才" ++RandomNickNames="发明家" ++RandomNickNames="故障" ++RandomNickNames="劫匪" ++RandomNickNames="干扰机" ++RandomNickNames="小丑" ++RandomNickNames="震动" ++RandomNickNames="闪电" ++RandomNickNames="求救" ++RandomNickNames="百万" ++RandomNickNames="牛顿" ++RandomNickNames="极限超载" ++RandomNickNames="补丁" ++RandomNickNames="教授" ++RandomNickNames="拉格泰姆" ++RandomNickNames="流氓" ++RandomNickNames="话痨" ++RandomNickNames="赤红" ++RandomNickNames="裂痕" ++RandomNickNames="开伞索" ++RandomNickNames="无赖" ++RandomNickNames="焦痕" ++RandomNickNames="哨兵" ++RandomNickNames="阴暗" ++RandomNickNames="奶昔" ++RandomNickNames="变形怪" ++RandomNickNames="畏缩" ++RandomNickNames="滑块" ++RandomNickNames="太阳能" ++RandomNickNames="声呐" ++RandomNickNames="火花" ++RandomNickNames="缝合" ++RandomNickNames="敲击者" ++RandomNickNames="泪珠" ++RandomNickNames="修理工" ++RandomNickNames="漩涡" ++RandomNickNames="毒液" ++RandomNickNames="蒸汽" ++RandomNickNames="军机" ++RandomNickNames="典狱长" ++RandomNickNames="威士忌" ++RandomNickNames="野小子" ++RandomNickNames="祖鲁" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="甜心" -RandomNickNames_Male[1]="魔术师" -RandomNickNames_Male[2]="牧师" -RandomNickNames_Male[3]="雨人" -RandomNickNames_Male[4]="公鸡" -RandomNickNames_Female[0]="女祭司" -RandomNickNames_Female[1]="狼母" -RandomNickNames_Female[2]="黑寡妇" -RandomNickNames_Female[4]="公爵夫人" ++RandomNickNames_Male="甜心" ++RandomNickNames_Male="魔术师" ++RandomNickNames_Male="牧师" ++RandomNickNames_Male="雨人" ++RandomNickNames_Male="公鸡" ++RandomNickNames_Female="女祭司" ++RandomNickNames_Female="狼母" ++RandomNickNames_Female="黑寡妇" ++RandomNickNames_Female="公爵夫人" ;ALPHABETICAL ORDER @@ -1674,86 +1680,86 @@ RightAbilityTreeTitle="辅助兵" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="陀螺" -RandomNickNames[1]="全力以赴" -RandomNickNames[2]="禽兽" -RandomNickNames[3]="发球机" -RandomNickNames[4]="大国家" -RandomNickNames[5]="大亨" -RandomNickNames[6]="大淘气" -RandomNickNames[7]="闪耀" -RandomNickNames[8]="爆弹" -RandomNickNames[9]="轰炸机" -RandomNickNames[10]="伙伴" -RandomNickNames[11]="斗牛犬" -RandomNickNames[12]="蛮牛" -RandomNickNames[13]="大剑" -RandomNickNames[14]="示威者" -RandomNickNames[15]="戒备者" -RandomNickNames[16]="魔犬" -RandomNickNames[17]="柴油机" -RandomNickNames[18]="安可" -RandomNickNames[19]="火球" -RandomNickNames[20]="冰箱" -RandomNickNames[21]="枪手" -RandomNickNames[22]="战锤" -RandomNickNames[23]="地狱火" -RandomNickNames[24]="高塔" -RandomNickNames[25]="霍斯" -RandomNickNames[26]="爆发" -RandomNickNames[27]="飓风" -RandomNickNames[28]="垃圾场" -RandomNickNames[29]="主宰" -RandomNickNames[30]="击倒" -RandomNickNames[31]="空" -RandomNickNames[32]="狂犬" -RandomNickNames[33]="融化" -RandomNickNames[34]="驼鹿" -RandomNickNames[35]="新星" -RandomNickNames[36]="卑鄙" -RandomNickNames[37]="硝基" -RandomNickNames[38]="霸主" -RandomNickNames[39]="斗兽犬" -RandomNickNames[40]="纵火狂" -RandomNickNames[41]="红线" -RandomNickNames[42]="犀牛" -RandomNickNames[43]="火箭" -RandomNickNames[44]="海风" -RandomNickNames[45]="厚板" -RandomNickNames[46]="碎击" -RandomNickNames[47]="喷火怪" -RandomNickNames[48]="烟幕" -RandomNickNames[49]="沼怪" -RandomNickNames[50]="丁字牛排" -RandomNickNames[51]="霸王龙" -RandomNickNames[52]="坦克" -RandomNickNames[53]="重击" -RandomNickNames[54]="迅雷" -RandomNickNames[55]="开心果" -RandomNickNames[56]="矮子" -RandomNickNames[57]="泰坦" -RandomNickNames[58]="炸药桶" -RandomNickNames[59]="火炬" -RandomNickNames[60]="战犬" -RandomNickNames[61]="战马" -RandomNickNames[62]="熊孩子" ++RandomNickNames="陀螺" ++RandomNickNames="全力以赴" ++RandomNickNames="禽兽" ++RandomNickNames="发球机" ++RandomNickNames="大国家" ++RandomNickNames="大亨" ++RandomNickNames="大淘气" ++RandomNickNames="闪耀" ++RandomNickNames="爆弹" ++RandomNickNames="轰炸机" ++RandomNickNames="伙伴" ++RandomNickNames="斗牛犬" ++RandomNickNames="蛮牛" ++RandomNickNames="大剑" ++RandomNickNames="示威者" ++RandomNickNames="戒备者" ++RandomNickNames="魔犬" ++RandomNickNames="柴油机" ++RandomNickNames="安可" ++RandomNickNames="火球" ++RandomNickNames="冰箱" ++RandomNickNames="枪手" ++RandomNickNames="战锤" ++RandomNickNames="地狱火" ++RandomNickNames="高塔" ++RandomNickNames="霍斯" ++RandomNickNames="爆发" ++RandomNickNames="飓风" ++RandomNickNames="垃圾场" ++RandomNickNames="主宰" ++RandomNickNames="击倒" ++RandomNickNames="空" ++RandomNickNames="狂犬" ++RandomNickNames="融化" ++RandomNickNames="驼鹿" ++RandomNickNames="新星" ++RandomNickNames="卑鄙" ++RandomNickNames="硝基" ++RandomNickNames="霸主" ++RandomNickNames="斗兽犬" ++RandomNickNames="纵火狂" ++RandomNickNames="红线" ++RandomNickNames="犀牛" ++RandomNickNames="火箭" ++RandomNickNames="海风" ++RandomNickNames="厚板" ++RandomNickNames="碎击" ++RandomNickNames="喷火怪" ++RandomNickNames="烟幕" ++RandomNickNames="沼怪" ++RandomNickNames="丁字牛排" ++RandomNickNames="霸王龙" ++RandomNickNames="坦克" ++RandomNickNames="重击" ++RandomNickNames="迅雷" ++RandomNickNames="开心果" ++RandomNickNames="矮子" ++RandomNickNames="泰坦" ++RandomNickNames="炸药桶" ++RandomNickNames="火炬" ++RandomNickNames="战犬" ++RandomNickNames="战马" ++RandomNickNames="熊孩子" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="野蛮人" -RandomNickNames_Male[1]="大男孩" -RandomNicknames_Male[2]="老大" -RandomNickNames_Male[3]="牛仔" -RandomNickNames_Male[4]="笨蛋" -RandomNickNames_Male[5]="暴君" -RandomNickNames_Male[6]="爸爸熊" -RandomNickNames_Male[7]="野人" -RandomNickNames_Female[0]="亚马逊" -RandomNicknames_Female[1]="大姐大" -RandomNickNames_Female[2]="牛仔妹" -RandomNicknames_Female[3]="多米诺" -RandomNickNames_Female[4]="芙蕾雅" -RandomNickNames_Female[5]="妈妈熊" -RandomNickNames_Female[6]="埋葬者" -RandomNickNames_Female[7]="纵火狂" ++RandomNickNames_Male="野蛮人" ++RandomNickNames_Male="大男孩" ++RandomNickNames_Male="老大" ++RandomNickNames_Male="牛仔" ++RandomNickNames_Male="笨蛋" ++RandomNickNames_Male="暴君" ++RandomNickNames_Male="爸爸熊" ++RandomNickNames_Male="野人" ++RandomNickNames_Female="亚马逊" ++RandomNickNames_Female="大姐大" ++RandomNickNames_Female="牛仔妹" ++RandomNickNames_Female="多米诺" ++RandomNickNames_Female="芙蕾雅" ++RandomNickNames_Female="妈妈熊" ++RandomNickNames_Female="埋葬者" ++RandomNickNames_Female="纵火狂" ;ALPHABETICAL ORDER @@ -1769,42 +1775,42 @@ RightAbilityTreeTitle="机枪手" +AbilityTreeTitles[3]="XCOM" +AbilityTreeTitles[4]="手枪" -RandomNickNames[0]="走火" -RandomNickNames[1]="巴哈" -RandomNickNames[2]="熊狸" -RandomNickNames[3]="残酷" -RandomNickNames[4]="电锯" -RandomNickNames[5]="比目鱼" -RandomNickNames[6]="节目" -RandomNickNames[7]="傻瓜" -RandomNickNames[8]="小贩" -RandomNickNames[9]="星兹" -RandomNickNames[10]="便当" -RandomNickNames[11]="碾压机" -RandomNickNames[12]="肉钩" -RandomNickNames[13]="驼鹿" -RandomNickNames[14]="纳努克" -RandomNickNames[15]="炸鸡块" -RandomNickNames[16]="核弹" -RandomNickNames[17]="食人魔" -RandomNickNames[18]="煎饼" -RandomNickNames[19]="装甲车" -RandomNickNames[20]="活塞" -RandomNickNames[21]="投石者" -RandomNickNames[22]="麻雀" -RandomNickNames[23]="尖刺" -RandomNickNames[24]="修行者" -RandomNickNames[25]="扎菲尔" -RandomNickNames_Male[0]="哈哈" -RandomNickNames_Male[1]="呆呆" -RandomNickNames_Male[2]="疯子" -RandomNickNames_Male[3]="拳套" -RandomNickNames_Male[4]="海象" -RandomNickNames_Female[0]="泡泡" -RandomNickNames_Female[1]="小玩意儿" -RandomNickNames_Female[2]="嘻嘻" -RandomNickNames_Female[3]="芒果" -RandomNickNames_Female[4]="胡椒粉" ++RandomNickNames="走火" ++RandomNickNames="巴哈" ++RandomNickNames="熊狸" ++RandomNickNames="残酷" ++RandomNickNames="电锯" ++RandomNickNames="比目鱼" ++RandomNickNames="节目" ++RandomNickNames="傻瓜" ++RandomNickNames="小贩" ++RandomNickNames="星兹" ++RandomNickNames="便当" ++RandomNickNames="碾压机" ++RandomNickNames="肉钩" ++RandomNickNames="驼鹿" ++RandomNickNames="纳努克" ++RandomNickNames="炸鸡块" ++RandomNickNames="核弹" ++RandomNickNames="食人魔" ++RandomNickNames="煎饼" ++RandomNickNames="装甲车" ++RandomNickNames="活塞" ++RandomNickNames="投石者" ++RandomNickNames="麻雀" ++RandomNickNames="尖刺" ++RandomNickNames="修行者" ++RandomNickNames="扎菲尔" ++RandomNickNames_Male="哈哈" ++RandomNickNames_Male="呆呆" ++RandomNickNames_Male="疯子" ++RandomNickNames_Male="拳套" ++RandomNickNames_Male="海象" ++RandomNickNames_Female="泡泡" ++RandomNickNames_Female="小玩意儿" ++RandomNickNames_Female="嘻嘻" ++RandomNickNames_Female="芒果" ++RandomNickNames_Female="胡椒粉" [LWS_Ranger X2SoldierClassTemplate] @@ -1819,43 +1825,43 @@ RightAbilityTreeTitle="守卫" +AbilityTreeTitles[3]="XCOM" +AbilityTreeTitles[4]="手枪" -RandomNickNames[0]="野马" -RandomNickNames[1]="雄鹿" -RandomNickNames[2]="牛眼" -RandomNickNames[3]="钴" -RandomNickNames[4]="牛仔" -RandomNickNames[5]="挖掘机" -RandomNickNames[6]="全垒打" -RandomNickNames[7]="冰霜" -RandomNickNames[8]="呼噜" -RandomNickNames[9]="好莱坞" -RandomNickNames[10]="霍斯" -RandomNickNames[11]="吼猴" -RandomNickNames[12]="松鸦" -RandomNickNames[13]="苍鹰" -RandomNickNames[14]="法官" -RandomNickNames[15]="马林鱼" -RandomNickNames[16]="野马" -RandomNickNames[17]="浆糊" -RandomNickNames[18]="画家" -RandomNickNames[19]="杂毛" -RandomNickNames[20]="流氓" -RandomNickNames[21]="坚岩" -RandomNickNames[22]="踏板车" -RandomNickNames[23]="蚊子" -RandomNickNames[24]="打滑" -RandomNickNames[25]="弹性" -RandomNickNames[26]="重击" -RandomNickNames[27]="狼人" -RandomNickNames_Male[0]="灰尘" -RandomNickNames_Male[1]="荷兰的" -RandomNickNames_Male[2]="剥皮机" -RandomNickNames_Male[3]="滑头" -RandomNickNames_Male[4]="爆炸" -RandomNickNames_Female[0]="姨妈" -RandomNickNames_Female[1]="晚安" -RandomNickNames_Female[2]="美杜莎" -RandomNickNames_Female[3]="宝贝" ++RandomNickNames="野马" ++RandomNickNames="雄鹿" ++RandomNickNames="牛眼" ++RandomNickNames="钴" ++RandomNickNames="牛仔" ++RandomNickNames="挖掘机" ++RandomNickNames="全垒打" ++RandomNickNames="冰霜" ++RandomNickNames="呼噜" ++RandomNickNames="好莱坞" ++RandomNickNames="霍斯" ++RandomNickNames="吼猴" ++RandomNickNames="松鸦" ++RandomNickNames="苍鹰" ++RandomNickNames="法官" ++RandomNickNames="马林鱼" ++RandomNickNames="野马" ++RandomNickNames="浆糊" ++RandomNickNames="画家" ++RandomNickNames="杂毛" ++RandomNickNames="流氓" ++RandomNickNames="坚岩" ++RandomNickNames="踏板车" ++RandomNickNames="蚊子" ++RandomNickNames="打滑" ++RandomNickNames="弹性" ++RandomNickNames="重击" ++RandomNickNames="狼人" ++RandomNickNames_Male="灰尘" ++RandomNickNames_Male="荷兰的" ++RandomNickNames_Male="剥皮机" ++RandomNickNames_Male="滑头" ++RandomNickNames_Male="爆炸" ++RandomNickNames_Female="姨妈" ++RandomNickNames_Female="晚安" ++RandomNickNames_Female="美杜莎" ++RandomNickNames_Female="宝贝" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1871,79 +1877,79 @@ RightAbilityTreeTitle="射手" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="顶端" -RandomNickNames[1]="王牌" -RandomNickNames[2]="余波" -RandomNickNames[3]="阿尔法" -RandomNickNames[4]="黑杰克" -RandomNickNames[5]="靶眼" -RandomNickNames[6]="闪电" -RandomNickNames[7]="权贵" -RandomNickNames[8]="瞌睡虫" -RandomNickNames[9]="巨大成功" -RandomNickNames[10]="老板" -RandomNickNames[11]="靶眼" -RandomNickNames[12]="将军" -RandomNickNames[13]="首领" -RandomNickNames[14]="小马驹" -RandomNickNames[15]="达拉斯" -RandomNickNames[16]="门栓" -RandomNickNames[17]="致命射手" -RandomNickNames[18]="暗锁" -RandomNickNames[19]="朽木" -RandomNickNames[20]="D.O.A." -RandomNickNames[21]="鹰眼" -RandomNickNames[22]="八号球" -RandomNickNames[23]="平线" -RandomNickNames[24]="游戏时间" -RandomNickNames[25]="恶棍" -RandomNickNames[26]="掘墓人" -RandomNickNames[27]="帽子戏法" -RandomNickNames[28]="鹰目" -RandomNickNames[29]="加热器" -RandomNickNames[30]="正午" -RandomNickNames[31]="职业杀手" -RandomNickNames[32]="好莱坞" -RandomNickNames[33]="炒作" -RandomNickNames[34]="偶像" -RandomNickNames[35]="豺狼" -RandomNickNames[36]="法官" -RandomNickNames[37]="余光" -RandomNickNames[38]="禁闭" -RandomNickNames[39]="远投高手" -RandomNickNames[40]="徒步者" -RandomNickNames[41]="刺针" -RandomNickNames[42]="苍白骑士" -RandomNickNames[43]="死神" -RandomNickNames[44]="抓痕" -RandomNickNames[45]="连环杀戮" -RandomNickNames[46]="警长" -RandomNickNames[47]="枪手" -RandomNickNames[48]="表演时间" -RandomNickNames[49]="滑头" -RandomNickNames[50]="投石者" -RandomNickNames[51]="冷血" -RandomNickNames[52]="清洁工" -RandomNickNames[53]="小孩" -RandomNickNames[54]="真相" -RandomNickNames[55]="墓碑" -RandomNickNames[56]="大腕" -RandomNickNames[57]="高层货架" -RandomNickNames[58]="双击" -RandomNickNames[59]="送葬者" -RandomNickNames[60]="情人" ++RandomNickNames="顶端" ++RandomNickNames="王牌" ++RandomNickNames="余波" ++RandomNickNames="阿尔法" ++RandomNickNames="黑杰克" ++RandomNickNames="靶眼" ++RandomNickNames="闪电" ++RandomNickNames="权贵" ++RandomNickNames="瞌睡虫" ++RandomNickNames="巨大成功" ++RandomNickNames="老板" ++RandomNickNames="靶眼" ++RandomNickNames="将军" ++RandomNickNames="首领" ++RandomNickNames="小马驹" ++RandomNickNames="达拉斯" ++RandomNickNames="门栓" ++RandomNickNames="致命射手" ++RandomNickNames="暗锁" ++RandomNickNames="朽木" ++RandomNickNames="D.O.A." ++RandomNickNames="鹰眼" ++RandomNickNames="八号球" ++RandomNickNames="平线" ++RandomNickNames="游戏时间" ++RandomNickNames="恶棍" ++RandomNickNames="掘墓人" ++RandomNickNames="帽子戏法" ++RandomNickNames="鹰目" ++RandomNickNames="加热器" ++RandomNickNames="正午" ++RandomNickNames="职业杀手" ++RandomNickNames="好莱坞" ++RandomNickNames="炒作" ++RandomNickNames="偶像" ++RandomNickNames="豺狼" ++RandomNickNames="法官" ++RandomNickNames="余光" ++RandomNickNames="禁闭" ++RandomNickNames="远投高手" ++RandomNickNames="徒步者" ++RandomNickNames="刺针" ++RandomNickNames="苍白骑士" ++RandomNickNames="死神" ++RandomNickNames="抓痕" ++RandomNickNames="连环杀戮" ++RandomNickNames="警长" ++RandomNickNames="枪手" ++RandomNickNames="表演时间" ++RandomNickNames="滑头" ++RandomNickNames="投石者" ++RandomNickNames="冷血" ++RandomNickNames="清洁工" ++RandomNickNames="小孩" ++RandomNickNames="真相" ++RandomNickNames="墓碑" ++RandomNickNames="大腕" ++RandomNickNames="高层货架" ++RandomNickNames="双击" ++RandomNickNames="送葬者" ++RandomNickNames="情人" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="牛仔" -RandomNickNames_Male[1]="教父" -RandomNickNames_Male[2]="邮差" -RandomNickNames_Male[3]="睡魔" -RandomNickNames_Male[4]="瘦子" -RandomNickNames_Male[5]="税务员" -RandomNickNames_Male[6]="宙斯" -RandomNickNames_Female[0]="男爵夫人" -RandomNickNames_Female[1]="黑寡妇" -RandomNicknames_Female[2]="灾难" -RandomNicknames_Female[3]="蜂后" ++RandomNickNames_Male="牛仔" ++RandomNickNames_Male="教父" ++RandomNickNames_Male="邮差" ++RandomNickNames_Male="睡魔" ++RandomNickNames_Male="瘦子" ++RandomNickNames_Male="税务员" ++RandomNickNames_Male="宙斯" ++RandomNickNames_Female="男爵夫人" ++RandomNickNames_Female="黑寡妇" ++RandomNickNames_Female="灾难" ++RandomNickNames_Female="蜂后" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1959,73 +1965,73 @@ RightAbilityTreeTitle="破门者" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="强盗" -RandomNickNames[1]="闪电" -RandomNickNames[2]="硬砖" -RandomNickNames[3]="屠夫" -RandomNickNames[4]="锯齿鸟" -RandomNickNames[5]="凯金" -RandomNickNames[6]="排骨" -RandomNickNames[7]="眼镜蛇" -RandomNickNames[8]="美洲豹" -RandomNickNames[9]="郊狼" -RandomNickNames[10]="冲击" -RandomNickNames[11]="钻石" -RandomNickNames[12]="执行人" -RandomNickNames[13]="毁灭者" -RandomNickNames[14]="闪侠" -RandomNickNames[15]="愤怒" -RandomNickNames[16]="鳄鱼" -RandomNickNames[17]="幽灵" -RandomNickNames[18]="枪手" -RandomNickNames[19]="猎犬" -RandomNickNames[20]="寒冰" -RandomNickNames[21]="冰锥" -RandomNickNames[22]="撕咬者" -RandomNickNames[23]="审判日" -RandomNickNames[24]="卷毛" -RandomNickNames[25]="怪兽" -RandomNickNames[26]="野马" -RandomNickNames[27]="圣骑士" -RandomNickNames[28]="斗兽犬" -RandomNickNames[29]="先锋" -RandomNickNames[30]="林戈" -RandomNickNames[31]="武士" -RandomNickNames[32]="天蝎" -RandomNickNames[33]="将军" -RandomNickNames[34]="影子" -RandomNickNames[35]="杀手" -RandomNickNames[36]="蛇" -RandomNickNames[37]="蛇眼" -RandomNickNames[38]="独行侠" -RandomNickNames[39]="幽灵" -RandomNickNames[40]="蜘蛛" -RandomNickNames[41]="潜行者" -RandomNickNames[42]="钢铁" -RandomNickNames[43]="毒刺" -RandomNickNames[44]="圣殿骑士" -RandomNickNames[45]="勇士" -RandomNickNames[46]="破坏者" -RandomNickNames[47]="维京人" -RandomNickNames[48]="典狱长" -RandomNickNames[49]="军阀" -RandomNickNames[50]="狼獾" -RandomNickNames[51]="熊孩子" -RandomNickNames[52]="野人" -RandomNickNames[53]="祖鲁" ++RandomNickNames="强盗" ++RandomNickNames="闪电" ++RandomNickNames="硬砖" ++RandomNickNames="屠夫" ++RandomNickNames="锯齿鸟" ++RandomNickNames="凯金" ++RandomNickNames="排骨" ++RandomNickNames="眼镜蛇" ++RandomNickNames="美洲豹" ++RandomNickNames="郊狼" ++RandomNickNames="冲击" ++RandomNickNames="钻石" ++RandomNickNames="执行人" ++RandomNickNames="毁灭者" ++RandomNickNames="闪侠" ++RandomNickNames="愤怒" ++RandomNickNames="鳄鱼" ++RandomNickNames="幽灵" ++RandomNickNames="枪手" ++RandomNickNames="猎犬" ++RandomNickNames="寒冰" ++RandomNickNames="冰锥" ++RandomNickNames="撕咬者" ++RandomNickNames="审判日" ++RandomNickNames="卷毛" ++RandomNickNames="怪兽" ++RandomNickNames="野马" ++RandomNickNames="圣骑士" ++RandomNickNames="斗兽犬" ++RandomNickNames="先锋" ++RandomNickNames="林戈" ++RandomNickNames="武士" ++RandomNickNames="天蝎" ++RandomNickNames="将军" ++RandomNickNames="影子" ++RandomNickNames="杀手" ++RandomNickNames="蛇" ++RandomNickNames="蛇眼" ++RandomNickNames="独行侠" ++RandomNickNames="幽灵" ++RandomNickNames="蜘蛛" ++RandomNickNames="潜行者" ++RandomNickNames="钢铁" ++RandomNickNames="毒刺" ++RandomNickNames="圣殿骑士" ++RandomNickNames="勇士" ++RandomNickNames="破坏者" ++RandomNickNames="维京人" ++RandomNickNames="典狱长" ++RandomNickNames="军阀" ++RandomNickNames="狼獾" ++RandomNickNames="熊孩子" ++RandomNickNames="野人" ++RandomNickNames="祖鲁" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="斧男" -RandomNickNames_Male[1]="公爵" -RandomNickNames_Male[2]="坚岩" -RandomNickNames_Male[3]="种马" -RandomNickNames_Male[4]="狼人" ++RandomNickNames_Male="斧男" ++RandomNickNames_Male="公爵" ++RandomNickNames_Male="坚岩" ++RandomNickNames_Male="种马" ++RandomNickNames_Male="狼人" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="雅典娜" -RandomNickNames_Female[1]="公爵夫人" -RandomNicknames_Female[2]="铁娘子" -RandomNicknames_Female[3]="铁处女" -RandomNicknames_Female[4]="女战士" -RandomNickNames_Female[5]="女武神" ++RandomNickNames_Female="雅典娜" ++RandomNickNames_Female="公爵夫人" ++RandomNickNames_Female="铁娘子" ++RandomNickNames_Female="铁处女" ++RandomNickNames_Female="女战士" ++RandomNickNames_Female="女武神" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -2041,47 +2047,47 @@ RightAbilityTreeTitle="剑士" +AbilityTreeTitles[4]="手枪" ;ALPHABETICAL ORDER -RandomNickNames[0]="抓紧" -RandomNickNames[1]="眼镜蛇" -RandomNickNames[2]="匕首" -RandomNickNames[3]="舞者" -RandomNickNames[4]="猛冲者" -RandomNickNames[5]="躲闪者" -RandomNickNames[6]="巨龙" -RandomNickNames[7]="剑客" -RandomNickNames[8]="翻转者" -RandomNickNames[9]="毛球" -RandomNickNames[10]="地鼠" -RandomNickNames[11]="狼牙棒" -RandomNickNames[12]="黑夜" -RandomNickNames[13]="中子" -RandomNickNames[14]="画家" -RandomNickNames[15]="巴夏" -RandomNickNames[16]="偷猎者" -RandomNickNames[17]="话痨" -RandomNickNames[18]="剃刀" -RandomNickNames[19]="撕裂者" -RandomNickNames[20]="贵族" -RandomNickNames[21]="阴暗" -RandomNickNames[22]="棒子" -RandomNickNames[23]="空格键" -RandomNickNames[24]="碎片" -RandomNickNames[25]="潜行者" -RandomNickNames[26]="爪子" -RandomNickNames[27]="送葬者" -RandomNickNames[28]="野猫" ++RandomNickNames="抓紧" ++RandomNickNames="眼镜蛇" ++RandomNickNames="匕首" ++RandomNickNames="舞者" ++RandomNickNames="猛冲者" ++RandomNickNames="躲闪者" ++RandomNickNames="巨龙" ++RandomNickNames="剑客" ++RandomNickNames="翻转者" ++RandomNickNames="毛球" ++RandomNickNames="地鼠" ++RandomNickNames="狼牙棒" ++RandomNickNames="黑夜" ++RandomNickNames="中子" ++RandomNickNames="画家" ++RandomNickNames="巴夏" ++RandomNickNames="偷猎者" ++RandomNickNames="话痨" ++RandomNickNames="剃刀" ++RandomNickNames="撕裂者" ++RandomNickNames="贵族" ++RandomNickNames="阴暗" ++RandomNickNames="棒子" ++RandomNickNames="空格键" ++RandomNickNames="碎片" ++RandomNickNames="潜行者" ++RandomNickNames="爪子" ++RandomNickNames="送葬者" ++RandomNickNames="野猫" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="弯曲" -RandomNickNames_Male[1]="科奇斯" -RandomNickNames_Male[2]="瘦子" -RandomNickNames_Male[3]="骑手" -RandomNickNames_Male[4]="睡魔" -RandomNickNames_Male[5]="剑客" ++RandomNickNames_Male="弯曲" ++RandomNickNames_Male="科奇斯" ++RandomNickNames_Male="瘦子" ++RandomNickNames_Male="骑手" ++RandomNickNames_Male="睡魔" ++RandomNickNames_Male="剑客" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="黑豹" -RandomNickNames_Female[1]="海妖" -RandomNickNames_Female[2]="火花塞" -RandomNickNames_Female[3]="喷火怪" ++RandomNickNames_Female="黑豹" ++RandomNickNames_Female="海妖" ++RandomNickNames_Female="火花塞" ++RandomNickNames_Female="喷火怪" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -2135,6 +2141,12 @@ RewardDetails="获得随机的敌人尸体。" DisplayName="属性加成" ; End Translation +[Reward_Supply_Mission X2RewardTemplate] +DisplayName="大型补给夺取任务" + +[Reward_Detachment_Mission X2RewardTemplate] +DisplayName="潜入伏击任务" + ; POI Templates [POI_Rebels X2PointOfInterestTemplate] DisplayNames[0]="志愿者" @@ -2841,6 +2853,15 @@ BriefingImage="img:///UILibrary_StrategyImages。X2StrategyMap。Alert_Resistanc ObjectiveTextPools[0]="尽可能多的获取变种人资源" ObjectiveTextPools[1]="撤离所有XCOM士兵" +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="补给突袭" +Briefing="突袭变种人补给站" +PostMissionType="补给突袭" +BriefingImage="img:///UILibrary_StrategyImages。X2StrategyMap。Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="尽可能多的获取变种人资源" +ObjectiveTextPools[1]="撤离所有XCOM士兵" + + [SupplyExtraction_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="标记并回收变种人物资箱" ObjectiveTextPools[1]="标记并回收变种人物资箱" @@ -2855,6 +2876,14 @@ ObjectiveTextPools[3]="撤离所有XCOM士兵" ObjectiveTextPools[4]="补给突袭" ObjectiveTextPools[5]="反抗军找到一个含有各种资源的变种人补给站。 突袭补给站,尽可能多的带走这些资源,在敌人增员赶来之前撤离。 该任务将会有多个补给目标, 但是一名士兵只能带走一个补给箱。" +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="找到变种人资源" +ObjectiveTextPools[1]="转移变种人资源" +ObjectiveTextPools[2]="找到额外的变种人资源(可选)" +ObjectiveTextPools[3]="撤离所有XCOM士兵" +ObjectiveTextPools[4]="补给突袭" +ObjectiveTextPools[5]="反抗军找到一个含有各种资源的变种人补给站。 突袭补给站,尽可能多的带走这些资源,在敌人增员赶来之前撤离。 该任务将会有多个补给目标, 但是一名士兵只能带走一个补给箱。" + [TroopManeuvers_LW X2MissionTemplate] DisplayName="伏击一支变种人列队" Briefing="伏击一支变种人列队" @@ -2872,6 +2901,24 @@ ObjectiveTextPools[4]="LWOTC不速之客" ObjectiveTextPools[5]="欢迎来到LWOTC的第一个任务!

目标很简单:击杀所有的敌人。

请注意,这是为数不多可以获得敌人尸体的任务之一,这些尸体是研究和建设许多项目所需要的。在LWOTC用爆炸物击杀敌人会摧毁尸体!" ; End Translation +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="伏击一支变种人列队" +Briefing="伏击一支变种人列队" +PostMissionType="伏击敌方军队" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="消灭所有目标敌人" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="消灭所有目标敌人" +ObjectiveTextPools[1]="撤离所有XCOM士兵" +ObjectiveTextPools[2]="伏击敌方军队" +ObjectiveTextPools[3]="变种人通常以大群体的形式转移他们的军队,但是我们还是找到了较小的容易攻击的单位。一次时机恰当的突袭将会挫败变种人在这片地区的势力,并为我们提供将敌人尸体带回研究的宝贵机会。" +; LWOTC Needs Translation +ObjectiveTextPools[4]="LWOTC不速之客" +ObjectiveTextPools[5]="欢迎来到LWOTC的第一个任务!

目标很简单:击杀所有的敌人。

请注意,这是为数不多可以获得敌人尸体的任务之一,这些尸体是研究和建设许多项目所需要的。在LWOTC用爆炸物击杀敌人会摧毁尸体!" +; End Translation + + [Rendezvous_LW X2MissionTemplate] DisplayName="集结点" Briefing="阻止间谍与变种人部队的会面" @@ -4943,12 +4990,12 @@ LocPromotionPopupText=" 合适的位置可以将对峙的威力发挥 LocPromotionPopupText=" 多重火力的每次攻击都有单独的命中率。
如果每一枪都命中,多重火力会造成毁灭性的伤害。
多重火力有回合冷却时间。
" ; End translation -; LWOTC Needs Translation (2) +; LWOTC Translated (2) [SoulSteal X2AbilityTemplate] -LocLongDescription="灵魂火伤害的一半恢复灵能士兵的生命值,如果灵能士兵未受伤害,将其转化为护盾值。但使灵魂火的冷却时间提高1回合。" -LocHelpText="灵魂火会恢复受伤士兵 的生命值,或者提供额外的护盾值。但使灵魂火的冷却时间提高1回合。" -LocPromotionPopupText=" 灵魂汲取将会恢复受伤士兵的生命值,并提供3/4/6护盾值,持续3回合。
一名士兵最多可汲取15点护盾值。" -; End Translation (2) +LocLongDescription="灵魂火伤害的一半恢复灵能士兵的生命值,如果灵能士兵未受伤害,则将其转化为持续3回合的护盾。" +LocHelpText="灵魂火会恢复受伤士兵的生命值并提供额外的护盾。" +LocPromotionPopupText=" 灵魂汲取将会恢复受伤士兵的生命值,并提供3/4/6点护盾,持续3回合。
一名士兵最多可汲取15点护盾值。" +; End Translated (2) ; LWOTC Needs Translation [Domination X2AbilityTemplate] @@ -5151,7 +5198,14 @@ FocusLevelDescriptions[4]="撕裂伤害+\n移动力+< [TemplarFocus X2AbilityTemplate] LocPromotionPopupText=" 圣殿骑士在开始任务时比其他士兵弱,但在更高的专注水平下会变得非常强大。
专注是通过用撕裂攻击敌人获得的(即使未命中也能获得)。
" -[Rend X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="撕裂" +LocLongDescription="近战攻击有几率使目标眩晕或混乱。触发气势,产生专注。" +LocHelpText="近战攻击有几率使目标眩晕或混乱。触发气势,产生专注。" +LocPromotionPopupText=" 使用撕裂是圣殿骑士产生专注的主要方法。
施展撕裂后,圣殿骑士将获得气势,允许他们进行一次移动动作。攻击后撤回掩体。
撕裂每1点专注有%几率眩晕。眩晕的目标也会被击退。
撕裂每1点专注有%几率混乱。
" + +[Rend_LW X2AbilityTemplate] +LocFriendlyName="撕裂" LocLongDescription="近战攻击有几率使目标眩晕或混乱。触发气势,产生专注。" LocHelpText="近战攻击有几率使目标眩晕或混乱。触发气势,产生专注。" LocPromotionPopupText=" 使用撕裂是圣殿骑士产生专注的主要方法。
施展撕裂后,圣殿骑士将获得气势,允许他们进行一次移动动作。攻击后撤回掩体。
撕裂每1点专注有%几率眩晕。眩晕的目标也会被击退。
撕裂每1点专注有%几率混乱。
" @@ -5592,6 +5646,12 @@ ActionObjective="获取反抗军MEC" [CovertAction_RecruitRebels X2CovertActionTemplate] ActionObjective="招募反抗军" +[CovertAction_BigSupplyDepot X2CovertActionTemplate] +ActionObjective="寻找补给站" + +[CovertAction_FindAdventDetachment X2CovertActionTemplate] +ActionObjective="定位变种人巡逻队" + [CovertActionNarrative_EnemyCorpses_Skirmishers X2CovertActionNarrativeTemplate] ActionName="突袭变种人停尸房" ActionPreNarrative="我们发现了他们把被你消灭的敌人尸体扔到哪里去了。这可能是一个加速技术发展的机会。" @@ -5652,6 +5712,36 @@ ActionName="反抗军招募搜寻" ActionPreNarrative="我们了解到该地区有一小部分持不同政见者可能愿意直接帮助我们。进去看看能不能把他们招进反抗军避难所。" ActionPostNarrative="你的队伍说服了一些持不同政见者加入我们的事业。" +[CovertActionNarrative_FindBigDepot_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="定位一个变种人补给站" +ActionPreNarrative="我们得知了一个可能的大型物资储备地点。我们应该进行调查。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + +[CovertActionNarrative_FindBigDepot_Reapers X2CovertActionNarrativeTemplate] +ActionName="定位一个变种人补给站" +ActionPreNarrative="我们得知了一个可能的大型物资储备地点。我们应该进行调查。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + +[CovertActionNarrative_FindBigDepot_Templars X2CovertActionNarrativeTemplate] +ActionName="定位一个变种人补给站" +ActionPreNarrative="我们得知了一个可能的大型物资储备地点。我们应该进行调查。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + +[CovertActionNarrative_FindAdventDetachment_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="寻找单独的变种人巡逻队" +ActionPreNarrative="我们得知了一个变种人侦察小队可能的位置。我们应该调查一下。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + +[CovertActionNarrative_FindAdventDetachment_Reapers X2CovertActionNarrativeTemplate] +ActionName="寻找单独的变种人巡逻队" +ActionPreNarrative="我们得知了一个变种人侦察小队可能的位置。我们应该调查一下。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + +[CovertActionNarrative_FindAdventDetachment_Templars X2CovertActionNarrativeTemplate] +ActionName="寻找单独的变种人巡逻队" +ActionPreNarrative="我们得知了一个变种人侦察小队可能的位置。我们应该调查一下。" +ActionPostNarrative="干得好。现在我们可以派遣一个小队进一步跟进。" + [AbilityPoints X2ItemTemplate] FriendlyName="能力点" FriendlyNamePlural="能力点" @@ -5692,6 +5782,9 @@ LocFlyOverText="灵魂风暴" LocPromotionPopupText=" 召唤灵魂风暴对目标区域内的敌人造成伤害,并摧毁他们的掩体。
灵魂风暴的影响范围以释放者为中心。
不能破坏地板或天花板。
灵魂风暴需要一个行动点并结束你的回合。
灵魂风暴有回合冷却时间。
灵魂风暴半径为4格。
" ; End Translation (2) +[TheLostGrappler X2CharacterTemplate] +strCharacterName="利爪失魂者" + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="利爪失魂者" @@ -5725,6 +5818,9 @@ strCharacterName="利爪失魂者" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="利爪失魂者" +[TheLostBrute X2CharacterTemplate] +strCharacterName="残暴失魂者" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="残暴失魂者" @@ -6198,10 +6294,10 @@ LocLongDescription="你的主武器攻击会让敌人流血。" LocHelpText="你的主武器攻击会让敌人流血。" [MindScorchDangerZone X2AbilityTemplate] -LocFriendlyName="高压电" -LocLongDescription="增加格心灵灼烧半径。" -LocHelpText="增加格心灵灼烧半径。" -LocPromotionPopupText=" 增加格心灵灼烧半径。" +LocFriendlyName="心灵燃烧" +LocLongDescription="增加格心灵灼烧半径。减少心灵灼烧1回合冷却时间。" +LocHelpText="增加格心灵灼烧半径。减少心灵灼烧1回合冷却时间。" +LocPromotionPopupText="" [MindScorchTerror X2AbilityTemplate] LocFriendlyName="恐怖主义" @@ -6228,15 +6324,15 @@ LocFlyOverText="敏锐" [CombatReadiness X2AbilityTemplate] LocFriendlyName="战备状态" -LocLongDescription="本回合内在掩体中获得可叠加的命中和防御加成,并移除大部分减益状态。" -LocHelpText="本回合内在掩体中获得可叠加的命中和防御加成,并移除大部分减益状态。" +LocLongDescription="本回合内在掩体中获得可叠加的%爆炸伤害减免和防御加成,并移除定身减益状态。" +LocHelpText="本回合内在掩体中获得可叠加的%爆炸伤害减免和防御加成,并移除定身减益状态。" LocFlyOverText="战备状态" ;LWOTC needs translation [CombatReadinessPassive X2AbilityTemplate] LocFriendlyName="战备状态" -LocLongDescription="本回合内在掩体中获得可叠加的命中和防御加成,并移除大部分减益状态。" -LocHelpText="本回合内在掩体中获得可叠加的命中和防御加成,并移除大部分减益状态。" +LocLongDescription="本回合内在掩体中获得可叠加的%爆炸伤害减免和防御加成,并移除定身减益状态。" +LocHelpText="本回合内在掩体中获得可叠加的%爆炸伤害减免和防御加成,并移除定身减益状态。" LocFlyOverText="战备状态" ; End translation @@ -6315,6 +6411,29 @@ LocLongDescription="每次用你的近战武器攻击,得到一个堆叠的伤 LocHelpText="每次用你的近战武器攻击,得到一个堆叠的伤害提升你的近战攻击。增益取决于天选者的等级,T1/T2/T3/T4对应+///伤害。成功劫持后移除。" LocFlyOverText="嗜血" +; LWOTC Translated (2) +[UnholyAscension_LW X2AbilityTemplate] +LocFriendlyName="邪恶的升华" +LocLongDescription="冠军术士的护盾、命中、暴击、意志和灵能攻击加成翻倍,并提供暴击免疫的效果。" +LocHelpText="冠军术士的护盾、命中、暴击、意志和灵能攻击加成翻倍,并提供暴击免疫的效果。" +LocFlyOverText="邪恶的升华" + +[RuptureImmunity X2AbilityTemplate] +LocFriendlyName="牢不可破" +LocLongDescription="所有对你施加的撕裂效果将立即被移除。" +LocHelpText="所有对你施加的撕裂效果将立即被移除。" +LocFlyOverText="牢不可破" + +[TrackingShotMark X2AbilityTemplate] +LocFriendlyName="追踪射击标记" +LocHelpText="在你的回合开始时,可以对一名对你暴露(侧袭)的敌人免费进行标记。对该目标的第一次射击保证命中,并且会返还行动点数。" +LocLongDescription="在你的回合开始时,可以对一名对你暴露(侧袭)的敌人免费进行标记。对该目标的第一次射击保证命中,并且会返还行动点数。" + +[TrackingShot X2AbilityTemplate] +LocFriendlyName="追踪射击" +LocHelpText="在你的回合开始时,可以对一名对你暴露(侧袭)的敌人免费进行标记。对该目标的第一次射击保证命中,并且会返还行动点数。" +LocLongDescription="在你的回合开始时,可以对一名对你暴露(侧袭)的敌人免费进行标记。对该目标的第一次射击保证命中,并且会返还行动点数。" +; End Translated (2) [PreciseStrike_LW X2AbilityTemplate] LocFriendlyName="精准刺击" @@ -6324,14 +6443,14 @@ LocFlyOverText="精准刺击" [PsychoticRage_LW X2AbilityTemplate] LocFriendlyName="精神发狂" -LocHelpText="在35%或更少的生命值下获得50%的伤害提升。" -LocLongDescription="在35%或更少的生命值下获得50%的伤害提升。" +LocHelpText="在%或更少的生命值下获得%的伤害提升。" +LocLongDescription="在%或更少的生命值下获得%的伤害提升。" LocFlyOverText="精神发狂" [YouCannotHide_LW X2AbilityTemplate] LocFriendlyName="无所遁形" -LocHelpText="你的主武器增加100命中。" -LocLongDescription="你的主武器增加100命中。" +LocHelpText="你的增加30命中。" +LocLongDescription="你的增加30命中。" LocFlyOverText="逃跑吧。" [RebelHPUpgrade_T1 X2AbilityTemplate] @@ -6397,8 +6516,8 @@ LocFlyOverText="嗜血" [OverbearingSuperiority_LW X2AbilityTemplate] LocFriendlyName="霸气侧漏" -LocLongDescription="当你的主武器造成暴击时,你的行动点将返还。" -LocHelpText="当你的主武器造成暴击时,你的行动点将返还。" +LocLongDescription="你的暴击率增加+。当你使用造成暴击时,行动点将返还。" +LocHelpText="你的暴击率增加+。当你使用造成暴击时,行动点将返还。" LocFlyOverText="霸气侧漏" [DisruptorRifleCrit X2AbilityTemplate] @@ -6415,8 +6534,8 @@ LocFlyOverText="死亡标记" [Fatality_LW X2AbilityTemplate] LocFriendlyName="宿命" -LocLongDescription="使用对35%生命或更低的目标增加+100命中和暴击率。" -LocHelpText="使用对35%生命或更低的目标增加+100命中和暴击率。" +LocLongDescription="使用%生命或更低的目标增加+100命中和暴击率。" +LocHelpText="使用%生命或更低的目标增加+100命中和暴击率。" LocFlyOverText="宿命" [Vampirism_LW X2AbilityTemplate] @@ -6476,7 +6595,7 @@ LocHelpText="在XCOM回合受到伤害后,获得移动动作或战备状态。 LocFlyOverText="天选者反应" ; LWOTC Needs Translation (2) -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="天选者免疫" LocLongDescription="天选者对眩晕、混乱和冰冻免疫,并遭受-50%的致残移动力,而不是原地不动。" LocHelpText="天选者对眩晕、混乱和冰冻免疫,并遭受-50%的致残移动力,而不是原地不动。" @@ -6551,9 +6670,9 @@ SummaryText="残酷镇压反抗军,减少该地区反抗军未来" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="横冲直撞" +LocLongDescription="当过载激活时,能够在移动时撞穿墙壁和掩体。" +LocHelpText="当过载激活时,能够在移动时撞穿墙壁和掩体。" +LocPromotionPopupText="横冲直撞能够用于将敌人暴露在夹击中。.
使用移动路径点指引SPARK前往合适的路径以摧毁掩体和环境物体。
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="密集轰炸" +LocLongDescription="往任何可见位置发射BIT,释放一次强力的爆炸冲击。高级BIT能造成更多伤害。" +LocHelpText="发射BIT冲击所有范围内的单位。" +LocPromotionPopupText="密集轰炸可以发射到小队视野中的任何位置。
升级BIT可以使密集轰炸的伤害提升。
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="猎手协议" +LocLongDescription="当敌人暴露时,有%的几率对其进行一次监视射击。" +LocHelpText="当敌人暴露时,有%的几率对其进行一次监视射击。" +LocPromotionPopupText="猎手协议让SPARK成为探索战争迷雾的理想单位,因为可以立刻攻击任何暴露的敌人。
" + +[Nova X2AbilityTemplate] +LocFriendlyName="新星" +LocLongDescription="释放一波能量,伤害附近所有的单位。攻击不会有行动点消耗和冷却时间,但持续的新星会伤害SPARK。" +LocHelpText="冲击附近所有单位。持续的新星可伤害SPARK。" +LocPromotionPopupText="新星无需行动点和冷却。
每个任务首次新星攻击会对SPARK造成0的伤害。
SPARK首次新星攻击后的每次新星攻击都会对其造成一个叠加的伤害。
" diff --git a/LongWarOfTheChosen/Localization/XComGame.cht b/LongWarOfTheChosen/Localization/XComGame.cht index 781722c95..a540a26cb 100644 --- a/LongWarOfTheChosen/Localization/XComGame.cht +++ b/LongWarOfTheChosen/Localization/XComGame.cht @@ -463,6 +463,10 @@ LocPromotionPopupText=" 槍林彈雨消耗彈藥 [ChainShot X2AbilityTemplate] LocPromotionPopupText=" 連環射擊消耗彈藥。
連環射擊有回合冷卻時間。
連環射擊可以對無掩體敵人(如狂戰士,機械敵人)造成毀滅性的打擊,或者增加命中加成。
" +[ChainShotSnapShot X2AbilityTemplate] +LocPromotionPopupText=" 連環射擊消耗彈藥。
連環射擊有回合冷卻時間。
連環射擊可以對無掩體敵人(如狂戰士,機械敵人)造成毀滅性的打擊,或者增加命中加成。
" + + [SaturationFire X2AbilityTemplate] LocPromotionPopupText=" 飽和火力消耗彈藥。
飽和火力有回合冷卻時間。
飽和火力將對錐型範圍內的每一個敵人進行標準射擊,並將損壞或摧毀錐型範圍內隨機的掩體。
" ;End Translation @@ -1507,74 +1511,74 @@ RightAbilityTreeTitle="爆破員" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="天使" -RandomNickNames[1]="貝塔" -RandomNickNames[2]="主教" -RandomNickNames[3]="骨頭" -RandomNickNames[4]="粉碎者" -RandomNickNames[5]="中間人" -RandomNickNames[6]="秘密成員" -RandomNickNames[7]="網絡" -RandomNickNames[8]="密碼" -RandomNickNames[9]="數據" -RandomNickNames[10]="執事" -RandomNickNames[11]="興奮劑博士" -RandomNickNames[12]="醫生" -RandomNickNames[13]="反噬" -RandomNickNames[14]="防火牆" -RandomNickNames[15]="天才" -RandomNickNames[16]="發明家" -RandomNickNames[17]="故障" -RandomNickNames[18]="劫匪" -RandomNickNames[19]="干擾機" -RandomNickNames[20]="小丑" -RandomNickNames[21]="震動" -RandomNickNames[22]="閃電" -RandomNickNames[23]="求救" -RandomNickNames[24]="百萬" -RandomNickNames[25]="牛頓" -RandomNickNames[26]="極限超載" -RandomNickNames[27]="補丁" -RandomNickNames[28]="教授" -RandomNickNames[29]="拉格泰姆" -RandomNickNames[30]="流氓" -RandomNickNames[31]="話癆" -RandomNickNames[32]="赤紅" -RandomNickNames[33]="裂痕" -RandomNickNames[34]="開傘索" -RandomNickNames[35]="無賴" -RandomNickNames[36]="焦痕" -RandomNickNames[37]="哨兵" -RandomNickNames[38]="陰暗" -RandomNickNames[39]="奶昔" -RandomNickNames[40]="變形怪" -RandomNickNames[41]="畏縮" -RandomNickNames[42]="滑塊" -RandomNickNames[43]="太陽能" -RandomNickNames[44]="聲吶" -RandomNickNames[45]="火花" -RandomNickNames[46]="縫合" -RandomNickNames[47]="敲擊者" -RandomNickNames[48]="淚珠" -RandomNickNames[49]="修理工" -RandomNickNames[50]="漩渦" -RandomNickNames[51]="毒液" -RandomNickNames[52]="蒸汽" -RandomNickNames[53]="軍機" -RandomNickNames[54]="典獄長" -RandomNickNames[55]="威士忌" -RandomNickNames[56]="野小子" -RandomNickNames[57]="祖魯" ++RandomNickNames="天使" ++RandomNickNames="貝塔" ++RandomNickNames="主教" ++RandomNickNames="骨頭" ++RandomNickNames="粉碎者" ++RandomNickNames="中間人" ++RandomNickNames="秘密成員" ++RandomNickNames="網絡" ++RandomNickNames="密碼" ++RandomNickNames="數據" ++RandomNickNames="執事" ++RandomNickNames="興奮劑博士" ++RandomNickNames="醫生" ++RandomNickNames="反噬" ++RandomNickNames="防火牆" ++RandomNickNames="天才" ++RandomNickNames="發明家" ++RandomNickNames="故障" ++RandomNickNames="劫匪" ++RandomNickNames="干擾機" ++RandomNickNames="小丑" ++RandomNickNames="震動" ++RandomNickNames="閃電" ++RandomNickNames="求救" ++RandomNickNames="百萬" ++RandomNickNames="牛頓" ++RandomNickNames="極限超載" ++RandomNickNames="補丁" ++RandomNickNames="教授" ++RandomNickNames="拉格泰姆" ++RandomNickNames="流氓" ++RandomNickNames="話癆" ++RandomNickNames="赤紅" ++RandomNickNames="裂痕" ++RandomNickNames="開傘索" ++RandomNickNames="無賴" ++RandomNickNames="焦痕" ++RandomNickNames="哨兵" ++RandomNickNames="陰暗" ++RandomNickNames="奶昔" ++RandomNickNames="變形怪" ++RandomNickNames="畏縮" ++RandomNickNames="滑塊" ++RandomNickNames="太陽能" ++RandomNickNames="聲吶" ++RandomNickNames="火花" ++RandomNickNames="縫合" ++RandomNickNames="敲擊者" ++RandomNickNames="淚珠" ++RandomNickNames="修理工" ++RandomNickNames="漩渦" ++RandomNickNames="毒液" ++RandomNickNames="蒸汽" ++RandomNickNames="軍機" ++RandomNickNames="典獄長" ++RandomNickNames="威士忌" ++RandomNickNames="野小子" ++RandomNickNames="祖魯" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="甜心" -RandomNickNames_Male[1]="魔術師" -RandomNickNames_Male[2]="牧師" -RandomNickNames_Male[3]="雨人" -RandomNickNames_Male[4]="公雞" -RandomNickNames_Female[0]="女祭司" -RandomNickNames_Female[1]="狼母" -RandomNickNames_Female[2]="黑寡婦" -RandomNickNames_Female[4]="公爵夫人" ++RandomNickNames_Male="甜心" ++RandomNickNames_Male="魔術師" ++RandomNickNames_Male="牧師" ++RandomNickNames_Male="雨人" ++RandomNickNames_Male="公雞" ++RandomNickNames_Female="女祭司" ++RandomNickNames_Female="狼母" ++RandomNickNames_Female="黑寡婦" ++RandomNickNames_Female="公爵夫人" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1590,74 +1594,74 @@ RightAbilityTreeTitle="黑客" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="天使" -RandomNickNames[1]="貝塔" -RandomNickNames[2]="主教" -RandomNickNames[3]="骨頭" -RandomNickNames[4]="粉碎者" -RandomNickNames[5]="中間人" -RandomNickNames[6]="秘密成員" -RandomNickNames[7]="網絡" -RandomNickNames[8]="密碼" -RandomNickNames[9]="數據" -RandomNickNames[10]="執事" -RandomNickNames[11]="興奮劑博士" -RandomNickNames[12]="醫生" -RandomNickNames[13]="反噬" -RandomNickNames[14]="防火牆" -RandomNickNames[15]="天才" -RandomNickNames[16]="發明家" -RandomNickNames[17]="故障" -RandomNickNames[18]="劫匪" -RandomNickNames[19]="干擾機" -RandomNickNames[20]="小丑" -RandomNickNames[21]="震動" -RandomNickNames[22]="閃電" -RandomNickNames[23]="求救" -RandomNickNames[24]="百萬" -RandomNickNames[25]="牛頓" -RandomNickNames[26]="極限超載" -RandomNickNames[27]="補丁" -RandomNickNames[28]="教授" -RandomNickNames[29]="拉格泰姆" -RandomNickNames[30]="流氓" -RandomNickNames[31]="話癆" -RandomNickNames[32]="赤紅" -RandomNickNames[33]="裂痕" -RandomNickNames[34]="開傘索" -RandomNickNames[35]="無賴" -RandomNickNames[36]="焦痕" -RandomNickNames[37]="哨兵" -RandomNickNames[38]="陰暗" -RandomNickNames[39]="奶昔" -RandomNickNames[40]="變形怪" -RandomNickNames[41]="畏縮" -RandomNickNames[42]="滑塊" -RandomNickNames[43]="太陽能" -RandomNickNames[44]="聲吶" -RandomNickNames[45]="火花" -RandomNickNames[46]="縫合" -RandomNickNames[47]="敲擊者" -RandomNickNames[48]="淚珠" -RandomNickNames[49]="修理工" -RandomNickNames[50]="漩渦" -RandomNickNames[51]="毒液" -RandomNickNames[52]="蒸汽" -RandomNickNames[53]="軍機" -RandomNickNames[54]="典獄長" -RandomNickNames[55]="威士忌" -RandomNickNames[56]="野小子" -RandomNickNames[57]="祖魯" ++RandomNickNames="天使" ++RandomNickNames="貝塔" ++RandomNickNames="主教" ++RandomNickNames="骨頭" ++RandomNickNames="粉碎者" ++RandomNickNames="中間人" ++RandomNickNames="秘密成員" ++RandomNickNames="網絡" ++RandomNickNames="密碼" ++RandomNickNames="數據" ++RandomNickNames="執事" ++RandomNickNames="興奮劑博士" ++RandomNickNames="醫生" ++RandomNickNames="反噬" ++RandomNickNames="防火牆" ++RandomNickNames="天才" ++RandomNickNames="發明家" ++RandomNickNames="故障" ++RandomNickNames="劫匪" ++RandomNickNames="干擾機" ++RandomNickNames="小丑" ++RandomNickNames="震動" ++RandomNickNames="閃電" ++RandomNickNames="求救" ++RandomNickNames="百萬" ++RandomNickNames="牛頓" ++RandomNickNames="極限超載" ++RandomNickNames="補丁" ++RandomNickNames="教授" ++RandomNickNames="拉格泰姆" ++RandomNickNames="流氓" ++RandomNickNames="話癆" ++RandomNickNames="赤紅" ++RandomNickNames="裂痕" ++RandomNickNames="開傘索" ++RandomNickNames="無賴" ++RandomNickNames="焦痕" ++RandomNickNames="哨兵" ++RandomNickNames="陰暗" ++RandomNickNames="奶昔" ++RandomNickNames="變形怪" ++RandomNickNames="畏縮" ++RandomNickNames="滑塊" ++RandomNickNames="太陽能" ++RandomNickNames="聲吶" ++RandomNickNames="火花" ++RandomNickNames="縫合" ++RandomNickNames="敲擊者" ++RandomNickNames="淚珠" ++RandomNickNames="修理工" ++RandomNickNames="漩渦" ++RandomNickNames="毒液" ++RandomNickNames="蒸汽" ++RandomNickNames="軍機" ++RandomNickNames="典獄長" ++RandomNickNames="威士忌" ++RandomNickNames="野小子" ++RandomNickNames="祖魯" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="甜心" -RandomNickNames_Male[1]="魔術師" -RandomNickNames_Male[2]="牧師" -RandomNickNames_Male[3]="雨人" -RandomNickNames_Male[4]="公雞" -RandomNickNames_Female[0]="女祭司" -RandomNickNames_Female[1]="狼母" -RandomNickNames_Female[2]="黑寡婦" -RandomNickNames_Female[4]="公爵夫人" ++RandomNickNames_Male="甜心" ++RandomNickNames_Male="魔術師" ++RandomNickNames_Male="牧師" ++RandomNickNames_Male="雨人" ++RandomNickNames_Male="公雞" ++RandomNickNames_Female="女祭司" ++RandomNickNames_Female="狼母" ++RandomNickNames_Female="黑寡婦" ++RandomNickNames_Female="公爵夫人" ;ALPHABETICAL ORDER @@ -1674,86 +1678,86 @@ RightAbilityTreeTitle="輔助兵" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="陀螺" -RandomNickNames[1]="全力以赴" -RandomNickNames[2]="禽獸" -RandomNickNames[3]="發球機" -RandomNickNames[4]="大國家" -RandomNickNames[5]="大亨" -RandomNickNames[6]="大淘氣" -RandomNickNames[7]="閃耀" -RandomNickNames[8]="爆彈" -RandomNickNames[9]="轟炸機" -RandomNickNames[10]="夥伴" -RandomNickNames[11]="鬥牛犬" -RandomNickNames[12]="蠻牛" -RandomNickNames[13]="大劍" -RandomNickNames[14]="示威者" -RandomNickNames[15]="戒備者" -RandomNickNames[16]="魔犬" -RandomNickNames[17]="柴油機" -RandomNickNames[18]="安可" -RandomNickNames[19]="火球" -RandomNickNames[20]="冰箱" -RandomNickNames[21]="槍手" -RandomNickNames[22]="戰錘" -RandomNickNames[23]="地獄火" -RandomNickNames[24]="高塔" -RandomNickNames[25]="霍斯" -RandomNickNames[26]="爆發" -RandomNickNames[27]="颶風" -RandomNickNames[28]="垃圾場" -RandomNickNames[29]="主宰" -RandomNickNames[30]="擊倒" -RandomNickNames[31]="空" -RandomNickNames[32]="狂犬" -RandomNickNames[33]="融化" -RandomNickNames[34]="駝鹿" -RandomNickNames[35]="新星" -RandomNickNames[36]="卑鄙" -RandomNickNames[37]="硝基" -RandomNickNames[38]="霸主" -RandomNickNames[39]="鬥獸犬" -RandomNickNames[40]="縱火狂" -RandomNickNames[41]="紅線" -RandomNickNames[42]="犀牛" -RandomNickNames[43]="火箭" -RandomNickNames[44]="海風" -RandomNickNames[45]="厚板" -RandomNickNames[46]="碎擊" -RandomNickNames[47]="噴火怪" -RandomNickNames[48]="煙幕" -RandomNickNames[49]="沼怪" -RandomNickNames[50]="丁字牛排" -RandomNickNames[51]="霸王龍" -RandomNickNames[52]="坦克" -RandomNickNames[53]="重擊" -RandomNickNames[54]="迅雷" -RandomNickNames[55]="開心果" -RandomNickNames[56]="矮子" -RandomNickNames[57]="泰坦" -RandomNickNames[58]="炸藥桶" -RandomNickNames[59]="火炬" -RandomNickNames[60]="戰犬" -RandomNickNames[61]="戰馬" -RandomNickNames[62]="熊孩子" ++RandomNickNames="陀螺" ++RandomNickNames="全力以赴" ++RandomNickNames="禽獸" ++RandomNickNames="發球機" ++RandomNickNames="大國家" ++RandomNickNames="大亨" ++RandomNickNames="大淘氣" ++RandomNickNames="閃耀" ++RandomNickNames="爆彈" ++RandomNickNames="轟炸機" ++RandomNickNames="夥伴" ++RandomNickNames="鬥牛犬" ++RandomNickNames="蠻牛" ++RandomNickNames="大劍" ++RandomNickNames="示威者" ++RandomNickNames="戒備者" ++RandomNickNames="魔犬" ++RandomNickNames="柴油機" ++RandomNickNames="安可" ++RandomNickNames="火球" ++RandomNickNames="冰箱" ++RandomNickNames="槍手" ++RandomNickNames="戰錘" ++RandomNickNames="地獄火" ++RandomNickNames="高塔" ++RandomNickNames="霍斯" ++RandomNickNames="爆發" ++RandomNickNames="颶風" ++RandomNickNames="垃圾場" ++RandomNickNames="主宰" ++RandomNickNames="擊倒" ++RandomNickNames="空" ++RandomNickNames="狂犬" ++RandomNickNames="融化" ++RandomNickNames="駝鹿" ++RandomNickNames="新星" ++RandomNickNames="卑鄙" ++RandomNickNames="硝基" ++RandomNickNames="霸主" ++RandomNickNames="鬥獸犬" ++RandomNickNames="縱火狂" ++RandomNickNames="紅線" ++RandomNickNames="犀牛" ++RandomNickNames="火箭" ++RandomNickNames="海風" ++RandomNickNames="厚板" ++RandomNickNames="碎擊" ++RandomNickNames="噴火怪" ++RandomNickNames="煙幕" ++RandomNickNames="沼怪" ++RandomNickNames="丁字牛排" ++RandomNickNames="霸王龍" ++RandomNickNames="坦克" ++RandomNickNames="重擊" ++RandomNickNames="迅雷" ++RandomNickNames="開心果" ++RandomNickNames="矮子" ++RandomNickNames="泰坦" ++RandomNickNames="炸藥桶" ++RandomNickNames="火炬" ++RandomNickNames="戰犬" ++RandomNickNames="戰馬" ++RandomNickNames="熊孩子" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="野蠻人" -RandomNickNames_Male[1]="大男孩" -RandomNicknames_Male[2]="老大" -RandomNickNames_Male[3]="牛仔" -RandomNickNames_Male[4]="笨蛋" -RandomNickNames_Male[5]="暴君" -RandomNickNames_Male[6]="爸爸熊" -RandomNickNames_Male[7]="野人" -RandomNickNames_Female[0]="亞馬遜" -RandomNicknames_Female[1]="大姐大" -RandomNickNames_Female[2]="牛仔妹" -RandomNicknames_Female[3]="多米諾" -RandomNickNames_Female[4]="芙蕾雅" -RandomNickNames_Female[5]="媽媽熊" -RandomNickNames_Female[6]="埋葬者" -RandomNickNames_Female[7]="縱火狂" ++RandomNickNames_Male="野蠻人" ++RandomNickNames_Male="大男孩" ++RandomNickNames_Male="老大" ++RandomNickNames_Male="牛仔" ++RandomNickNames_Male="笨蛋" ++RandomNickNames_Male="暴君" ++RandomNickNames_Male="爸爸熊" ++RandomNickNames_Male="野人" ++RandomNickNames_Female="亞馬遜" ++RandomNickNames_Female="大姐大" ++RandomNickNames_Female="牛仔妹" ++RandomNickNames_Female="多米諾" ++RandomNickNames_Female="芙蕾雅" ++RandomNickNames_Female="媽媽熊" ++RandomNickNames_Female="埋葬者" ++RandomNickNames_Female="縱火狂" ;ALPHABETICAL ORDER @@ -1768,42 +1772,42 @@ RightAbilityTreeTitle="機槍手" +AbilityTreeTitles[2]="機槍手" +AbilityTreeTitles[3]="XCOM" +AbilityTreeTitles[4]="手槍" -RandomNickNames[0]="走火" -RandomNickNames[1]="巴哈" -RandomNickNames[2]="熊狸" -RandomNickNames[3]="殘酷" -RandomNickNames[4]="電鋸" -RandomNickNames[5]="比目魚" -RandomNickNames[6]="節目" -RandomNickNames[7]="傻瓜" -RandomNickNames[8]="小販" -RandomNickNames[9]="星茲" -RandomNickNames[10]="便當" -RandomNickNames[11]="碾壓機" -RandomNickNames[12]="肉鉤" -RandomNickNames[13]="駝鹿" -RandomNickNames[14]="納努克" -RandomNickNames[15]="炸雞塊" -RandomNickNames[16]="核彈" -RandomNickNames[17]="食人魔" -RandomNickNames[18]="煎餅" -RandomNickNames[19]="裝甲車" -RandomNickNames[20]="活塞" -RandomNickNames[21]="投石者" -RandomNickNames[22]="麻雀" -RandomNickNames[23]="尖刺" -RandomNickNames[24]="修行者" -RandomNickNames[25]="扎菲爾" -RandomNickNames_Male[0]="哈哈" -RandomNickNames_Male[1]="呆呆" -RandomNickNames_Male[2]="瘋子" -RandomNickNames_Male[3]="拳套" -RandomNickNames_Male[4]="海象" -RandomNickNames_Female[0]="泡泡" -RandomNickNames_Female[1]="小玩意兒" -RandomNickNames_Female[2]="嘻嘻" -RandomNickNames_Female[3]="芒果" -RandomNickNames_Female[4]="胡椒粉" ++RandomNickNames="走火" ++RandomNickNames="巴哈" ++RandomNickNames="熊狸" ++RandomNickNames="殘酷" ++RandomNickNames="電鋸" ++RandomNickNames="比目魚" ++RandomNickNames="節目" ++RandomNickNames="傻瓜" ++RandomNickNames="小販" ++RandomNickNames="星茲" ++RandomNickNames="便當" ++RandomNickNames="碾壓機" ++RandomNickNames="肉鉤" ++RandomNickNames="駝鹿" ++RandomNickNames="納努克" ++RandomNickNames="炸雞塊" ++RandomNickNames="核彈" ++RandomNickNames="食人魔" ++RandomNickNames="煎餅" ++RandomNickNames="裝甲車" ++RandomNickNames="活塞" ++RandomNickNames="投石者" ++RandomNickNames="麻雀" ++RandomNickNames="尖刺" ++RandomNickNames="修行者" ++RandomNickNames="扎菲爾" ++RandomNickNames_Male="哈哈" ++RandomNickNames_Male="呆呆" ++RandomNickNames_Male="瘋子" ++RandomNickNames_Male="拳套" ++RandomNickNames_Male="海象" ++RandomNickNames_Female="泡泡" ++RandomNickNames_Female="小玩意兒" ++RandomNickNames_Female="嘻嘻" ++RandomNickNames_Female="芒果" ++RandomNickNames_Female="胡椒粉" [LWS_Ranger X2SoldierClassTemplate] @@ -1818,43 +1822,43 @@ RightAbilityTreeTitle="守衛" +AbilityTreeTitles[3]="XCOM" +AbilityTreeTitles[4]="手槍" -RandomNickNames[0]="野馬" -RandomNickNames[1]="雄鹿" -RandomNickNames[2]="牛眼" -RandomNickNames[3]="鈷" -RandomNickNames[4]="牛仔" -RandomNickNames[5]="挖掘機" -RandomNickNames[6]="全壘打" -RandomNickNames[7]="冰霜" -RandomNickNames[8]="呼嚕" -RandomNickNames[9]="好萊塢" -RandomNickNames[10]="霍斯" -RandomNickNames[11]="吼猴" -RandomNickNames[12]="松鴉" -RandomNickNames[13]="蒼鷹" -RandomNickNames[14]="法官" -RandomNickNames[15]="馬林魚" -RandomNickNames[16]="野馬" -RandomNickNames[17]="漿糊" -RandomNickNames[18]="畫家" -RandomNickNames[19]="雜毛" -RandomNickNames[20]="流氓" -RandomNickNames[21]="堅岩" -RandomNickNames[22]="踏板車" -RandomNickNames[23]="蚊子" -RandomNickNames[24]="打滑" -RandomNickNames[25]="彈性" -RandomNickNames[26]="重擊" -RandomNickNames[27]="狼人" -RandomNickNames_Male[0]="灰塵" -RandomNickNames_Male[1]="荷蘭的" -RandomNickNames_Male[2]="剝皮機" -RandomNickNames_Male[3]="滑頭" -RandomNickNames_Male[4]="爆炸" -RandomNickNames_Female[0]="姨媽" -RandomNickNames_Female[1]="晚安" -RandomNickNames_Female[2]="美杜莎" -RandomNickNames_Female[3]="寶貝" ++RandomNickNames="野馬" ++RandomNickNames="雄鹿" ++RandomNickNames="牛眼" ++RandomNickNames="鈷" ++RandomNickNames="牛仔" ++RandomNickNames="挖掘機" ++RandomNickNames="全壘打" ++RandomNickNames="冰霜" ++RandomNickNames="呼嚕" ++RandomNickNames="好萊塢" ++RandomNickNames="霍斯" ++RandomNickNames="吼猴" ++RandomNickNames="松鴉" ++RandomNickNames="蒼鷹" ++RandomNickNames="法官" ++RandomNickNames="馬林魚" ++RandomNickNames="野馬" ++RandomNickNames="漿糊" ++RandomNickNames="畫家" ++RandomNickNames="雜毛" ++RandomNickNames="流氓" ++RandomNickNames="堅岩" ++RandomNickNames="踏板車" ++RandomNickNames="蚊子" ++RandomNickNames="打滑" ++RandomNickNames="彈性" ++RandomNickNames="重擊" ++RandomNickNames="狼人" ++RandomNickNames_Male="灰塵" ++RandomNickNames_Male="荷蘭的" ++RandomNickNames_Male="剝皮機" ++RandomNickNames_Male="滑頭" ++RandomNickNames_Male="爆炸" ++RandomNickNames_Female="姨媽" ++RandomNickNames_Female="晚安" ++RandomNickNames_Female="美杜莎" ++RandomNickNames_Female="寶貝" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1870,79 +1874,79 @@ RightAbilityTreeTitle="射手" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="頂端" -RandomNickNames[1]="王牌" -RandomNickNames[2]="餘波" -RandomNickNames[3]="阿爾法" -RandomNickNames[4]="黑傑克" -RandomNickNames[5]="靶眼" -RandomNickNames[6]="閃電" -RandomNickNames[7]="權貴" -RandomNickNames[8]="瞌睡蟲" -RandomNickNames[9]="巨大成功" -RandomNickNames[10]="老闆" -RandomNickNames[11]="靶眼" -RandomNickNames[12]="將軍" -RandomNickNames[13]="首領" -RandomNickNames[14]="小馬駒" -RandomNickNames[15]="達拉斯" -RandomNickNames[16]="門栓" -RandomNickNames[17]="致命射手" -RandomNickNames[18]="暗鎖" -RandomNickNames[19]="朽木" -RandomNickNames[20]="D.O.A." -RandomNickNames[21]="鷹眼" -RandomNickNames[22]="八號球" -RandomNickNames[23]="平線" -RandomNickNames[24]="遊戲時間" -RandomNickNames[25]="惡棍" -RandomNickNames[26]="掘墓人" -RandomNickNames[27]="帽子戲法" -RandomNickNames[28]="鷹目" -RandomNickNames[29]="加熱器" -RandomNickNames[30]="正午" -RandomNickNames[31]="職業殺手" -RandomNickNames[32]="好萊塢" -RandomNickNames[33]="炒作" -RandomNickNames[34]="偶像" -RandomNickNames[35]="豺狼" -RandomNickNames[36]="法官" -RandomNickNames[37]="餘光" -RandomNickNames[38]="禁閉" -RandomNickNames[39]="遠投高手" -RandomNickNames[40]="徒步者" -RandomNickNames[41]="刺針" -RandomNickNames[42]="蒼白騎士" -RandomNickNames[43]="死神" -RandomNickNames[44]="抓痕" -RandomNickNames[45]="連環殺戮" -RandomNickNames[46]="警長" -RandomNickNames[47]="槍手" -RandomNickNames[48]="表演時間" -RandomNickNames[49]="滑頭" -RandomNickNames[50]="投石者" -RandomNickNames[51]="冷血" -RandomNickNames[52]="清潔工" -RandomNickNames[53]="小孩" -RandomNickNames[54]="真相" -RandomNickNames[55]="墓碑" -RandomNickNames[56]="大腕" -RandomNickNames[57]="高層貨架" -RandomNickNames[58]="雙擊" -RandomNickNames[59]="送葬者" -RandomNickNames[60]="情人" ++RandomNickNames="頂端" ++RandomNickNames="王牌" ++RandomNickNames="餘波" ++RandomNickNames="阿爾法" ++RandomNickNames="黑傑克" ++RandomNickNames="靶眼" ++RandomNickNames="閃電" ++RandomNickNames="權貴" ++RandomNickNames="瞌睡蟲" ++RandomNickNames="巨大成功" ++RandomNickNames="老闆" ++RandomNickNames="靶眼" ++RandomNickNames="將軍" ++RandomNickNames="首領" ++RandomNickNames="小馬駒" ++RandomNickNames="達拉斯" ++RandomNickNames="門栓" ++RandomNickNames="致命射手" ++RandomNickNames="暗鎖" ++RandomNickNames="朽木" ++RandomNickNames="D.O.A." ++RandomNickNames="鷹眼" ++RandomNickNames="八號球" ++RandomNickNames="平線" ++RandomNickNames="遊戲時間" ++RandomNickNames="惡棍" ++RandomNickNames="掘墓人" ++RandomNickNames="帽子戲法" ++RandomNickNames="鷹目" ++RandomNickNames="加熱器" ++RandomNickNames="正午" ++RandomNickNames="職業殺手" ++RandomNickNames="好萊塢" ++RandomNickNames="炒作" ++RandomNickNames="偶像" ++RandomNickNames="豺狼" ++RandomNickNames="法官" ++RandomNickNames="餘光" ++RandomNickNames="禁閉" ++RandomNickNames="遠投高手" ++RandomNickNames="徒步者" ++RandomNickNames="刺針" ++RandomNickNames="蒼白騎士" ++RandomNickNames="死神" ++RandomNickNames="抓痕" ++RandomNickNames="連環殺戮" ++RandomNickNames="警長" ++RandomNickNames="槍手" ++RandomNickNames="表演時間" ++RandomNickNames="滑頭" ++RandomNickNames="投石者" ++RandomNickNames="冷血" ++RandomNickNames="清潔工" ++RandomNickNames="小孩" ++RandomNickNames="真相" ++RandomNickNames="墓碑" ++RandomNickNames="大腕" ++RandomNickNames="高層貨架" ++RandomNickNames="雙擊" ++RandomNickNames="送葬者" ++RandomNickNames="情人" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="牛仔" -RandomNickNames_Male[1]="教父" -RandomNickNames_Male[2]="郵差" -RandomNickNames_Male[3]="睡魔" -RandomNickNames_Male[4]="瘦子" -RandomNickNames_Male[5]="稅務員" -RandomNickNames_Male[6]="宙斯" -RandomNickNames_Female[0]="男爵夫人" -RandomNickNames_Female[1]="黑寡婦" -RandomNicknames_Female[2]="災難" -RandomNicknames_Female[3]="蜂后" ++RandomNickNames_Male="牛仔" ++RandomNickNames_Male="教父" ++RandomNickNames_Male="郵差" ++RandomNickNames_Male="睡魔" ++RandomNickNames_Male="瘦子" ++RandomNickNames_Male="稅務員" ++RandomNickNames_Male="宙斯" ++RandomNickNames_Female="男爵夫人" ++RandomNickNames_Female="黑寡婦" ++RandomNickNames_Female="災難" ++RandomNickNames_Female="蜂后" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1958,73 +1962,73 @@ RightAbilityTreeTitle="破門者" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="強盜" -RandomNickNames[1]="閃電" -RandomNickNames[2]="硬磚" -RandomNickNames[3]="屠夫" -RandomNickNames[4]="鋸齒鳥" -RandomNickNames[5]="凱金" -RandomNickNames[6]="排骨" -RandomNickNames[7]="眼鏡蛇" -RandomNickNames[8]="美洲豹" -RandomNickNames[9]="郊狼" -RandomNickNames[10]="衝擊" -RandomNickNames[11]="鑽石" -RandomNickNames[12]="執行人" -RandomNickNames[13]="毀滅者" -RandomNickNames[14]="閃俠" -RandomNickNames[15]="憤怒" -RandomNickNames[16]="鱷魚" -RandomNickNames[17]="幽靈" -RandomNickNames[18]="槍手" -RandomNickNames[19]="獵犬" -RandomNickNames[20]="寒冰" -RandomNickNames[21]="冰錐" -RandomNickNames[22]="撕咬者" -RandomNickNames[23]="審判日" -RandomNickNames[24]="捲毛" -RandomNickNames[25]="怪獸" -RandomNickNames[26]="野馬" -RandomNickNames[27]="聖騎士" -RandomNickNames[28]="鬥獸犬" -RandomNickNames[29]="先鋒" -RandomNickNames[30]="林戈" -RandomNickNames[31]="武士" -RandomNickNames[32]="天蠍" -RandomNickNames[33]="將軍" -RandomNickNames[34]="影子" -RandomNickNames[35]="殺手" -RandomNickNames[36]="蛇" -RandomNickNames[37]="蛇眼" -RandomNickNames[38]="獨行俠" -RandomNickNames[39]="幽靈" -RandomNickNames[40]="蜘蛛" -RandomNickNames[41]="潛行者" -RandomNickNames[42]="鋼鐵" -RandomNickNames[43]="毒刺" -RandomNickNames[44]="聖殿騎士" -RandomNickNames[45]="勇士" -RandomNickNames[46]="破壞者" -RandomNickNames[47]="維京人" -RandomNickNames[48]="典獄長" -RandomNickNames[49]="軍閥" -RandomNickNames[50]="狼獾" -RandomNickNames[51]="熊孩子" -RandomNickNames[52]="野人" -RandomNickNames[53]="祖魯" ++RandomNickNames="強盜" ++RandomNickNames="閃電" ++RandomNickNames="硬磚" ++RandomNickNames="屠夫" ++RandomNickNames="鋸齒鳥" ++RandomNickNames="凱金" ++RandomNickNames="排骨" ++RandomNickNames="眼鏡蛇" ++RandomNickNames="美洲豹" ++RandomNickNames="郊狼" ++RandomNickNames="衝擊" ++RandomNickNames="鑽石" ++RandomNickNames="執行人" ++RandomNickNames="毀滅者" ++RandomNickNames="閃俠" ++RandomNickNames="憤怒" ++RandomNickNames="鱷魚" ++RandomNickNames="幽靈" ++RandomNickNames="槍手" ++RandomNickNames="獵犬" ++RandomNickNames="寒冰" ++RandomNickNames="冰錐" ++RandomNickNames="撕咬者" ++RandomNickNames="審判日" ++RandomNickNames="捲毛" ++RandomNickNames="怪獸" ++RandomNickNames="野馬" ++RandomNickNames="聖騎士" ++RandomNickNames="鬥獸犬" ++RandomNickNames="先鋒" ++RandomNickNames="林戈" ++RandomNickNames="武士" ++RandomNickNames="天蠍" ++RandomNickNames="將軍" ++RandomNickNames="影子" ++RandomNickNames="殺手" ++RandomNickNames="蛇" ++RandomNickNames="蛇眼" ++RandomNickNames="獨行俠" ++RandomNickNames="幽靈" ++RandomNickNames="蜘蛛" ++RandomNickNames="潛行者" ++RandomNickNames="鋼鐵" ++RandomNickNames="毒刺" ++RandomNickNames="聖殿騎士" ++RandomNickNames="勇士" ++RandomNickNames="破壞者" ++RandomNickNames="維京人" ++RandomNickNames="典獄長" ++RandomNickNames="軍閥" ++RandomNickNames="狼獾" ++RandomNickNames="熊孩子" ++RandomNickNames="野人" ++RandomNickNames="祖魯" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="斧男" -RandomNickNames_Male[1]="公爵" -RandomNickNames_Male[2]="堅岩" -RandomNickNames_Male[3]="種馬" -RandomNickNames_Male[4]="狼人" ++RandomNickNames_Male="斧男" ++RandomNickNames_Male="公爵" ++RandomNickNames_Male="堅岩" ++RandomNickNames_Male="種馬" ++RandomNickNames_Male="狼人" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="雅典娜" -RandomNickNames_Female[1]="公爵夫人" -RandomNicknames_Female[2]="鐵娘子" -RandomNicknames_Female[3]="鐵處女" -RandomNicknames_Female[4]="女戰士" -RandomNickNames_Female[5]="女武神" ++RandomNickNames_Female="雅典娜" ++RandomNickNames_Female="公爵夫人" ++RandomNickNames_Female="鐵娘子" ++RandomNickNames_Female="鐵處女" ++RandomNickNames_Female="女戰士" ++RandomNickNames_Female="女武神" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -2040,47 +2044,47 @@ RightAbilityTreeTitle="劍士" +AbilityTreeTitles[4]="手槍" ;ALPHABETICAL ORDER -RandomNickNames[0]="抓緊" -RandomNickNames[1]="眼鏡蛇" -RandomNickNames[2]="匕首" -RandomNickNames[3]="舞者" -RandomNickNames[4]="猛衝者" -RandomNickNames[5]="躲閃者" -RandomNickNames[6]="巨龍" -RandomNickNames[7]="劍客" -RandomNickNames[8]="翻轉者" -RandomNickNames[9]="毛球" -RandomNickNames[10]="地鼠" -RandomNickNames[11]="狼牙棒" -RandomNickNames[12]="黑夜" -RandomNickNames[13]="中子" -RandomNickNames[14]="畫家" -RandomNickNames[15]="巴夏" -RandomNickNames[16]="偷獵者" -RandomNickNames[17]="話癆" -RandomNickNames[18]="剃刀" -RandomNickNames[19]="撕裂者" -RandomNickNames[20]="貴族" -RandomNickNames[21]="陰暗" -RandomNickNames[22]="棒子" -RandomNickNames[23]="空格鍵" -RandomNickNames[24]="碎片" -RandomNickNames[25]="潛行者" -RandomNickNames[26]="爪子" -RandomNickNames[27]="送葬者" -RandomNickNames[28]="野貓" ++RandomNickNames="抓緊" ++RandomNickNames="眼鏡蛇" ++RandomNickNames="匕首" ++RandomNickNames="舞者" ++RandomNickNames="猛衝者" ++RandomNickNames="躲閃者" ++RandomNickNames="巨龍" ++RandomNickNames="劍客" ++RandomNickNames="翻轉者" ++RandomNickNames="毛球" ++RandomNickNames="地鼠" ++RandomNickNames="狼牙棒" ++RandomNickNames="黑夜" ++RandomNickNames="中子" ++RandomNickNames="畫家" ++RandomNickNames="巴夏" ++RandomNickNames="偷獵者" ++RandomNickNames="話癆" ++RandomNickNames="剃刀" ++RandomNickNames="撕裂者" ++RandomNickNames="貴族" ++RandomNickNames="陰暗" ++RandomNickNames="棒子" ++RandomNickNames="空格鍵" ++RandomNickNames="碎片" ++RandomNickNames="潛行者" ++RandomNickNames="爪子" ++RandomNickNames="送葬者" ++RandomNickNames="野貓" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="彎曲" -RandomNickNames_Male[1]="科奇斯" -RandomNickNames_Male[2]="瘦子" -RandomNickNames_Male[3]="騎手" -RandomNickNames_Male[4]="睡魔" -RandomNickNames_Male[5]="劍客" ++RandomNickNames_Male="彎曲" ++RandomNickNames_Male="科奇斯" ++RandomNickNames_Male="瘦子" ++RandomNickNames_Male="騎手" ++RandomNickNames_Male="睡魔" ++RandomNickNames_Male="劍客" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="黑豹" -RandomNickNames_Female[1]="海妖" -RandomNickNames_Female[2]="火花塞" -RandomNickNames_Female[3]="噴火怪" ++RandomNickNames_Female="黑豹" ++RandomNickNames_Female="海妖" ++RandomNickNames_Female="火花塞" ++RandomNickNames_Female="噴火怪" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -2840,6 +2844,14 @@ BriefingImage="img:///UILibrary_StrategyImages。X2StrategyMap。Alert_Resistanc ObjectiveTextPools[0]="儘可能多的獲取變種人資源" ObjectiveTextPools[1]="撤離所有XCOM士兵" +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="補給突襲" +Briefing="突襲變種人補給站" +PostMissionType="補給突襲" +BriefingImage="img:///UILibrary_StrategyImages。X2StrategyMap。Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="儘可能多的獲取變種人資源" +ObjectiveTextPools[1]="撤離所有XCOM士兵" + [SupplyExtraction_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="標記並回收變種人物資箱" ObjectiveTextPools[1]="標記並回收變種人物資箱" @@ -2854,6 +2866,15 @@ ObjectiveTextPools[3]="撤離所有XCOM士兵" ObjectiveTextPools[4]="補給突襲" ObjectiveTextPools[5]="反抗軍找到一個含有各種資源的變種人補給站。 突襲補給站,儘可能多的帶走這些資源,在敵人增員趕來之前撤離。 該任務將會有多個補給目標, 但是一名士兵只能帶走一個補給箱。" +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="找到變種人資源" +ObjectiveTextPools[1]="轉移變種人資源" +ObjectiveTextPools[2]="找到額外的變種人資源(可選)" +ObjectiveTextPools[3]="撤離所有XCOM士兵" +ObjectiveTextPools[4]="補給突襲" +ObjectiveTextPools[5]="反抗軍找到一個含有各種資源的變種人補給站。 突襲補給站,儘可能多的帶走這些資源,在敵人增員趕來之前撤離。 該任務將會有多個補給目標, 但是一名士兵只能帶走一個補給箱。" + + [TroopManeuvers_LW X2MissionTemplate] DisplayName="伏擊一支變種人列隊" Briefing="伏擊一支變種人列隊" @@ -2871,6 +2892,23 @@ ObjectiveTextPools[4]="LWOTC不速之客" ObjectiveTextPools[5]="歡迎來到LWOTC的第一個任務!

目標很簡單:擊殺所有的敵人。

請注意,這是為數不多可以獲得敵人屍體的任務之一,這些屍體是研究和建設許多項目所需要的。在LWOTC用爆炸物擊殺敵人會摧毀屍體!" ; End Translation +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="伏擊一支變種人列隊" +Briefing="伏擊一支變種人列隊" +PostMissionType="伏擊敵方軍隊" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="消滅所有目標敵人" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="消滅所有目標敵人" +ObjectiveTextPools[1]="撤離所有XCOM士兵" +ObjectiveTextPools[2]="伏擊敵方軍隊" +ObjectiveTextPools[3]="變種人通常以大群體的形式轉移他們的軍隊,但是我們還是找到了較小的容易攻擊的單位。一次時機恰當的突襲將會挫敗變種人在這片地區的勢力,並為我們提供將敵人屍體帶回研究的寶貴機會。" +; LWOTC Needs Translation +ObjectiveTextPools[4]="LWOTC不速之客" +ObjectiveTextPools[5]="歡迎來到LWOTC的第一個任務!

目標很簡單:擊殺所有的敵人。

請注意,這是為數不多可以獲得敵人屍體的任務之一,這些屍體是研究和建設許多項目所需要的。在LWOTC用爆炸物擊殺敵人會摧毀屍體!" +; End Translation + [Rendezvous_LW X2MissionTemplate] DisplayName="集結點" Briefing="阻止間諜與變種人部隊的會面" @@ -5149,7 +5187,14 @@ FocusLevelDescriptions[4]="撕裂傷害 +\n移動力 [TemplarFocus X2AbilityTemplate] LocPromotionPopupText=" 聖殿騎士在開始任務時比其他士兵弱,但在更高的專注水平下會變得非常強大。
專注是通過用撕裂攻擊敵人獲得的(即使未命中也能獲得)。
" -[Rend X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="撕裂" +LocLongDescription="近戰攻擊有幾率使目標眩暈或混亂。觸發氣勢,產生專注。" +LocHelpText="近戰攻擊有幾率使目標眩暈或混亂。觸發氣勢,產生專注。" +LocPromotionPopupText=" 使用撕裂是聖殿騎士產生專注的主要方法。
施展撕裂後,聖殿騎士將獲得氣勢,允許他們進行一次移動動作。攻擊後撤回掩體。
撕裂每1點專注有%幾率眩暈。眩暈的目標也會被擊退。
撕裂每1點專注有 %幾率混亂。
" + +[Rend_LW X2AbilityTemplate] +LocFriendlyName="撕裂" LocLongDescription="近戰攻擊有幾率使目標眩暈或混亂。觸發氣勢,產生專注。" LocHelpText="近戰攻擊有幾率使目標眩暈或混亂。觸發氣勢,產生專注。" LocPromotionPopupText=" 使用撕裂是聖殿騎士產生專注的主要方法。
施展撕裂後,聖殿騎士將獲得氣勢,允許他們進行一次移動動作。攻擊後撤回掩體。
撕裂每1點專注有%幾率眩暈。眩暈的目標也會被擊退。
撕裂每1點專注有 %幾率混亂。
" @@ -5690,6 +5735,9 @@ LocFlyOverText="靈魂風暴" LocPromotionPopupText=" 召喚靈魂風暴對目標區域內的敵人造成傷害,並摧毀他們的掩體。
靈魂風暴的影響範圍以釋放者為中心。
不能破壞地板或天花板。
靈魂風暴需要一個行動點並結束你的回合。
靈魂風暴有回合冷卻時間。
靈魂風暴半徑為4格。
" ; End Translation (2) +[TheLostGrappler X2CharacterTemplate] +strCharacterName="利爪失魂者" + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="利爪失魂者" @@ -5723,6 +5771,9 @@ strCharacterName="利爪失魂者" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="利爪失魂者" +[TheLostBrute X2CharacterTemplate] +strCharacterName="殘暴失魂者" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="殘暴失魂者" @@ -6328,8 +6379,8 @@ LocFlyOverText="精神發狂" [YouCannotHide_LW X2AbilityTemplate] LocFriendlyName="無所遁形" -LocHelpText="你的主武器增加100命中。" -LocLongDescription="你的主武器增加100命中。" +LocHelpText="你的主武器增加30命中。" +LocLongDescription="你的主武器增加30命中。" LocFlyOverText="逃跑吧。" [RebelHPUpgrade_T1 X2AbilityTemplate] @@ -6413,8 +6464,8 @@ LocFlyOverText="死亡標記" [Fatality_LW X2AbilityTemplate] LocFriendlyName="宿命" -LocLongDescription="使用對35%生命或更低的目標增加+100命中和暴擊率。" -LocHelpText="使用對35%生命或更低的目標增加+100命中和暴擊率。" +LocLongDescription="使用%生命或更低的目標增加+100命中和暴擊率。" +LocHelpText="使用%生命或更低的目標增加+100命中和暴擊率。" LocFlyOverText="宿命" [Vampirism_LW X2AbilityTemplate] @@ -6474,7 +6525,7 @@ LocHelpText="在XCOM回合受到傷害後,獲得移動動作或戰備狀態。 LocFlyOverText="天選者反應" ; LWOTC Needs Translation (2) -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="天選者免疫" LocLongDescription="天選者對眩暈、混亂和冰凍免疫,並遭受-50%的致殘移動力,而不是原地不動。" LocHelpText="天選者對眩暈、混亂和冰凍免疫,並遭受-50%的致殘移動力,而不是原地不動。" @@ -6549,9 +6600,9 @@ SummaryText="殘酷鎮壓反抗軍,減少該地區反抗軍未來 Disparo en cadena consume puntos de munición.
Tiempo de reutilización de turnos.
Disparo en cadena puede ser devastador contra enemigos que no están cubiertos o cuando es potenciado con bonificaciones de puntería.
" +[ChainShotSnapShot X2AbilityTemplate] +LocFriendlyName="Disparo en cadena" +LocLongDescription="Dispara con una penalización de a la puntería. Si aciertas el objetivo, haces otro disparo al objetivo automáticamente." +LocHelpText="Dispara con una penalización de a la puntería. Si aciertas el objetivo, haces otro disparo al objetivo automáticamente." +LocFlyOverText="Disparo en cadena" +LocPromotionPopupText=" Disparo en cadena requiere puntos de munición y tiene un tiempo de enfriamiento de turnos.
Disparo en cadena puede ser devastador contra enemigos que no están a cubierto o cuando se aumenta con bonificaciones de puntería.
" + +[ChainShotSnapShot X2AbilityTemplate] +LocPromotionPopupText=" Disparo en cadena consume puntos de munición.
Tiempo de reutilización de turnos.
Disparo en cadena puede ser devastador contra enemigos que no están cubiertos o cuando es potenciado con bonificaciones de puntería.
" + +[ChainShotSnapShot2 X2AbilityTemplate] +LocFriendlyName="Disparo en cadena" +LocFlyOverText="Disparo en cadena" +LocPromotionPopupText="" + + + [SaturationFire X2AbilityTemplate] LocPromotionPopupText=" Fuego de saturación requiere puntos de munición.
Tiempo de reutilización de turnos.
Fuego de saturación realiza un disparo estándar a cada objetivo en el cono de visión y dañará o destruirá elementos de cobertura aleatorios.
" ; End translated @@ -507,7 +525,7 @@ LocLongDescription="Dispara los dos cañones de la escopeta recortada a un enemi LocHelpText="Dispara los dos cañones de la escopeta recortada a un enemigo cercano, infligiendo el doble de daño." LocFlyOverText="Dos cañones" ; LWOTC translated -LocPromotionPopupText=" Dispara los dos cañones de la escopeta recortada a un enemigo cercano, infligiendo el doble de daño.
Usa de munición.
Usa una acción.
" +LocPromotionPopupText=" Dispara los dos cañones de la escopeta recortada a un enemigo cercano, infligiendo el doble de daño.
Usa de munición.
Cuesta una acción.
" ; End translated [PumpAction X2AbilityTemplate] @@ -738,126 +756,126 @@ LocFlyOverText="Reacción inmediata de élite" [Stock_LW_Bsc_Ability X2AbilityTemplate] LocFriendlyName="Arma estable" LocLongDescription="Activa la habilidad Arma estable para obtener + de puntería y probabilidad de crítico en el siguiente disparo con el arma que lleves equipada. La bonificación se pierde si usas acciones que no sean disparar o te hieren." -LocHelpText="Arma estable: bonificación a impactar con el siguiente disparo si no estás herido ni realizas otra acción." +LocHelpText="Arma estable: bonificación a impactos y críticos con el siguiente disparo si no estás herido ni realizas otra acción." LocFlyOverText="Arma estable" ; LWOTC translated [Stock_LW_Adv_Ability X2AbilityTemplate] LocFriendlyName="Arma estable" LocLongDescription="Activa la habilidad Arma estable para obtener + de puntería y probabilidad de crítico en el siguiente disparo con el arma que lleves equipada. La bonificación se pierde si usas acciones que no sean disparar o te hieren." -LocHelpText="Arma estable: bonificación a impactar con el siguiente disparo si no estás herido ni realizas otra acción." +LocHelpText="Arma estable: bonificación a impactos y críticos con el siguiente disparo si no estás herido ni realizas otra acción." LocFlyOverText="Arma estable" [Stock_LW_Sup_Ability X2AbilityTemplate] LocFriendlyName="Arma estable" LocLongDescription="Activa la habilidad Arma estable para obtener + de puntería y probabilidad de crítico en el siguiente disparo con el arma que lleves equipada. La bonificación se pierde si usas acciones que no sean disparar o te hieren." -LocHelpText="Arma estable: bonificación a impactar con el siguiente disparo si no estás herido ni realizas otra acción." +LocHelpText="Arma estable: bonificación a impactos y críticos con el siguiente disparo si no estás herido ni realizas otra acción." LocFlyOverText="Arma estable" ; End translated [Needle_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Balas aguja" LocFlyOverText="Balas aguja" -LocLongDescription="Inflige +2 de daño a objetivos de ADVENT no robóticos. +1 de daño contra todos los enemigos." -LocHelpText="Inflige +2 de daño a objetivos de ADVENT no robóticos. +1 de daño contra todos los enemigos." +LocLongDescription="Inflige + de daño a objetivos de ADVENT no robóticos. + de daño contra todos los enemigos." +LocHelpText="Inflige + de daño a objetivos de ADVENT no robóticos. + de daño contra todos los enemigos." [Shredder_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Munición trituradora" LocFlyOverText="Munición trituradora" -LocLongDescription="Destroza 2 punto de blindaje enemigo con cada impacto." -LocHelpText="Destroza 2 punto de blindaje enemigo con cada impacto." +LocLongDescription="Destroza punto/s de blindaje enemigo con cada impacto." +LocHelpText="Destroza punto/s de blindaje enemigo con cada impacto." [Flechette_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Balas dardo" LocFlyOverText="Balas dardo" -LocLongDescription="Inflige +2 de daño a objetivos sin blindaje. +1 de daño contra todos los enemigos." -LocHelpText="Inflige +2 de daño a objetivos sin blindaje. +1 de daño contra todos los enemigos." +LocLongDescription="Inflige + de daño a objetivos sin blindaje. + de daño contra todos los enemigos." +LocHelpText="Inflige + de daño a objetivos sin blindaje. + de daño contra todos los enemigos." [Redscreen_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Balas Pantalla roja" LocFlyOverText="Balas Pantalla roja" ; LWOTC translated -LocLongDescription="Reduce en la defensa al pirateo del objetivo con cada impacto. No se acumula, pero se renueva." -LocHelpText="Reduce en la defensa al pirateo del objetivo con cada impacto. No se acumula, pero se renueva." +LocLongDescription="Reduce en la defensa al pirateo del objetivo con cada impacto. El efecto no se acumula, pero renueva el tiempo que se mantiene aplicado." +LocHelpText="Reduce en la defensa al pirateo del objetivo con cada impacto. El efecto no se acumula, pero renueva el tiempo que se mantiene aplicado." ; End translated [Stiletto_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Balas estilete" LocFlyOverText="Balas estilete" -LocLongDescription="Inflige +2 de daño a alienígenas no robóticos. +1 de daño contra todos los enemigos." -LocHelpText="Inflige +2 de daño a alienígenas no robóticos. +1 de daño contra todos los enemigos." +LocLongDescription="Inflige + de daño a alienígenas no robóticos. + de daño contra todos los enemigos." +LocHelpText="Inflige + de daño a alienígenas no robóticos. + de daño contra todos los enemigos." [AP_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Munición perforante" LocFlyOverText="Munición perforante" -LocLongDescription="Tus impactos ignoran 2 puntos de blindaje." -LocHelpText="Tus impactos ignoran 2 puntos de blindaje." +LocLongDescription="Tus impactos ignoran punto/s de blindaje." +LocHelpText="Tus impactos ignoran punto/s de blindaje." [Tracer_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Balas trazadoras" LocFlyOverText="Balas trazadoras" -LocLongDescription="Tus armas tienen +5 de puntería." -LocHelpText="Tus armas tienen +5 de puntería." +LocLongDescription="Tus armas tienen + de puntería." +LocHelpText="Tus armas tienen + de puntería." [Talon_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Munición Garra" LocFlyOverText="Munición Garra" -LocLongDescription="Tus armas tienen +10 de probabilidad de crítico y hacen +1 de daño con los impactos críticos." -LocHelpText="Tus armas tienen +10 de probabilidad de crítico y hacen +1 de daño con los impactos críticos." +LocLongDescription="Tus armas tienen + de probabilidad de crítico y hacen + de daño con los impactos críticos." +LocHelpText="Tus armas tienen + de probabilidad de crítico y hacen + de daño con los impactos críticos." [Dragon_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Balas Dragón" LocFlyOverText="Balas Dragón" -LocLongDescription="Tus armas infligen +1 de daño y pueden prender fuego a los enemigos." -LocHelpText="Tus armas infligen +1 de daño y pueden prender fuego a los enemigos." +LocLongDescription="Tus armas infligen +1 de daño y pueden prender fuego a los enemigos con una probabilidad del %." +LocHelpText="Tus armas infligen +1 de daño y pueden prender fuego a los enemigos con una probabilidad del %." [Bluescreen_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Balas Pantalla azul" LocFlyOverText="Balas Pantalla azul" -LocLongDescription="Tus armas infligen +3 de daño a enemigos mecánicos y eliminan algunos escudos defensivos." -LocHelpText="Tus armas infligen +3 de daño a enemigos mecánicos y eliminan algunos escudos defensivos." +LocLongDescription="Tus armas infligen + de daño a enemigos mecánicos y eliminan algunos escudos defensivos." +LocHelpText="Tus armas infligen + de daño a enemigos mecánicos y eliminan algunos escudos defensivos." [Venom_Rounds_Ability_PP X2AbilityTemplate] LocFriendlyName="Balas venenosas" LocFlyOverText="Balas venenosas" -LocLongDescription="Tus armas infligen +1 de daño y pueden envenenar a los enemigos." -LocHelpText="Tus armas infligen +1 de daño y pueden envenenar a los enemigos." +LocLongDescription="Tus armas infligen +1 de daño y pueden envenenar a los enemigos con una probabilidad del %." +LocHelpText="Tus armas infligen +1 de daño y pueden envenenar a los enemigos con una probabilidad del %." [Ceramic_Plating_Ability X2AbilityTemplate] LocFriendlyName="Placas cerámicas" LocFlyOverText="Placas cerámicas" -LocLongDescription="Obtienes 2 puntos de salud ablativos." -LocHelpText="Obtienes 2 puntos de salud ablativos." +LocLongDescription="Obtienes puntos de salud ablativos." +LocHelpText="Obtienes puntos de salud ablativos." [Alloy_Plating_Ability X2AbilityTemplate] LocFriendlyName="Placas de aleación" LocFlyOverText="Placas de aleación" -LocLongDescription="Obtienes 3 puntos de salud ablativos." -LocHelpText="Obtienes 3 puntos de salud ablativos." +LocLongDescription="Obtienes puntos de salud ablativos." +LocHelpText="Obtienes puntos de salud ablativos." [Chitin_Plating_Ability X2AbilityTemplate] LocFriendlyName="Placas de quitina" LocFlyOverText="Placas de quitina" -LocLongDescription="Obtienes 4 puntos de salud ablativos." -LocHelpText="Obtienes 4 puntos de salud ablativos." +LocLongDescription="Obtienes puntos de salud ablativos." +LocHelpText="Obtienes puntos de salud ablativos." [Carapace_Plating_Ability X2AbilityTemplate] LocFriendlyName="Placas de caparazón" LocFlyOverText="Placas de caparazón" -LocLongDescription="Obtienes 5 puntos de salud ablativos." -LocHelpText="Obtienes 5 puntos de salud ablativos." +LocLongDescription="Obtienes puntos de salud ablativos." +LocHelpText="Obtienes puntos de salud ablativos." [HazmatVestBonus_LW X2AbilityTemplate] LocFriendlyName="Chaleco ambiental" LocFlyOverText="Chaleco ambiental" -LocLongDescription="Concede 3 puntos de salud y confiere inmunidad al fuego, al ácido y al veneno." -LocHelpText="Concede 3 puntos de salud y confiere inmunidad al fuego, al ácido y al veneno." +LocLongDescription="Concede puntos de salud y confiere inmunidad al fuego, al ácido y al veneno." +LocHelpText="Concede puntos de salud y confiere inmunidad al fuego, al ácido y al veneno." [NanofiberVestBonus_LW X2AbilityTemplate] LocFriendlyName="Chaleco de nanoescamas" LocFlyOverText="Chaleco de nanoescamas" -LocLongDescription="Da 2 puntos de salud, y los enemigos tienen un -25 a la probabilidad de crítico contra ti." -LocHelpText="Da 2 puntos de salud, y los enemigos tienen un -25 a la probabilidad de crítico contra ti." +LocLongDescription="Da puntos de salud, y los enemigos tienen un - a la probabilidad de crítico contra ti." +LocHelpText="Da puntos de salud, y los enemigos tienen un - a la probabilidad de crítico contra ti." [FireControl25 X2AbilityTemplate] LocFriendlyName="Control del disparo (25)" @@ -880,8 +898,8 @@ LocHelpText="Esta unidad no efectuará disparos de reacción que no tengan al me [Neurowhip_Ability X2AbilityTemplate] LocFriendlyName="Neurolátigo" LocFlyoverText="Neurolátigo" -LocLongDescription="Concede 10 de ataque psi a costa de 10 de voluntad." -LocHelpText="Concede 10 de ataque psi a costa de 10 de voluntad." +LocLongDescription="Concede de ataque psi a costa de de voluntad." +LocHelpText="Concede de ataque psi a costa de de voluntad." ;;;;;;;;;;;;;;;;;;;; ITEM TEMPLATES ;;;;;;;;;;;;;;;;;;;;;;; @@ -923,9 +941,13 @@ TacticalText=" Las pistolas de plasma son las pistolas más potentes de [AlienHunterPistol_CV X2WeaponTemplate] UnknownUtilityCategory="Pistola" +TacticalText=" La fuerza del guardián de la sombra es comparable a la de una convencional, pero tiene mejor puntería y probabilidad de dar un golpe crítico.\n Las pistolas se pueden disparar con una sola acción..\n Muertes realizadas con la habilidad \"Bajo la sombra\" oculta instantáneamente la unidad." + [AlienHunterPistol_MG X2WeaponTemplate] UnknownUtilityCategory="Pistola" +TacticalText=" La fuerza del guardián de la sombra mejorado es similar a la de la pistola magnética, pero tiene una puntería y probabilidad de producir un impacto crítico mejoradas.\n A diferencia del fusil de francotirador, las pistolas se pueden disparar con una sola acción.\nLas bajas infligidas con la habilidad \"Bajo la sombra\" ocultan instantáneamente a la unidad.
" + [AlienHunterPistol_BM X2WeaponTemplate] UnknownUtilityCategory="Pistola" @@ -1372,13 +1394,13 @@ TacticalText=" Confiere un aumento de Robo de alma repondrá la salud perdida de un agente herido o proveerá con 3/4/6 ablativos durante 3 turnos.
Un agente puede incrementar sus PS ablativos a no más de 15 utilizando Robo de alma." ; End translated @@ -5110,7 +5197,7 @@ TimerDefendSubtitle="Turnos hasta la llegada de ADVENT" ; LWOTC translated [Domination X2AbilityTemplate] -LocPromotionPopupText=" Dominio requiere una confrontación de la fuerza del soldado psiónico frente a la voluntad del objetivo.
Si Dominio falla hay un tiempo de reutilización de 4 turnos antes de que se pueda realizar otra Dominación.
Si el soldado psiónico muere o abandona el campo de batalla el Dominio se rompe.
" +LocPromotionPopupText=" Dominio requiere una confrontación de la fuerza del soldado psiónico frente a la voluntad del objetivo.
Si Dominio falla hay un tiempo de reutilización de turno(s) antes de que se pueda realizar otra Dominación.
Si el soldado psiónico muere o abandona el campo de batalla el Dominio se rompe.
" ; End translated ; LWOTC translated @@ -5120,8 +5207,8 @@ LocPromotionPopupText=" Genera un campo explosivo de energía psiónica ; LWOTC translated [CoveringFire X2AbilityTemplate] -LocLongDescription="Los disparos de reacción ahora producen una reducción de puntería a los enemigos y pueden activarse con cualquier acción enemiga, no solo con el movimiento." -LocPromotionPopupText=" Si se desencadena con una acción del objetivo, Fuego de cobertura se activará antes de que se complete la operación enemiga.
Además, la habilidad Fuego de cobertura confiere una penalización temporal de puntería a cualquier unidad contra la que tomes un disparo de reacción, sin importar si fue o no un disparo de fuego de cobertura.
" +LocLongDescription="Los disparos de reacción ahora producen una reducción de puntería a los enemigos de -, incluso si fallas, y pueden activarse con cualquier acción enemiga, no solo con el movimiento." +LocPromotionPopupText=" Si se desencadena con una acción del objetivo, Fuego de cobertura se activará antes de que se complete la operación enemiga.
Además, la habilidad Fuego de cobertura confiere una penalización temporal de puntería de - a cualquier unidad contra la que tomes un disparo de reacción, sin importar si fue o no un disparo de fuego de cobertura.
" ; End translated ; LWOTC translated @@ -5292,7 +5379,8 @@ FocusLevelDescriptions[4]="Daño de Hender +\nMovilid LocPromotionPopupText=" Los Templarios comienzan las misiones más débiles que otros soldados, pero aumentarán extremadamente su fuerza en niveles de concentración más elevadas. Administrar concentración de manera efectiva para aprovechar al máximo cada habilidad y los aumentos de estadísticas es fundamental para regir un Templario.
La concentración se consigue atacando enemigos con Hender (incluso si fallas).
" ; LWOTC translated -[Rend X2AbilityTemplate] +[Rend_LW X2AbilityTemplate] +LocFriendlyName="Hender" LocLongDescription="Ataque cuerpo a cuerpo con la posibilidad de aturdir o desorientar al objetivo. Activa Ímpetu y genera concentración en los ataques." LocHelpText="Ataque cuerpo a cuerpo con la posibilidad de aturdir o desorientar al objetivo. Activa Ímpetu y genera concentración en los ataques." LocPromotionPopupText=" Usar Hender es el método principal de los Templarios para generar concentración.
Después de lanzar Hender el Templario ganará Ímpetu lo que le permitirá una acción de movimiento gratuita. Empléala para volver a trasladarte a una cobertura después de atacar.
Hender tiene un % de probabilidad de aturdir con concentración. Los objetivos aturdidos también serán derribados.
Hender también posee un % de probabilidad de desorientar mediante concentración.
" @@ -5358,9 +5446,9 @@ LocPromotionPopupText=" Reduce el tiempo de reutilización de Sombra en ; LWOTC translated [BloodTrail X2AbilityTemplate] LocFriendlyName="Reguero de sangre" -LocLongDescription="Los disparos infligen + de daño e ignoran de esquiva si ya se ha herido al objetivo este turno." -LocHelpText="Los disparos infligen + de daño e ignoran de esquiva si ya se ha herido al objetivo este turno." -LocPromotionPopupText=" Sólo se aplica en el mismo turno en que se haga daño al objetivo.
Funciona con todas las armas incluyendo granadas.
" +LocLongDescription="Los disparos infligen + de daño e ignoran de esquiva si ya se ha herido al objetivo anteriormente." +LocHelpText="Los disparos infligen + de daño e ignoran de esquiva si ya se ha herido al objetivo anteriormente." +LocPromotionPopupText=" Las bonificaciones se aplican si el enemigo ha recibido daño en tu turno o en su turno anterior..
Funciona con todas las armas incluyendo granadas.
" ; End translated [PaleHorse X2AbilityTemplate] @@ -5466,6 +5554,18 @@ LocHelpText="El Templario puede extinguir inmediatamente los efectos mentales ne LocPromotionPopupText=" Purgar limpia los efectos de desorientación, control mental, pánico y aturdimiento.
Cuesta 1 acción y no termina el turno; turnos de enfriamiento.
; End translated +; LWOTC translated + +[VoidConduit X2AbilityTemplate] +LocFriendlyName="Conducto del vacío" +LocLongDescription="Atrapa a un humanoide en una prisión psiónica, lo inmoviliza durante varias acciones y transfiere su salud al Templario. Cuesta 1 de concentración." +LocHelpText="Inmoviliza a un humanoide durante varias acciones y transfiere su salud al Templario. Cuesta 1 de concentración." +LocPromotionPopupText=" Conducto del vacío infligirá de daño inicial y absorberá de salud por acción del enemigo.
Conducto del vacío se mantendrá durante 2 acciones hostiles.
Tiempo de enfriamiento de turno(s).
Los objetivos que se ven atrapados por Conducto del vacío no pueden realizar acciones ni esquivar, pero sí que pueden ser blanco de otros ataques.
" + +; End translated + + + ; LWOTC translated [Ghost X2AbilityTemplate] LocPromotionPopupText=" Los Fantasmas comienzan con una concentración igual al nivel de concentración del Templario menos 1.
No pueden ganar concentración y desaparecen cuando se gasta toda la concentración o su salud llega a 0.
Hender cuesta 1 de concentración cuando se utiliza con fantasmas.
Debe lanzarse sobre el cadáver de un enemigo humanoide pero no sirve dos veces sobre el mismo cuerpo.
Tiempo de enfriamiento de turnos.
Los Fantasmas no pueden obtener las siguientes habilidades: Voltio, Golpe de escudo, habilidades de escudo, Desviar, Reflejar, Alivio, Conducto del vacío, Tormenta de espadas, Apoteosis, Aptitud superior, Tormenta iónica y Mantener.
" @@ -5544,6 +5644,13 @@ LocFriendlyName="El más grande Campeón del Brujo" LocHelpText="Otorga puntería, probabilidad crítica, voluntad, poder psiónico y un escudo ablativo a un aliado. Cuando esa unidad permanece con vida el Brujo gana % de mitigación al daño. Tiempo de reutilización de turnos." LocLongDescription="Otorga puntería, probabilidad crítica, voluntad, poder psiónico y un escudo ablativo a un aliado. Cuando esa unidad permanece con vida el Brujo gana % de mitigación al daño. Tiempo de reutilización de turnos." LocFlyOverText="El más grande Campeón del Brujo" + +[ShieldAllyM5 X2AbilityTemplate] +LocFriendlyName="El más grande Campeón del Brujo" +LocHelpText="Otorga puntería, probabilidad crítica, voluntad, poder psiónico y un escudo ablativo a un aliado. Cuando esa unidad permanece con vida el Brujo gana % de mitigación al daño. Tiempo de reutilización de turnos." +LocLongDescription="Otorga puntería, probabilidad crítica, voluntad, poder psiónico y un escudo ablativo a un aliado. Cuando esa unidad permanece con vida el Brujo gana % de mitigación al daño. Tiempo de reutilización de turnos." +LocFlyOverText="El más grande Campeón del Brujo" + ; End translated ; LWOTC translated @@ -5628,6 +5735,10 @@ LocLongDescription="Cuando consigas un crítico con cualquier disparo o habilida [LocationScout X2SitRepTemplate] Description="La Resistencia ha colocado detectores de movimiento de rango bajo en toda el área de operaciones que se conectan a las comunicaciones del escuadrón. Nuestros soldados podrán detectar unidades enemigas que estén fuera de la línea de visión." +[ChosenOnMissionSitrep X2SitrepTemplate] +FriendlyName="Alerta, presencia detectada" +Description="Se ha descubierto el aura oscura de un Elegido. Ten seguro que aparecerán en esta misión." + [LargeMap X2SitRepTemplate] FriendlyName="Tamaño del mapa considerable" Description="El área de operaciones es más grande de lo normal: probablemente te llevará más tiempo de lo habitual en llegar al objetivo." @@ -5749,6 +5860,11 @@ Description="Las unidades enemigas serán significativamente más difíciles de FriendlyName="Baja infiltración (¿imposible?)" Description="Las unidades enemigas van a ser de tal calibre que la misión rozará virtualmente lo imposible para completarla ya que no te estás infiltrando lo suficiente." +[LargeDepot_LW X2SitRepTemplate] +FriendlyName="Depósito grande" +Description="Se ha rastreado un envío de ADVENT hasta este lugar más grande de lo normal. Aparecerán cajas adicionales." + + ; LWOTC translated [ToughScaling X2AbilityTemplate] LocFriendlyName="Baja infiltración (leve)" @@ -5791,6 +5907,13 @@ ActionObjective="Apropiarse un CEM para la Resistencia" [CovertAction_RecruitRebels X2CovertActionTemplate] ActionObjective="Reclutar rebeldes" +[CovertAction_BigSupplyDepot X2CovertActionTemplate] +ActionObjective="Localiza un depósito de suiministros" + +[CovertAction_FindAdventDetachment X2CovertActionTemplate] +ActionObjective="Rastrea a las patrullas ADVENT" + + [CovertActionNarrative_EnemyCorpses_Skirmishers X2CovertActionNarrativeTemplate] ActionName="Asalta una morgue enemiga" ActionPreNarrative="Descubrimos dónde han estado arrojando los cadáveres que provienen del resultado de nuestras batallas campales contra ellos. Podría ser una oportunidad para acelerar nuestro desarrollo tecnológico." @@ -5851,6 +5974,37 @@ ActionName="Búsqueda de reclutas de la Resistencia" ActionPreNarrative="Hemos sabido de un pequeño destacamento de disidentes en la región que pueden estar dispuestos a ayudarnos. Vaya y vea si es capaz de persuadirlos para de que se unan al Refugio." ActionPostNarrative="Su equipo convenció a algunos de los disidentes: se unirán con el propósito de luchar contra un enemigo en común." +[CovertActionNarrative_FindBigDepot_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Localiza un depósito de suministros ADVENT" +ActionPreNarrative="Hemos hallado la posible ubicación de un gran alijo de suministros. Deberíamos investigar." +ActionPostNarrative="¡Eso es! Ahora podemos enviar un equipo para realizar un mayor seguimiento." + +[CovertActionNarrative_FindBigDepot_Reapers X2CovertActionNarrativeTemplate] +ActionName="Localiza un depósito de suministros ADVENT" +ActionPreNarrative="Hemos hallado la posible ubicación de un gran alijo de suministros. Deberíamos investigar." +ActionPostNarrative="¡Eso es! Ahora podemos enviar un equipo para realizar un mayor seguimiento." + +[CovertActionNarrative_FindBigDepot_Templars X2CovertActionNarrativeTemplate] +ActionName="Localiza un depósito de suministros ADVENT" +ActionPreNarrative="Hemos hallado la posible ubicación de un gran alijo de suministros. Deberíamos investigar." +ActionPostNarrative="¡Eso es! Ahora podemos enviar un equipo para realizar un mayor seguimiento." + +[CovertActionNarrative_FindAdventDetachment_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Perseguir patrulla exploradora ADVENT" +ActionPreNarrative="Nos hemos enterado de la posible ubicación de una célula ADVENT. Deberíamos investigar." +ActionPostNarrative="Buen trabajo, los tenemos... ya son carne de cañón." + +[CovertActionNarrative_FindAdventDetachment_Reapers X2CovertActionNarrativeTemplate] +ActionName="Perseguir patrulla exploradora ADVENT" +ActionPreNarrative="Nos hemos enterado de la posible ubicación de una célula ADVENT. Deberíamos investigar." +ActionPostNarrative="Buen trabajo, los tenemos... ya son carne de cañón." + +[CovertActionNarrative_FindAdventDetachment_Templars X2CovertActionNarrativeTemplate] +ActionName="Perseguir patrulla exploradora ADVENT" +ActionPreNarrative="Nos hemos enterado de la posible ubicación de una célula ADVENT. Deberíamos investigar." +ActionPostNarrative="Buen trabajo, los tenemos... ya son carne de cañón." + + [AbilityPoints X2ItemTemplate] FriendlyName="Puntos de habilidad" FriendlyNamePlural="Puntos de habilidad" @@ -5892,6 +6046,16 @@ LocFlyOverText="Tormenta de almas" LocPromotionPopupText=" Invoca meteoros de energía psiónica dentro de un área objetivo a fin de infligir daño a los enemigos y destruir su cobertura.
El área de efecto de Tormenta de almas se centra en el lanzador.
No destruye muros ni tejados.
Requiere una acción y finaliza tu turno.
Tiempo de enfriamiento de turnos.
Tormenta de almas tiene un radio de acción de 4 casillas.
" ; End translated +[Stasis X2AbilityTemplate] +LocFriendlyName="Estasis" +LocLongDescription="Aturde completamente al objetivo durante 1 turno, pero lo hace inmune a todo daño o ataque." +LocHelpText="Aturde completamente al objetivo durante 1 turno, pero lo hace inmune a todo daño o ataque." +LocFlyOverText="Estasis" +LocPromotionPopupText=" Estasis cuesta una acción y no termina el turno.
Tiene un tiempo de enfriamiento de turnos.
Se puede lanzar tanto en aliados como enemigos.
Puesto que Estasis retira a una unidad enemiga del combate durante un turno, puede utilizarse de forma defensiva para proteger a soldados vulnerables, o bien de forma ofensiva para organizar un ataque coordinado.
" + +[TheLostGrappler X2CharacterTemplate] +strCharacterName="Perdido destructor" + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="Perdido destructor" @@ -5925,6 +6089,9 @@ strCharacterName="Perdido destructor" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="Perdido destructor" +[TheLostBrute X2CharacterTemplate] +strCharacterName="Perdido bruto" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="Perdido bruto" @@ -6038,9 +6205,9 @@ LocPromotionPopupText=" Tus ataques a distancia conceden una vez por turno." LocPromotionPopupText=" Devolver fuego sólo se activará una vez por turno.
También se estimulará mediante ataques cuerpo a cuerpo y de área.
Devolver fuego no se ejecutará cuando seas objetivo de una guardia.
" +[TriggerBot X2AbilityTemplate] +LocFriendlyName="Revancha" +LocHelpText="Cuando seas objetivo de fuego enemigo, contraataca automáticamente con tu una vez por turno, con una reacción que tiene un % de penalización de daño, pero es un impacto garantizado." +LocLongDescription="Cuando seas objetivo de fuego enemigo, contraataca automáticamente con tu una vez por turno, con una reacción que tiene un % de penalización de daño, pero es un impacto garantizado." +LocPromotionPopupText=" Revancha sólo se ejecutará una vez por turno.
Puede activarse mediante ataques cuerpo a cuerpo y ataques de área de efecto.
No funciona con las guardias.
" + +[TriggerBotShot X2AbilityTemplate] +LocFriendlyName="Revancha" +LocHelpText="Cuando seas objetivo de fuego enemigo, contraataca automáticamente con tu una vez por turno, con una reacción que tiene un % de penalización de daño, pero es un impacto garantizado. +LocLongDescription="Cuando seas objetivo de fuego enemigo, contraataca automáticamente con tu una vez por turno, con una reacción que tiene un % de penalización de daño, pero es un impacto garantizado." +LocPromotionPopupText=" Revancha sólo se ejecutará una vez por turno.
Puede activarse mediante ataques cuerpo a cuerpo y ataques de área de efecto.
No funciona con las guardias.
" + + [DeadeyeSnapShot X2AbilityTemplate] LocFriendlyName="Ojo de lince" LocLongDescription="Dispara con una pequeña penalización a la puntería a cambio de un considerable aumento del daño." @@ -6371,44 +6551,44 @@ LocFlyOverText="Guerrero sagrado" [ChosenDragonRounds X2AbilityTemplate] LocFriendlyName="Furia infernal" LocFlyOverText="Furia infernal" -LocLongDescription="Tu arma principal prenderá fuego a tus enemigos." -LocHelpText="Tu arma principal prenderá fuego a tus enemigos" +LocLongDescription="Tu prenderá fuego a tus enemigos." +LocHelpText="Tu prenderá fuego a tus enemigos" [ChosenDragonRoundsPassive X2AbilityTemplate] LocFriendlyName="Furia infernal" LocFlyOverText="Furia infernal" -LocLongDescription="Tu arma principal prenderá fuego a tus enemigos." -LocHelpText="Tu arma principal prenderá fuego a tus enemigos." +LocLongDescription="Tu prenderá fuego a tus enemigos." +LocHelpText="Tu prenderá fuego a tus enemigos." [ChosenVenomRounds X2AbilityTemplate] LocFriendlyName="Pesadilla tóxica" LocFlyOverText="Pesadilla tóxica" -LocLongDescription="Tus ataques con el arma principal envenenarán a los enemigos." -LocHelpText="Tus ataques con el arma principal envenenarán a los enemigos." +LocLongDescription="Tus ataques con tu envenenarán a los enemigos." +LocHelpText="Tus ataques con tu envenenarán a los enemigos." [ChosenVenomRoundsPassive X2AbilityTemplate] LocFriendlyName="Pesadilla tóxica" LocFlyOverText="Pesadilla tóxica" -LocLongDescription="Tus ataques con el arma principal envenenarán a los enemigos." -LocHelpText="Tus ataques con el arma principal envenenarán a los enemigos." +LocLongDescription="Tus ataques con tu envenenarán a los enemigos." +LocHelpText="Tus ataques con tu envenenarán a los enemigos." [ChosenBleedingRounds X2AbilityTemplate] LocFriendlyName="Golpéale donde duele" LocFlyOverText="Golpéale donde duele" -LocLongDescription="Tus ataques con tu arma principal harán sangrar a los enemigos." -LocHelpText="Tus ataques con tu arma principal harán sangrar a los enemigos." +LocLongDescription="Tus ataques con tu harán sangrar a los enemigos." +LocHelpText="Tus ataques con tu l harán sangrar a los enemigos." [ChosenBleedingRoundsPassive X2AbilityTemplate] LocFriendlyName="Golpéale donde duele" LocFlyOverText="Golpéale donde duele" -LocLongDescription="Tus ataques con tu arma principal harán sangrar a los enemigos." -LocHelpText="Tus ataques con tu arma principal harán sangrar a los enemigos." +LocLongDescription="Tus ataques con tu harán sangrar a los enemigos." +LocHelpText="Tus ataques con tu harán sangrar a los enemigos." [MindScorchDangerZone X2AbilityTemplate] -LocFriendlyName="Alto voltaje" -LocLongDescription="Gana de radio de bonificación en Arrasar mentes." -LocHelpText="Gana de radio de bonificación en Arrasar mentes." -LocPromotionPopupText=" Provee de radio de bonificación en Arrasar mentes." +LocFriendlyName="Alto voltaje perverso" +LocLongDescription="Bonificación de + en el radio de Arrasar mentes, y reduce su reutilización en 1 turno." +LocHelpText="Bonificación de + en el radio de Arrasar mentes, y reduce su reutilización en 1 turno." +LocPromotionPopupText=" Provee de radio de bonificación en Arrasar mentes y se reinicia 1 turno antes." [MindScorchTerror X2AbilityTemplate] LocFriendlyName="Aterrar" @@ -6438,19 +6618,26 @@ LocFlyOverText="Afiladura" ; LWOTC translated [CombatReadiness X2AbilityTemplate] LocFriendlyName="Preparación para el combate" -LocLongDescription="Gana de puntería y de bonus defensivo acumulable en cobertura durante el resto del turno y elimina cualquier inmovilización." -LocHelpText="Gana de puntería y de bonus defensivo acumulable en cobertura durante el resto del turno y elimina cualquier inmovilización." +LocLongDescription="Gana % de reducción al daño explosivo y % de bonus defensivo en cobertura durante el resto del turno, y elimina cualquier inmovilización. Ambas mejoras son acumulables." +LocHelpText="Gana % de reducción al daño explosivo y % de bonus defensivo en cobertura durante el resto del turno, y elimina cualquier inmovilización. Ambas mejoras son acumulables." LocFlyOverText="Preparación para el combate" ; End translated ; LWOTC translated [CombatReadinessPassive X2AbilityTemplate] LocFriendlyName="Preparación para el combate" -LocLongDescription="Gana de puntería y de bonus defensivo acumulable en cobertura durante el resto del turno y elimina cualquier inmovilización." -LocHelpText="Gana de puntería y de bonus defensivo acumulable en cobertura durante el resto del turno y elimina cualquier inmovilización." +LocLongDescription="Gana % de reducción al daño explosivo y % de bonus defensivo en cobertura durante el resto del turno, y elimina cualquier inmovilización. Ambas mejoras son acumulables." +LocHelpText="Gana % de reducción al daño explosivo y % de bonus defensivo en cobertura durante el resto del turno, y elimina cualquier inmovilización. Ambas mejoras son acumulables." LocFlyOverText="Preparación para el combate" ; End translated + +[HunterReactionMobBoost_LW X2AbilityTemplate] +LocFriendlyName="Reacciones mejoradas" +LocLongDescription="Obtienes +2 de movilidad este turno por cada impacto recibido." +LocFlyOverText="Movilidad potenciada" + + ; LWOTC translated [Banzai_LW X2AbilityTemplate] LocFriendlyName="Técnicas de combate mejoradas" @@ -6481,6 +6668,10 @@ strAcquiredText="Una gran amenaza en combate cuerpo a cuerpo: la Asesina es un m [ChosenAssassinM4 X2CharacterTemplate] strCharacterName="Asesina" strAcquiredText="Una gran amenaza en combate cuerpo a cuerpo: la Asesina es un monstruo que correrá hacia ti y se abalanzará siempre que le sea posible. Su daño inicialmente bajo, pero en constante aumento, no puede subestimarse." + +[ChosenAssassinM5 X2CharacterTemplate] +strCharacterName="Asesina" +strAcquiredText="Una gran amenaza en combate cuerpo a cuerpo: la Asesina es un monstruo que correrá hacia ti y se abalanzará siempre que le sea posible. Su daño inicialmente bajo, pero en constante aumento, no puede subestimarse." ; End translated [ChosenWarlock X2CharacterTemplate] @@ -6499,6 +6690,11 @@ strAcquiredText="El más grande campeón Elder es una unidad de apoyo increíble strCharacterName="Brujo" strAcquiredText="El más grande campeón Elder es una unidad de apoyo increíblemente peligrosa y el Rey de la media distancia, capaz de inhabilitar por completo a tus tropas y potenciar fuertemente las suyas." +[ChosenWarlockM5 X2CharacterTemplate] +strCharacterName="Brujo" +strAcquiredText="El más grande campeón Elder es una unidad de apoyo increíblemente peligrosa y el Rey de la media distancia, capaz de inhabilitar por completo a tus tropas y potenciar fuertemente las suyas." + + [ChosenSniper X2CharacterTemplate] strCharacterName="Cazador" strAcquiredText="El Cazador es el maestro del combate a larga distancia; constantemente marcará a tus tropas mientras las derriba con sus peligrosos disparos por el flanco. Débil en el combate cuerpo a cuerpo, no debe subestimarse." @@ -6515,20 +6711,88 @@ strAcquiredText="El Cazador es el maestro del combate a larga distancia; constan strCharacterName="Cazador" strAcquiredText="El Cazador es el maestro del combate a larga distancia; constantemente marcará a tus tropas mientras las derriba con sus peligrosos disparos por el flanco. Débil en el combate cuerpo a cuerpo, no debe subestimarse." -; LWOTC Needs Translation (2) +[ChosenSniperM5 X2CharacterTemplate] +strCharacterName="Cazador" +strAcquiredText="El Cazador es el maestro del combate a larga distancia; constantemente marcará a tus tropas mientras las derriba con sus peligrosos disparos por el flanco. Débil en el combate cuerpo a cuerpo, no debe subestimarse." + +; LWOTC translated (2) + +[ChosenShotgun_T5 X2WeaponTemplate] +FriendlyName="Ultraescopeta de los Elegidos" +FriendlyNamePlural="Ultraescopetas de los Elegidos" +BriefSummary="La escopeta arrasadora dispara un conjunto concentrado de pulsos de rayo que perforan y funden el objetivo a través de una superficie considerable." +TacticalText=" Esta es el arma de tipo escopeta más avanzada disponible en el arsenal de XCOM.\n Las armas de tipo escopeta son muy eficaces a corta distancia, pero su precisión decae rápidamente a mayores distancias.\n Usa mejoras saqueadas de los enemigos para aumentar la eficacia táctica de la escopeta arrasadora." +AbilityDescName="escopeta" + +[ChosenSword_T5 X2WeaponTemplate] +FriendlyName="Ultraespada de los Elegidos" +FriendlyNamePlural="Ultraespadas de los Elegidos" +BriefSummary="La hoja de fusión contiene un núcleo metálico calentado con plasma en un campo magnético microdelgado, lo que permite ataques cuerpo a cuerpo devastadores que son capaces de prender fuego a los enemigos." +TacticalText=" Esta es la versión más avanzada de la espada del comando, que inflige el máximo de daño con una probabilidad de quemar a los objetivos enemigos." +AbilityDescName="espada" + +[ChosenSniperRifle_T5 X2WeaponTemplate] +FriendlyName="Ultrafusil de francotirador de los Elegidos" +FriendlyNamePlural="Ultrafusiles de francotirador de los Elegidos" +BriefSummary="La tecnología de rayo concentrado de los alienígenas tiene aplicaciones obvias para la mejora de fusiles de francotirador. La lanza de plasma es un fusil de francotirador sin parangón." +TacticalText=" Esta es la cumbre de la tecnología de fusiles de francotirador.\n Los fusiles de francotirador siempre requieren las dos acciones para disparar.\n Son menos precisos a corto alcance, pero letales a distancia.\n Usa mejoras recuperadas de los enemigos para mejorar la eficacia táctica del fusil de francotirador de plasma." +AbilityDescName="fusil de francotirador" + + +[ChosenSniperPistol_T5 X2WeaponTemplate] +FriendlyName="Ultrapistola de los Elegidos" +FriendlyNamePlural="Ultrapistolas de los Elegidos" +BriefSummary="Esta pistola, lo máximo en armas auxiliares, integra la tecnología de armamento de rayo de los alienígenas, y el resultado es un sistema de gran potencia." +TacticalText=" Las pistolas de rayo son las pistolas más potentes de la Tierra.\n A diferencia del fusil de francotirador, las pistolas se pueden disparar con una sola acción." + +[ChosenRifle_T5 X2WeaponTemplate] +FriendlyName="Ultrafusil de los Elegidos" +FriendlyNamePlural="Ultrafusiles de los Elegidos" +BriefSummary="Ahora que hemos descifrado la devastadora tecnología ofensiva de los alienígenas y somos capaces de desarrollar nuestras propias armas de rayo, podemos fabricar fusiles que estén a la altura de cualquier enemigo que encuentren los soldados en combate." +TacticalText=" El fusil de plasma es un sistema de armamento de infantería de aplicación general pero sumamente potente.\n Disparar el arma principal siempre termina el turno del soldado.\n Usa las mejoras saqueadas de los enemigos para aumentar la eficacia táctica del fusil de plasma." +AbilityDescName="fusil de asalto" + + [BloodThirst_LW X2AbilityTemplate] LocFriendlyName="Sed de sangre" -LocLongDescription="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +/// de daño en el Tier1/Tier2/Tier3/Tier4. Desaparece si logran un secuestro exitoso." -LocHelpText="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +/// de daño en el Tier1/Tier2/Tier3/Tier4. Desaparece si logran un secuestro exitoso." +LocLongDescription="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +//// de daño en el Tier1/Tier2/Tier3/Tier4/Tier5. Desaparece si logran un secuestro exitoso." +LocHelpText="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +//// de daño en el Tier1/Tier2/Tier3/Tier4/Tier5. Desaparece si logran un secuestro exitoso." LocFlyOverText="Sed de sangre" [BloodThirstPassive_LW X2AbilityTemplate] LocFriendlyName="Sed de sangre" -LocLongDescription="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +/// de daño en el Tier1/Tier2/Tier3/Tier4. Desaparece si logran un secuestro exitoso." -LocHelpText="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +/// de daño en el Tier1/Tier2/Tier3/Tier4. Desaparece si logran un secuestro exitoso." +LocLongDescription="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +//// de daño en el Tier1/Tier2/Tier3/Tier4/Tier5. Desaparece si logran un secuestro exitoso." +LocHelpText="Cada vez que atacas con tu arma cuerpo a cuerpo consigue un aumento de daño acumulable. La bonificación depende del nivel del Elegido, +//// de daño en el Tier1/Tier2/Tier3/Tier4/Tier5. Desaparece si logran un secuestro exitoso." LocFlyOverText="Sed de sangre" ; End translated +; LWOTC translated (2) + +[UnholyAscension_LW X2AbilityTemplate] +LocFriendlyName="Ascensión impía" +LocLongDescription="Las bonificaciones de escudo, puntería, crítico, voluntad y ofensiva psi de El más grande Campeón del Brujo se duplican y otorgan inmunidad crítica." +LocHelpText="Las bonificaciones de escudo, puntería, crítico, voluntad y ofensiva psi de El más grande Campeón del Brujo se duplican y otorgan inmunidad crítica." +LocFlyOverText="Ascensión impía" + +[RuptureImmunity X2AbilityTemplate] +LocFriendlyName="Regeneración siniestra" +LocLongDescription="Todos los efectos de ruptura que se te inflijan se eliminarán instantáneamente." +LocHelpText="Todos los efectos de ruptura que se te inflijan se eliminarán instantáneamente." +LocFlyOverText="Regeneración siniestra" + +[TrackingShotMark X2AbilityTemplate] +LocFriendlyName="Marca de disparo buscador" +LocHelpText="Al comienzo de tu turno, marca un enemigo que esté flanqueado como acción gratuita. Tu primer disparo contra esa amenaza acertará, sin opción a fallo, y será reembolsado." +LocLongDescription="Al comienzo de tu turno, marca un enemigo que esté flanqueado como acción gratuita. Tu primer disparo contra esa amenaza acertará, sin opción a fallo, y será reembolsado." + +[TrackingShot X2AbilityTemplate] +LocFriendlyName="Disparo buscador" +LocHelpText="Al comienzo de tu turno, marca un enemigo que esté flanqueado como acción gratuita. Tu primer disparo contra esa amenaza acertará, sin opción a fallo, y será reembolsado." +LocLongDescription="Al comienzo de tu turno, marca un enemigo que esté flanqueado como acción gratuita. Tu primer disparo contra esa amenaza acertará, sin opción a fallo, y será reembolsado." + +; End translated + + [PreciseStrike_LW X2AbilityTemplate] LocFriendlyName="Golpe preciso" LocLongDescription="Tus ataques cuerpo a cuerpo perforan 3 de armadura." @@ -6537,15 +6801,15 @@ LocFlyOverText="Golpe preciso" [PsychoticRage_LW X2AbilityTemplate] LocFriendlyName="Rabia psicótica" -LocHelpText="Concede un aumento de daño del 50% cuando tu salud se encuentre en un 35% o menos. ¡Pepinaco de talento!" -LocLongDescription="Concede un aumento de daño del 50% cuando tu salud se encuentre en un 35% o menos. ¡Pepinaco de talento!" +LocHelpText="Concede un aumento de daño del % cuando tu salud se encuentre en un % o menos. ¡Pepinaco de talento!" +LocLongDescription="Concede un aumento de daño del % cuando tu salud se encuentre en un % o menos. ¡Pepinaco de talento!" LocFlyOverText="Rabia psicótica" [YouCannotHide_LW X2AbilityTemplate] ; LWOTC translated LocFriendlyName="No puedes esconderte" -LocHelpText="Consigues 100 de puntería con tu arma principal." -LocLongDescription="Consigues 100 de puntería con tu arma principal." +LocHelpText="Consigues 30 de puntería con tu ." +LocLongDescription="Consigues 30 de puntería con tu ." ; End translated LocFlyOverText="¡Correr!." @@ -6616,9 +6880,9 @@ LocFlyOverText="Sed de sangre" [OverbearingSuperiority_LW X2AbilityTemplate] LocFriendlyName="Superioridad aplastante" -LocLongDescription="Siempre que consigues un golpe crítico con tu arma principal tus acciones se reinician." +LocLongDescription="Consigues + de probabilidad crítica con tu . Cuando logras un impacto crítico, tus acciones se reinician." ; LWOTC translated -LocHelpText="Siempre que consigues un golpe crítico con tu arma principal tus acciones se reinician." +LocHelpText="Consigues + de probabilidad crítica con tu . Cuando logras un impacto crítico, tus acciones se reinician." ; End translated LocFlyOverText="Superioridad aplastante" @@ -6630,15 +6894,15 @@ LocFlyOverText="Ira contra indignos" [XCOMHunterMark_LW X2AbilityTemplate] LocFriendlyName="La marca de la muerte" -LocLongDescription="Marca un objetivo para la muerte garantizando la restitución de tus disparos. El efecto se mantiene hasta el próximo turno de XCOM." +LocLongDescription="Marca un objetivo para la muerte garantizando la restitución de tus disparos estándar e instantáneos. Finaliza el turno del soldado. El efecto se mantiene hasta el próximo turno de XCOM." LocHelpText="Marca un objetivo para la muerte garantizando la restitución de tus disparos." LocFlyOverText="La marca de la muerte" [Fatality_LW X2AbilityTemplate] LocFriendlyName="Fatalidad" ; LWOTC translated -LocLongDescription="Gana +100 de puntería y crítico con tu contra unidades con un 35% de salud o menos." -LocHelpText="Gana +100 de puntería y crítico con tu contra unidades con un 35% de salud o menos." +LocLongDescription="Gana +100 de puntería y crítico con tu contra unidades con un % de salud o menos." +LocHelpText="Gana +100 de puntería y crítico con tu contra unidades con un % de salud o menos." ; End translated LocFlyOverText="Fatalidad" @@ -6666,7 +6930,7 @@ LocHelpText="Benefíciate de una bonificación defensiva acumulable después de [ComplexReload_LW X2AbilityTemplate] LocFriendlyName="Recarga compleja" -LocHelpText="Recarga tu arma principal. Finaliza el turno." +LocHelpText="Recarga tu . Finaliza el turno." LocFlyOverText="Recargando" [XcomGame.X2StrategyGameRulesetDataStructures] @@ -6688,18 +6952,18 @@ LocFlyOverText="Reacción primaria del Elegido" [HunterPrimeReactionPassive X2AbilityTemplate] LocFriendlyName="Reacción primaria del Elegido" -LocLongDescription="Gana una acción de movimiento o Preparación para el combate después de recibir daño en el turno de XCOM." +LocLongDescription="Gana una acción de movimiento, con movilidad reducida, o Preparación para el combate después de recibir daño en el turno de XCOM." LocHelpText="Gana una acción de movimiento o Preparación para el combate después de recibir daño en el turno de XCOM." LocFlyOverText="Reacción primaria del Elegido" [WarlockPrimeReactionPassive X2AbilityTemplate] LocFriendlyName="Reacción primaria del Elegido" -LocLongDescription="Gana una acción de movimiento o Preparación para el combate después de recibir daño en el turno de XCOM." +LocLongDescription="Gana una acción de movimiento, con movilidad reducida, o Preparación para el combate después de recibir daño en el turno de XCOM." LocHelpText="Gana una acción de movimiento o Preparación para el combate después de recibir daño en el turno de XCOM." LocFlyOverText="Reacción primaria del Elegido" ; LWOTC translated -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="Inmunidad de los Elegidos" LocLongDescription="Los Elegidos son inmunes al aturdimiento, desorientación y congelación." LocHelpText="Los Elegidos son inmunes al aturdimiento, desorientación y congelación." @@ -6718,9 +6982,9 @@ LocFlyOverText="Maremoto" [Brawler X2AbilityTemplate] LocFriendlyName="Inquebrantable" LocFlyOverText="Inquebrantable" -LocLongDescription="Recibes % menos de daño en ataques cercanos de hasta cuatro casillas de distancia." -LocHelpText="Recibes % menos de daño en ataques cercanos de hasta cuatro casillas de distancia." -LocPromotionPopupText=" Recibes % menos de daño en ataques cercanos de hasta cuatro casillas de distancia.
" +LocLongDescription="Recibes % menos de daño frente a cualquier ataque a meleé o acción hostil cercana de hasta cuatro casillas de distancia. Asimismo, seguirá ejecutándose en los ataques cuerpo a cuerpo realizados por el Templario, independientemente de la posición inicial." +LocHelpText="Recibes % menos de daño frente a cualquier ataque a meleé o acción hostil cercana de hasta cuatro casillas de distancia. Asimismo, seguirá ejecutándose en los ataques realizados cuerpo a cuerpo por el Templario, independientemente de la posición inicial." +LocPromotionPopupText=" Recibes % menos de daño frente a cualquier ataque a meleé o acción hostil cercana de hasta cuatro casillas de distancia. Asimismo, seguirá ejecutándose en los ataques realizados cuerpo a cuerpo por el Templario, independientemente de la posición inicial.
" [InstantReactionTime X2AbilityTemplate] LocFriendlyName="Tiempo de reacción instantáneo" @@ -6781,11 +7045,11 @@ SummaryText="Una brutal represalia contra la Resistencia, reduciendo todos los i ; LWOTC translated [XComGameState_AdventChosen] KnowledgeGainFirstBullet[eChosenKnowledge_Start]="" -KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]="¡Los Elegidos se están planteando obstaculizar las actividades rebeldes!" -KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="¡Los Elegidos aumentarán el peligro en las operaciones encubiertas!" -KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="¡Los Elegidos pretenden hallar la forma de sabotear al Avenger!" +KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]=" " +KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="¡Los Elegidos pueden impulsar la aparición de un evento oscuro adicional!" +KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="¡Los Elegidos se están planteando obstaculizar las actividades rebeldes!" KnowledgeGainFirstBullet[eChosenKnowledge_Raider]="¡Es posible que los Elegidos organicen un asalto contra el Avenger!" -KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="¡Los Elegidos pueden impulsar la aparición de un evento oscuro adicional!" +KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="" ; LWOTC translated @@ -6881,6 +7145,25 @@ LocHelpText="Otorga media cobertura a los aliados." LocLongDescription="Otorga media cobertura a los aliados." LocFlyOverText="Escudo Templario" +[TemplarInvert X2AbilityTemplate] +LocFriendlyName="Invertir" +LocLongDescription="Cambia de ubicación con una unidad. Coste de 1 de Concentración." +LocHelpText="Cambia de ubicación con una unidad. Coste de 1 de Concentración." +LocPromotionPopupText=" Invertir tiene un tiempo de enfriamiento de turnos y no finaliza el turno del Templario.
Utilizable tanto en unidades aliadas como enemigas.
No sirve con los Elegidos.
" + +[OneForAll X2AbilityTemplate] +LocFriendlyName="Uno para todos" +LocHelpText="Proporciona cobertura alta a tus compañeros de escuadrón donde sea que te encuentres y como penalización resta -30 de defensa. A favor aplicará escudos ablativos extra según el nivel de escudo del Templario durante la duración del efecto. Moverse o atacar cancelará la habilidad." +LocLongDescription="Proporciona cobertura alta a tus compañeros de escuadrón donde sea que te encuentres y como penalización resta -30 de defensa. A favor aplicará escudos ablativos extra según el nivel de escudo del Templario durante la duración del efecto. Moverse o atacar cancelará la habilidad." +LocFlyOverText="Uno para todos" + +[ShieldBash_LW X2AbilityTemplate] +LocFriendlyName="Golpe de escudo" +LocHelpText="Golpea a un enemigo adyacente con tu escudo; inflige un poco de daño y empuja al objetivo 2 casillas. Acción gratuita." +LocLongDescription="Golpea a un enemigo adyacente con tu escudo; inflige un poco de daño y empuja al objetivo 2 casillas. Acción gratuita." +LocPromotionPopupText=" El daño es equivalente al daño base del escudo actualmente equipado.
Golpe de escudo es una acción sin coste con un tiempo de reutilización de turnos.
También es posible ejecutar el talento con enemigos en casillas adyacentes que se encuentren en diagonal.
" +LocFlyOverText="Golpe de escudo" + ; LWOTC translated [TemplarBallisticShield_CV X2AbilityTemplate] LocFriendlyName="Escudo Templario" @@ -6901,24 +7184,6 @@ LocLongDescription="Otorga media cobertura a los aliados. Garantiza a esta unida LocFlyOverText="Escudo Templario" ; End translated -[ShieldBash_LW X2AbilityTemplate] -LocFriendlyName="Golpe de escudo" -LocHelpText="Golpea a un enemigo adyacente con tu escudo; inflige un poco de daño y empuja al objetivo 2 casillas. Acción gratuita." -LocLongDescription="Golpea a un enemigo adyacente con tu escudo; inflige un poco de daño y empuja al objetivo 2 casillas. Acción gratuita." -LocPromotionPopupText=" El daño es equivalente al daño base del escudo actualmente equipado.
Golpe de escudo es una acción sin coste con un tiempo de reutilización de turnos.
También es posible ejecutar el talento con enemigos en casillas adyacentes que se encuentren en diagonal.
" -LocFlyOverText="Golpe de escudo" - -[TemplarInvert X2AbilityTemplate] -LocFriendlyName="Invertir" -LocLongDescription="Cambia de ubicación con una unidad. Coste de 1 de Concentración." -LocHelpText="Cambia de ubicación con una unidad. Coste de 1 de Concentración." -LocPromotionPopupText=" Invertir tiene un tiempo de enfriamiento de turnos y no finaliza el turno del Templario.
Utilizable tanto en unidades aliadas como enemigas.
No sirve con los Elegidos.
" - -[OneForAll X2AbilityTemplate] -LocFriendlyName="Uno para todos" -LocHelpText="Proporciona cobertura alta a tus compañeros de escuadrón donde sea que te encuentres y como penalización resta -30 de defensa. A favor aplicará escudos ablativos extra según el nivel de escudo del Templario durante la duración del efecto. Moverse o atacar cancelará la habilidad." -LocLongDescription="Proporciona cobertura alta a tus compañeros de escuadrón donde sea que te encuentres y como penalización resta -30 de defensa. A favor aplicará escudos ablativos extra según el nivel de escudo del Templario durante la duración del efecto. Moverse o atacar cancelará la habilidad." -LocFlyOverText="Uno para todos" [GreaterPadding_CV X2AbilityTemplate] @@ -6942,11 +7207,23 @@ LocLongDescription="Reduce los tiempos de recuperación de las heridas de este s LocHelpText="Reduce los tiempos de recuperación de las heridas de este soldado" LocPromotionPopupText=" Mayor acolchado reduce en puntos la cantidad de salud que un soldado debe recuperar después de ser herido en batalla.
No afecta a los soldados que sufrieron heridas mortales y están estabilizados para no desangrarse." +[IRI_SoulShot X2AbilityTemplate] +LocFriendlyName="Flecha mística" +LocLongDescription="Un poderoso ataque a distancia basado en la puntería que puede generar críticos y no finaliza el turno. Cuesta 1 de Concentración." +LocHelpText="Un poderoso ataque a distancia basado en la puntería que puede generar críticos y no finaliza el turno. Cuesta 1 de Concentración." +LocPromotionPopupText=" Flecha mística tiene una bonificación a la puntería de +20.
Sin tiempo de reutilización.
El daño se incrementa con una actualización del guantelete." + +[IRI_TemplarShield X2AbilityTemplate] +LocFriendlyName="Escudo Templario" +LocLongDescription="Usa tu guantelete para generar un escudo psiónico y obtener de defensa ablativa que durará hasta el inicio del siguiente turno. También es posible activarlo después de Ímpetu." +LocHelpText="Usa tu guantelete para generar un escudo psiónico y obtener de defensa ablativa que durará hasta el inicio del siguiente turno. También es posible activarlo después de Ímpetu." +LocPromotionPopupText=" Finaliza el turno cuando se usa.
La fuerza del escudo se irá incrementando conforme se mejore el guantelete." + [Indomitable X2AbilityTemplate] LocFriendlyName="Indomable" LocHelpText="Una vez por turno, gana 1 de concentración cuando te ataquenn." LocLongDescription="Una vez por turno, gana 1 de concentración cuando te ataquen." -LocPromotionPopupText" Una vez por turno, gana 1 de concentración cuando te ataquen.
Se aplica tanto a ataques cuerpo a cuerpo como a distancia.
" +LocPromotionPopupText=" Una vez por turno, gana 1 de concentración cuando te ataquen.
Se aplica tanto en combate cuerpo a cuerpo como a distancia, pero no con ataques de área.
" LocFlyOverText="Indomable" [VoltFocusOnKills X2AbilityTemplate] @@ -6974,7 +7251,7 @@ LocFlyOverText="Aptitud superior" LocFriendlyName="Voltio" LocLongDescription="Un ataque psiónico que inflige poco daño pero que \"salta\" a las unidades cercanas en los niveles de concentración más altos. Cuesta 1 de concentración." LocHelpText="Un ataque psiónico que inflige poco daño pero que \"salta\" a las unidades cercanas en los niveles de concentración más altos. Cuesta 1 de concentración." -LocPromotionPopupText="Voltio no tiene tiempo de enfriamiento, pero cuesta 1 de concentración.
Voltio aumenta la puntería de tu escuadrón contra los objetivos en +.
" +LocPromotionPopupText=" Voltio no tiene tiempo de enfriamiento, pero cuesta 1 de concentración.
Voltio aumenta la puntería de tu escuadrón contra los objetivos en +.
" [Amplify X2AbilityTemplate] LocFriendlyName="Amplificar" @@ -6986,8 +7263,8 @@ LocPromotionPopupText=" Amplificar durará 3 acciones una vez le tengas ; LWOTC translated [CrusaderRage_LW X2AbilityTemplate] LocFriendlyName="Rabia del Cruzado" -LocHelpText="Obtienes un aumento del daño del 25% por cada 25% de puntos de salud que falten, hasta un incremento del 50%. Reduce el tiempo de recuperación de las heridas de este soldado en 8." -LocLongDescription="Obtienes un aumento del daño del 25% por cada 25% de puntos de salud que falten, hasta un incremento del 50%. Reduce el tiempo de recuperación de las heridas de este soldado en 8." +LocHelpText="Obtienes un aumento del daño del 25% por cada 25% de puntos de salud que falten, hasta un incremento del 50%. Reduce el tiempo de recuperación de las heridas de este soldado en 6." +LocLongDescription="Obtienes un aumento del daño del 25% por cada 25% de puntos de salud que falten, hasta un incremento del 50%. Reduce el tiempo de recuperación de las heridas de este soldado en 6." LocPromotionPopupText=" La reducción en los tiempos de regeneración de heridas no se implementa si el soldado se desangró durante la misión.
" LocFlyOverText="Rabia del Cruzado" ; End translated @@ -7032,16 +7309,16 @@ LocHelpText="Corre hacia un aliado y estabilízalo con tu botiquín." [SoulReaper X2AbilityTemplate] LocFriendlyName="Desterrar" -LocLongDescription="Dispara a un objetivo hasta que te quedes sin munición o muera. Cada impacto consigue de acierto menos que el anterior. " -LocHelpText="Dispara a un objetivo hasta que te quedes sin munición o muera. Cada impacto consigue de acierto menos que el anterior. Desvela al Segador." +LocLongDescription="Dispara a un objetivo hasta que te quedes sin munición o muera. Cada impacto consigue de acierto menos que el anterior. Desvela al Segador. " +LocHelpText="Dispara a un objetivo hasta que te quedes sin munición o muera. Cada impacto consigue de acierto menos que el anterior. Desvela al Segador. Comienza con cargas; una vez que se gastan, iniciará un tiempo de reutilización." LocFlyoverText="Desterrar" -LocPromotionPopupText=" Cada disparo en Desterrar genera una probabilidad de impactar aleatoria.
Desterrar no se puede activar con sólo 1 de munición restante.
Puede producir críticos.
" +LocPromotionPopupText=" Cada disparo en Desterrar genera una probabilidad de impactar aleatoria.
Desterrar no se puede activar con sólo 1 de munición restante.
Puede producir críticos.
Tiempo de refresco de turnos.
" ; LWOTC translated [TotalCombat X2AbilityTemplate] LocFriendlyName="Combate total" -LocLongDescription="Concede 1 de movilidad y 5 de puntería. Lanzar una granada o usar un objeto ya no termina el turno y las granadas no tienen tiempo de reutilización. Además, puedes lanzar granadas a 3 casillas más de distancia y su radio aumenta en 1. Otorga un espacio sólo para granadas." -LocHelpText="Concede 1 de movilidad y 5 de puntería. Lanzar una granada o usar un objeto ya no termina el turno y las granadas no tienen tiempo de reutilización. Además, puedes lanzar granadas a 3 casillas más de distancia y su radio aumenta en 1. Otorga un espacio sólo para granadas." +LocLongDescription="Concede 1 de movilidad y 5 de puntería. Lanzar una granada o usar un objeto ya no termina el turno y las granadas no tienen tiempo de reutilización. Además, puedes lanzar granadas a 2 casillas más de distancia y su radio aumenta en 1. Otorga un espacio sólo para granadas." +LocHelpText="Concede 1 de movilidad y 5 de puntería. Lanzar una granada o usar un objeto ya no termina el turno y las granadas no tienen tiempo de reutilización. Además, puedes lanzar granadas a 2 casillas más de distancia y su radio aumenta en 1. Otorga un espacio sólo para granadas." LocPromotionPopupText=" Elimina el tiempo de reutilización de las granadas.
Obtiene Mezcla volátil, por lo tanto, no se acumula con ella." ; End translated @@ -7060,7 +7337,13 @@ LocLongDescription="Una forma poderosa de guardia. En lugar de disparar automát LocHelpText="Una forma poderosa de guardia. En lugar de disparar automáticamente realiza una sola acción. Actividad sin coste." LocPromotionPopupText=" No cuesta ninguna acción.
Algunas actividades no están disponibles durante la interrupción, como guardia.
Tiempo de enfriamiento de turnos." -[ArcWavePassive X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="Hender" +LocLongDescription="Ataque cuerpo a cuerpo con la posibilidad de aturdir o desorientar al objetivo. Activa Ímpetu y genera concentración en los ataques." +LocHelpText="Ataque cuerpo a cuerpo con la posibilidad de aturdir o desorientar al objetivo. Activa Ímpetu y genera concentración en los ataques." +LocPromotionPopupText=" Usar Hender es el método principal de los Templarios para generar concentración.
Después de lanzar Hender el Templario ganará Ímpetu lo que le permitirá una acción de movimiento gratuita. Empléala para volver a trasladarte a una cobertura después de atacar.
Hender tiene un % de probabilidad de aturdir con concentración. Los objetivos aturdidos también serán derribados.
Hender también posee un % de probabilidad de desorientar mediante concentración.
" + +[ArcWavePassive_LW X2AbilityTemplate] LocFriendlyName="Onda psiónica" LocLongDescription="Hender genera una ola de energía psiónica en la dirección del ataque. El daño aumenta con el nivel del guantelete." LocHelpText="Hender genera una ola de energía psiónica en la dirección del ataque." @@ -7075,8 +7358,8 @@ LocPromotionPopupText=" El radio de Tormenta iónica aumenta con nivele ; LWOTC translated [Sabotage_LongRangeComms X2SabotageTemplate] -SummaryText="Hemos estado luchando por mantener comunicaciones de largo alcance después del reciente sabotaje de los Elegidos. Nuestras operaciones encubiertas se retrasarán 2 semanas." -ShortSummaryText="¡Nuestras operaciones encubiertas se han retrasado 2 semanas!" +SummaryText="Hemos estado luchando por mantener comunicaciones de largo alcance después del reciente sabotaje de los Elegidos. Nuestras operaciones encubiertas se retrasarán 5 días." +ShortSummaryText="¡Nuestras operaciones encubiertas se han retrasado 5 días!" ; End translated ; LWOTC translated @@ -7130,11 +7413,111 @@ LocHelpText="Las torres de seguridad ADVENT no pueden percibir esta unidad cuand LocLongDescription="El portador de este artilugio será inmune a las condiciones mentales negativas como el pánico, control mental y los aturdimientos." [Sustain X2AbilityTemplate] -LocLongDescription="Si la unidad recibe suficiente daño como para ser asesinada, se pone inmediatamente en Estasis durante 1 turno y su salud se reduce a 1. Esto sólo puede suceder una vez por misión." -LocHelpText="Si la unidad recibe suficiente daño como para ser asesinada, se pone inmediatamente en Estasis durante 1 turno y su salud se reduce a 1. Esto sólo puede suceder una vez por misión." +LocLongDescription="Si la unidad recibe suficiente daño como para ser asesinada, se pone inmediatamente en Estasis durante 1 turno y su salud se reduce a 1. Esto sólo puede suceder una vez por misión. Reduce los tiempos de recuperación de heridas de este soldado en ." +LocHelpText="Si la unidad recibe suficiente daño como para ser asesinada, se pone inmediatamente en Estasis durante 1 turno y su salud se reduce a 1. Esto sólo puede suceder una vez por misión. Reduce los tiempos de recuperación de heridas de este soldado en ." LocPromotionPopupText=" Ten en cuenta que una unidad en Estasis puede conservar efectos negativos dañinos como veneno o quemaduras una vez reaparezca.
" [SustainTriggered X2AbilityTemplate] LocLongDescription="La unidad habría muerto, pero se salvó y se puso en Estasis durante 1 turno. Esto no puede volver a suceder durante esta misión." LocHelpText="La unidad habría muerto, pero se salvó y se puso en Estasis durante 1 turno. Esto no puede volver a suceder durante esta misión." ; End translated + +[X2MPData_Shell] +arrMPMapFriendlyNames[9]="Subterráneo" +arrMPMapFriendlyNames[10]="Subterráneo" + +[Overdrive X2AbilityTemplate] +LocFriendlyName="Sobrecarga" +LocLongDescription="Realiza tres acciones en este turno y ninguna lo finaliza. Los disparos estándar múltiples sufren una pequeña penalización por retroceso." +LocHelpText="Realiza tres acciones en este turno y ninguna lo finaliza. Los disparos estándar múltiples sufren una pequeña penalización por retroceso." +LocPromotionPopupText=" Se aplica una penalización por retroceso del % tras cada disparo estándar mientras la sobrecarga esté activa.
La sobrecarga no tiene coste de activación, pero tiene un tiempo de enfriamiento de turnos.
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Baluarte" +LocLongDescription="Obtiene un punto de bonificación de blindaje y proporciona cobertura alta a los compañeros adyacentes." +LocHelpText="Obtiene un punto de bonificación de blindaje y proporciona cobertura alta a los compañeros adyacentes." +LocPromotionPopupText=" Baluarte añade un punto de blindaje.
Cualquier compañero que permanezca junto al SPARK obtendrá la bonificación defensiva de cobertura alta.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Arsenal" +LocLongDescription="BIT puede equipar y disparar armas pesadas." +LocHelpText="BIT puede equipar y disparar armas pesadas." +LocPromotionPopupText=" Arsenal permite que los SPARK equipen armamento pesado en su equipamiento.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Hacedor de lluvia" +LocLongDescription="Las armas pesadas equipadas infligen + de daño y tienen un área de efecto mayor." +LocHelpText="Las armas pesadas equipadas infligen más daño y sobre un área mayor." +LocPromotionPopupText=" Hacedor de lluvia añade + de daño a todas las armas pesadas.
Las armas pesadas con un área de efecto circular verán su radio incrementado en +.
Las armas pesadas con un área de efecto cónica verán su diámetro incrementado en + y su distancia en +.
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Intimidar" +LocLongDescription="Al ser objetivo de un ataque, el enemigo tiene una probabilidad de sufrir pánico." +LocHelpText="Al ser objetivo de un ataque, el enemigo tiene una probabilidad de sufrir pánico." +LocFlyOverText="Intimidar" +LocPromotionPopupText=" La probabilidad de que Intimidar cause pánico en el enemigo aumenta cuanto mayor sea el blindaje del SPARK.
Intimidar se puede activar en ataques cuerpo a cuerpo y de área de efecto.
Intimidar no se activa cuando el ataque proviene de disparos en guardia.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Intimidar" +LocLongDescription="Al ser objetivo de un ataque, todos los enemigos visibles tienen una probabilidad de sufrir pánico." +LocHelpText="Al ser objetivo de un ataque, todos los enemigos visibles tienen una probabilidad de sufrir pánico." +LocFlyOverText="Intimidar" +LocPromotionPopupText="" +LocMissMessage="Intimidar fallido" + +[Repair X2AbilityTemplate] +LocFriendlyName="REPARAR" +LocLongDescription="Envía el BIT a reparar un aliado robótico dañado. Los BIT avanzados pueden efectuar reparaciones ligeramente más completas." +LocHelpText="Envía el BIT a reparar un aliado robótico dañado." +LocFlyOverText="Reparar" +LocPromotionPopupText=" Reparar restaurará de salud.
Mejora tu BIT para reparar más PS.
Si usas la reparación como tu primera acción, no finalizará tu turno.
Reparar tiene cargas por misión.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Campo de canalización" +LocLongDescription="Cada vez que seas el objetivo de un ataque, parte de la energía se canalizará a tu . Esta energía se desatará en tu próximo disparo estándar." +LocHelpText="Canaliza energía a tu al ser el objetivo de un ataque y desátala en tu próximo disparo estándar." +LocFlyOverText="Energía canalizada: +1" +LocPromotionPopupText=" Cada punto de energía canalizado por Campo de canalización aumenta el daño del próximo ataque de en 1.
La energía almacenada por Campo de canalización se consumirá aunque el siguiente tiro no acierte en el blanco.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Sacrificar" +LocLongDescription="Genera un campo protector que redirige los ataques enemigos contra los aliados hacia ti. Obtienes una bonificación de defensa y blindaje mientras esté activo." +LocHelpText="Genera un campo protector para redirigir los ataques enemigos hacia ti." +LocFlyOverText="Sacrificar" +LocPromotionPopupText=" El SPARK obtiene + de defensa y + de blindaje mientras Sacrificar esté activo.
Sacrificar tiene un tiempo de enfriamiento de turnos.
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Puntería adaptable" +LocLongDescription="Cuando la sobrecarga está activa, los disparos estándar no incurren en penalizaciones de retroceso." +LocHelpText="Cuando la sobrecarga está activa, los disparos estándar no incurren en penalizaciones de retroceso." +LocPromotionPopupText=" Puntería adaptable elimina el % de la penalización a la puntería de los disparos estándar consecutivos cuando la sobrecarga está activa.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="Ataque" +LocLongDescription="Ataca a cualquier enemigo al alcance del movimiento con un potente ataque cuerpo a cuerpo." +LocHelpText="Ataca a cualquier enemigo al alcance del movimiento con un potente ataque cuerpo a cuerpo." +LocPromotionPopupText=" Para activar la habilidad Ataque, coloca el cursor de movimiento sobre un enemigo.
El SPARK puede realizar un movimiento de \"correr\", usando ambas acciones para moverse, y además activar un Ataque contra un enemigo adyacente.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Bola de demolición" +LocLongDescription="Mientras la sobrecarga esté activa, atraviesa paredes y coberturas al moverte." +LocHelpText="Mientras la sobrecarga esté activa, atraviesa paredes y coberturas al moverte." +LocPromotionPopupText=" Se puede utilizar Bola de demolición para exponer a los enemigos a disparos de flanqueo.
Usa puntos de ruta para guiar al SPARK por el mejor camino para destruir la cobertura y el entorno.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Bombardear" +LocLongDescription="Lanza el BIT hacia cualquier posición visible, desde donde desatará una potente explosión. Los BIT avanzados infligen más daño." +LocHelpText="Lanza el BIT para causar una explosión que afecte a todas las unidades en un radio determinado." +LocPromotionPopupText=" Bombardear se puede disparar a cualquier lugar que esté a la vista del pelotón.
Mejora tu BIT para incrementar el daño de Bombardear.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Protocolo de cazador" +LocLongDescription="Cuando un enemigo es revelado, existe una probabilidad del % de efectuar un disparo de guardia gratuito." +LocHelpText="Cuando un enemigo es revelado, existe una probabilidad del % de efectuar un disparo de guardia gratuito." +LocPromotionPopupText=" Protocolo de cazador convierte al SPARK en una unidad perfecta para explorar entre la niebla de guerra, pues puede atacar de inmediato a cualquier enemigo revelado.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Nova" +LocLongDescription="Libera un estallido de energía que daña a todas las unidades cercanas. Este ataque no tiene coste ni enfriamiento, pero las Novas consecutivas causarán daños al SPARK." +LocHelpText="Causa una explosión que afecta a todas las unidades cercanas. Las Novas consecutivas causarán daños al SPARK." +LocPromotionPopupText=" Nova no tiene coste en puntos de acción ni tiempo de enfriamiento.
El primer ataque de Nova en cada misión infligirá 0 de daño al SPARK.
Todos los ataques de Nova posteriores infligirán un daño acumulado de al SPARK.
" diff --git a/LongWarOfTheChosen/Localization/XComGame.fra b/LongWarOfTheChosen/Localization/XComGame.fra index e4f43f8a5..c79cb5a61 100644 --- a/LongWarOfTheChosen/Localization/XComGame.fra +++ b/LongWarOfTheChosen/Localization/XComGame.fra @@ -497,6 +497,10 @@ LocPromotionPopupText=" Cette capacité nécessite En début de mission, les Templiers sont plus faibles que les autres soldats, mais plus leur niveau de concentration est élevé, plus ils deviennent puissants. Apprenez à gérer efficacement la concentration pour profiter au mieux des améliorations de statistiques et de chaque capacité.
Vous gagnez de la concentration en attaquant à l'aide de la capacité Taillade et ce, quelque soit le résultat de l'attaque (réussite, égratignure ou échec).
" ; LWOTC translated (3) -[Rend X2AbilityTemplate] +[Rend_LW X2AbilityTemplate] +LocFriendlyName="Taillade" LocLongDescription="Les attaques de mêlée ont une chance d'étourdir ou de désorienter leurs cibles. Déclenche la capacité Élan et génère de la concentration (quelque soit le résultat de l'attaque: succès, égratignure ou échec)." LocHelpText="Les attaques de mêlée ont une chance d'étourdir ou de désorienter leurs cibles. Déclenche la capacité Élan et génère de la concentration (quelque soit le résultat de l'attaque: succès, égratignure ou échec)." LocPromotionPopupText=" La capacité Taillade constitue la principale façon pour un Templier de générer de la concentration.
L'utilisation de Taillade déclenche la capacité Élan, qui octroie au Templier une action de déplacement bonus.
Taillade a % de chances par point de concentration d'étourdir sa cible. Les unités étourdies de cette façon sont également repoussées.
Taillade a % de chances par point de concentration de désorienter sa cible.
" @@ -5900,6 +5939,9 @@ LocFlyOverText="Maelstrom" LocPromotionPopupText=" Invoque une tempête d'énergie psionique, centrée sur son utilisateur, qui inflige des dégâts à tous les ennemis situés dans un rayon de 4 cases et détruit les abris. Coûte 1 action et met fin au tour.
Temps de rechargement de tour(s).
Cette capacité ne détruit que les abris tels que les murs, pas les planchers et les plafonds.
" ; End translated (2) +[TheLostGrappler X2CharacterTemplate] +strCharacterName="Ombre avide" + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="Ombre avide" @@ -5933,6 +5975,9 @@ strCharacterName="Ombre avide" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="Ombre avide" +[TheLostBrute X2CharacterTemplate] +strCharacterName="Ombre brutale" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="Ombre brutale" @@ -6552,8 +6597,8 @@ LocFlyOverText="Rage psychotique" [YouCannotHide_LW X2AbilityTemplate] ; LWOTC translated (2) LocFriendlyName="Se cacher est inutile" -LocHelpText="Gagnez un bonus de +100 en visée avec votre arme principale." -LocLongDescription="Gagnez un bonus de +100 en visée avec votre arme principale." +LocHelpText="Gagnez un bonus de +30 en visée avec votre arme principale." +LocLongDescription="Gagnez un bonus de +30 en visée avec votre arme principale." ; LWOTC translated (2) LocFlyOverText="Cours." @@ -6645,8 +6690,8 @@ LocFlyOverText="Marque noire" [Fatality_LW X2AbilityTemplate] LocFriendlyName="Fatalité" ; LWOTC translated (2) -LocLongDescription="Gagnez un bonus de +100 en visée et en chances de coup critique avec votre contre les unités dont les PV actuels sont inférieurs ou égaux à 35% de leurs PV initiaux." -LocHelpText="Gagnez un bonus de +100 en visée et en chances de coup critique avec votre contre les unités dont les PV actuels sont inférieurs ou égaux à 35% de leurs PV initiaux." +LocLongDescription="Gagnez un bonus de +100 en visée et en chances de coup critique avec votre contre les unités dont les PV actuels sont inférieurs ou égaux à % de leurs PV initiaux." +LocHelpText="Gagnez un bonus de +100 en visée et en chances de coup critique avec votre contre les unités dont les PV actuels sont inférieurs ou égaux à % de leurs PV initiaux." ; End translated (2) LocFlyOverText="Fatalité" @@ -6707,7 +6752,7 @@ LocHelpText="Gagne une action de déplacement ou de Préparation au combat aprè LocFlyOverText="Réaction instinctive de l'Élu" ; LWOTC translated (2) -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="Immunités de l'Élu" LocLongDescription="L'Élu est immunisé à l'étourdissement, la désorientation et la glace. Il subit un malus de -50% en mobilité en cas de Mutilation (au lieu d'être totalement immobilisé, comme c'est normalement le cas)." LocHelpText="L'Élu est immunisé à l'étourdissement, la désorientation et la glace. Il subit un malus de -50% en mobilité en cas de Mutilation (au lieu d'être totalement immobilisé, comme c'est normalement le cas)." @@ -6790,9 +6835,9 @@ SummaryText="De violentes représailles dirigées contre la résistance, qui a p ; LWOTC translated [XComGameState_AdventChosen] KnowledgeGainFirstBullet[eChosenKnowledge_Start]="" -KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]="L'Élu peut gêner les activités rebelles!" +KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]=" " KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="L'Élu augmente les risques des missions secrètes!" -KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="L'Élu peut saboter le Talion!" +KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="L'Élu peut gêner les activités rebelles!" KnowledgeGainFirstBullet[eChosenKnowledge_Raider]="L'Élu peut lancer un assaut contre le Talion!" KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="Chosen peut mener une opération supplémentaire!" @@ -7049,8 +7094,8 @@ LocPromotionPopupText=" Chaque tir effectué avec Bannissement a une ch ; LWOTC translated (3) [TotalCombat X2AbilityTemplate] LocFriendlyName="Combat total" -LocLongDescription="Procure un bonus de +1 en Mobilité et de +5 en visée. Lancer une grenade ou utiliser un objet ne met plus fin à votre tour. La portée de vos grenades est augmentée de 3 cases et leurs temps de rechargement est réduit à 0. Octroie la capacité Mélange explosif (zone d'effet des grenades +1 case). Une grenade supplémentaire peut être équipée à l'emplacement réservé aux grenades." -LocHelpText="Procure un bonus de +1 en Mobilité et de +5 en visée. Lancer une grenade ou utiliser un objet ne met plus fin à votre tour. La portée de vos grenades est augmentée de 3 cases et leurs temps de rechargement est réduit à 0. Octroie la capacité Mélange explosif (zone d'effet des grenades +1 case). Une grenade supplémentaire peut être équipée à l'emplacement réservé aux grenades." +LocLongDescription="Procure un bonus de +1 en Mobilité et de +5 en visée. Lancer une grenade ou utiliser un objet ne met plus fin à votre tour. La portée de vos grenades est augmentée de 2 cases et leurs temps de rechargement est réduit à 0. Octroie la capacité Mélange explosif (zone d'effet des grenades +1 case). Une grenade supplémentaire peut être équipée à l'emplacement réservé aux grenades." +LocHelpText="Procure un bonus de +1 en Mobilité et de +5 en visée. Lancer une grenade ou utiliser un objet ne met plus fin à votre tour. La portée de vos grenades est augmentée de 2 cases et leurs temps de rechargement est réduit à 0. Octroie la capacité Mélange explosif (zone d'effet des grenades +1 case). Une grenade supplémentaire peut être équipée à l'emplacement réservé aux grenades." LocPromotionPopupText=" Cette capacité octroie la capacité Mélange explosif, et ne peut donc pas être combinée avec cette capacité.
" ; End translated (3) @@ -7069,7 +7114,14 @@ LocLongDescription="Une forme supérieure de Vigilance. Plutôt que de tirer aut LocHelpText="Une forme supérieure de Vigilance. Plutôt que de tirer automatiquement, effectue n'importe quelle action simple. Action gratuite." LocPromotionPopupText=" Une forme supérieure de Vigilance. Plutôt que de tirer automatiquement, effectue n'importe quelle action simple. Action gratuite.
Certaines actions, telles que Vigilance, ne sont pas disponibles lors d'une Interruption.
Temps de rechargement de tour(s)." -[ArcWavePassive X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="Taillade" +LocLongDescription="Les attaques de mêlée ont une chance d'étourdir ou de désorienter leurs cibles. Déclenche la capacité Élan et génère de la concentration (quelque soit le résultat de l'attaque: succès, égratignure ou échec)." +LocHelpText="Les attaques de mêlée ont une chance d'étourdir ou de désorienter leurs cibles. Déclenche la capacité Élan et génère de la concentration (quelque soit le résultat de l'attaque: succès, égratignure ou échec)." +LocPromotionPopupText=" La capacité Taillade constitue la principale façon pour un Templier de générer de la concentration.
L'utilisation de Taillade déclenche la capacité Élan, qui octroie au Templier une action de déplacement bonus.
Taillade a % de chances par point de concentration d'étourdir sa cible. Les unités étourdies de cette façon sont également repoussées.
Taillade a % de chances par point de concentration de désorienter sa cible.
" + + +[ArcWavePassive_LW X2AbilityTemplate] LocFriendlyName="Vague arquée" LocLongDescription="La Taillade génère une vague d'énergie psionique dans la direction de l'attaque. La Vague arquée n'affecte pas la cible de la Taillade originale. Les versions améliorées des gantelets augmentent les dégâts infligés par cet effet." LocHelpText="La Taillade génère une vague d'énergie psionique dans la direction de l'attaque. La Vague arquée n'affecte pas la cible de la Taillade originale." @@ -7128,6 +7180,101 @@ LocLongDescription="Cette unité a % de résist LocHelpText="Cette unité a % de résister aux désorientations provoquées par les grenades flash." ; End translated +[Overdrive X2AbilityTemplate] +LocFriendlyName="Overdrive" +LocLongDescription="Trois actions utilisées pour ce tour, dont aucune n'y met fin. Des tirs normaux multiples entraînent une légère pénalité de recul." +LocHelpText="Trois actions utilisées pour ce tour, dont aucune n'y met fin. Des tirs normaux multiples entraînent une légère pénalité de recul." +LocPromotionPopupText=" Une pénalité de recul à la visée de % s'applique après chaque tir normal lorsque l'Overdrive est activé.
L'Overdrive ne consomme pas de point d'action, mais nécessite un temps de rechargement de tour(s).
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Rempart" +LocLongDescription="L'armure gagne un point bonus. Offre toujours une couverture complète à tous les alliés adjacents." +LocHelpText="L'armure gagne un point bonus. Offre toujours une couverture complète à tous les alliés adjacents." +LocPromotionPopupText=" Le Rempart fait gagner un point d'armure.
Tout allié adjacent au Spark voit sa défense améliorée par une couverture complète.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Arsenal" +LocLongDescription="Le BOT peut s'équiper d'armes lourdes et tirer." +LocHelpText="Le BOT peut s'équiper d'armes lourdes et tirer." +LocPromotionPopupText=" L'Arsenal permet au Spark de s'équiper d'armes lourdes.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Faiseur de pluie" +LocLongDescription="Les armes lourdes équipées infligent point(s) de dégâts en plus et touchent une zone plus large." +LocHelpText="Les armes lourdes équipées infligent plus de dégâts et touchent une zone plus large." +LocPromotionPopupText=" La capacité Faiseur de pluie augmente de point(s) les dégâts infligés par les armes lourdes.
Les armes lourdes à zone d'effet circulaire voient leur rayon augmenter de .
Les armes lourdes à cône d'effet voient leur diamètre augmenter de et leur longueur de .
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Intimidation" +LocLongDescription="Si l'unité est la cible d'une attaque, l'ennemi a une chance d'être pris de panique." +LocHelpText="Si l'unité est la cible d'une attaque, l'ennemi a une chance d'être pris de panique." +LocFlyOverText="Intimidation" +LocPromotionPopupText=" Les chances de faire paniquer l'attaquant avec l'Intimidation augmentent en fonction du blindage du Spark.
L'Intimidation peut être déclenchée par les attaques au corps à corps ou à effet de zone.
L'Intimidation ne se déclenchera pas si l'unité est visée par un tir de vigilance.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Intimidation" +LocLongDescription="Si l'unité est la cible d'une attaque, tous les ennemis visibles ont une chance d'être pris de panique." +LocHelpText="Si l'unité est la cible d'une attaque, tous les ennemis visibles ont une chance d'être pris de panique." +LocFlyOverText="Intimidation" +LocPromotionPopupText="" +LocMissMessage="Échec de l'intimidation" + +[Repair X2AbilityTemplate] +LocFriendlyName="Réparation" +LocLongDescription="Envoyez le BOT réparer un allié robotique endommagé. Plus le BOT est avancé, plus les réparations sont efficaces." +LocHelpText="Envoyez le BOT réparer un allié robotique endommagé." +LocFlyOverText="Réparation" +LocPromotionPopupText=" La capacité Réparation régénère PV.
Améliorez votre BOT pour des réparations plus efficaces.
La Réparation peut être utilisée en début de tour sans y mettre fin.
La Réparation peut être utilisée fois par mission.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Champ de canalisation" +LocLongDescription="Chaque fois que vous êtes pris pour cible, une partie de l'énergie est canalisée dans votre , avant d'être libérée à votre prochain tir normal." +LocHelpText="Canalisez de l'énergie dans votre lorsque vous êtes pris pour cible et libérez-la à votre prochain tir normal." +LocFlyOverText="Énergie canalisée : +1" +LocPromotionPopupText=" Chaque point d'énergie canalisé par le Champ de canalisation augmente d'un point les dégâts de la prochaine attaque avec votre .
L'énergie stockée par le champ de canalisation est dépensée même si le tir suivant ne touche pas sa cible.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Sacrifice" +LocLongDescription="Générez un champ de protection qui déviera toutes les attaques contre vos alliés sur vous. Tant que la capacité est activée, la défense et le blindage augmentent." +LocHelpText="Générez un champ de protection qui déviera toutes les attaques ennemies sur vous." +LocFlyOverText="Sacrifice" +LocPromotionPopupText=" Lorsque le Sacrifice est activé, la défense du Spark augmente de et son armure de .
Le Sacrifice nécessite un temps de rechargement de tour(s).
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Visée adaptative" +LocLongDescription="Lorsque l'Overdrive est activé, les tirs normaux n'ont pas de pénalité de recul." +LocHelpText="Lorsque l'Overdrive est activé, les tirs normaux n'ont pas de pénalité de recul." +LocPromotionPopupText=" La Visée adaptative élimine la pénalité de visée de % pour les tirs normaux consécutifs lorsque l'Overdrive est activé.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="Frappe" +LocLongDescription="Portez une puissante attaque au corps à corps contre un ennemi à portée de déplacement." +LocHelpText="Portez une puissante attaque au corps à corps contre un ennemi à portée de déplacement." +LocPromotionPopupText=" Vous pouvez déclencher la capacité Frappe en plaçant le curseur sur un ennemi.
Un Spark peut \"sprinter\" en utilisant ses deux actions tout en étant capable de lancer une Frappe sur un ennemi adjacent.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Boulet de démolition" +LocLongDescription="Lorsque l'Overdrive est activé, vous brisez les murs et les abris en vous déplaçant." +LocHelpText="Lorsque l'Overdrive est activé, vous brisez les murs et les abris en vous déplaçant." +LocPromotionPopupText=" Le Boulet de démolition permet d'exposer l'ennemi aux attaques à revers.
Placez des repères pour guider le Spark de façon optimale afin de détruire des abris et l'environnement.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Bombardement" +LocLongDescription="Vous lancez le BOT vers un point visible, où il déclenche une violente explosion. les BOT avancés font plus de dégâts." +LocHelpText="Vous lancez le BOT et il explose, blessant les unités présentes dans le rayon de la déflagration." +LocPromotionPopupText=" Le Bombardement peut être utilisé sur n'importe quel emplacement dans le champ de vision de l'escouade.
Améliorez votre BOT pour faire plus de dégâts.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Protocole de chasseur" +LocLongDescription="Lorsqu'un ennemi est dévoilé, vous avez  % de chances d'effectuer un tir de vigilance gratuit." +LocHelpText="Lorsqu'un ennemi est dévoilé, vous avez  % de chances d'effectuer un tir de vigilance gratuit." +LocPromotionPopupText=" Le Protocole de chasseur fait du Spark l'unité idéale pour partir en reconnaissance dans le brouillard de guerre, puisque tout ennemi découvert peut immédiatement être attaqué.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Nova" +LocLongDescription="Relâche une explosion énergétique blessant toutes les unités à proximité. Ne coûte aucun point d'action et n'a pas besoin d'être rechargée, mais les Novas suivantes endommageront le Spark." +LocHelpText="Explose en blessant toutes les unités à proximité. Les Novas suivantes endommageront le Spark." +LocPromotionPopupText=" La capacité Nova ne consomme pas de point d'action et n'a pas besoin de se recharger.
La première Nova de chaque mission ne fait perdre aucun PV au Spark.
Toutes les Novas suivantes font systématiquement perdre PV au Spark (effet cumulatif).
" ;;;;;;;;;;;;;;;;;;;; SPECIFICITES FRA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; LWotC(FRA) - Was here before, can't say if I've to delete it diff --git a/LongWarOfTheChosen/Localization/XComGame.int b/LongWarOfTheChosen/Localization/XComGame.int index c615b4401..ea728becb 100644 --- a/LongWarOfTheChosen/Localization/XComGame.int +++ b/LongWarOfTheChosen/Localization/XComGame.int @@ -175,7 +175,7 @@ LocFlyOverText="Napalm-X" ; LWOTC Needs Translation (3) LocLongDescription="Your Flamethrower can now panic enemies." LocHelpText="Your Flamethrower can now panic enemies." -LocPromotionPopupText=" Your Flamethrower can now panic enemies. Enemy units must pass a will check to avoid negative effects.
The chance to panic is % + //%, depending on soldier's gauntlet tier, and is negatively affected by target's Will score." +LocPromotionPopupText=" Your Flamethrower can now panic enemies. Enemy units must pass a will check to avoid negative effects.
The chance to panic is % + //%, depending on soldier's gauntlet tier, and is negatively affected by target's Will score.
Enemies hit by Roust are not affected by Napalm-X." ; End Translation (3) [PhosphorusPassive X2AbilityTemplate] @@ -183,7 +183,7 @@ LocFriendlyName="Phosphorus" LocFlyOverText="Phosphorus" LocLongDescription="Your flamethrower's base damage can now ignore fire immunities, and shred armor."" LocHelpText="Your flamethrower's base damage can now ignore fire immunities, and shred armor." -LocPromotionPopupText=" Your flamethrower can now ignore fire immunities.
Flamethrower attacks shred 1 armor.
" +LocPromotionPopupText=" While you can now damage fire immune enemies, they still cannot be set on fire.
Flamethrower attacks shred 1 armor.
" [Incinerator X2AbilityTemplate] LocFriendlyName="Incinerator" @@ -195,9 +195,9 @@ LocPromotionPopupText=" Your flamethrower has an increased range and co [Roust X2AbilityTemplate] LocFriendlyName="Roust" LocFlyOverText="Roust" -LocLongDescription="Special Flamethrower shot that does limited damage but forces enemies to change their position." -LocHelpText="Special flamethrower shot that forces enemies to change their location." -LocPromotionPopupText=" Has a 20% chance to set enemies in the area of effect on fire and does limited damage.
The narrow jet of flame has less impact on the environment.
Units hit by the shot will be forced to move, often triggering overwatch fire.
One use per mission, but can gain an additional use with additional gear.
Cannot be used from concealment." +LocLongDescription="Special Flamethrower shot that deals limited damage but forces enemies to change their position and decreases their mobility and defense." +LocHelpText="Special Flamethrower shot that deals limited damage but forces enemies to change their position and decreases their mobility and defense." +LocPromotionPopupText=" Has a % chance to set enemies in the area of effect on fire and deals % reduced damage.
The narrow jet of flame has less impact on the environment.
Units hit by the shot will be forced to move, often triggering overwatch fire.
One use per mission, but can gain an additional use with additional gear.
Cannot be used from concealment." ; LWOTC Needs Translation (2) [Burnout X2AbilityTemplate] @@ -234,7 +234,15 @@ LocFriendlyName="Firestorm" LocFlyOverText="Firestorm" LocLongDescription="Once per battle, attack all units in a complete circle around the soldier's position. Also grants immunity to fire damage." LocHelpText="Spray fire in a complete circle around your position." -LocPromotionPopupText=" This will light fires and do fire damage to all enemies in a circle around the soldier's position, doing + bonus damage over regular Flamethrower attacks.
Firestorm also grants immunity to fire damage.
Requires one action point and will end the soldier's turn when used.
Usable once per battle.
It is not recommended the soldier uses Firestorm on rooftops." +LocPromotionPopupText=" This will light fires and deal fire damage to all enemies in a circle around the soldier's position.
Firestorm deals + bonus damage over regular Flamethrower attacks.
Requires two action points and will end the soldier's turn when used.
Usable once per battle.
Firestorm also grants immunity to fire damage.
It is not recommended the soldier uses Firestorm on rooftops." + +[Firestorm2 X2AbilityTemplate] +LocFriendlyName="Test Firestorm" +LocFlyOverText="Test Firestorm" +LocLongDescription="Once per battle, attack all units in a complete circle around the soldier's position. Also grants immunity to fire damage." +LocHelpText="Spray fire in a complete circle around your position." +LocPromotionPopupText=" This will light fires and deal fire damage to all enemies in a circle around the soldier's position.
Firestorm deals + bonus damage over regular Flamethrower attacks.
Requires two action points and will end the soldier's turn when used.
Usable once per battle.
Firestorm also grants immunity to fire damage.
It is not recommended the soldier uses Firestorm on rooftops." + [TechnicalFireImmunity X2AbilityTemplate] LocFriendlyName="Fire Immunity" @@ -278,14 +286,14 @@ LocLongDescription="Attacks with your gauntlet, and fires set by gauntlet weapon LocHelpText="Attacks with your gauntlet, and fires set by gauntlet weapons, do +1 damage." LocPromotionPopupText=" Attacks with your gauntlet, and fires set by gauntlet weapons, do +1 damage.
This applies to both rocket launcher and flamethrower weapons, and the fires they set.
" -; LWOTC Needs Translation (2) +; LWOTC Needs Translation (4) [ConcussionRocket X2AbilityTemplate] LocFriendlyName="Concussion Rocket" LocFlyOverText="Concussion Rocket" -LocLongDescription="Fire a special rocket that does limited damage but has a chance to stun or disorient organic enemies within its area of effect and leaves a cloud of smoke." -LocHelpText="Rocket that stuns or disorients targets and leaves a smoke cloud. " -LocPromotionPopupText=" One use per mission.
Stun chances based on target's Will score and the soldier's gauntlet tier.
Disorientation chances based on target's Will score only.
Requires one action and ends the soldier's turn.
Elite Codexes and Psi Zombies are immune to all effects including damage.
Allies cannot be injured by this attack.
" -; End Translation (2) +LocLongDescription="Fire a special rocket that does limited damage but has a chance to stun or disorient organic enemies within its area of effect." +LocHelpText="Rocket that stuns or disorients targets. " +LocPromotionPopupText=" One use per mission.
Stun chance is 20% .
Disorientation chance is 100% and bypasses disorient resist (but not immunity).
Requires one action and ends the soldier's turn.
Elite Codexes and Psi Zombies are immune to all effects including damage.
Allies cannot be injured by this attack.
" +; End Translation (4) ;;;;;;;;;;;;;;;;;;;; SHINOBI ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; @@ -319,7 +327,7 @@ LocFriendlyName="Failsafe" LocLongDescription="If you fail a hack, you prevent any negative effects from occurring." LocHelpText="If you fail a hack, you prevent any negative effects from occurring." LocFlyOverText="Failsafe" -LocPromotionPopupText=" If you fail a hack, you prevent any negative effects from occurring." +LocPromotionPopupText=" Negative effects prevented by Failsafe include losing squad concealment." [FullOverride X2AbilityTemplate] LocFriendlyName="Full Override" @@ -358,8 +366,8 @@ Description="Take control of this unit for rest of the mission and gain stat bon ; LWOTC Needs Translation (3) [ScanningProtocol X2AbilityTemplate] -LocLongDescription="The GREMLIN can trigger an instant scan of the area, increasing the Specialist's sight radius substantially for one turn, and revealing any hidden or disguised enemies in view. Free Action." -LocPromotionPopupText=" Scanning Protocol has initial charges.
Scanning Protocol gains bonus charges with improved Gremlins.
In addition to hidden and disguised enemies, enemies blocked from line of sight by walls or obstructions will also be revealed by Scanning Protocol.
Scanning Protocol is a free action.
If the Specialist is employed as Haven Adviser Scanning Protocol will reduce the chance of recruiting Faceless rebels by 40% (stacking cumulatively with other similar abilities).
" +LocLongDescription="The GREMLIN can trigger an instant scan of the area, increasing the 's sight radius substantially for one turn, and revealing any hidden or disguised enemies in view. Free Action." +LocPromotionPopupText=" Scanning Protocol has initial charges.
Scanning Protocol gains bonus charges with improved GREMLINs.
In addition to hidden and disguised enemies, enemies blocked from line of sight by walls or obstructions will also be revealed by Scanning Protocol.
Scanning Protocol is a free action.
If the Specialist is employed as Haven Adviser Scanning Protocol will reduce the chance of recruiting Faceless rebels by 40% (stacking cumulatively with other similar abilities).
" ; End Translation (3) ; End translation @@ -410,16 +418,16 @@ LocFriendlyName="HEAT Warheads" LocLongDescription="Your grenades now pierce up to point(s) of armor and shred additional point(s) of armor." LocHelpText="Your grenades now pierce up to point(s) of armor and shred additional point(s) of armor." LocFlyOverText="HEAT Warheads" -LocPromotionPopupText=" Your grenades now pierce (ignore) up to point(s) of armor and shred additional point(s) of armor.
" +LocPromotionPopupText=" Grenades that do not innately shred any armor do not benefit from the additional shred." ; End Translation [Bombard_LW X2AbilityTemplate] LocFriendlyName="Bombardier" ; LWOTC Needs Translation (2) -LocLongDescription="You may throw or launch grenades two additional tiles." -LocHelpText="You may throw or launch grenades two additional tiles." +LocLongDescription="You may throw or launch grenades additional tiles." +LocHelpText="You may throw or launch grenades additional tiles." LocFlyOverText="Bombardier" -LocPromotionPopupText=" Your grenades have 2 tiles extra range.
This includes both launched and thrown grenades.
" +LocPromotionPopupText=" This includes both launched and thrown grenades." ; End Translation (2) [BluescreenBombs X2AbilityTemplate] @@ -466,10 +474,10 @@ LocPromotionPopupText=" Grenades, standard rockets, and MEC micromissil [KnifeFighter X2AbilityTemplate] LocFriendlyName="Knife Fighter" -LocLongDescription="You may make a melee attack with your knife against adjacent enemies." -LocHelpText="Knife Attack" +LocLongDescription="Attack an adjacent enemy with your knife." +LocHelpText="Attack an adjacent enemy with your knife." LocFlyOverText="Knife Fighter" -LocPromotionPopupText=" Knife attacks use one action and do not end your turn.
" +LocPromotionPopupText=" Knife attacks use one action and do not end your turn." [Combatives X2AbilityTemplate] LocFriendlyName="Combatives" @@ -482,11 +490,11 @@ LocPromotionPopupText=" You will parry any grazed melee attack against [Flush X2AbilityTemplate] LocFriendlyName="Flush" -LocLongDescription="Special shot with a bonus to hit that does little or no damage but confers defense and dodge penalties and forces target to change position if it hits." -LocHelpText="Special shot that does little or no damage but confers defense and dodge penalties and forces target to change position." +LocLongDescription="Special shot with + aim but -% reduced damage. If it hits, the target loses - defense, - dodge, and is forced to move." +LocHelpText="Special shot with + aim but -% reduced damage. If it hits, the target loses - defense, - dodge, and is forced to move." LocFlyOverText="Flush" ; LWOTC needs translation (2) -LocPromotionPopupText=" Consumes ammo.
Flush has a turn cooldown.
+ bonus to aim.
Cannot crit or apply bonus ammo effects.
Cannot be used from concealment.
Target loses defense and dodge. The debuff lasts turns." +LocPromotionPopupText=" Consumes ammo.
Flush has a turn cooldown.
The defense and dodge debuff lasts turns.
Cannot crit or apply bonus ammo effects.
Cannot be used from concealment." ; End Translation (2) str_FlushEffect="Flushed" @@ -499,6 +507,26 @@ LocPromotionPopupText=" Hail of Bullets requires Plasma weapons also cause targets to take 1 additional damage on future hits." [AlienHunterPistol_BM X2WeaponTemplate] UnknownUtilityCategory="Pistol" -TacticalText=" Powered Shadowkeeper's strength is comparable to a Plasma Pistol, but has improved aim and chance to critical hit.\n Unlike the sniper rifle, pistols can be fired with a single action.\n Kills made with the \"Shadowfall\" ability instantly conceal the unit.
Plasma weapons also cause targets to take 1 additional damage on future hits." +TacticalText=" Powered Shadowkeeper's strength is comparable to a Plasma Pistol, but has improved aim and chance to critical hit.\n Pistols can be fired with a single action.\n Kills made with the \"Shadowfall\" ability instantly conceal the unit.
Plasma weapons also cause targets to take 1 additional damage on future hits." [SawedOffShotgun_CV X2WeaponTemplate] FriendlyName="Sawed-Off Shotgun" @@ -1006,7 +1036,7 @@ AbilityDescName="holotargeter" [Holotargeter_BM X2WeaponTemplate] FriendlyName="Holotargeter Mark III" -FriendlyNamePlural="Holotargeters Mark IIIs" +FriendlyNamePlural="Holotargeter Mark IIIs" BriefSummary="Allows targeting enemy units to provide aim bonuses to any members of the squad targeting this unit." TacticalText=" Grants 20 bonus aim to any unit attacking the Holotargeted unit." AbilityDescName="holotargeter" @@ -1139,7 +1169,7 @@ AbilityDescName="crossbow" [Vektor_LS X2WeaponTemplate] FriendlyName="Laser Vektor Rifle" FriendlyNamePlural="Laser Vektor Rifles" -BriefSummary="An experimental laser weapon design originating all the way from old-world russia, the Laser Vektor Rifle is close in performance to the traditional marksman rifles used by the Reapers. Now updated with modern alloy shielding and a compact power source, it is quite a formidable weapon in the hands of a skilled sniper." +BriefSummary="An experimental laser weapon design originating all the way from old-world Russia, the Laser Vektor Rifle is close in performance to the traditional marksman rifles used by the Reapers. Now updated with modern alloy shielding and a compact power source, it is quite a formidable weapon in the hands of a skilled sniper." TacticalText=" Laser weapons receive bonus aim.
The Vektor Rifle range of weapons suffer a penalty to hit at close range, but can be used at squad sight range.
The weapons incur an increasing aim penalty from 4 tiles beyond squad sight range.
Use upgrades looted from enemies to improve the Vektor Rifle's tactical effectiveness." AbilityDescName="vektor rifle" @@ -1399,13 +1429,13 @@ TacticalText=" Grants a hit point FriendlyName="Tactical Vest" FriendlyNamePlural="Tactical Vests" BriefSummary="Shen has improved the traditional Nanoscale Vest with armored plating, providing reduced damage from armor protection against enemy attacks." -TacticalText=" Grants 3 hit points to the soldier.\n Provides 1 armor.\n Only one plating item and one vest can be equipped at a time." +TacticalText=" Grants 3 hit points to the soldier.\n Provides 1 armor.\n Enemies have a penalty of - critical chance against the soldier.\n Only one plating item and one vest can be equipped at a time." [HazmatVest X2EquipmentTemplate] FriendlyName="Hazmat Vest" FriendlyNamePlural="Hazmat Vests" BriefSummary="By reinforcing the Nanoscale Vest with specialized materials, we are able to make our soldiers completely resistant to any environmental hazards like fire, acid or poison." -TacticalText=" Increases soldier health by 3.\n Provides immunity to fire, acid and poison.\n Only one plating item and one vest can be equipped at a time." +TacticalText=" Increases soldier health by .\n Provides immunity to fire, acid and poison.\n Only one plating item and one vest can be equipped at a time." [Hellweave X2EquipmentTemplate] FriendlyName="Hellweave Vest" @@ -1494,8 +1524,8 @@ BriefSummary="The Superior Focus sim provides the affected soldier with the best FriendlyName="Ceramic Plating" FriendlyNamePlural="Ceramic Plating" UnknownUtilityCategory="Plating" -BriefSummary="Grants 2 ablative armor points." -TacticalText=" Grants 2 ablative armor points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of Ceramic Plating HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." +BriefSummary="Grants ablative hit points." +TacticalText=" Grants ablative hit points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of Ceramic Plating HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." [ChameleonSuit X2EquipmentTemplate] FriendlyName="Chameleon Suit" @@ -1507,34 +1537,34 @@ TacticalText=" Significantly reduces infiltration time by this unit.\n< FriendlyName="Alloy Plating" FriendlyNamePlural="Alloy Plating" UnknownUtilityCategory="Plating" -BriefSummary="Grants 3 ablative armor points." -TacticalText=" Grants 3 ablative armor points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." +BriefSummary="Grants ablative hit points." +TacticalText=" Grants ablative hit points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." [ChitinPlating X2EquipmentTemplate] FriendlyName="Chitin Plating" FriendlyNamePlural="Chitin Plating" UnknownUtilityCategory="Plating" -BriefSummary="Grants 4 ablative armor points." -TacticalText=" Grants 4 ablative armor points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." +BriefSummary="Grants ablative hit points." +TacticalText=" Grants ablative hit points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." [CarapacePlating X2EquipmentTemplate] FriendlyName="Carapace Plating" FriendlyNamePlural="Carapace Plating" UnknownUtilityCategory="Plating" -BriefSummary="Grants 5 ablative armor points." -TacticalText=" Grants 5 ablative armor points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." +BriefSummary="Grants ablative hit points." +TacticalText=" Grants ablative hit points.
These hit points, once lost, cannot be regained for the remainder of the mission.
Loss of ablative HP does not increase wound time.\n Only one plating item and one vest can be equipped at a time." [StilettoRounds X2AmmoTemplate] FriendlyName="Stiletto Rounds" FriendlyNamePlural="Stiletto Rounds" -BriefSummary="Does +1 damage to all targets and +2 damage to nonrobotic aliens." -TacticalText=" Does +2 damage to nonrobotic aliens.
Only one ammo enhancement may be equipped at a time." +BriefSummary="Your shots deal + damage to all targets and + additional damage to nonrobotic aliens." +TacticalText=" Your shots deal + damage to all targets and + additional damage to nonrobotic aliens.
Only one ammo enhancement may be equipped at a time." [FlechetteRounds X2AmmoTemplate] FriendlyName="Flechette Rounds" FriendlyNamePlural="Flechette Rounds" -BriefSummary="Does +1 damage to all targets and +2 damage to unarmored enemies." -TacticalText=" Does +2 damage to unarmored targets.
Only one ammo enhancement may be equipped at a time." +BriefSummary="Your shots deal + damage to all targets and + additional damage to unarmored targets." +TacticalText=" Your shots deal + damage to all targets and + additional damage to unarmored targets.
Only one ammo enhancement may be equipped at a time." [RedScreenRounds X2AmmoTemplate] FriendlyName="Redscreen Rounds" @@ -1547,14 +1577,14 @@ TacticalText=" Lowers enemy hack defense by Templars begin missions weaker than other soldiers, but can become extremely powerful at higher Focus levels.
Focus is gained by attacking enemies with Rend (even misses count).
" ; LWOTC Needs Translation (3) -[Rend X2AbilityTemplate] +[Rend_LW X2AbilityTemplate] +LocFriendlyName="Rend" LocLongDescription="Melee attack with a chance to stun or disorient the target. Triggers Momentum, and generates Focus on attacks." LocHelpText="Melee attack with a chance to stun or disorient the target. Triggers Momentum, and generates Focus on attacks." LocPromotionPopupText=" Using Rend is the Templar's primary method for generating Focus.
After casting Rend, the Templar will gain Momentum, allowing them one movement action. Use this to return to cover after attacking.
Rend has a % chance to Stun per Focus. Stunned targets will also be knocked back.
Rend has a % chance to Disorient per Focus.
" @@ -5360,7 +5444,7 @@ LocPromotionPopupText=" The pillar will last for a number of turns equa [StunStrike X2AbilityTemplate] LocLongDescription="Strike an enemy with Psionic force, stunning them. Costs 1 Focus." LocHelpText="Strike an enemy with Psionic force, stunning them. Costs 1 Focus." -LocPromotionPopupText=" Stun Strike has a % chance to hit, increased by % for each Focus level.
Stun Strike has a % chance to stun the target if successful.
Stun Strike does not end the Templar's turn.
Stun Strike has a turn cooldown.
" +LocPromotionPopupText=" Stun Strike has a % chance to hit, increased by % for each Focus level.
Stun Strike has a % chance to stun the target if successful.
Stun Strike costs one action and does not end the Templar's turn.
Stun Strike has a turn cooldown.
Stun Strike cannot be used against targets that take more space than 1 tile." [BondmateTeamwork X2AbilityTemplate] LocHelpText="Grant an additional movement point to a bondmate. Has a single charge shared between bondmates." @@ -5398,9 +5482,9 @@ LocPromotionPopupText=" Reduces Shadow's cooldown by 1 turn.
" ; LWOTC Needs Translation (4) [BloodTrail X2AbilityTemplate] LocFriendlyName="Blood Trail" -LocLongDescription="Attacks deal + damage and ignore up to Dodge if the target has been wounded this turn." +LocLongDescription="Attacks deal + damage and ignore up to Dodge if the target has taken damage after your previous turn." LocHelpText="Attacks deal + damage and ignore up to Dodge if the target has been wounded this turn." -LocPromotionPopupText=" Only applies on the same turn the enemy is damaged.
Works with all weapons, including grenades.
" +LocPromotionPopupText=" The bonuses apply if the enemy has taken damage on your turn or its previous turn.
Works with all weapons, including grenades.
" ; End Translation (4) [PaleHorse X2AbilityTemplate] @@ -5506,6 +5590,14 @@ LocPromotionPopupText=" Solace cleanses disorientation, mind control, p LocPromotionPopupText=" Ghosts start with Focus equal to the Templar's Focus level when created minus 1.
Ghosts cannot gain Focus, and disappear when all Focus is spent, or their health reaches 0.
Rend costs 1 Focus when used by Ghosts.
Ghost must be cast on the corpse of a humanoid enemy, and cannot be cast on the same corpse twice.
Ghost has a turn cooldown.
Ghosts cannot gain following abilities: Volt, Shield bash, Shield abilities, Deflect, Reflect, Solace, Void Conduit, Bladestorm, Apotheosis, Superior Aptitude, Ionic Storm and Sustain.
" ; End Translation (2) +; LWOTC Needs Translation (2) +[VoidConduit X2AbilityTemplate] +LocFriendlyName="Void Conduit" +LocLongDescription="Trap a humanoid in a Psionic prison, immobilizing them for 2 actions and transferring their health to the Templar. Costs 1 Focus." +LocHelpText="Immobilize a humanoid for 2 actions, and transfer their health to the Templar. Costs 1 Focus." +LocPromotionPopupText=" Void Conduit will deal damage initially, then drain health per enemy action.
Void Conduit lasts for 2 enemy actions.
Void Conduit has a turn cooldown.
Targets trapped by Void Conduit cannot take actions or dodge, but can be targeted by other attacks.
" +; End Translation (2) + ; LWOTC Needs Translation (3) ; (2) Shard and Caster gauntlet tactical text and the brief ; summaries for the caster gauntlets have been updated. @@ -5582,6 +5674,14 @@ LocLongDescription="Gives a shield, an aim, critical hit chance, will and Psi of ; End Translation (3) LocFlyOverText="The Warlock's Greatest Champion" +; LWOTC Needs Translation +[ShieldAllyM5 X2AbilityTemplate] +LocFriendlyName="The Warlock's Greatest Champion" +LocHelpText="Gives a shield, an aim, critical hit chance, will and Psi offense bonus to an ally. When the ally is alive, Warlock gains % Damage Reduction. turn cooldown." +LocLongDescription="Gives a shield, an aim, critical hit chance, will and Psi offense bonus to an ally. When the ally is alive, Warlock gains % Damage Reduction. turn cooldown." +LocFlyOverText="The Warlock's Greatest Champion" +; End Translation + [PsiMindControl X2AbilityTemplate] LocFriendlyName="Mind Control" ; LWOTC Needs Translation (3) @@ -5627,7 +5727,7 @@ LocFlyOverText="Get up!" [ChosenSummonFollowers X2AbilityTemplate] LocFriendlyName="Summon Followers" ; LWOTC Needs Translation (3) -LocHelpText="Summon aliens. turn cooldown." +LocHelpText="Summon aliens." ; End Translation (3) LocLongDescription="Summon aliens." LocFlyOverText="Summonnin' ayys" @@ -5649,6 +5749,10 @@ LocLongDescription="When you get a crit with any shot or ability, your human or [LocationScout X2SitRepTemplate] Description="The resistance have placed low-range motion detectors throughout the AO that hook into your squad's comms. Your soldiers will be able to detect enemy units that are out of line of sight." +[ChosenOnMissionSitrep X2SitrepTemplate] +FriendlyName="Chosen Presence" +Description="A Chosen's energy signature has been detected. Expect them to appear on this mission." + ; LWOTC Needs Translation (2) [LargeMap X2SitRepTemplate] FriendlyName="Large Map" @@ -5776,6 +5880,10 @@ Description="Enemies units are going to be significantly tougher to take down be FriendlyName="Under infiltration (impossible?)" Description="Enemies units are going to be so tough, the fight will be virtually impossible to win because you're underinfiltrating." +[LargeDepot_LW X2SitRepTemplate] +FriendlyName="Large Depot" +Description="A larger than normal Advent shipment has been traced to this location. Extra crates will spawn." + ; LWOTC Needs Translation (2) [ToughScaling X2AbilityTemplate] LocFriendlyName="Under infiltration (minor)" @@ -5819,6 +5927,13 @@ ActionObjective="Obtain Resistance MEC" [CovertAction_RecruitRebels X2CovertActionTemplate] ActionObjective="Recruit Rebels" +[CovertAction_BigSupplyDepot X2CovertActionTemplate] +ActionObjective="Find A Supply Depot" + +[CovertAction_FindAdventDetachment X2CovertActionTemplate] +ActionObjective="Locate ADVENT Patrols" + + [CovertActionNarrative_EnemyCorpses_Skirmishers X2CovertActionNarrativeTemplate] ActionName="Raid an Enemy Morgue" ActionPreNarrative="We've discovered where they've been dumping the corpses from all the fighting you've been doing. Could be an opportunity to accelerate your tech development." @@ -5879,6 +5994,36 @@ ActionName="Search for Resistance Recruits" ActionPreNarrative="We've learned of a small group of dissidents in the region who may be willing to help us directly. Go in and see whether you can recruit them for the haven." ActionPostNarrative="Your team persuaded some of the dissidents to join our cause." +[CovertActionNarrative_FindBigDepot_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Locate an ADVENT Supply Depot" +ActionPreNarrative="We've learned of the potential location of a large supply cache. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + +[CovertActionNarrative_FindBigDepot_Reapers X2CovertActionNarrativeTemplate] +ActionName="Locate an ADVENT Supply Depot" +ActionPreNarrative="We've learned of the potential location of a large supply cache. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + +[CovertActionNarrative_FindBigDepot_Templars X2CovertActionNarrativeTemplate] +ActionName="Locate an ADVENT Supply Depot" +ActionPreNarrative="We've learned of the potential location of a large supply cache. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + +[CovertActionNarrative_FindAdventDetachment_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Locate Detached ADVENT Patrol" +ActionPreNarrative="We've learned of the potential location of an ADVENT Scouting Party. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + +[CovertActionNarrative_FindAdventDetachment_Reapers X2CovertActionNarrativeTemplate] +ActionName="Locate Detached ADVENT Patrol" +ActionPreNarrative="We've learned of the potential location of an ADVENT Scouting Party. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + +[CovertActionNarrative_FindAdventDetachment_Templars X2CovertActionNarrativeTemplate] +ActionName="Locate Detached ADVENT Patrol" +ActionPreNarrative="We've learned of the potential location of an ADVENT Scouting Party. We should investigate." +ActionPostNarrative="Nice job. Now we can send in a team to follow up further." + [AbilityPoints X2ItemTemplate] FriendlyName="Ability Points" FriendlyNamePlural="Ability Points" @@ -5919,6 +6064,16 @@ LocFlyOverText="Soul Storm" LocPromotionPopupText="Summon meteors of psionic energy to deal damage to enemies inside a target area, and destroy their cover.
Soul Storm area of effect is centered on the user.
Cannot destroy floors or ceilings.
Soul Storm requires one action and end your turn.
Soul Storm has a turn cooldown.
Soul Storm has a radius of 4 tiles.
" ; End Translation (2) +[Stasis X2AbilityTemplate] +LocFriendlyName="Stasis" +LocLongDescription="Completely stuns the target for 1 turn, but renders them immune to any damage or attack." +LocHelpText="Completely stuns the target for 1 turn, but renders them immune to any damage or attack." +LocFlyOverText="Stasis" +LocPromotionPopupText=" Stasis costs one action point and does not end your turn.
Stasis has a turn cooldown.
Stasis can be cast on both enemies and allies.
Stasis cannot be used against targets that take more space than 1 tile.
As Stasis completely removes an enemy unit from combat for a turn, it can be used defensively to protect vulnerable soldiers, or it can be used offensively to set up a coordinated attack.
" + +[TheLostGrappler X2CharacterTemplate] +strCharacterName="Lost Grappler" + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="Lost Grappler" @@ -5952,6 +6107,9 @@ strCharacterName="Lost Grappler" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="Lost Grappler" +[TheLostBrute X2CharacterTemplate] +strCharacterName="Lost Brute" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="Lost Brute" @@ -6065,9 +6223,9 @@ LocPromotionPopupText=" Your ranged attacks gain once per turn." LocPromotionPopupText=" Return Fire will only trigger once per turn.
Return Fire can be triggered by melee attacks and area of effect attacks.
Return Fire will not trigger when targeted by overwatch fire.
" +[TriggerBot X2AbilityTemplate] +LocFriendlyName="Trigger Bot" +LocHelpText="When targeted by enemy fire, automatically fire back with your once per turn with an attack that has a % damage penalty, but is a guaranteed hit." +LocLongDescription="When targeted by enemy fire, automatically fire back with your once per turn with an attack that has a % damage penalty, but is a guaranteed hit." +LocPromotionPopupText=" Trigger Bot will only trigger once per turn.
Trigger Bot can be triggered by melee attacks and area of effect attacks.
Trigger Bot will not trigger when targeted by overwatch fire.
" + +[TriggerBotShot X2AbilityTemplate] +LocFriendlyName="Trigger Bot" +LocHelpText="When targeted by enemy fire, automatically fire back with your once per turn with an attack that has a % damage penalty, but is a guaranteed hit." +LocLongDescription="When targeted by enemy fire, automatically fire back with your once per turn with an attack that has a % damage penalty, but is a guaranteed hit." +LocPromotionPopupText=" Trigger Bot will only trigger once per turn.
Trigger Bot can be triggered by melee attacks and area of effect attacks.
Trigger Bot will not trigger when targeted by overwatch fire.
" + [DeadeyeSnapShot X2AbilityTemplate] LocFriendlyName="Deadeye (Snap Shot)" LocLongDescription="Take a shot with a small aim penalty for a significant damage boost." @@ -6398,44 +6568,44 @@ LocFlyOverText="Holy Warrior" [ChosenDragonRounds X2AbilityTemplate] LocFriendlyName="Infernal Fury" LocFlyOverText="Infernal Fury" -LocLongDescription="Your primary weapon will set your enemies on fire." -LocHelpText="Your primary weapon will set your enemies on fire." +LocLongDescription="Your will set your enemies on fire." +LocHelpText="Your will set your enemies on fire." [ChosenDragonRoundsPassive X2AbilityTemplate] LocFriendlyName="Infernal Fury" LocFlyOverText="Infernal Fury" -LocLongDescription="Your primary weapon will set your enemies on fire." -LocHelpText="Your primary weapon will set your enemies on fire." +LocLongDescription="Your will set your enemies on fire." +LocHelpText="Your will set your enemies on fire." [ChosenVenomRounds X2AbilityTemplate] LocFriendlyName="Toxic Nightmare" LocFlyOverText="Toxic Nightmare" -LocLongDescription="Your Primary weapon attacks will poison enemies." -LocHelpText="Your Primary weapon attacks will poison enemies." +LocLongDescription="Your attacks will poison enemies." +LocHelpText="Your attacks will poison enemies." [ChosenVenomRoundsPassive X2AbilityTemplate] LocFriendlyName="Toxic Nightmare" LocFlyOverText="Toxic Nightmare" -LocLongDescription="Your Primary weapon attacks will poison enemies." -LocHelpText="Your Primary weapon attacks will poison enemies." +LocLongDescription="Your attacks will poison enemies." +LocHelpText="Your attacks will poison enemies." [ChosenBleedingRounds X2AbilityTemplate] LocFriendlyName="Hit it where it hurts" LocFlyOverText="Hit it where it hurts" -LocLongDescription="Your Primary weapon attacks will bleed enemies." -LocHelpText="Your Primary weapon attacks will bleed enemies." +LocLongDescription="Your attacks will bleed enemies." +LocHelpText="Your attacks will bleed enemies." [ChosenBleedingRoundsPassive X2AbilityTemplate] LocFriendlyName="Hit it where it hurts" LocFlyOverText="Hit it where it hurts" -LocLongDescription="Your Primary weapon attacks will bleed enemies." -LocHelpText="Your Primary weapon attacks will bleed enemies." +LocLongDescription="Your attacks will bleed enemies." +LocHelpText="Your attacks will bleed enemies." [MindScorchDangerZone X2AbilityTemplate] -LocFriendlyName="High Voltage" -LocLongDescription="Gain -tile bonus radius for Mind Scorch." -LocHelpText="Gain -tile bonus radius for Mind Scorch." -LocPromotionPopupText=" Provides a -tile bonus to the radius of Mind Scorch." +LocFriendlyName="Mind Combustion" +LocLongDescription="Gain -tile bonus radius for Mind Scorch, and reduce the cooldown of mind scorch by 1." +LocHelpText="Gain -tile bonus radius for Mind Scorch, and reduce the cooldown of mind scorch by 1." +LocPromotionPopupText="" [MindScorchTerror X2AbilityTemplate] LocFriendlyName="Terrorize" @@ -6465,19 +6635,24 @@ LocFlyOverText="Keen" ; LWOTC needs translation (2) [CombatReadiness X2AbilityTemplate] LocFriendlyName="Combat Readiness" -LocLongDescription="Gain a stackable aim and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." -LocHelpText="Gain a stackable aim and defense bonus in cover for the rest of your turn." +LocLongDescription="Gain a stackable % explosive damage reduction and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." +LocHelpText="Gain a stackable % explosive damage reduction and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." LocFlyOverText="Combat Readiness" ; End translation (2) ; LWOTC needs translation (2) [CombatReadinessPassive X2AbilityTemplate] LocFriendlyName="Combat Readiness" -LocLongDescription="Gain a stackable aim and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." -LocHelpText="Gain a stackable aim and defense bonus in cover for the rest of your turn." +LocLongDescription="Gain a stackable % explosive damage reduction and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." +LocHelpText="Gain a stackable % explosive damage reduction and defense bonus in cover for the rest of your turn, and remove the immobilize debuff." LocFlyOverText="Combat Readiness" ; End translation (2) +[HunterReactionMobBoost_LW X2AbilityTemplate] +LocFriendlyName="Enhanced Reactions" +LocLongDescription="Gain +2 mobility per hit received this turn." +LocFlyOverText="Gained Mobility" + ; LWOTC needs translation [Banzai_LW X2AbilityTemplate] LocFriendlyName="BANZAI" @@ -6510,6 +6685,12 @@ strCharacterName="Assassin" strAcquiredText="Now a close-combat menace, the Assassin is a juggernaut that will run towards you and slash you whenever possible. Her initially-low, but ever-increasing damage cannot be underestimated." ;end translation (2) +;LWOTC needs translation +[ChosenAssassinM5 X2CharacterTemplate] +strCharacterName="Assassin" +strAcquiredText="Now a close-combat menace, the Assassin is a juggernaut that will run towards you and slash you whenever possible. Her initially-low, but ever-increasing damage cannot be underestimated." +;end translation + [ChosenWarlock X2CharacterTemplate] strCharacterName="Warlock" strAcquiredText="The Elder's greatest champion is an incredibly dangerous support unit and the king of mid range, capable of completely disabling your troops and heavily buffing his." @@ -6526,6 +6707,12 @@ strAcquiredText="The Elder's greatest champion is an incredibly dangerous suppor strCharacterName="Warlock" strAcquiredText="The Elder's greatest champion is an incredibly dangerous support unit and the king of mid range, capable of completely disabling your troops and heavily buffing his." +;LWOTC needs translation +[ChosenWarlockM5 X2CharacterTemplate] +strCharacterName="Warlock" +strAcquiredText="The Elder's greatest champion is an incredibly dangerous support unit and the king of mid range, capable of completely disabling your troops and heavily buffing his." +;end translation + [ChosenSniper X2CharacterTemplate] strCharacterName="Hunter" strAcquiredText="The Hunter is the master of long range combat, constantly kiting your troops while taking them down with his dangerous flank shots. Weak at close combat, but is not to be underestimated." @@ -6542,20 +6729,87 @@ strAcquiredText="The Hunter is the master of long range combat, constantly kitin strCharacterName="Hunter" strAcquiredText="The Hunter is the master of long range combat, constantly kiting your troops while taking them down with his dangerous flank shots. Weak at close combat, but is not to be underestimated." +;LWOTC needs translation +[ChosenSniperM5 X2CharacterTemplate] +strCharacterName="Hunter" +strAcquiredText="The Hunter is the master of long range combat, constantly kiting your troops while taking them down with his dangerous flank shots. Weak at close combat, but is not to be underestimated." +;end translation + +;LWOTC needs translation +[ChosenShotgun_T5 X2WeaponTemplate] +FriendlyName="Chosen Ultra Shotgun" +FriendlyNamePlural="Chosen Ultra Shotguns" +BriefSummary="The Storm Gun fires a concentrated set of beam pulses, piercing and melting the target across a substantial surface area." +TacticalText=" This is the most advanced shotgun-style weapon available in the XCOM arsenal.\n Shotgun-style weapons are very effective at close range, but their accuracy drops off quickly at longer range.\n Use upgrades looted from enemies to improve the Storm Gun's tactical effectiveness." +AbilityDescName="shotgun" + +[ChosenSword_T5 X2WeaponTemplate] +FriendlyName="Chosen Ultra Sword" +FriendlyNamePlural="Chosen Ultra Swords" +BriefSummary="The Fusion Blade encases a plasma-heated metallic core in a micro-thin magnetic field, enabling devastating melee attacks that are capable of setting enemies aflame." +TacticalText=" This is the most advanced version of the Ranger's sword, dealing maximum damage with a chance to burn enemy targets." +AbilityDescName="sword" + +[ChosenSniperRifle_T5 X2WeaponTemplate] +FriendlyName="Chosen Ultra Sniper Rifle" +FriendlyNamePlural="Chosen Ultra Sniper Rifles" +BriefSummary="The aliens' focused beam technology has obvious applications for improving sniper rifles. The Plasma Lance is an unmatched sniper rifle." +TacticalText=" This is the apex of sniper rifle technology.\n Sniper rifles always require both actions to fire.\n They are less accurate at close range, but deadly at a distance.\n Use upgrades looted from enemies to improve the plasma sniper rifle's tactical effectiveness." +AbilityDescName="sniper rifle" + + +[ChosenSniperPistol_T5 X2WeaponTemplate] +FriendlyName="Chosen Ultra Pistol" +FriendlyNamePlural="Chosen Ultra Pistols" +BriefSummary="The ultimate sidearm, this pistol integrates the aliens' beam weapons technology to powerful effect." +TacticalText=" Beam pistols are the most powerful handguns on Earth.\n Unlike the sniper rifle, pistols can be fired with a single action." + +[ChosenRifle_T5 X2WeaponTemplate] +FriendlyName="Chosen Ultra Rifle" +FriendlyNamePlural="Chosen Ultra Rifle" +BriefSummary="Now that we've finally deciphered the aliens' devastating weapon technology and can develop beam weapons of our own, we can build rifles that will be the match of any enemy our soldiers encounter in the field." +TacticalText=" The Plasma Rifle is a general purpose, supremely powerful primary infantry weapons system.\n Firing the primary weapon always ends the soldier's turn.\n Use upgrades looted from enemies to improve the Plasma Rifle's tactical effectiveness." +AbilityDescName="assault rifle" +;end translation + ; LWOTC Needs Translation (2) [BloodThirst_LW X2AbilityTemplate] LocFriendlyName="Blood Thirst" -LocLongDescription="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +/// damage for T1/T2/T3/T4. Removed on a successful kidnap." -LocHelpText="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +/// damage for T1/T2/T3/T4. Removed on a successful kidnap." +LocLongDescription="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +//// damage for T1/T2/T3/T4/T5. Removed on a successful kidnap." +LocHelpText="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +//// damage for T1/T2/T3/T4/T5. Removed on a successful kidnap." LocFlyOverText="Blood Thirst" [BloodThirstPassive_LW X2AbilityTemplate] LocFriendlyName="Blood Thirst" -LocLongDescription="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +/// damage for T1/T2/T3/T4. Removed on a successful kidnap." -LocHelpText="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +/// damage for T1/T2/T3/T4. Removed on a successful kidnap." +LocLongDescription="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +//// damage for T1/T2/T3/T4/T5. Removed on a successful kidnap." +LocHelpText="Every time you attack with your melee weapon, get a stackable damage boost to your melee attacks. Bonus depends on Chosen tier, +//// damage for T1/T2/T3/T4/T5. Removed on a successful kidnap." LocFlyOverText="Blood Thirst" ; End Translation (2) +; LWOTC Needs Translation (2) +[UnholyAscension_LW X2AbilityTemplate] +LocFriendlyName="Unholy Ascension" +LocLongDescription="Warlock's Greatest Champion's Shield, Aim, Crit, Will, and Psi Offense bonuses are doubled and grant crit immunity." +LocHelpText="Warlock's Greatest Champion's Shield, Aim, Crit, Will, and Psi Offense bonuses are doubled and grant crit immunity." +LocFlyOverText="Unholy Ascension" + +[RuptureImmunity X2AbilityTemplate] +LocFriendlyName="Unbreakable" +LocLongDescription="All Rupture Effects inflicted on you will be instantly removed." +LocHelpText="All Rupture Effects inflicted on you will be instantly removed." +LocFlyOverText="Unbreakable" + +[TrackingShotMark X2AbilityTemplate] +LocFriendlyName="Tracking Shot Mark" +LocHelpText="At the start of your turn, mark an enemy that's flanked against you as a free action. Your first shot against that target is guaranteed to hit, and refunded." +LocLongDescription="At the start of your turn, mark an enemy that's flanked against you as a free action. Your first shot against that target is guaranteed to hit, and refunded." + +[TrackingShot X2AbilityTemplate] +LocFriendlyName="Tracking Shot" +LocHelpText="At the start of your turn, mark an enemy that's flanked against you as a free action. Your first shot against that target is guaranteed to hit, and refunded." +LocLongDescription="At the start of your turn, mark an enemy that's flanked against you as a free action. Your first shot against that target is guaranteed to hit, and refunded." +;end translation (2) + [PreciseStrike_LW X2AbilityTemplate] LocFriendlyName="Precise strike" LocLongDescription="Your melee attacks pierce 3 armor." @@ -6564,15 +6818,39 @@ LocFlyOverText="Precise strike" [PsychoticRage_LW X2AbilityTemplate] LocFriendlyName="Psychotic Rage" -LocHelpText="Gain a 50% damage boost when at 35% hp or less" -LocLongDescription="Gain a 50% damage boost when at 35% hp or less." +LocHelpText="Gain a % damage boost when at % hp or less." +LocLongDescription="Gain a % damage boost when at % hp or less." LocFlyOverText="Psychotic Rage" +[HeroSlayer_LW X2AbilityTemplate] +LocFriendlyName="Big Game Hunter" +LocHelpText="You deal +% damage against hero classes." +LocLongDescription="You deal +% damage against hero classes." +LocFlyOverText="Big Game Hunter" + +[BloodBath_LW X2AbilityTemplate] +LocFriendlyName="Blood Bath" +LocHelpText="Harbor wave cone is wider by 2 tiles, and each enemy hit by it grants a blood thirst stack." +LocLongDescription="Harbor wave cone is wider by 2 tiles, and each enemy hit by it grants a blood thirst stack." +LocFlyOverText="Blood Bath" + +[MistyMadness_LW X2AbilityTemplate] +LocFriendlyName="Misty Madness" +LocHelpText="The radius of your mist grenade is increased by 2." +LocLongDescription="The radius of your mist grenade is increased by 2." +LocFlyOverText="Misty Madness" + +[Impenetrable_LW X2AbilityTemplate] +LocFriendlyName="Impenetrable" +LocHelpText="Impact Compensation Stacking limit is increased by 1." +LocLongDescription="Impact Compensation Stacking limit is increased by 1." +LocFlyOverText="Impenetrable" + [YouCannotHide_LW X2AbilityTemplate] ; LWOTC Needs Translation (2) LocFriendlyName="You Cannot Hide" -LocHelpText="Gain 100 aim with your primary weapon." -LocLongDescription="Gain 100 aim with your primary weapon." +LocHelpText="Gain 30 aim with your ." +LocLongDescription="Gain 30 aim with your ." ; End Translation (2) LocFlyOverText="Run." @@ -6616,7 +6894,7 @@ FriendlyName="Darklance" FriendlyNamePlural="Darklances" BriefSummary="This rifle belonging to the Chosen Hunter has probably seen more death than we can possibly imagine." ; LWOTC Needs Translation (2) -TacticalText=" This rifle is capable of insane burst damage against units that have been marked for death.
" +TacticalText=" This rifle is capable of insane burst damage against units that have been marked for death." ; End Translation (2) AbilityDescName="sniper rifle" @@ -6643,10 +6921,10 @@ LocFlyOverText="Blood Thirst" [OverbearingSuperiority_LW X2AbilityTemplate] LocFriendlyName="Overbearing Superiority" -LocLongDescription="Whenever you get a critical hit with your primary weapon, your actions are refunded." -;LWOTC Needs translation(2) -LocHelpText="Whenever you get a critical hit with your primary weapon, your actions are refunded." -;End Translation(2) +;LWOTC Needs translation(3) +LocLongDescription="Gain + Crit Chance with your . Whenever you get a critical hit with your , your actions are refunded." +LocHelpText="Gain + Crit Chance with your . Whenever you get a critical hit with your , your actions are refunded." +;End Translation(3) LocFlyOverText="Overbearing Superiority" [DisruptorRifleCrit X2AbilityTemplate] @@ -6664,8 +6942,8 @@ LocFlyOverText="Mark For Death" [Fatality_LW X2AbilityTemplate] LocFriendlyName="Fatality" ;LWOTC Needs translation(2) -LocLongDescription="Gain +100 aim and crit against units at 35% hp or lower with your ." -LocHelpText="Gain +100 aim and crit against units at 35% hp or lower with your ." +LocLongDescription="Gain +100 aim and crit against units at % hp or lower with your ." +LocHelpText="Gain +100 aim and crit against units at % hp or lower with your ." ;End Translation(2) LocFlyOverText="Fatality" @@ -6693,7 +6971,7 @@ LocHelpText="Gain a stackable defence bonus after taking damage for this turn." [ComplexReload_LW X2AbilityTemplate] LocFriendlyName="Complex Reload" -LocHelpText="Reload your primary weapon. Ends turn." +LocHelpText="Reload your . Ends turn." LocFlyOverText="Reloading" [XcomGame.X2StrategyGameRulesetDataStructures] @@ -6715,18 +6993,18 @@ LocFlyOverText="Chosen Prime Reaction" [HunterPrimeReactionPassive X2AbilityTemplate] LocFriendlyName="Chosen Prime Reaction" -LocLongDescription="Gain a movement action or Combat Readiness after taking damage on XCOM's turn." +LocLongDescription="Gain a reduced mobility movement action or Combat Readiness after taking damage on XCOM's turn." LocHelpText="Gain a movement action or Combat Readiness after taking damage on XCOM's turn." LocFlyOverText="Chosen Prime Reaction" [WarlockPrimeReactionPassive X2AbilityTemplate] LocFriendlyName="Chosen Prime Reaction" -LocLongDescription="Gain a movement action or Combat Readiness after taking damage on XCOM's turn." +LocLongDescription="Gain a reduced mobility movement action or Combat Readiness after taking damage on XCOM's turn." LocHelpText="Gain a movement action or Combat Readiness after taking damage on XCOM's turn." LocFlyOverText="Chosen Prime Reaction" ; LWOTC Needs Translation (3) -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="Chosen Immunities" LocLongDescription="Chosen are immune to stun, disorient, and frost." LocHelpText="Chosen are immune to stun, disorient, and frost." @@ -6746,9 +7024,9 @@ LocFlyOverText="Harbor Wave" [Brawler X2AbilityTemplate] LocFriendlyName="Brawler" LocFlyOverText="Brawler" -LocLongDescription="Take % less damage against attacks within four tiles." -LocHelpText="Take % less damage against attacks within four tiles." -LocPromotionPopupText=" Take % less damage against attacks within four tiles.
" +LocLongDescription="Take % less damage from any melee attack, or attacks from within four tiles." +LocHelpText="Take % less damage from any melee attack, or attacks from within four tiles." +LocPromotionPopupText="Take % less damage from any melee attack, or attacks from within four tiles.
" [InstantReactionTime X2AbilityTemplate] LocFriendlyName="Instant Reaction Time" @@ -6809,11 +7087,11 @@ SummaryText="A brutal crackdown on the Resistance, lowering all rebel income (in ; LWOTC Needs Translation [XComGameState_AdventChosen] KnowledgeGainFirstBullet[eChosenKnowledge_Start]="" -KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]="Chosen can hinder rebel activities!" -KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="Chosen increases risks on Covert Actions!" -KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="Chosen can sabotage the Avenger!" +KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]=" " +KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="Chosen can instigate an additional dark event!" +KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="Chosen can hinder rebel activities!" KnowledgeGainFirstBullet[eChosenKnowledge_Raider]="Chosen can launch an assault on the Avenger!" -KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="Chosen can instigate an additional dark event!" +KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="" ; LWOTC Needs Translation (2) @@ -6970,11 +7248,23 @@ LocLongDescription="Reduce wound recovery times for this soldier by Once per turn, gain 1 focus when you're attacked.
Applies to both melee and ranged attacks.
" +LocHelpText="Once per turn, gain 1 focus when you're directly attacked." +LocLongDescription="Once per turn, gain 1 focus when you're directly attacked." +LocPromotionPopupText" Once per turn, gain 1 focus when you're attacked.
Applies to both melee and ranged attacks, but not to AOE attacks.
" LocFlyOverText="Indomitable" [VoltFocusOnKills X2AbilityTemplate] @@ -7013,8 +7303,8 @@ LocPromotionPopupText=" Amplify will last for 3 damage instances.
< [CrusaderRage_LW X2AbilityTemplate] LocFriendlyName="Crusader's Rage" -LocHelpText="Gain 25% damage boost for every 25% HP missing, up to 50% damage boost. Reduce wound recovery times for this soldier by 8 HP" -LocLongDescription="Gain 25% damage boost for every 25% HP missing, up to 50% damage boost. Reduce wound recovery times for this soldier by 8 HP." +LocHelpText="Gain 25% damage boost for every 25% HP missing, up to 50% damage boost. Reduce wound recovery times for this soldier by 6 HP" +LocLongDescription="Gain 25% damage boost for every 25% HP missing, up to 50% damage boost. Reduce wound recovery times for this soldier by 6 HP." LocPromotionPopupText=" Wound reduction does not work if the soldier entered a bleeding out state during the mission.
" LocFlyOverText="Psychotic Rage" @@ -7059,16 +7349,16 @@ LocHelpText="Run towards an Ally and heal stabilize with your medikit." [SoulReaper X2AbilityTemplate] LocFriendlyName="Banish" -LocLongDescription="Fire at a target until you run out of ammo or it dies. Each shot has aim less than the previous one. Reveals the Reaper. " -LocHelpText="Fire at a target until you run out of ammo or it dies. Each shot has aim less than the previous one. Reveals the Reaper." +LocLongDescription="Fire at a target until you run out of ammo or it dies. Each shot has aim less than the previous one. Reveals the Reaper." +LocHelpText="Fire at a target until you run out of ammo or it dies. Each shot has aim less than the previous one. Reveals the Reaper. Starts with Charges, once charges are expended, has a cooldown instead." LocFlyoverText="Banish" -LocPromotionPopupText=" Each shot in Banish rolls a separate chance to hit.
Banish cannot be activated with only 1 ammo remaining.
Banish shots can crit.
" +LocPromotionPopupText=" Each shot in Banish rolls a separate chance to hit.
Banish cannot be activated with only 1 ammo remaining.
Banish shots can crit.
Banish has a turn cooldown." ;LWOTC needs translation(3) [TotalCombat X2AbilityTemplate] LocFriendlyName="Total Combat" -LocLongDescription="Gain 1 Mobility and 5 aim. Throwing a grenade or using an item no longer ends the turn and grenades have no cooldown. In addition, you can throw grenades 3 tiles further and their radius is increased by 1. Grants a Grenade-only slot." -LocHelpText="Gain 1 Mobility and 5 aim. Throwing a grenade or using an item no longer ends the turn and grenades have no cooldown. In addition, you can throw grenades 3 tiles further and their radius is increased by 1. Grants a Grenade-only slot." +LocLongDescription="Gain 1 Mobility and 5 aim. Throwing a grenade or using an item no longer ends the turn and grenades have no cooldown. In addition, you can throw grenades 2 tiles further and their radius is increased by 1. Grants a Grenade-only slot." +LocHelpText="Gain 1 Mobility and 5 aim. Throwing a grenade or using an item no longer ends the turn and grenades have no cooldown. In addition, you can throw grenades 2 tiles further and their radius is increased by 1. Grants a Grenade-only slot." LocPromotionPopupText=" Total Combat adds even more flexibility to the 's turns, allowing actions to be taken exactly when needed.
Removes the cooldown for grenades.
Grants Volatile Mix, hence it does not stack with it." ;End Translation(3) @@ -7087,11 +7377,17 @@ LocLongDescription="A powerful form of Overwatch. Instead of firing automaticall LocHelpText="A powerful form of Overwatch, capable of being used without any actions. Instead of firing automatically, perform any single action. Free action." LocPromotionPopupText=" This is a free action.
Some actions are not available during Interrupt, like Overwatch.
Interrupt has a turn cooldown." -[ArcWavePassive X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="Rend" +LocLongDescription="Melee attack with a chance to stun or disorient the target. Triggers Momentum, and generates Focus on attacks." +LocHelpText="Melee attack with a chance to stun or disorient the target. Triggers Momentum, and generates Focus on attacks." +LocPromotionPopupText=" Using Rend is the Templar's primary method for generating Focus.
After casting Rend, the Templar will gain Momentum, allowing them one movement action. Use this to return to cover after attacking.
Rend has a % chance to Stun per Focus. Stunned targets will also be knocked back.
Rend has a % chance to Disorient per Focus.
" + +[ArcWavePassive_LW X2AbilityTemplate] LocFriendlyName="Arc Wave" LocLongDescription="Rend generates a wave of Psionic energy in the direction of the attack. Damage increases with Gauntlet tier." LocHelpText="Rend generates a wave of Psionic energy in the direction of the attack." -LocPromotionPopupText=" Arc Wave does not affect the target of the original Rend attack.
Arc Wave deals 4/7/10 damage depanding on weapon tier.
Arc Wave travels through environmental objects.
" +LocPromotionPopupText=" Arc Wave does not affect the target of the original Rend attack.
Arc Wave deals 4/7/10 damage depending on weapon tier.
Arc Wave travels through environmental objects.
" [IonicStorm X2AbilityTemplate] LocFriendlyName="Ionic Storm" @@ -7102,8 +7398,8 @@ LocPromotionPopupText=" Ionic Storm's radius increases at higher Focus ; LWOTC Needs Translation [Sabotage_LongRangeComms X2SabotageTemplate] -SummaryText="We've been struggling to maintain long range communications after the recent sabotage by the Chosen. Our covert actions will be delayed by 2 weeks." -ShortSummaryText="Our covert actions have been delayed by 2 weeks!" +SummaryText="We've been struggling to maintain long range communications after the recent sabotage by the Chosen. Our covert actions will be delayed by 5 days." +ShortSummaryText="Our covert actions have been delayed by 5 days!" ; End Translation ; LWOTC Needs Translation @@ -7157,7 +7453,7 @@ LocHelpText="ADVENT security towers cannot see this unit when it's concealed or LocLongDescription="Makes wearer immune to negative mental conditions such as panic, mind control and stuns." [Sustain X2AbilityTemplate] -LocLongDescription="If the unit takes enough damage to be killed, they are immediately put in Stasis for 1 turn and their health is only reduced to 1 HP. This can only happen once per mission." +LocLongDescription="Reduce wound recovery times for this soldier by HP. If the unit takes enough damage to be killed, they are immediately put in Stasis for 1 turn and their health is only reduced to 1 HP. This can only happen once per mission." LocHelpText="If the unit takes enough damage to be killed, they are immediately put in Stasis for 1 turn and their health is only reduced to 1 HP. This can only happen once per mission." LocPromotionPopupText=" Beware that a sustained unit may retain damaging status effects like poison or burning after emerging from Stasis.
" @@ -7165,3 +7461,103 @@ LocPromotionPopupText=" Beware that a sustained unit may retain damagin LocLongDescription="The unit would have died, but was saved and put into Stasis for 1 turn. This cannot happen again during this mission." LocHelpText="The unit would have died, but was saved and put into Stasis for 1 turn. This cannot happen again during this mission." ; End Translation + +[X2MPData_Shell] +arrMPMapFriendlyNames[9]="Underground" +arrMPMapFriendlyNames[10]="Underground" + +[Overdrive X2AbilityTemplate] +LocFriendlyName="Overdrive" +LocLongDescription="Take three actions this turn, and no action is turn-ending. Multiple Standard Shots incur a small recoil penalty." +LocHelpText="Take three actions this turn, and no action is turn-ending. Multiple Standard Shots incur a small recoil penalty." +LocPromotionPopupText=" A recoil penalty of Aim is applied after each Standard Shot while Overdrive is active.
Overdrive has no cost to activate, but has a turn cooldown.
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Bulwark" +LocLongDescription="Gain a bonus point of Armor, and always provide high cover to all adjacent squadmates." +LocHelpText="Gain a bonus point of Armor, and always provide high cover to all adjacent squadmates." +LocPromotionPopupText=" Bulwark adds one point of Armor.
Any squadmate standing adjacent to the SPARK will gain the high cover Defense bonus.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Arsenal" +LocLongDescription="The BIT can equip and fire heavy weapons." +LocHelpText="The BIT can equip and fire heavy weapons." +LocPromotionPopupText=" Arsenal allows the SPARK to equip heavy weapons in their loadout.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Rainmaker" +LocLongDescription="Equipped heavy weapons deal + damage and have increased area of effect." +LocHelpText="Equipped heavy weapons deal more damage and affect a larger area." +LocPromotionPopupText=" Rainmaker adds + damage to all heavy weapons.
Heavy weapons with circular areas of effect have their radius increased by +.
Heavy weapons with conic areas of effect have their diameter increased by + and length increased by +.
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Intimidate" +LocLongDescription="When targeted by an attack, the enemy has a chance to panic." +LocHelpText="When targeted by an attack, the enemy has a chance to panic." +LocFlyOverText="Intimidate" +LocPromotionPopupText=" Intimidate's chance to panic the attacker increases with higher tier SPARK armors.
Intimidate can be triggered by melee and area of effect attacks.
Intimidate will not trigger when targeted by Overwatch fire.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Intimidate" +LocLongDescription="When targeted by an attack, all visible enemies have a chance to panic." +LocHelpText="When targeted by an attack, all visible enemies have a chance to panic." +LocFlyOverText="Intimidate" +LocPromotionPopupText="" +LocMissMessage="Intimidate Failed" + +[Repair X2AbilityTemplate] +LocFriendlyName="Repair" +LocLongDescription="Send the BIT to a damaged robotic ally and repair it. Advanced BITs can repair slightly more." +LocHelpText="Send the BIT to repair a damaged robotic ally." +LocFlyOverText="Repair" +LocPromotionPopupText=" Repair will restore health.
Upgrading your BIT will lead to more HP repaired.
Using Repair as your first action will not end your turn.
Repair has charges per mission.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Channeling Field" +LocLongDescription="Every time you are targeted, part of the energy is channeled to your . This energy is unleashed with your next Standard Shot." +LocHelpText="Channel energy to your when targeted, and unleash it with your next Standard Shot." +LocFlyOverText="Energy Channeled: +1" +LocPromotionPopupText=" Each point of energy channeled by Channeling Field increases the damage of the next attack by 1.
The energy stored by channeling field is expended even if the next shot misses.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Sacrifice" +LocLongDescription="Generate a protective field which redirects any attacks against allies inside it towards you. Gain bonus defense and armor while active." +LocHelpText="Generate a protective field to redirect enemy attacks towards you." +LocFlyOverText="Sacrifice" +LocPromotionPopupText=" The SPARK gains + defense and + armor while Sacrifice is active.
Sacrifice has a turn cooldown.
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Adaptive Aim" +LocLongDescription="When Overdrive is active, Standard Shots do not incur recoil penalties." +LocHelpText="When Overdrive is active, Standard Shots do not incur recoil penalties." +LocPromotionPopupText=" Adaptive Aim eliminates the Aim penalty for consecutive Standard Shots when Overdrive is active.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="Strike" +LocLongDescription="Attack any enemy within movement range with a powerful melee attack." +LocHelpText="Attack any enemy within movement range with a powerful melee attack." +LocPromotionPopupText=" You can trigger the Strike ability by placing the movement cursor over an enemy.
A SPARK can perform a \"Dash\" move, using both actions to move, and still trigger a Strike against an adjacent enemy.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Wrecking Ball" +LocLongDescription="While Overdrive is active, break through walls and cover when moving." +LocHelpText="While Overdrive is active, break through walls and cover when moving." +LocPromotionPopupText=" Wrecking Ball can be used to expose enemies to flanking shots.
Use movement waypoints to guide the SPARK on an optimal path for destroying cover and the environment.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Bombard" +LocLongDescription="Launch the BIT to any visible location where it releases a powerful explosive blast. Advanced BITs do more damage." +LocHelpText="Launch the BIT to blast all units in a radius." +LocPromotionPopupText=" Bombard can be fired at any location within squadsight.
Upgrading your BIT will lead to more Bombard damage.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Hunter Protocol" +LocLongDescription="When an enemy is revealed, there is a % chance to take a free Overwatch shot." +LocHelpText="When an enemy is revealed, there is a % chance to take a free Overwatch shot." +LocPromotionPopupText=" Hunter Protocol makes the SPARK an ideal unit for scouting into the fog of war, since any revealed enemy can be instantly attacked.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Nova" +LocLongDescription="Release a blast of energy, damaging all nearby units. This attack has no cost or cooldown, but consecutive Novas will damage the SPARK." +LocHelpText="Blast all nearby units. Consecutive Novas will damage the SPARK." +LocPromotionPopupText=" Nova has no action point cost and no cooldown.
The first Nova attack each mission will deal 0 damage to the SPARK.
All Nova attacks after the first will deal a stacking damage to the SPARK.
" diff --git a/LongWarOfTheChosen/Localization/XComGame.ita b/LongWarOfTheChosen/Localization/XComGame.ita index ccb58abd9..d02ce3a92 100644 --- a/LongWarOfTheChosen/Localization/XComGame.ita +++ b/LongWarOfTheChosen/Localization/XComGame.ita @@ -1291,74 +1291,74 @@ RightAbilityTreeTitle="Pompiere" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Angelo" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Vescovo" -RandomNickNames[3]="Osso" -RandomNickNames[4]="Breaker" -RandomNickNames[5]="Transistor" -RandomNickNames[6]="Crypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Cypher" -RandomNickNames[9]="Data" -RandomNickNames[10]="Diacono" -RandomNickNames[11]="Dott. Feelgood" -RandomNickNames[12]="Doc" -RandomNickNames[13]="Feedback" -RandomNickNames[14]="Firewall" -RandomNickNames[15]="Genio" -RandomNickNames[16]="Gadget" -RandomNickNames[17]="Glitch" -RandomNickNames[18]="Hack" -RandomNickNames[19]="Jammer" -RandomNickNames[20]="Jester" -RandomNickNames[21]="Lampo" -RandomNickNames[22]="Fulmine" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Overdrive" -RandomNickNames[27]="Patch" -RandomNickNames[28]="Professore" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Canaglia" -RandomNickNames[31]="Sonaglio" -RandomNickNames[32]="Red" -RandomNickNames[33]="Squarcio" -RandomNickNames[34]="Paracadute" -RandomNickNames[35]="Rogue" -RandomNickNames[36]="Fiamma" -RandomNickNames[37]="Sentinel" -RandomNickNames[38]="Losco" -RandomNickNames[39]="Tremito" -RandomNickNames[40]="Shift" -RandomNickNames[41]="Strizzacervelli" -RandomNickNames[42]="Pillola" -RandomNickNames[43]="Sole" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Scintilla" -RandomNickNames[46]="Sutura" -RandomNickNames[47]="Pic" -RandomNickNames[48]="Lacrima" -RandomNickNames[49]="Rotella" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Veleno" -RandomNickNames[52]="Vapore" -RandomNickNames[53]="Falco" -RandomNickNames[54]="Guardiano" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Folle" -RandomNickNames[57]="Zulu" ++RandomNickNames="Angelo" ++RandomNickNames="Beta" ++RandomNickNames="Vescovo" ++RandomNickNames="Osso" ++RandomNickNames="Breaker" ++RandomNickNames="Transistor" ++RandomNickNames="Crypto" ++RandomNickNames="Cyber" ++RandomNickNames="Cypher" ++RandomNickNames="Data" ++RandomNickNames="Diacono" ++RandomNickNames="Dott. Feelgood" ++RandomNickNames="Doc" ++RandomNickNames="Feedback" ++RandomNickNames="Firewall" ++RandomNickNames="Genio" ++RandomNickNames="Gadget" ++RandomNickNames="Glitch" ++RandomNickNames="Hack" ++RandomNickNames="Jammer" ++RandomNickNames="Jester" ++RandomNickNames="Lampo" ++RandomNickNames="Fulmine" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Overdrive" ++RandomNickNames="Patch" ++RandomNickNames="Professore" ++RandomNickNames="Ragtime" ++RandomNickNames="Canaglia" ++RandomNickNames="Sonaglio" ++RandomNickNames="Red" ++RandomNickNames="Squarcio" ++RandomNickNames="Paracadute" ++RandomNickNames="Rogue" ++RandomNickNames="Fiamma" ++RandomNickNames="Sentinel" ++RandomNickNames="Losco" ++RandomNickNames="Tremito" ++RandomNickNames="Shift" ++RandomNickNames="Strizzacervelli" ++RandomNickNames="Pillola" ++RandomNickNames="Sole" ++RandomNickNames="Sonar" ++RandomNickNames="Scintilla" ++RandomNickNames="Sutura" ++RandomNickNames="Pic" ++RandomNickNames="Lacrima" ++RandomNickNames="Rotella" ++RandomNickNames="Turbo" ++RandomNickNames="Veleno" ++RandomNickNames="Vapore" ++RandomNickNames="Falco" ++RandomNickNames="Guardiano" ++RandomNickNames="Whiskey" ++RandomNickNames="Folle" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Caramella" -RandomNickNames_Male[1]="Prestigiatore" -RandomNickNames_Male[2]="Priest" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Gallo" -RandomNickNames_Female[0]="Sacerdotessa" -RandomNickNames_Female[1]="Lupa" -RandomNickNames_Female[2]="Vedova nera" -RandomNickNames_Female[4]="Duchessa" ++RandomNickNames_Male="Caramella" ++RandomNickNames_Male="Prestigiatore" ++RandomNickNames_Male="Priest" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Gallo" ++RandomNickNames_Female="Sacerdotessa" ++RandomNickNames_Female="Lupa" ++RandomNickNames_Female="Vedova nera" ++RandomNickNames_Female="Duchessa" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1373,74 +1373,74 @@ RightAbilityTreeTitle="Hacker" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Angelo" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Vescovo" -RandomNickNames[3]="Osso" -RandomNickNames[4]="Breaker" -RandomNickNames[5]="Transistor" -RandomNickNames[6]="Crypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Cypher" -RandomNickNames[9]="Data" -RandomNickNames[10]="Diacono" -RandomNickNames[11]="Dott. Feelgood" -RandomNickNames[12]="Doc" -RandomNickNames[13]="Feedback" -RandomNickNames[14]="Firewall" -RandomNickNames[15]="Genio" -RandomNickNames[16]="Gadget" -RandomNickNames[17]="Glitch" -RandomNickNames[18]="Hack" -RandomNickNames[19]="Jammer" -RandomNickNames[20]="Jester" -RandomNickNames[21]="Lampo" -RandomNickNames[22]="Fulmine" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Overdrive" -RandomNickNames[27]="Patch" -RandomNickNames[28]="Professore" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Canaglia" -RandomNickNames[31]="Sonaglio" -RandomNickNames[32]="Red" -RandomNickNames[33]="Squarcio" -RandomNickNames[34]="Paracadute" -RandomNickNames[35]="Rogue" -RandomNickNames[36]="Fiamma" -RandomNickNames[37]="Sentinel" -RandomNickNames[38]="Losco" -RandomNickNames[39]="Tremito" -RandomNickNames[40]="Shift" -RandomNickNames[41]="Strizzacervelli" -RandomNickNames[42]="Pillola" -RandomNickNames[43]="Sole" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Scintilla" -RandomNickNames[46]="Sutura" -RandomNickNames[47]="Pic" -RandomNickNames[48]="Lacrima" -RandomNickNames[49]="Rotella" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Veleno" -RandomNickNames[52]="Vapore" -RandomNickNames[53]="Falco" -RandomNickNames[54]="Guardiano" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Folle" -RandomNickNames[57]="Zulu" ++RandomNickNames="Angelo" ++RandomNickNames="Beta" ++RandomNickNames="Vescovo" ++RandomNickNames="Osso" ++RandomNickNames="Breaker" ++RandomNickNames="Transistor" ++RandomNickNames="Crypto" ++RandomNickNames="Cyber" ++RandomNickNames="Cypher" ++RandomNickNames="Data" ++RandomNickNames="Diacono" ++RandomNickNames="Dott. Feelgood" ++RandomNickNames="Doc" ++RandomNickNames="Feedback" ++RandomNickNames="Firewall" ++RandomNickNames="Genio" ++RandomNickNames="Gadget" ++RandomNickNames="Glitch" ++RandomNickNames="Hack" ++RandomNickNames="Jammer" ++RandomNickNames="Jester" ++RandomNickNames="Lampo" ++RandomNickNames="Fulmine" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Overdrive" ++RandomNickNames="Patch" ++RandomNickNames="Professore" ++RandomNickNames="Ragtime" ++RandomNickNames="Canaglia" ++RandomNickNames="Sonaglio" ++RandomNickNames="Red" ++RandomNickNames="Squarcio" ++RandomNickNames="Paracadute" ++RandomNickNames="Rogue" ++RandomNickNames="Fiamma" ++RandomNickNames="Sentinel" ++RandomNickNames="Losco" ++RandomNickNames="Tremito" ++RandomNickNames="Shift" ++RandomNickNames="Strizzacervelli" ++RandomNickNames="Pillola" ++RandomNickNames="Sole" ++RandomNickNames="Sonar" ++RandomNickNames="Scintilla" ++RandomNickNames="Sutura" ++RandomNickNames="Pic" ++RandomNickNames="Lacrima" ++RandomNickNames="Rotella" ++RandomNickNames="Turbo" ++RandomNickNames="Veleno" ++RandomNickNames="Vapore" ++RandomNickNames="Falco" ++RandomNickNames="Guardiano" ++RandomNickNames="Whiskey" ++RandomNickNames="Folle" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Caramella" -RandomNickNames_Male[1]="Prestigiatore" -RandomNickNames_Male[2]="Priest" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Gallo" -RandomNickNames_Female[0]="Sacerdotessa" -RandomNickNames_Female[1]="Lupa" -RandomNickNames_Female[2]="Vedova nera" -RandomNickNames_Female[4]="Duchessa" ++RandomNickNames_Male="Caramella" ++RandomNickNames_Male="Prestigiatore" ++RandomNickNames_Male="Priest" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Gallo" ++RandomNickNames_Female="Sacerdotessa" ++RandomNickNames_Female="Lupa" ++RandomNickNames_Female="Vedova nera" ++RandomNickNames_Female="Duchessa" ;ALPHABETICAL ORDER @@ -1456,86 +1456,86 @@ RightAbilityTreeTitle="Supporto" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Ventiquattrore" -RandomNickNames[1]="All In" -RandomNickNames[2]="Animale" -RandomNickNames[3]="Spaccone" -RandomNickNames[4]="Bomba" -RandomNickNames[5]="Pezzo grosso" -RandomNickNames[6]="Bestia" -RandomNickNames[7]="Scintilla" -RandomNickNames[8]="Boom Boom" -RandomNickNames[9]="Bomber" -RandomNickNames[10]="Buddy" -RandomNickNames[11]="Bulldog" -RandomNickNames[12]="Bufalo" -RandomNickNames[13]="Claymore" -RandomNickNames[14]="TNT" -RandomNickNames[15]="Defcon" -RandomNickNames[16]="Cerbero" -RandomNickNames[17]="Diesel" -RandomNickNames[18]="Bis" -RandomNickNames[19]="Palla di fuoco" -RandomNickNames[20]="Bestione" -RandomNickNames[21]="Piombo" -RandomNickNames[22]="Hammer" -RandomNickNames[23]="Inferno" -RandomNickNames[24]="Grattacielo" -RandomNickNames[25]="Compare" -RandomNickNames[26]="Vulcano" -RandomNickNames[27]="Uragano" -RandomNickNames[28]="Rottamatore" -RandomNickNames[29]="Juggernaut" -RandomNickNames[30]="KO" -RandomNickNames[31]="Kong" -RandomNickNames[32]="Mad Dog" -RandomNickNames[33]="Devastazione" -RandomNickNames[34]="Alce" -RandomNickNames[35]="Nova" -RandomNickNames[36]="Nasty" -RandomNickNames[37]="Nitro" -RandomNickNames[38]="Signore" -RandomNickNames[39]="Pitbull" -RandomNickNames[40]="Piro" -RandomNickNames[41]="Linea rossa" -RandomNickNames[42]="Rinoceronte" -RandomNickNames[43]="Razzo" -RandomNickNames[44]="Brezza" -RandomNickNames[45]="Sberla" -RandomNickNames[46]="Spacco" -RandomNickNames[47]="Spitfire" -RandomNickNames[48]="Smokey" -RandomNickNames[49]="Mostro" -RandomNickNames[50]="Bisteccone" -RandomNickNames[51]="T-Rex" -RandomNickNames[52]="Tank" -RandomNickNames[53]="Pestone" -RandomNickNames[54]="Tuono" -RandomNickNames[55]="Solletico" -RandomNickNames[56]="Pucci" -RandomNickNames[57]="Titan" -RandomNickNames[58]="Dinamite" -RandomNickNames[59]="Cerino" -RandomNickNames[60]="Mastino" -RandomNickNames[61]="Pericolo" -RandomNickNames[62]="Selvaggio" ++RandomNickNames="Ventiquattrore" ++RandomNickNames="All In" ++RandomNickNames="Animale" ++RandomNickNames="Spaccone" ++RandomNickNames="Bomba" ++RandomNickNames="Pezzo grosso" ++RandomNickNames="Bestia" ++RandomNickNames="Scintilla" ++RandomNickNames="Boom Boom" ++RandomNickNames="Bomber" ++RandomNickNames="Buddy" ++RandomNickNames="Bulldog" ++RandomNickNames="Bufalo" ++RandomNickNames="Claymore" ++RandomNickNames="TNT" ++RandomNickNames="Defcon" ++RandomNickNames="Cerbero" ++RandomNickNames="Diesel" ++RandomNickNames="Bis" ++RandomNickNames="Palla di fuoco" ++RandomNickNames="Bestione" ++RandomNickNames="Piombo" ++RandomNickNames="Hammer" ++RandomNickNames="Inferno" ++RandomNickNames="Grattacielo" ++RandomNickNames="Compare" ++RandomNickNames="Vulcano" ++RandomNickNames="Uragano" ++RandomNickNames="Rottamatore" ++RandomNickNames="Juggernaut" ++RandomNickNames="KO" ++RandomNickNames="Kong" ++RandomNickNames="Mad Dog" ++RandomNickNames="Devastazione" ++RandomNickNames="Alce" ++RandomNickNames="Nova" ++RandomNickNames="Nasty" ++RandomNickNames="Nitro" ++RandomNickNames="Signore" ++RandomNickNames="Pitbull" ++RandomNickNames="Piro" ++RandomNickNames="Linea rossa" ++RandomNickNames="Rinoceronte" ++RandomNickNames="Razzo" ++RandomNickNames="Brezza" ++RandomNickNames="Sberla" ++RandomNickNames="Spacco" ++RandomNickNames="Spitfire" ++RandomNickNames="Smokey" ++RandomNickNames="Mostro" ++RandomNickNames="Bisteccone" ++RandomNickNames="T-Rex" ++RandomNickNames="Tank" ++RandomNickNames="Pestone" ++RandomNickNames="Tuono" ++RandomNickNames="Solletico" ++RandomNickNames="Pucci" ++RandomNickNames="Titan" ++RandomNickNames="Dinamite" ++RandomNickNames="Cerino" ++RandomNickNames="Mastino" ++RandomNickNames="Pericolo" ++RandomNickNames="Selvaggio" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Barbaro" -RandomNickNames_Male[1]="Big Boy" -RandomNicknames_Male[2]="Boss" -RandomNickNames_Male[3]="Cowboy" -RandomNickNames_Male[4]="Massacro" -RandomNickNames_Male[5]="Nerone" -RandomNickNames_Male[6]="Papà orso" -RandomNickNames_Male[7]="Pagliaccio" -RandomNickNames_Female[0]="Amazzone" -RandomNicknames_Female[1]="Signora" -RandomNickNames_Female[2]="Domatrice" -RandomNicknames_Female[3]="Madama" -RandomNickNames_Female[4]="Freya" -RandomNickNames_Female[5]="Mamma orsa" -RandomNickNames_Female[6]="Profondo blu" -RandomNickNames_Female[7]="Fiammifero" ++RandomNickNames_Male="Barbaro" ++RandomNickNames_Male="Big Boy" ++RandomNickNames_Male="Boss" ++RandomNickNames_Male="Cowboy" ++RandomNickNames_Male="Massacro" ++RandomNickNames_Male="Nerone" ++RandomNickNames_Male="Papà orso" ++RandomNickNames_Male="Pagliaccio" ++RandomNickNames_Female="Amazzone" ++RandomNickNames_Female="Signora" ++RandomNickNames_Female="Domatrice" ++RandomNickNames_Female="Madama" ++RandomNickNames_Female="Freya" ++RandomNickNames_Female="Mamma orsa" ++RandomNickNames_Female="Profondo blu" ++RandomNickNames_Female="Fiammifero" ;ALPHABETICAL ORDER @@ -1550,42 +1550,42 @@ RightAbilityTreeTitle="Mitragliere" +AbilityTreeTitles[2]="Mitragliere" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="Rinculo" -RandomNickNames[1]="Baja" -RandomNickNames[2]="Binturong" -RandomNickNames[3]="Brutal" -RandomNickNames[4]="Motosega" -RandomNickNames[5]="Adrenalina" -RandomNickNames[6]="Quiz" -RandomNickNames[7]="Gonzo" -RandomNickNames[8]="Ambulante" -RandomNickNames[9]="Kozmo" -RandomNickNames[10]="Chef" -RandomNickNames[11]="Inferno" -RandomNickNames[12]="Uncino" -RandomNickNames[13]="Alce" -RandomNickNames[14]="Nanook" -RandomNickNames[15]="Pepita" -RandomNickNames[16]="Atomo" -RandomNickNames[17]="Orco" -RandomNickNames[18]="Pancake" -RandomNickNames[19]="Panzer" -RandomNickNames[20]="Pistone" -RandomNickNames[21]="Pistolero" -RandomNickNames[22]="Sparviero" -RandomNickNames[23]="Spike" -RandomNickNames[24]="Yogi" -RandomNickNames[25]="Zarfer" -RandomNickNames_Male[0]="Comico" -RandomNickNames_Male[1]="Dingo" -RandomNickNames_Male[2]="Maniaco" -RandomNickNames_Male[3]="Nocche" -RandomNickNames_Male[4]="Tricheco" -RandomNickNames_Female[0]="Bolla" -RandomNickNames_Female[1]="Gadget" -RandomNickNames_Female[2]="Joker" -RandomNickNames_Female[3]="Mango" -RandomNickNames_Female[4]="Paprika" ++RandomNickNames="Rinculo" ++RandomNickNames="Baja" ++RandomNickNames="Binturong" ++RandomNickNames="Brutal" ++RandomNickNames="Motosega" ++RandomNickNames="Adrenalina" ++RandomNickNames="Quiz" ++RandomNickNames="Gonzo" ++RandomNickNames="Ambulante" ++RandomNickNames="Kozmo" ++RandomNickNames="Chef" ++RandomNickNames="Inferno" ++RandomNickNames="Uncino" ++RandomNickNames="Alce" ++RandomNickNames="Nanook" ++RandomNickNames="Pepita" ++RandomNickNames="Atomo" ++RandomNickNames="Orco" ++RandomNickNames="Pancake" ++RandomNickNames="Panzer" ++RandomNickNames="Pistone" ++RandomNickNames="Pistolero" ++RandomNickNames="Sparviero" ++RandomNickNames="Spike" ++RandomNickNames="Yogi" ++RandomNickNames="Zarfer" ++RandomNickNames_Male="Comico" ++RandomNickNames_Male="Dingo" ++RandomNickNames_Male="Maniaco" ++RandomNickNames_Male="Nocche" ++RandomNickNames_Male="Tricheco" ++RandomNickNames_Female="Bolla" ++RandomNickNames_Female="Gadget" ++RandomNickNames_Female="Joker" ++RandomNickNames_Female="Mango" ++RandomNickNames_Female="Paprika" [LWS_Ranger X2SoldierClassTemplate] @@ -1599,43 +1599,43 @@ RightAbilityTreeTitle="Difensore" +AbilityTreeTitles[2]="Difensore" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="Bronco" -RandomNickNames[1]="Buck" -RandomNickNames[2]="Castagna" -RandomNickNames[3]="Cobalto" -RandomNickNames[4]="Cowboy" -RandomNickNames[5]="Vanga" -RandomNickNames[6]="Urto" -RandomNickNames[7]="Frost" -RandomNickNames[8]="Grunt" -RandomNickNames[9]="Hollywood" -RandomNickNames[10]="Compare" -RandomNickNames[11]="Civetta" -RandomNickNames[12]="Uccellino" -RandomNickNames[13]="Aquila" -RandomNickNames[14]="Giudice" -RandomNickNames[15]="Marlin" -RandomNickNames[16]="Mustang" -RandomNickNames[17]="Papino" -RandomNickNames[18]="Artista" -RandomNickNames[19]="Pinto" -RandomNickNames[20]="Canaglia" -RandomNickNames[21]="Rocky" -RandomNickNames[22]="Scooter" -RandomNickNames[23]="Skeeter" -RandomNickNames[24]="Sgomma" -RandomNickNames[25]="Stretch" -RandomNickNames[26]="Pestone" -RandomNickNames[27]="Mannaro" -RandomNickNames_Male[0]="Polvere" -RandomNickNames_Male[1]="Olandese" -RandomNickNames_Male[2]="Husker" -RandomNickNames_Male[3]="Stile" -RandomNickNames_Male[4]="Nonno" -RandomNickNames_Female[0]="Zietta" -RandomNickNames_Female[1]="Buonanotte" -RandomNickNames_Female[2]="Medusa" -RandomNickNames_Female[3]="Zucchero" ++RandomNickNames="Bronco" ++RandomNickNames="Buck" ++RandomNickNames="Castagna" ++RandomNickNames="Cobalto" ++RandomNickNames="Cowboy" ++RandomNickNames="Vanga" ++RandomNickNames="Urto" ++RandomNickNames="Frost" ++RandomNickNames="Grunt" ++RandomNickNames="Hollywood" ++RandomNickNames="Compare" ++RandomNickNames="Civetta" ++RandomNickNames="Uccellino" ++RandomNickNames="Aquila" ++RandomNickNames="Giudice" ++RandomNickNames="Marlin" ++RandomNickNames="Mustang" ++RandomNickNames="Papino" ++RandomNickNames="Artista" ++RandomNickNames="Pinto" ++RandomNickNames="Canaglia" ++RandomNickNames="Rocky" ++RandomNickNames="Scooter" ++RandomNickNames="Skeeter" ++RandomNickNames="Sgomma" ++RandomNickNames="Stretch" ++RandomNickNames="Pestone" ++RandomNickNames="Mannaro" ++RandomNickNames_Male="Polvere" ++RandomNickNames_Male="Olandese" ++RandomNickNames_Male="Husker" ++RandomNickNames_Male="Stile" ++RandomNickNames_Male="Nonno" ++RandomNickNames_Female="Zietta" ++RandomNickNames_Female="Buonanotte" ++RandomNickNames_Female="Medusa" ++RandomNickNames_Female="Zucchero" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1650,79 +1650,79 @@ RightAbilityTreeTitle="Tiratore mobile" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Apice" -RandomNickNames[1]="Asso" -RandomNickNames[2]="Laser" -RandomNickNames[3]="Alfa" -RandomNickNames[4]="Blackjack" -RandomNickNames[5]="Centro" -RandomNickNames[6]="Proiettile" -RandomNickNames[7]="Pezzo grosso" -RandomNickNames[8]="Sogni d'oro" -RandomNickNames[9]="Caccia grossa" -RandomNickNames[10]="Padrone" -RandomNickNames[11]="Centro" -RandomNickNames[12]="Scaccomatto" -RandomNickNames[13]="Capo" -RandomNickNames[14]="Colt" -RandomNickNames[15]="Dallas" -RandomNickNames[16]="Freccia" -RandomNickNames[17]="Bingo" -RandomNickNames[18]="Stretta mortale" -RandomNickNames[19]="Sipario" -RandomNickNames[20]="Vivo o morto" -RandomNickNames[21]="Occhio di falco" -RandomNickNames[22]="Carambola" -RandomNickNames[23]="Morte" -RandomNickNames[24]="Game over" -RandomNickNames[25]="Gangster" -RandomNickNames[26]="Becchino" -RandomNickNames[27]="Tripletta" -RandomNickNames[28]="Aquila" -RandomNickNames[29]="Gol" -RandomNickNames[30]="Duello" -RandomNickNames[31]="Hitman" -RandomNickNames[32]="Hollywood" -RandomNickNames[33]="Hype" -RandomNickNames[34]="Icona" -RandomNickNames[35]="Sciacallo" -RandomNickNames[36]="Giudice" -RandomNickNames[37]="Buonanotte" -RandomNickNames[38]="Blocco totale" -RandomNickNames[39]="Chilometro" -RandomNickNames[40]="Granpasso" -RandomNickNames[41]="Needle" -RandomNickNames[42]="Cavaliere" -RandomNickNames[43]="Mietitore" -RandomNickNames[44]="Graffio" -RandomNickNames[45]="Serie" -RandomNickNames[46]="Sceriffo" -RandomNickNames[47]="Cecchino" -RandomNickNames[48]="Show" -RandomNickNames[49]="Stile" -RandomNickNames[50]="Pistolero" -RandomNickNames[51]="Ghiacciolo" -RandomNickNames[52]="Lo Spazzino" -RandomNickNames[53]="Il Ragazzo" -RandomNickNames[54]="La verità" -RandomNickNames[55]="Lapide" -RandomNickNames[56]="Top" -RandomNickNames[57]="Power" -RandomNickNames[58]="Uno due" -RandomNickNames[59]="Beccamorto" -RandomNickNames[60]="Rubacuori" ++RandomNickNames="Apice" ++RandomNickNames="Asso" ++RandomNickNames="Laser" ++RandomNickNames="Alfa" ++RandomNickNames="Blackjack" ++RandomNickNames="Centro" ++RandomNickNames="Proiettile" ++RandomNickNames="Pezzo grosso" ++RandomNickNames="Sogni d'oro" ++RandomNickNames="Caccia grossa" ++RandomNickNames="Padrone" ++RandomNickNames="Centro" ++RandomNickNames="Scaccomatto" ++RandomNickNames="Capo" ++RandomNickNames="Colt" ++RandomNickNames="Dallas" ++RandomNickNames="Freccia" ++RandomNickNames="Bingo" ++RandomNickNames="Stretta mortale" ++RandomNickNames="Sipario" ++RandomNickNames="Vivo o morto" ++RandomNickNames="Occhio di falco" ++RandomNickNames="Carambola" ++RandomNickNames="Morte" ++RandomNickNames="Game over" ++RandomNickNames="Gangster" ++RandomNickNames="Becchino" ++RandomNickNames="Tripletta" ++RandomNickNames="Aquila" ++RandomNickNames="Gol" ++RandomNickNames="Duello" ++RandomNickNames="Hitman" ++RandomNickNames="Hollywood" ++RandomNickNames="Hype" ++RandomNickNames="Icona" ++RandomNickNames="Sciacallo" ++RandomNickNames="Giudice" ++RandomNickNames="Buonanotte" ++RandomNickNames="Blocco totale" ++RandomNickNames="Chilometro" ++RandomNickNames="Granpasso" ++RandomNickNames="Needle" ++RandomNickNames="Cavaliere" ++RandomNickNames="Mietitore" ++RandomNickNames="Graffio" ++RandomNickNames="Serie" ++RandomNickNames="Sceriffo" ++RandomNickNames="Cecchino" ++RandomNickNames="Show" ++RandomNickNames="Stile" ++RandomNickNames="Pistolero" ++RandomNickNames="Ghiacciolo" ++RandomNickNames="Lo Spazzino" ++RandomNickNames="Il Ragazzo" ++RandomNickNames="La verità" ++RandomNickNames="Lapide" ++RandomNickNames="Top" ++RandomNickNames="Power" ++RandomNickNames="Uno due" ++RandomNickNames="Beccamorto" ++RandomNickNames="Rubacuori" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Cowboy" -RandomNickNames_Male[1]="Padrino" -RandomNickNames_Male[2]="Postino" -RandomNickNames_Male[3]="Sandman" -RandomNickNames_Male[4]="Smilzo" -RandomNickNames_Male[5]="Tassa" -RandomNickNames_Male[6]="Zeus" -RandomNickNames_Female[0]="Baronessa" -RandomNickNames_Female[1]="Vedova nera" -RandomNicknames_Female[2]="Calamity" -RandomNicknames_Female[3]="Ape regina" ++RandomNickNames_Male="Cowboy" ++RandomNickNames_Male="Padrino" ++RandomNickNames_Male="Postino" ++RandomNickNames_Male="Sandman" ++RandomNickNames_Male="Smilzo" ++RandomNickNames_Male="Tassa" ++RandomNickNames_Male="Zeus" ++RandomNickNames_Female="Baronessa" ++RandomNickNames_Female="Vedova nera" ++RandomNickNames_Female="Calamity" ++RandomNickNames_Female="Ape regina" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1737,73 +1737,72 @@ RightAbilityTreeTitle="Incursore" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Bandito" -RandomNickNames[1]="Blitz" -RandomNickNames[2]="Mattone" -RandomNickNames[3]="Macellaio" -RandomNickNames[4]="Motosega" -RandomNickNames[5]="Cajun" -RandomNickNames[6]="Squarcio" -RandomNickNames[7]="Cobra" -RandomNickNames[8]="Puma" -RandomNickNames[9]="Coyote" -RandomNickNames[10]="Crash" -RandomNickNames[11]="Diamond" -RandomNickNames[12]="Lex" -RandomNickNames[13]="Fatale" -RandomNickNames[14]="Flash" -RandomNickNames[15]="Furia" -RandomNickNames[16]="Alligatore" -RandomNickNames[17]="Ghost" -RandomNickNames[18]="Piombo" -RandomNickNames[19]="Segugio" -RandomNickNames[20]="Ice" -RandomNickNames[21]="Spigolo" -RandomNickNames[22]="Squalo" -RandomNickNames[23]="Apocalisse" -RandomNickNames[24]="Fetish" -RandomNickNames[25]="Mostro" -RandomNickNames[26]="Mustang" -RandomNickNames[27]="Paladino" -RandomNickNames[28]="Pitbull" -RandomNickNames[29]="Esploratore" -RandomNickNames[30]="Ringo" -RandomNickNames[31]="Samurai" -RandomNickNames[32]="Scorpione" -RandomNickNames[33]="Shogun" -RandomNickNames[34]="Shadow" -RandomNickNames[35]="Slayer" -RandomNickNames[36]="Snake" -RandomNickNames[37]="Occhi di serpente" -RandomNickNames[38]="Solitario" -RandomNickNames[39]="Spettro" -RandomNickNames[40]="Spider" -RandomNickNames[41]="Persecutore" -RandomNickNames[42]="Steel" -RandomNickNames[43]="Calabrone" -RandomNickNames[44]="Templare" -RandomNickNames[45]="Sgobbone" -RandomNickNames[46]="Vandalo" -RandomNickNames[47]="Vichingo" -RandomNickNames[48]="Guardiano" -RandomNickNames[49]="Re della guerra" -RandomNickNames[50]="Artiglio" -RandomNickNames[51]="Selvaggio" -RandomNickNames[52]="Jolly" -RandomNickNames[53]="Zulu" ++RandomNickNames="Bandito" ++RandomNickNames="Blitz" ++RandomNickNames="Mattone" ++RandomNickNames="Macellaio" ++RandomNickNames="Motosega" ++RandomNickNames="Cajun" ++RandomNickNames="Squarcio" ++RandomNickNames="Cobra" ++RandomNickNames="Puma" ++RandomNickNames="Coyote" ++RandomNickNames="Crash" ++RandomNickNames="Diamond" ++RandomNickNames="Lex" ++RandomNickNames="Fatale" ++RandomNickNames="Flash" ++RandomNickNames="Furia" ++RandomNickNames="Alligatore" ++RandomNickNames="Ghost" ++RandomNickNames="Piombo" ++RandomNickNames="Segugio" ++RandomNickNames="Ice" ++RandomNickNames="Spigolo" ++RandomNickNames="Squalo" ++RandomNickNames="Apocalisse" ++RandomNickNames="Fetish" ++RandomNickNames="Mostro" ++RandomNickNames="Mustang" ++RandomNickNames="Paladino" ++RandomNickNames="Pitbull" ++RandomNickNames="Esploratore" ++RandomNickNames="Ringo" ++RandomNickNames="Samurai" ++RandomNickNames="Scorpione" ++RandomNickNames="Shogun" ++RandomNickNames="Shadow" ++RandomNickNames="Slayer" ++RandomNickNames="Snake" ++RandomNickNames="Occhi di serpente" ++RandomNickNames="Solitario" ++RandomNickNames="Spettro" ++RandomNickNames="Spider" ++RandomNickNames="Persecutore" ++RandomNickNames="Steel" ++RandomNickNames="Calabrone" ++RandomNickNames="Sgobbone" ++RandomNickNames="Vandalo" ++RandomNickNames="Vichingo" ++RandomNickNames="Guardiano" ++RandomNickNames="Re della guerra" ++RandomNickNames="Artiglio" ++RandomNickNames="Selvaggio" ++RandomNickNames="Jolly" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Ascia" -RandomNickNames_Male[1]="Duca" -RandomNickNames_Male[2]="Rocky" -RandomNickNames_Male[3]="Stallion" -RandomNickNames_Male[4]="Lupo" ++RandomNickNames_Male="Ascia" ++RandomNickNames_Male="Duca" ++RandomNickNames_Male="Rocky" ++RandomNickNames_Male="Stallion" ++RandomNickNames_Male="Lupo" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Atena" -RandomNickNames_Female[1]="Duchessa" -RandomNicknames_Female[2]="Lady d'acciaio" -RandomNicknames_Female[3]="Regina" -RandomNicknames_Female[4]="Dominatrice" -RandomNickNames_Female[5]="Valchiria" ++RandomNickNames_Female="Atena" ++RandomNickNames_Female="Duchessa" ++RandomNickNames_Female="Lady d'acciaio" ++RandomNickNames_Female="Regina" ++RandomNickNames_Female="Dominatrice" ++RandomNickNames_Female="Valchiria" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -1818,47 +1817,47 @@ RightAbilityTreeTitle="Kenshi" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Frizione" -RandomNickNames[1]="Cobra" -RandomNickNames[2]="Spada" -RandomNickNames[3]="Ballerino" -RandomNickNames[4]="Fulmine" -RandomNickNames[5]="Swish" -RandomNickNames[6]="Dragon" -RandomNickNames[7]="Schermidore" -RandomNickNames[8]="Flipper" -RandomNickNames[9]="Palla di pelo" -RandomNickNames[10]="Talpa" -RandomNickNames[11]="Lacrima" -RandomNickNames[12]="Ombra" -RandomNickNames[13]="Neutrone" -RandomNickNames[14]="Artista" -RandomNickNames[15]="Pasha" -RandomNickNames[16]="Bracconiere" -RandomNickNames[17]="Sonaglio" -RandomNickNames[18]="Rasoio" -RandomNickNames[19]="Ripper" -RandomNickNames[20]="Reale" -RandomNickNames[21]="Losco" -RandomNickNames[22]="Stecco" -RandomNickNames[23]="Barra Spaziatrice" -RandomNickNames[24]="Scheggia" -RandomNickNames[25]="Persecutore" -RandomNickNames[26]="Artiglio" -RandomNickNames[27]="Beccamorto" -RandomNickNames[28]="Randagio" ++RandomNickNames="Frizione" ++RandomNickNames="Cobra" ++RandomNickNames="Spada" ++RandomNickNames="Ballerino" ++RandomNickNames="Fulmine" ++RandomNickNames="Swish" ++RandomNickNames="Dragon" ++RandomNickNames="Schermidore" ++RandomNickNames="Flipper" ++RandomNickNames="Palla di pelo" ++RandomNickNames="Talpa" ++RandomNickNames="Lacrima" ++RandomNickNames="Ombra" ++RandomNickNames="Neutrone" ++RandomNickNames="Artista" ++RandomNickNames="Pasha" ++RandomNickNames="Bracconiere" ++RandomNickNames="Sonaglio" ++RandomNickNames="Rasoio" ++RandomNickNames="Ripper" ++RandomNickNames="Reale" ++RandomNickNames="Losco" ++RandomNickNames="Stecco" ++RandomNickNames="Barra Spaziatrice" ++RandomNickNames="Scheggia" ++RandomNickNames="Persecutore" ++RandomNickNames="Artiglio" ++RandomNickNames="Beccamorto" ++RandomNickNames="Randagio" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Bender" -RandomNickNames_Male[1]="Cochise" -RandomNickNames_Male[2]="Smilzo" -RandomNickNames_Male[3]="Fantino" -RandomNickNames_Male[4]="Sandman" -RandomNickNames_Male[5]="Swordsman" ++RandomNickNames_Male="Bender" ++RandomNickNames_Male="Cochise" ++RandomNickNames_Male="Smilzo" ++RandomNickNames_Male="Fantino" ++RandomNickNames_Male="Sandman" ++RandomNickNames_Male="Swordsman" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Pantera" -RandomNickNames_Female[1]="Sirena" -RandomNickNames_Female[2]="Scintilla" -RandomNickNames_Female[3]="Spitfire" ++RandomNickNames_Female="Pantera" ++RandomNickNames_Female="Sirena" ++RandomNickNames_Female="Scintilla" ++RandomNickNames_Female="Spitfire" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -2584,6 +2583,23 @@ ObjectiveTextPools[4]="LWOTC Gatecrasher" ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" ; End Translation +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="Assalta una colonna di truppe ADVENT" +Briefing="Assalta una colonna di truppe ADVENT" +PostMissionType="Assalta le truppe nemiche" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="Neutralizza i bersagli nemici" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Neutralizza i bersagli nemici" +ObjectiveTextPools[1]="Estrai tutti i soldati XCOM" +ObjectiveTextPools[2]="Assalta le truppe nemiche" +ObjectiveTextPools[3]="La ADVENT solitamente muove le sue forze in grandi gruppi, ma abbiamo trovato un'unità più piccola e vulnerabile. Un assalto con il giusto tempismo ostacolerebbe gli interessi della ADVENT nella regione e ci darebbe una rara opportunità di recuperare i cadaveri dei nemici per fini di ricerca." +; LWOTC Needs Translation +ObjectiveTextPools[4]="LWOTC Gatecrasher" +ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" +; End Translation + [Rendezvous_LW X2MissionTemplate] DisplayName="Incontro" Briefing="Interrompi l'incontro tra la spia e le forze ADVENT" @@ -4578,13 +4594,21 @@ BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Op ObjectiveTextPools[0]="Recupera la massima quantità possibile di risorse " ObjectiveTextPools[1]="Estrai tutti i soldati XCOM" +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="Assalta e porta via" +Briefing="Assalta un deposito della ADVENT" +PostMissionType=" Assalta e porta via" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="Recupera la massima quantità possibile di risorse " +ObjectiveTextPools[1]="Estrai tutti i soldati XCOM" + [SupplyExtraction_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="Segnala e recupera le casse della ADVENT" ObjectiveTextPools[1]="Segnala e recupera le casse della ADVENT" ObjectiveTextPools[2]="Estrai tutti i soldati XCOM" ObjectiveTextPools[3]="OPPURE: elimina tutti i bersagli nemici rimasti" -[DefaultSmashNGrab_LW X2MissionNarrativeTemplate] +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="Acquisisci risorse della ADVENT" ObjectiveTextPools[1]="Estrai le risorse della ADVENT acquisite" ObjectiveTextPools[2]="Recupera ed estrai risorse aggiuntive (Facoltativo) " @@ -4695,3 +4719,99 @@ TacticalText=" Il proiettore al plasma rilascia un raggio di energia de [SparkRifle_BM X2WeaponTemplate] TacticalText=" Il cannone fasico all'elerium, progettato appositamente per infliggere il massimo dei danni con gli SPARK, è l'apice della tecnologia dei fucili.\n Sparare con l'arma primaria conclude sempre il turno di un soldato, se non ha ricevuto addestramenti speciali.
Le armi al plasma causano al bersaglio un ulteriore danno aggiuntivo ad ogni colpo." + +[Overdrive X2AbilityTemplate] +LocFriendlyName="Overdrive" +LocLongDescription="Esegui tre azioni che non concludono il turno corrente. Sparare più Colpi standard può causare una piccola penalità per il rinculo." +LocHelpText="Esegui tre azioni che non concludono il turno corrente. Sparare più Colpi standard può causare una piccola penalità per il rinculo." +LocPromotionPopupText=" Una penalità di rinculo di punti percentuali alla Mira si applica a tutti i Colpi standard mentre Overdrive è attivo.
Overdrive si attiva gratuitamente ma ha una ricarica di turni.
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Bastione" +LocLongDescription="Ottiene un punto bonus di Armatura e fornisce sempre un riparo alto a tutti i compagni di squadra adiacenti." +LocHelpText="Ottiene un punto bonus di Armatura e fornisce sempre un riparo alto a tutti i compagni di squadra adiacenti." +LocPromotionPopupText=" Bastione aggiunge un punto di Armatura.
I compagni di squadra adiacenti all'unità SPARK ottengono il bonus difensivo di un riparo alto.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Arsenale" +LocLongDescription="Il BIT può montare e usare armi pesanti." +LocHelpText="Il BIT può montare e usare armi pesanti." +LocPromotionPopupText=" Arsenale consente allo SPARK di montare armi pesanti.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Abbondanza" +LocLongDescription="Le armi pesanti in uso infliggono + danni e hanno un'area d'effetto più ampia." +LocHelpText="Le armi pesanti in uso infliggono più danni in un'area più ampia." +LocPromotionPopupText=" Abbondanza aggiunge + danni a tutte le armi pesanti.
Le armi pesanti con aree d'effetto circolari aumentano il raggio di azione di +.
Le armi pesanti con area d'effetto conica aumentano il diametro di azione di + e la distanza di +.
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Intimidazione" +LocLongDescription="Quando viene bersagliato da un attacco, c'è una probabilità che il nemico vada nel panico." +LocHelpText="Quando viene bersagliato da un attacco, c'è una probabilità che il nemico vada nel panico." +LocFlyOverText="Intimidazione" +LocPromotionPopupText=" Le probabilità di Intimidazione di causare il panico aumentano con i livelli più alti delle armature dello SPARK.
Intimidazione può attivarsi con gli attacchi in mischia e con quelli ad area.
Intimidazione non si attiva con il fuoco dei colpi di Guardia.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Intimidazione" +LocLongDescription="Quando viene bersagliato da un attacco, c'è una probabilità che tutti i nemici visibili vadano nel panico." +LocHelpText="Quando viene bersagliato da un attacco, c'è una probabilità che tutti i nemici visibili vadano nel panico." +LocFlyOverText="Intimidazione" +LocPromotionPopupText="" +LocMissMessage="Intimidazione fallita" + +[Repair X2AbilityTemplate] +LocFriendlyName="RIPARA" +LocLongDescription="Invia il BIT a riparare un alleato robotico danneggiato. I BIT avanzati riparano un po' di più." +LocHelpText="Invia il BIT a riparare un alleato robotico danneggiato." +LocFlyOverText="Ripara" +LocPromotionPopupText=" Ripara ripristina salute.
Potenzia il tuo BIT per riparare più PV.
Usare Ripara come prima azione non conclude il turno.
Ripara ha cariche per missione.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Campo canalizzante" +LocLongDescription="Ogni volta che vieni attaccato, parte dell'energia viene incanalata nell'arma . L'energia viene scaricata con il Colpo standard successivo." +LocHelpText="Incanala l'energia nell'arma quando vieni attaccato, scaricandola con il Colpo normale successivo." +LocFlyOverText="Energia canalizzata: +1" +LocPromotionPopupText=" Ogni punto di energia incanalato da Campo canalizzante aumenta di 1 i danni del successivo attacco con l'arma .
L'energia immagazzinata dalla canalizzazione viene consumata anche se il colpo va a vuoto.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Sacrificio" +LocLongDescription="Crea un campo protettivo che ridirige verso di te tutti gli attacchi rivolti agli alleati al suo interno. Ottieni un bonus a Difesa e Armatura mentre l'effetto è attivo." +LocHelpText="Genera un campo protettivo che ridirige verso di te gli attacchi nemici." +LocFlyOverText="Sacrificio" +LocPromotionPopupText=" Lo SPARK ottiene + difesa e + armatura mentre Sacrificio è attivo.
Sacrificio ha turni di ricarica.
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Mira regolabile" +LocLongDescription="Quando Overdrive è attivo, i Colpi standard non subiscono penalità di rinculo." +LocHelpText="Quando Overdrive è attivo, i Colpi standard non subiscono penalità di rinculo." +LocPromotionPopupText=" Mira regolabile elimina la penalità di punti percentuali alla Mira per i Colpi standard consecutivi mentre Overdrive è attivo.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="Strike" +LocLongDescription="Attacca un nemico entro la portata di movimento con un potente assalto in mischia." +LocHelpText="Attacca un nemico entro la portata di movimento con un potente assalto in mischia." +LocPromotionPopupText=" Puoi attivare l'abilità Strike piazzando il cursore di movimento sopra un nemico.
Lo SPARK può eseguire uno \"scatto\", usando entrambe le azioni per il movimento, attivando comunque lo Strike ai danni di un nemico adiacente.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Demolizione" +LocLongDescription="Se Overdrive è attivo, abbatte muri e ripari quando si muove." +LocHelpText="Se Overdrive è attivo, abbatte muri e ripari quando si muove." +LocPromotionPopupText=" Demolizione può esporre i nemici agli attacchi sul fianco.
Usa le tappe dei movimenti in modo da guidare lo SPARK sul percorso ottimale per distruggere i ripari e l'ambiente.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Bombardamento" +LocLongDescription="Invia il BIT in una posizione visibile, dove rilascia una potente scarica esplosiva. I BIT avanzati infliggono più danni." +LocHelpText="Invia il BIT a colpire tutte le unità entro un raggio." +LocPromotionPopupText=" Bombardamento può essere usato in ogni posizione all'interno della visuale di squadra.
Potenziare il BIT aumenta i danni di Bombardamento.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Protocollo di caccia" +LocLongDescription="Quando un nemico è rivelato, c'è una probabilità di punti percentuali di sparare un colpo di Guardia gratuito." +LocHelpText="Quando un nemico è rivelato, c'è una probabilità di punti percentuali di sparare un colpo di Guardia gratuito." +LocPromotionPopupText=" Il protocollo di caccia rende lo SPARK l'unità ideale per esplorare la nebbia di guerra, visto che ogni nemico rivelato può essere attaccato all'istante.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Nova" +LocLongDescription="Rilascia una scarica di energia che danneggia tutti i nemici nelle vicinanze. Non costa un'azione e non ha ricarica, ma gli usi successivi danneggiano lo SPARK." +LocHelpText="Colpisce tutti i nemici nelle vicinanze. Gli attacchi Nova successivi danneggiano lo SPARK." +LocPromotionPopupText=" Nova non ha un costo in punti azione e non ha ricarica.
Il primo attacco Nova di ogni missione infligge 0 danni allo SPARK.
Gli attacchi Nova successivi infliggono un danno accumulabile di allo SPARK.
" diff --git a/LongWarOfTheChosen/Localization/XComGame.jpn b/LongWarOfTheChosen/Localization/XComGame.jpn index 41afea5b9..d6a921be2 100644 --- a/LongWarOfTheChosen/Localization/XComGame.jpn +++ b/LongWarOfTheChosen/Localization/XComGame.jpn @@ -1289,74 +1289,74 @@ RightAbilityTreeTitle="機関兵" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Angel" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Bishop" -RandomNickNames[3]="Bones" -RandomNickNames[4]="Breaker" -RandomNickNames[5]="Broker" -RandomNickNames[6]="Crypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Cypher" -RandomNickNames[9]="Data" -RandomNickNames[10]="Deacon" -RandomNickNames[11]="Dr. Feelgood" -RandomNickNames[12]="Doc" -RandomNickNames[13]="Feedback" -RandomNickNames[14]="Firewall" -RandomNickNames[15]="Genius" -RandomNickNames[16]="Gizmo" -RandomNickNames[17]="Glitch" -RandomNickNames[18]="Hijack" -RandomNickNames[19]="Jammer" -RandomNickNames[20]="Jester" -RandomNickNames[21]="Jolt" -RandomNickNames[22]="Lightning" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Overdrive" -RandomNickNames[27]="Patch" -RandomNickNames[28]="Professor" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Rascal" -RandomNickNames[31]="Rattler" -RandomNickNames[32]="Red" -RandomNickNames[33]="Rift" -RandomNickNames[34]="Ripcord" -RandomNickNames[35]="Rogue" -RandomNickNames[36]="Scorch" -RandomNickNames[37]="Sentinel" -RandomNickNames[38]="Shady" -RandomNickNames[39]="Shakes" -RandomNickNames[40]="Shifter" -RandomNickNames[41]="Shrink" -RandomNickNames[42]="Slider" -RandomNickNames[43]="Solar" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Sparks" -RandomNickNames[46]="Stitch" -RandomNickNames[47]="Tapper" -RandomNickNames[48]="Teardrop" -RandomNickNames[49]="Tinker" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Venom" -RandomNickNames[52]="Vapor" -RandomNickNames[53]="Warbird" -RandomNickNames[54]="Warden" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Wild Thing" -RandomNickNames[57]="Zulu" ++RandomNickNames="Angel" ++RandomNickNames="Beta" ++RandomNickNames="Bishop" ++RandomNickNames="Bones" ++RandomNickNames="Breaker" ++RandomNickNames="Broker" ++RandomNickNames="Crypto" ++RandomNickNames="Cyber" ++RandomNickNames="Cypher" ++RandomNickNames="Data" ++RandomNickNames="Deacon" ++RandomNickNames="Dr. Feelgood" ++RandomNickNames="Doc" ++RandomNickNames="Feedback" ++RandomNickNames="Firewall" ++RandomNickNames="Genius" ++RandomNickNames="Gizmo" ++RandomNickNames="Glitch" ++RandomNickNames="Hijack" ++RandomNickNames="Jammer" ++RandomNickNames="Jester" ++RandomNickNames="Jolt" ++RandomNickNames="Lightning" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Overdrive" ++RandomNickNames="Patch" ++RandomNickNames="Professor" ++RandomNickNames="Ragtime" ++RandomNickNames="Rascal" ++RandomNickNames="Rattler" ++RandomNickNames="Red" ++RandomNickNames="Rift" ++RandomNickNames="Ripcord" ++RandomNickNames="Rogue" ++RandomNickNames="Scorch" ++RandomNickNames="Sentinel" ++RandomNickNames="Shady" ++RandomNickNames="Shakes" ++RandomNickNames="Shifter" ++RandomNickNames="Shrink" ++RandomNickNames="Slider" ++RandomNickNames="Solar" ++RandomNickNames="Sonar" ++RandomNickNames="Sparks" ++RandomNickNames="Stitch" ++RandomNickNames="Tapper" ++RandomNickNames="Teardrop" ++RandomNickNames="Tinker" ++RandomNickNames="Turbo" ++RandomNickNames="Venom" ++RandomNickNames="Vapor" ++RandomNickNames="Warbird" ++RandomNickNames="Warden" ++RandomNickNames="Whiskey" ++RandomNickNames="Wild Thing" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Candyman" -RandomNickNames_Male[1]="Magic Man" -RandomNickNames_Male[2]="Priest" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Rooster" -RandomNickNames_Female[0]="Priestess" -RandomNickNames_Female[1]="Wolfmother" -RandomNickNames_Female[2]="Black Widow" -RandomNickNames_Female[4]="Duchess" ++RandomNickNames_Male="Candyman" ++RandomNickNames_Male="Magic Man" ++RandomNickNames_Male="Priest" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Rooster" ++RandomNickNames_Female="Priestess" ++RandomNickNames_Female="Wolfmother" ++RandomNickNames_Female="Black Widow" ++RandomNickNames_Female="Duchess" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1371,74 +1371,74 @@ RightAbilityTreeTitle="ハッカー" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Angel" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Bishop" -RandomNickNames[3]="Bones" -RandomNickNames[4]="Breaker" -RandomNickNames[5]="Broker" -RandomNickNames[6]="Crypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Cypher" -RandomNickNames[9]="Data" -RandomNickNames[10]="Deacon" -RandomNickNames[11]="Dr. Feelgood" -RandomNickNames[12]="Doc" -RandomNickNames[13]="Feedback" -RandomNickNames[14]="Firewall" -RandomNickNames[15]="Genius" -RandomNickNames[16]="Gizmo" -RandomNickNames[17]="Glitch" -RandomNickNames[18]="Hijack" -RandomNickNames[19]="Jammer" -RandomNickNames[20]="Jester" -RandomNickNames[21]="Jolt" -RandomNickNames[22]="Lightning" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Overdrive" -RandomNickNames[27]="Patch" -RandomNickNames[28]="Professor" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Rascal" -RandomNickNames[31]="Rattler" -RandomNickNames[32]="Red" -RandomNickNames[33]="Rift" -RandomNickNames[34]="Ripcord" -RandomNickNames[35]="Rogue" -RandomNickNames[36]="Scorch" -RandomNickNames[37]="Sentinel" -RandomNickNames[38]="Shady" -RandomNickNames[39]="Shakes" -RandomNickNames[40]="Shifter" -RandomNickNames[41]="Shrink" -RandomNickNames[42]="Slider" -RandomNickNames[43]="Solar" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Sparks" -RandomNickNames[46]="Stitch" -RandomNickNames[47]="Tapper" -RandomNickNames[48]="Teardrop" -RandomNickNames[49]="Tinker" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Venom" -RandomNickNames[52]="Vapor" -RandomNickNames[53]="Warbird" -RandomNickNames[54]="Warden" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Wild Thing" -RandomNickNames[57]="Zulu" ++RandomNickNames="Angel" ++RandomNickNames="Beta" ++RandomNickNames="Bishop" ++RandomNickNames="Bones" ++RandomNickNames="Breaker" ++RandomNickNames="Broker" ++RandomNickNames="Crypto" ++RandomNickNames="Cyber" ++RandomNickNames="Cypher" ++RandomNickNames="Data" ++RandomNickNames="Deacon" ++RandomNickNames="Dr. Feelgood" ++RandomNickNames="Doc" ++RandomNickNames="Feedback" ++RandomNickNames="Firewall" ++RandomNickNames="Genius" ++RandomNickNames="Gizmo" ++RandomNickNames="Glitch" ++RandomNickNames="Hijack" ++RandomNickNames="Jammer" ++RandomNickNames="Jester" ++RandomNickNames="Jolt" ++RandomNickNames="Lightning" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Overdrive" ++RandomNickNames="Patch" ++RandomNickNames="Professor" ++RandomNickNames="Ragtime" ++RandomNickNames="Rascal" ++RandomNickNames="Rattler" ++RandomNickNames="Red" ++RandomNickNames="Rift" ++RandomNickNames="Ripcord" ++RandomNickNames="Rogue" ++RandomNickNames="Scorch" ++RandomNickNames="Sentinel" ++RandomNickNames="Shady" ++RandomNickNames="Shakes" ++RandomNickNames="Shifter" ++RandomNickNames="Shrink" ++RandomNickNames="Slider" ++RandomNickNames="Solar" ++RandomNickNames="Sonar" ++RandomNickNames="Sparks" ++RandomNickNames="Stitch" ++RandomNickNames="Tapper" ++RandomNickNames="Teardrop" ++RandomNickNames="Tinker" ++RandomNickNames="Turbo" ++RandomNickNames="Venom" ++RandomNickNames="Vapor" ++RandomNickNames="Warbird" ++RandomNickNames="Warden" ++RandomNickNames="Whiskey" ++RandomNickNames="Wild Thing" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Candyman" -RandomNickNames_Male[1]="Magic Man" -RandomNickNames_Male[2]="Priest" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Rooster" -RandomNickNames_Female[0]="Priestess" -RandomNickNames_Female[1]="Wolfmother" -RandomNickNames_Female[2]="Black Widow" -RandomNickNames_Female[4]="Duchess" ++RandomNickNames_Male="Candyman" ++RandomNickNames_Male="Magic Man" ++RandomNickNames_Male="Priest" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Rooster" ++RandomNickNames_Female="Priestess" ++RandomNickNames_Female="Wolfmother" ++RandomNickNames_Female="Black Widow" ++RandomNickNames_Female="Duchess" ;ALPHABETICAL ORDER @@ -1454,86 +1454,85 @@ RightAbilityTreeTitle="サポート" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="All Day" -RandomNickNames[1]="All In" -RandomNickNames[2]="Animal" -RandomNickNames[3]="Baller" -RandomNickNames[4]="Big Country" -RandomNickNames[5]="Big Money" -RandomNickNames[6]="Big Nasty" -RandomNickNames[7]="Blaze" -RandomNickNames[8]="Boom Boom" -RandomNickNames[9]="Bomber" -RandomNickNames[10]="Buddy" -RandomNickNames[11]="Bulldog" -RandomNickNames[12]="Bull Rush" -RandomNickNames[13]="Claymore" -RandomNickNames[14]="Demo" -RandomNickNames[15]="Defcon" -RandomNickNames[16]="Devil Dog" -RandomNickNames[17]="Diesel" -RandomNickNames[18]="Encore" -RandomNickNames[19]="Fireball" -RandomNickNames[20]="Fridge" -RandomNickNames[21]="Gunner" -RandomNickNames[22]="Hammer" -RandomNickNames[23]="Hellfire" -RandomNickNames[24]="Hightower" -RandomNickNames[25]="Hoss" -RandomNickNames[26]="Volcano" -RandomNickNames[27]="Hurricane" -RandomNickNames[28]="Junkyard" -RandomNickNames[29]="Juggernaut" -RandomNickNames[30]="Knockout" -RandomNickNames[31]="Kong" -RandomNickNames[32]="Mad Dog" -RandomNickNames[33]="Meltdown" -RandomNickNames[34]="Moose" -RandomNickNames[35]="Nova" -RandomNickNames[36]="Nasty" -RandomNickNames[37]="Nitro" -RandomNickNames[38]="Overlord" -RandomNickNames[39]="Pitbull" -RandomNickNames[40]="Pyro" -RandomNickNames[41]="Redline" -RandomNickNames[42]="Rhino" -RandomNickNames[43]="Rocket" -RandomNickNames[44]="Seabreeze" -RandomNickNames[45]="Slab" -RandomNickNames[46]="Smash" -RandomNickNames[47]="Spitfire" -RandomNickNames[48]="Smokey" -RandomNickNames[49]="Swamp Thing" -RandomNickNames[50]="T-Bone" -RandomNickNames[51]="T-Rex" -RandomNickNames[52]="Tank" -RandomNickNames[53]="Thumper" -RandomNickNames[54]="Thunder" -RandomNickNames[55]="Tickle" -RandomNickNames[56]="Tiny" -RandomNickNames[57]="Titan" -RandomNickNames[58]="Dynamite" -RandomNickNames[59]="Torch" -RandomNickNames[60]="Wardog" -RandomNickNames[61]="Warhorse" -RandomNickNames[62]="Wildchild" ++RandomNickNames="All Day" ++RandomNickNames="All In" ++RandomNickNames="Animal" ++RandomNickNames="Baller" ++RandomNickNames="Big Country" ++RandomNickNames="Big Money" ++RandomNickNames="Big Nasty" ++RandomNickNames="Blaze" ++RandomNickNames="Boom Boom" ++RandomNickNames="Bomber" ++RandomNickNames="Buddy" ++RandomNickNames="Bulldog" ++RandomNickNames="Bull Rush" ++RandomNickNames="Claymore" ++RandomNickNames="Demo" ++RandomNickNames="Defcon" ++RandomNickNames="Devil Dog" ++RandomNickNames="Diesel" ++RandomNickNames="Encore" ++RandomNickNames="Fireball" ++RandomNickNames="Fridge" ++RandomNickNames="Hammer" ++RandomNickNames="Hellfire" ++RandomNickNames="Hightower" ++RandomNickNames="Hoss" ++RandomNickNames="Volcano" ++RandomNickNames="Hurricane" ++RandomNickNames="Junkyard" ++RandomNickNames="Juggernaut" ++RandomNickNames="Knockout" ++RandomNickNames="Kong" ++RandomNickNames="Mad Dog" ++RandomNickNames="Meltdown" ++RandomNickNames="Moose" ++RandomNickNames="Nova" ++RandomNickNames="Nasty" ++RandomNickNames="Nitro" ++RandomNickNames="Overlord" ++RandomNickNames="Pitbull" ++RandomNickNames="Pyro" ++RandomNickNames="Redline" ++RandomNickNames="Rhino" ++RandomNickNames="Rocket" ++RandomNickNames="Seabreeze" ++RandomNickNames="Slab" ++RandomNickNames="Smash" ++RandomNickNames="Spitfire" ++RandomNickNames="Smokey" ++RandomNickNames="Swamp Thing" ++RandomNickNames="T-Bone" ++RandomNickNames="T-Rex" ++RandomNickNames="Tank" ++RandomNickNames="Thumper" ++RandomNickNames="Thunder" ++RandomNickNames="Tickle" ++RandomNickNames="Tiny" ++RandomNickNames="Titan" ++RandomNickNames="Dynamite" ++RandomNickNames="Torch" ++RandomNickNames="Wardog" ++RandomNickNames="Warhorse" ++RandomNickNames="Wildchild" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Barbarian" -RandomNickNames_Male[1]="Big Boy" -RandomNicknames_Male[2]="Boss Man" -RandomNickNames_Male[3]="Cowboy" -RandomNickNames_Male[4]="Meathead" -RandomNickNames_Male[5]="Nero" -RandomNickNames_Male[6]="Papa Bear" -RandomNickNames_Male[7]="Wildman" -RandomNickNames_Female[0]="Amazon" -RandomNicknames_Female[1]="Boss Lady" -RandomNickNames_Female[2]="Cowgirl" -RandomNicknames_Female[3]="Domino" -RandomNickNames_Female[4]="Freya" -RandomNickNames_Female[5]="Mama Bear" -RandomNickNames_Female[6]="Deep Six" -RandomNickNames_Female[7]="Firebug" ++RandomNickNames_Male="Barbarian" ++RandomNickNames_Male="Big Boy" ++RandomNickNames_Male="Boss Man" ++RandomNickNames_Male="Cowboy" ++RandomNickNames_Male="Meathead" ++RandomNickNames_Male="Nero" ++RandomNickNames_Male="Papa Bear" ++RandomNickNames_Male="Wildman" ++RandomNickNames_Female="Amazon" ++RandomNickNames_Female="Boss Lady" ++RandomNickNames_Female="Cowgirl" ++RandomNickNames_Female="Domino" ++RandomNickNames_Female="Freya" ++RandomNickNames_Female="Mama Bear" ++RandomNickNames_Female="Deep Six" ++RandomNickNames_Female="Firebug" ;ALPHABETICAL ORDER @@ -1548,42 +1547,42 @@ RightAbilityTreeTitle="マシンガンナー" +AbilityTreeTitles[2]="マシンガンナー" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="Backfire" -RandomNickNames[1]="Baja" -RandomNickNames[2]="Bearcat" -RandomNickNames[3]="Brutal" -RandomNickNames[4]="Chainsaw" -RandomNickNames[5]="Flounder" -RandomNickNames[6]="Gameshow" -RandomNickNames[7]="Gonzo" -RandomNickNames[8]="Hawker" -RandomNickNames[9]="Kozmo" -RandomNickNames[10]="Lunchbox" -RandomNickNames[11]="Mangler" -RandomNickNames[12]="Meathook" -RandomNickNames[13]="Moose" -RandomNickNames[14]="Nanook" -RandomNickNames[15]="Nugget" -RandomNickNames[16]="Nuke" -RandomNickNames[17]="Ogre" -RandomNickNames[18]="Pancake" -RandomNickNames[19]="Panzer" -RandomNickNames[20]="Piston" -RandomNickNames[21]="Slinger" -RandomNickNames[22]="Sparrow" -RandomNickNames[23]="Spike" -RandomNickNames[24]="Yogi" -RandomNickNames[25]="Zarfer" -RandomNickNames_Male[0]="Chuckles" -RandomNickNames_Male[1]="Dingus" -RandomNickNames_Male[2]="Maniac" -RandomNickNames_Male[3]="Knuckles" -RandomNickNames_Male[4]="Walrus" -RandomNickNames_Female[0]="Bubbles" -RandomNickNames_Female[1]="Gadget" -RandomNickNames_Female[2]="Giggles" -RandomNickNames_Female[3]="Mango" -RandomNickNames_Female[4]="Pepper" ++RandomNickNames="Backfire" ++RandomNickNames="Baja" ++RandomNickNames="Bearcat" ++RandomNickNames="Brutal" ++RandomNickNames="Chainsaw" ++RandomNickNames="Flounder" ++RandomNickNames="Gameshow" ++RandomNickNames="Gonzo" ++RandomNickNames="Hawker" ++RandomNickNames="Kozmo" ++RandomNickNames="Lunchbox" ++RandomNickNames="Mangler" ++RandomNickNames="Meathook" ++RandomNickNames="Moose" ++RandomNickNames="Nanook" ++RandomNickNames="Nugget" ++RandomNickNames="Nuke" ++RandomNickNames="Ogre" ++RandomNickNames="Pancake" ++RandomNickNames="Panzer" ++RandomNickNames="Piston" ++RandomNickNames="Slinger" ++RandomNickNames="Sparrow" ++RandomNickNames="Spike" ++RandomNickNames="Yogi" ++RandomNickNames="Zarfer" ++RandomNickNames_Male="Chuckles" ++RandomNickNames_Male="Dingus" ++RandomNickNames_Male="Maniac" ++RandomNickNames_Male="Knuckles" ++RandomNickNames_Male="Walrus" ++RandomNickNames_Female="Bubbles" ++RandomNickNames_Female="Gadget" ++RandomNickNames_Female="Giggles" ++RandomNickNames_Female="Mango" ++RandomNickNames_Female="Pepper" [LWS_Ranger X2SoldierClassTemplate] @@ -1597,43 +1596,43 @@ RightAbilityTreeTitle="ディフェンダー" +AbilityTreeTitles[2]="ディフェンダー" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="Bronco" -RandomNickNames[1]="Buck" -RandomNickNames[2]="Buckeye" -RandomNickNames[3]="Cobalt" -RandomNickNames[4]="Cowboy" -RandomNickNames[5]="Digger" -RandomNickNames[6]="Dinger" -RandomNickNames[7]="Frosty" -RandomNickNames[8]="Grunt" -RandomNickNames[9]="Hollywood" -RandomNickNames[10]="Hoss" -RandomNickNames[11]="Howler" -RandomNickNames[12]="Jaybird" -RandomNickNames[13]="Jayhawk" -RandomNickNames[14]="Judge" -RandomNickNames[15]="Marlin" -RandomNickNames[16]="Mustang" -RandomNickNames[17]="Pappy" -RandomNickNames[18]="Painter" -RandomNickNames[19]="Pinto" -RandomNickNames[20]="Rascal" -RandomNickNames[21]="Rocky" -RandomNickNames[22]="Scooter" -RandomNickNames[23]="Skeeter" -RandomNickNames[24]="Skids" -RandomNickNames[25]="Stretch" -RandomNickNames[26]="Thumper" -RandomNickNames[27]="Werewolf" -RandomNickNames_Male[0]="Dusty" -RandomNickNames_Male[1]="Dutch" -RandomNickNames_Male[2]="Husker" -RandomNickNames_Male[3]="Slick" -RandomNickNames_Male[4]="Pops" -RandomNickNames_Female[0]="Aunty" -RandomNickNames_Female[1]="Goodnight" -RandomNickNames_Female[2]="Medusa" -RandomNickNames_Female[3]="Sugar" ++RandomNickNames="Bronco" ++RandomNickNames="Buck" ++RandomNickNames="Buckeye" ++RandomNickNames="Cobalt" ++RandomNickNames="Cowboy" ++RandomNickNames="Digger" ++RandomNickNames="Dinger" ++RandomNickNames="Frosty" ++RandomNickNames="Grunt" ++RandomNickNames="Hollywood" ++RandomNickNames="Hoss" ++RandomNickNames="Howler" ++RandomNickNames="Jaybird" ++RandomNickNames="Jayhawk" ++RandomNickNames="Judge" ++RandomNickNames="Marlin" ++RandomNickNames="Mustang" ++RandomNickNames="Pappy" ++RandomNickNames="Painter" ++RandomNickNames="Pinto" ++RandomNickNames="Rascal" ++RandomNickNames="Rocky" ++RandomNickNames="Scooter" ++RandomNickNames="Skeeter" ++RandomNickNames="Skids" ++RandomNickNames="Stretch" ++RandomNickNames="Thumper" ++RandomNickNames="Werewolf" ++RandomNickNames_Male="Dusty" ++RandomNickNames_Male="Dutch" ++RandomNickNames_Male="Husker" ++RandomNickNames_Male="Slick" ++RandomNickNames_Male="Pops" ++RandomNickNames_Female="Aunty" ++RandomNickNames_Female="Goodnight" ++RandomNickNames_Female="Medusa" ++RandomNickNames_Female="Sugar" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1648,79 +1647,78 @@ RightAbilityTreeTitle="マークスマン" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Apex" -RandomNickNames[1]="Ace" -RandomNickNames[2]="Aftermath" -RandomNickNames[3]="Alpha" -RandomNickNames[4]="Blackjack" -RandomNickNames[5]="Bullseye" -RandomNickNames[6]="Bolt" -RandomNickNames[7]="Big Shot" -RandomNickNames[8]="Big Sleep" -RandomNickNames[9]="Big Time" -RandomNickNames[10]="Boss" -RandomNickNames[11]="Bullseye" -RandomNickNames[12]="Checkmate" -RandomNickNames[13]="Chief" -RandomNickNames[14]="Colt" -RandomNickNames[15]="Dallas" -RandomNickNames[16]="Deadbolt" -RandomNickNames[17]="Deadeye" -RandomNickNames[18]="Deadlock" -RandomNickNames[19]="Deadwood" -RandomNickNames[20]="D.O.A." -RandomNickNames[21]="Eagle Eye" -RandomNickNames[22]="Eight Ball" -RandomNickNames[23]="Flatline" -RandomNickNames[24]="Game Time" -RandomNickNames[25]="Gangster" -RandomNickNames[26]="Grave Digger" -RandomNickNames[27]="Hat Trick" -RandomNickNames[28]="Hawkeye" -RandomNickNames[29]="Heater" -RandomNickNames[30]="High Noon" -RandomNickNames[31]="Hitman" -RandomNickNames[32]="Hollywood" -RandomNickNames[33]="Hype" -RandomNickNames[34]="Icon" -RandomNickNames[35]="Jackal" -RandomNickNames[36]="Judge" -RandomNickNames[37]="Lights Out" -RandomNickNames[38]="Lockdown" -RandomNickNames[39]="Long Shot" -RandomNickNames[40]="Longwalker" -RandomNickNames[41]="Needle" -RandomNickNames[42]="Pale Rider" -RandomNickNames[43]="Reaper" -RandomNickNames[44]="Scratch" -RandomNickNames[45]="Serial" -RandomNickNames[46]="Sheriff" -RandomNickNames[47]="Shooter" -RandomNickNames[48]="Showtime" -RandomNickNames[49]="Slick" -RandomNickNames[50]="Slinger" -RandomNickNames[51]="Stonecold" -RandomNickNames[52]="The Cleaner" -RandomNickNames[53]="The Kid" -RandomNickNames[54]="The Truth" -RandomNickNames[55]="Tombstone" -RandomNickNames[56]="Top Notch" -RandomNickNames[57]="Top Shelf" -RandomNickNames[58]="Two Tap" -RandomNickNames[59]="Undertaker" -RandomNickNames[60]="Valentine" ++RandomNickNames="Apex" ++RandomNickNames="Ace" ++RandomNickNames="Aftermath" ++RandomNickNames="Alpha" ++RandomNickNames="Blackjack" ++RandomNickNames="Bullseye" ++RandomNickNames="Bolt" ++RandomNickNames="Big Shot" ++RandomNickNames="Big Sleep" ++RandomNickNames="Big Time" ++RandomNickNames="Boss" ++RandomNickNames="Bullseye" ++RandomNickNames="Checkmate" ++RandomNickNames="Chief" ++RandomNickNames="Colt" ++RandomNickNames="Dallas" ++RandomNickNames="Deadbolt" ++RandomNickNames="Deadeye" ++RandomNickNames="Deadlock" ++RandomNickNames="Deadwood" ++RandomNickNames="D.O.A." ++RandomNickNames="Eagle Eye" ++RandomNickNames="Eight Ball" ++RandomNickNames="Flatline" ++RandomNickNames="Game Time" ++RandomNickNames="Gangster" ++RandomNickNames="Grave Digger" ++RandomNickNames="Hat Trick" ++RandomNickNames="Hawkeye" ++RandomNickNames="Heater" ++RandomNickNames="High Noon" ++RandomNickNames="Hitman" ++RandomNickNames="Hollywood" ++RandomNickNames="Hype" ++RandomNickNames="Icon" ++RandomNickNames="Jackal" ++RandomNickNames="Judge" ++RandomNickNames="Lights Out" ++RandomNickNames="Lockdown" ++RandomNickNames="Long Shot" ++RandomNickNames="Longwalker" ++RandomNickNames="Needle" ++RandomNickNames="Pale Rider" ++RandomNickNames="Scratch" ++RandomNickNames="Serial" ++RandomNickNames="Sheriff" ++RandomNickNames="Shooter" ++RandomNickNames="Showtime" ++RandomNickNames="Slick" ++RandomNickNames="Slinger" ++RandomNickNames="Stonecold" ++RandomNickNames="The Cleaner" ++RandomNickNames="The Kid" ++RandomNickNames="The Truth" ++RandomNickNames="Tombstone" ++RandomNickNames="Top Notch" ++RandomNickNames="Top Shelf" ++RandomNickNames="Two Tap" ++RandomNickNames="Undertaker" ++RandomNickNames="Valentine" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Cowboy" -RandomNickNames_Male[1]="Godfather" -RandomNickNames_Male[2]="Mailman" -RandomNickNames_Male[3]="Sandman" -RandomNickNames_Male[4]="Slim" -RandomNickNames_Male[5]="Taxman" -RandomNickNames_Male[6]="Zeus" -RandomNickNames_Female[0]="Baroness" -RandomNickNames_Female[1]="Black Widow" -RandomNicknames_Female[2]="Calamity" -RandomNicknames_Female[3]="Queen Bee" ++RandomNickNames_Male="Cowboy" ++RandomNickNames_Male="Godfather" ++RandomNickNames_Male="Mailman" ++RandomNickNames_Male="Sandman" ++RandomNickNames_Male="Slim" ++RandomNickNames_Male="Taxman" ++RandomNickNames_Male="Zeus" ++RandomNickNames_Female="Baroness" ++RandomNickNames_Female="Black Widow" ++RandomNickNames_Female="Calamity" ++RandomNickNames_Female="Queen Bee" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1735,73 +1733,71 @@ RightAbilityTreeTitle="ブリーチャー" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Bandit" -RandomNickNames[1]="Blitz" -RandomNickNames[2]="Brick" -RandomNickNames[3]="Butcher" -RandomNickNames[4]="Buzzsaw" -RandomNickNames[5]="Cajun" -RandomNickNames[6]="Chops" -RandomNickNames[7]="Cobra" -RandomNickNames[8]="Cougar" -RandomNickNames[9]="Coyote" -RandomNickNames[10]="Crash" -RandomNickNames[11]="Diamond" -RandomNickNames[12]="Enforcer" -RandomNickNames[13]="Fatal" -RandomNickNames[14]="Flash" -RandomNickNames[15]="Fury" -RandomNickNames[16]="Gator" -RandomNickNames[17]="Ghost" -RandomNickNames[18]="Gunner" -RandomNickNames[19]="Hound Dog" -RandomNickNames[20]="Ice" -RandomNickNames[21]="Icepick" -RandomNickNames[22]="Jaws" -RandomNickNames[23]="Judgment Day" -RandomNickNames[24]="Kinky" -RandomNickNames[25]="Monster" -RandomNickNames[26]="Mustang" -RandomNickNames[27]="Paladin" -RandomNickNames[28]="Pitbull" -RandomNickNames[29]="Pathfinder" -RandomNickNames[30]="Ringo" -RandomNickNames[31]="Samurai" -RandomNickNames[32]="Scorpion" -RandomNickNames[33]="Shogun" -RandomNickNames[34]="Shadow" -RandomNickNames[35]="Slayer" -RandomNickNames[36]="Snake" -RandomNickNames[37]="Snake Eyes" -RandomNickNames[38]="Solo" -RandomNickNames[39]="Specter" -RandomNickNames[40]="Spider" -RandomNickNames[41]="Stalker" -RandomNickNames[42]="Steel" -RandomNickNames[43]="Stinger" -RandomNickNames[44]="Templar" -RandomNickNames[45]="Trojan" -RandomNickNames[46]="Vandal" -RandomNickNames[47]="Viking" -RandomNickNames[48]="Warden" -RandomNickNames[49]="Warlord" -RandomNickNames[50]="Wolverine" -RandomNickNames[51]="Wildchild" -RandomNickNames[52]="Wildling" -RandomNickNames[53]="Zulu" ++RandomNickNames="Bandit" ++RandomNickNames="Blitz" ++RandomNickNames="Brick" ++RandomNickNames="Butcher" ++RandomNickNames="Buzzsaw" ++RandomNickNames="Cajun" ++RandomNickNames="Chops" ++RandomNickNames="Cobra" ++RandomNickNames="Cougar" ++RandomNickNames="Coyote" ++RandomNickNames="Crash" ++RandomNickNames="Diamond" ++RandomNickNames="Enforcer" ++RandomNickNames="Fatal" ++RandomNickNames="Flash" ++RandomNickNames="Fury" ++RandomNickNames="Gator" ++RandomNickNames="Ghost" ++RandomNickNames="Hound Dog" ++RandomNickNames="Ice" ++RandomNickNames="Icepick" ++RandomNickNames="Jaws" ++RandomNickNames="Judgment Day" ++RandomNickNames="Kinky" ++RandomNickNames="Monster" ++RandomNickNames="Mustang" ++RandomNickNames="Paladin" ++RandomNickNames="Pitbull" ++RandomNickNames="Pathfinder" ++RandomNickNames="Ringo" ++RandomNickNames="Samurai" ++RandomNickNames="Scorpion" ++RandomNickNames="Shogun" ++RandomNickNames="Shadow" ++RandomNickNames="Slayer" ++RandomNickNames="Snake" ++RandomNickNames="Snake Eyes" ++RandomNickNames="Solo" ++RandomNickNames="Specter" ++RandomNickNames="Spider" ++RandomNickNames="Stalker" ++RandomNickNames="Steel" ++RandomNickNames="Stinger" ++RandomNickNames="Trojan" ++RandomNickNames="Vandal" ++RandomNickNames="Viking" ++RandomNickNames="Warden" ++RandomNickNames="Warlord" ++RandomNickNames="Wolverine" ++RandomNickNames="Wildchild" ++RandomNickNames="Wildling" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Axeman" -RandomNickNames_Male[1]="Duke" -RandomNickNames_Male[2]="Rocky" -RandomNickNames_Male[3]="Stallion" -RandomNickNames_Male[4]="Wolfman" ++RandomNickNames_Male="Axeman" ++RandomNickNames_Male="Duke" ++RandomNickNames_Male="Rocky" ++RandomNickNames_Male="Stallion" ++RandomNickNames_Male="Wolfman" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Athena" -RandomNickNames_Female[1]="Duchess" -RandomNicknames_Female[2]="Iron Lady" -RandomNicknames_Female[3]="Iron Maiden" -RandomNicknames_Female[4]="Shieldmaiden" -RandomNickNames_Female[5]="Valkyrie" ++RandomNickNames_Female="Athena" ++RandomNickNames_Female="Duchess" ++RandomNickNames_Female="Iron Lady" ++RandomNickNames_Female="Iron Maiden" ++RandomNickNames_Female="Shieldmaiden" ++RandomNickNames_Female="Valkyrie" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -1816,47 +1812,47 @@ RightAbilityTreeTitle="ケンシ" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="Clutch" -RandomNickNames[1]="Cobra" -RandomNickNames[2]="Dagger" -RandomNickNames[3]="Dancer" -RandomNickNames[4]="Dasher" -RandomNickNames[5]="Dodger" -RandomNickNames[6]="Dragon" -RandomNickNames[7]="Fencer" -RandomNickNames[8]="Flipper" -RandomNickNames[9]="Furball" -RandomNickNames[10]="Gopher" -RandomNickNames[11]="Mace" -RandomNickNames[12]="Midnight" -RandomNickNames[13]="Neutron" -RandomNickNames[14]="Painter" -RandomNickNames[15]="Pasha" -RandomNickNames[16]="Poacher" -RandomNickNames[17]="Rattler" -RandomNickNames[18]="Razor" -RandomNickNames[19]="Ripper" -RandomNickNames[20]="Royal" -RandomNickNames[21]="Shady" -RandomNickNames[22]="Sticks" -RandomNickNames[23]="Spacebar" -RandomNickNames[24]="Splinter" -RandomNickNames[25]="Stalker" -RandomNickNames[26]="Talon" -RandomNickNames[27]="Undertaker" -RandomNickNames[28]="Wildcat" ++RandomNickNames="Clutch" ++RandomNickNames="Cobra" ++RandomNickNames="Dagger" ++RandomNickNames="Dancer" ++RandomNickNames="Dasher" ++RandomNickNames="Dodger" ++RandomNickNames="Dragon" ++RandomNickNames="Fencer" ++RandomNickNames="Flipper" ++RandomNickNames="Furball" ++RandomNickNames="Gopher" ++RandomNickNames="Mace" ++RandomNickNames="Midnight" ++RandomNickNames="Neutron" ++RandomNickNames="Painter" ++RandomNickNames="Pasha" ++RandomNickNames="Poacher" ++RandomNickNames="Rattler" ++RandomNickNames="Razor" ++RandomNickNames="Ripper" ++RandomNickNames="Royal" ++RandomNickNames="Shady" ++RandomNickNames="Sticks" ++RandomNickNames="Spacebar" ++RandomNickNames="Splinter" ++RandomNickNames="Stalker" ++RandomNickNames="Talon" ++RandomNickNames="Undertaker" ++RandomNickNames="Wildcat" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Bender" -RandomNickNames_Male[1]="Cochise" -RandomNickNames_Male[2]="Slim" -RandomNickNames_Male[3]="Jockey" -RandomNickNames_Male[4]="Sandman" -RandomNickNames_Male[5]="Swordsman" ++RandomNickNames_Male="Bender" ++RandomNickNames_Male="Cochise" ++RandomNickNames_Male="Slim" ++RandomNickNames_Male="Jockey" ++RandomNickNames_Male="Sandman" ++RandomNickNames_Male="Swordsman" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Panther" -RandomNickNames_Female[1]="Siren" -RandomNickNames_Female[2]="Sparkplug" -RandomNickNames_Female[3]="Spitfire" ++RandomNickNames_Female="Panther" ++RandomNickNames_Female="Siren" ++RandomNickNames_Female="Sparkplug" ++RandomNickNames_Female="Spitfire" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -2582,6 +2578,23 @@ ObjectiveTextPools[4]="LWOTC Gatecrasher" ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" ; End Translation +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="アドヴェントの隊列を待ち伏せする" +Briefing="アドヴェントの隊列を待ち伏せする" +PostMissionType="敵兵を奇襲する" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="すべての敵ターゲットを無力化する" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="すべての敵ターゲットを無力化する" +ObjectiveTextPools[1]="XCOM兵を全員撤収させる" +ObjectiveTextPools[2]="敵兵を奇襲する" +ObjectiveTextPools[3]="通常ならアドヴェントは大勢の部隊で移動するが、無防備な状態にある少数のユニットを発見した。タイミングを計って襲撃すれば、この地域のアドヴェントどもに一泡吹かせることができ、研究用のサンプルを入手する貴重なチャンスとなるだろう。" +; LWOTC Needs Translation +ObjectiveTextPools[4]="LWOTC Gatecrasher" +ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" +; End Translation + [Rendezvous_LW X2MissionTemplate] DisplayName="合流地点" Briefing="アドヴェントとスパイの合流を阻止する" @@ -4575,6 +4588,15 @@ BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Op ObjectiveTextPools[0]="可能な限り多くの物資を回収する" ObjectiveTextPools[1]="全てのXCOM兵士を回収する" +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="強奪" +Briefing="アドヴェントの物資集積地を強襲せよ" +PostMissionType="強奪" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="可能な限り多くの物資を回収する" +ObjectiveTextPools[1]="全てのXCOM兵士を回収する" + + [SupplyExtraction_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="アドヴェントのコンテナをマーキングして回収する" ObjectiveTextPools[1]="アドヴェントのコンテナをマーキングして回収する" @@ -4589,6 +4611,15 @@ ObjectiveTextPools[3]="全てのXCOM兵を回収する" ObjectiveTextPools[4]="強奪" ObjectiveTextPools[5]="貴重な物資や資源が蓄えられた守りの薄いアドヴェントの倉庫をレジスタンスが発見した。突入し、持てるだけの物資を持ってアドヴェントの増援が到着する前に脱出せよ。 このミッションでは複数の対象物資が存在するが, 兵士はそれぞれ一つしか物資を運ぶことができない。" +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="アドヴェントの物資を獲得する" +ObjectiveTextPools[1]="アドヴェントの物資を回収する" +ObjectiveTextPools[2]="さらに物資を回収する (任意)" +ObjectiveTextPools[3]="全てのXCOM兵を回収する" +ObjectiveTextPools[4]="強奪" +ObjectiveTextPools[5]="貴重な物資や資源が蓄えられた守りの薄いアドヴェントの倉庫をレジスタンスが発見した。突入し、持てるだけの物資を持ってアドヴェントの増援が到着する前に脱出せよ。 このミッションでは複数の対象物資が存在するが, 兵士はそれぞれ一つしか物資を運ぶことができない。" + + [SmashNGrabQuestItem X2EquipmentTemplate] FriendlyName="アドヴェントの物資" FriendlyNamePlural="アドヴェントの物資" @@ -4692,3 +4723,99 @@ TacticalText="プラズマブラスターは破壊エネルギーのビ [SparkRifle_BM X2WeaponTemplate] TacticalText="SPARKによる使用を前提に設計された。エレリウム・フェイズキャノンこそが高威力ライフルの典型である。\n特別訓練時をのぞき、メイン武器を発射するとその兵士のターンは終了する。
プラズマ兵器は、攻撃対象への以後の攻撃に追加の1ダメージを与える。" + +[Overdrive X2AbilityTemplate] +LocFriendlyName="オーバードライブ" +LocLongDescription="このターンに3回行動する。行動によってターンが終了することはない。通常射撃を複数回行うと、若干の反動ペナルティを受ける。" +LocHelpText="このターンに3回行動する。行動によってターンが終了することはない。通常射撃を複数回行うと、若干の反動ペナルティを受ける。" +LocPromotionPopupText="オーバードライブ発動中、通常射撃を行うごとに命中率%の反動ペナルティを受ける。
オーバードライブの発動に行動値は消費しないが、ターンのクールダウンが発生する。
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="ブルウォーク" +LocLongDescription="アーマーに1ポイントのボーナスがつき、隣接するすべての味方ユニットに常に高遮へい物を提供する。" +LocHelpText="アーマーに1ポイントのボーナスがつき、隣接するすべての味方ユニットに常に高遮へい物を提供する。" +LocPromotionPopupText="ブルウォークはアーマーに1ポイント加算する。
SPARKに隣接する味方は高遮へい物の防御ボーナスを得る。
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="アーセナル" +LocLongDescription="BITが重火器を装備/発射できる。" +LocHelpText="BITが重火器を装備/発射できる。" +LocPromotionPopupText="SPARKが重火器を装備可能になる。
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="レインメーカー" +LocLongDescription="装備している重火器のタメージが増加し、効果範囲が拡張される。" +LocHelpText="装備している重火器のダメージが増加し、効果範囲が拡張される。" +LocPromotionPopupText="レインメーカーはすべての重火器によるダメージを加算する。
円型の効果範囲をもつ重火器は効果半径が拡張される。
円錐形の効果範囲をもつ重火器は効果直径+、射程距離+
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="インティミデイト" +LocLongDescription="攻撃のターゲットになると、その敵を一定確率でパニック状態にする。" +LocHelpText="攻撃のターゲットになると、その敵を一定確率でパニック状態にする。" +LocFlyOverText="インティミデイト" +LocPromotionPopupText="インティミデイトによって敵をパニック状態にする確率は、SPARKのアーマー値が高いほど大きくなる。
インティミデイトは近接攻撃または範囲攻撃によって発動する。
監視射撃の標的になった場合、インティミデイトは発動しない。
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="インティミデイト" +LocLongDescription="攻撃のターゲットになると、視界内の敵を一定確率でパニック状態にする。" +LocHelpText="攻撃のターゲットになると、視界内の敵を一定確率でパニック状態にする。" +LocFlyOverText="インティミデイト" +LocPromotionPopupText="" +LocMissMessage="インティミデイト失敗" + +[Repair X2AbilityTemplate] +LocFriendlyName="修復" +LocLongDescription="BITは味方ロボットの修理を行うことができる。強化されたBITはより効果的に修理を行うことができる。" +LocHelpText="BITは味方ロボットの修理を行うことができる。" +LocFlyOverText="修復" +LocPromotionPopupText=" 修復によって体力が回復する。
BITをアップグレードすることで修復によるHPの回復量が増加する。
最初の行動として修復を行ってもターン終了とならない。
修復は1ミッションにつきチャージ。
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="チャネリングフィールド" +LocLongDescription="ターゲットになるたびに、そのエネルギーの一部がに蓄えられ、次回通常射撃時に放出される。" +LocHelpText="ターゲットになると、にエネルギーが蓄えられ、次回通常射撃時に放出される。" +LocFlyOverText="チャネルエネルギー:+1" +LocPromotionPopupText="チャネリングフィールドによって蓄えられたエネルギー1ポイントごとに、次のによる攻撃のダメージが1増加する。
次の攻撃を外した場合でも、チャネリングフィールドに蓄えられたエネルギーは拡張する。
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="サクリファイス" +LocLongDescription="防御エリアを発生させ、エリア内にいるユニットへの攻撃をすべて引き受ける。発動中は防御力とアーマーにボーナスを得る。" +LocHelpText="防御フィールドを発生させ、敵からの攻撃を引き受ける。" +LocFlyOverText="サクリファイス" +LocPromotionPopupText="サクリファイス発動中はSPARKの防御力+、アーマーが加算される。
サクリファイスはクールダウンにターンを要する。
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="適応照準" +LocLongDescription="オーバードライブ有効時、通常射撃の反動ペナルティがなくなる。" +LocHelpText="オーバードライブ有効時、通常射撃の反動ペナルティがなくなる。" +LocPromotionPopupText="適応照準はオーバードライブ有効時に連続で通常射撃を行う際、%の命中率ペナルティを除去する。
" + +[Strike X2AbilityTemplate] +LocFriendlyName="打撃" +LocLongDescription="行動範囲内の敵に対して強力な近接攻撃を行うことができる。" +LocHelpText="行動範囲内の敵に対して強力な近接攻撃を行うことができる。" +LocPromotionPopupText="打撃のアビリティは移動カーソルを敵の上に位置させることで発動できる。
SPARKは行動値を2使って「ダッシュ」してから、隣接する敵に対して打撃を発動することができる。
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="レッキング・ボール" +LocLongDescription="オーバードライブ時、壁や遮へい物を破壊して通過できる。" +LocHelpText="オーバードライブ時、壁や遮へい物を破壊して通過できる。" +LocPromotionPopupText="レッキング・ボールは、敵を挟撃射撃にさらすように使用できる。
移動ウェイポイントを用いてSPARKを最適経路で誘導し、遮へい物やオブジェクトを破壊させよう。
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="ボンバード" +LocLongDescription="BITが視界内の任意の場所で強力な爆発を引き起こす。強化されたBITはより大きなダメージを与える。" +LocHelpText="BITが範囲内のすべての敵に爆発でダメージを与える。" +LocPromotionPopupText="部隊視界内の任意の場所を狙って発射可能。
BITをアップグレードするとボンバードによるダメージが増加する。" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="ハンター・プロトコル" +LocLongDescription="%の確率で非潜伏状態になった敵に監視射撃を行う。" +LocHelpText="%の確率で非潜伏状態になった敵に監視射撃を行う。" +LocPromotionPopupText="ハンター・プロトコルによって、非潜伏状態の敵を即座に攻撃できるため、SPARKは混沌とした戦場での偵察活動に最適なユニットとなっている。
" + +[Nova X2AbilityTemplate] +LocFriendlyName="ノヴァ" +LocLongDescription="エネルギーを爆発的に放出して、近くにいるすべてのユニットにダメージを与える。行動値は消費せず、クールダウン時間も発生しないが、初撃以降はノヴァを使用するたびにSPARKがダメージを受ける。" +LocHelpText="すべてのユニットに爆発でダメージを与える。初撃以降はノヴァを使用するたびにSPARKがダメージを受ける。" +LocPromotionPopupText="ノヴァは行動値を消費せず、クールダウンもない。
ミッション最初のノヴァ攻撃では、SPARKはダメージを受けない。
ただし、初撃以降のノヴァ攻撃はSPARKにの蓄積ダメージを与えていく。
" diff --git a/LongWarOfTheChosen/Localization/XComGame.kor b/LongWarOfTheChosen/Localization/XComGame.kor index ac32c4f5c..d41994a09 100644 --- a/LongWarOfTheChosen/Localization/XComGame.kor +++ b/LongWarOfTheChosen/Localization/XComGame.kor @@ -1289,74 +1289,74 @@ RightAbilityTreeTitle="소방관" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="천사" -RandomNickNames[1]="베타" -RandomNickNames[2]="주교" -RandomNickNames[3]="뼈다귀" -RandomNickNames[4]="큰 파도" -RandomNickNames[5]="브로커" -RandomNickNames[6]="비밀 당원" -RandomNickNames[7]="사이버" -RandomNickNames[8]="암호" -RandomNickNames[9]="데이터" -RandomNickNames[10]="집사" -RandomNickNames[11]="유쾌한 박사" -RandomNickNames[12]="의사" -RandomNickNames[13]="피드백" -RandomNickNames[14]="화염벽" -RandomNickNames[15]="천재" -RandomNickNames[16]="기즈모" -RandomNickNames[17]="작은 결함" -RandomNickNames[18]="납치" -RandomNickNames[19]="방해 전파" -RandomNickNames[20]="어릿광대" -RandomNickNames[21]="동요" -RandomNickNames[22]="번개" -RandomNickNames[23]="메이데이" -RandomNickNames[24]="메가" -RandomNickNames[25]="뉴턴" -RandomNickNames[26]="오버드라이브" -RandomNickNames[27]="패치" -RandomNickNames[28]="교수" -RandomNickNames[29]="래그타임" -RandomNickNames[30]="악동" -RandomNickNames[31]="수다쟁이" -RandomNickNames[32]="빨강" -RandomNickNames[33]="균열" -RandomNickNames[34]="낙하산 줄" -RandomNickNames[35]="불한당" -RandomNickNames[36]="그을음" -RandomNickNames[37]="감시병" -RandomNickNames[38]="수상한 자" -RandomNickNames[39]="요동" -RandomNickNames[40]="사기꾼" -RandomNickNames[41]="심리학자" -RandomNickNames[42]="슬라이더" -RandomNickNames[43]="태양" -RandomNickNames[44]="음파 탐지기" -RandomNickNames[45]="불똥" -RandomNickNames[46]="바느질" -RandomNickNames[47]="딱따구리" -RandomNickNames[48]="눈물" -RandomNickNames[49]="땜장이" -RandomNickNames[50]="터보" -RandomNickNames[51]="맹독" -RandomNickNames[52]="수증기" -RandomNickNames[53]="항공병" -RandomNickNames[54]="감시관" -RandomNickNames[55]="위스키" -RandomNickNames[56]="난폭한 녀석" -RandomNickNames[57]="줄루" ++RandomNickNames="천사" ++RandomNickNames="베타" ++RandomNickNames="주교" ++RandomNickNames="뼈다귀" ++RandomNickNames="큰 파도" ++RandomNickNames="브로커" ++RandomNickNames="비밀 당원" ++RandomNickNames="사이버" ++RandomNickNames="암호" ++RandomNickNames="데이터" ++RandomNickNames="집사" ++RandomNickNames="유쾌한 박사" ++RandomNickNames="의사" ++RandomNickNames="피드백" ++RandomNickNames="화염벽" ++RandomNickNames="천재" ++RandomNickNames="기즈모" ++RandomNickNames="작은 결함" ++RandomNickNames="납치" ++RandomNickNames="방해 전파" ++RandomNickNames="어릿광대" ++RandomNickNames="동요" ++RandomNickNames="번개" ++RandomNickNames="메이데이" ++RandomNickNames="메가" ++RandomNickNames="뉴턴" ++RandomNickNames="오버드라이브" ++RandomNickNames="패치" ++RandomNickNames="교수" ++RandomNickNames="래그타임" ++RandomNickNames="악동" ++RandomNickNames="수다쟁이" ++RandomNickNames="빨강" ++RandomNickNames="균열" ++RandomNickNames="낙하산 줄" ++RandomNickNames="불한당" ++RandomNickNames="그을음" ++RandomNickNames="감시병" ++RandomNickNames="수상한 자" ++RandomNickNames="요동" ++RandomNickNames="사기꾼" ++RandomNickNames="심리학자" ++RandomNickNames="슬라이더" ++RandomNickNames="태양" ++RandomNickNames="음파 탐지기" ++RandomNickNames="불똥" ++RandomNickNames="바느질" ++RandomNickNames="딱따구리" ++RandomNickNames="눈물" ++RandomNickNames="땜장이" ++RandomNickNames="터보" ++RandomNickNames="맹독" ++RandomNickNames="수증기" ++RandomNickNames="항공병" ++RandomNickNames="감시관" ++RandomNickNames="위스키" ++RandomNickNames="난폭한 녀석" ++RandomNickNames="줄루" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="마약 판매자" -RandomNickNames_Male[1]="마술사" -RandomNickNames_Male[2]="사제" -RandomNickNames_Male[3]="레인맨" -RandomNickNames_Male[4]="수탉" -RandomNickNames_Female[0]="여사제" -RandomNickNames_Female[1]="울프 마더" -RandomNickNames_Female[2]="블랙 위도우" -RandomNickNames_Female[4]="공작부인" ++RandomNickNames_Male="마약 판매자" ++RandomNickNames_Male="마술사" ++RandomNickNames_Male="사제" ++RandomNickNames_Male="레인맨" ++RandomNickNames_Male="수탉" ++RandomNickNames_Female="여사제" ++RandomNickNames_Female="울프 마더" ++RandomNickNames_Female="블랙 위도우" ++RandomNickNames_Female="공작부인" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1371,74 +1371,74 @@ RightAbilityTreeTitle="전투 해커" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="천사" -RandomNickNames[1]="베타" -RandomNickNames[2]="주교" -RandomNickNames[3]="뼈다귀" -RandomNickNames[4]="큰 파도" -RandomNickNames[5]="브로커" -RandomNickNames[6]="비밀 당원" -RandomNickNames[7]="사이버" -RandomNickNames[8]="암호" -RandomNickNames[9]="데이터" -RandomNickNames[10]="집사" -RandomNickNames[11]="유쾌한 박사" -RandomNickNames[12]="의사" -RandomNickNames[13]="피드백" -RandomNickNames[14]="화염벽" -RandomNickNames[15]="천재" -RandomNickNames[16]="기즈모" -RandomNickNames[17]="작은 결함" -RandomNickNames[18]="납치" -RandomNickNames[19]="방해 전파" -RandomNickNames[20]="어릿광대" -RandomNickNames[21]="동요" -RandomNickNames[22]="번개" -RandomNickNames[23]="메이데이" -RandomNickNames[24]="메가" -RandomNickNames[25]="뉴턴" -RandomNickNames[26]="오버드라이브" -RandomNickNames[27]="패치" -RandomNickNames[28]="교수" -RandomNickNames[29]="래그타임" -RandomNickNames[30]="악동" -RandomNickNames[31]="수다쟁이" -RandomNickNames[32]="빨강" -RandomNickNames[33]="균열" -RandomNickNames[34]="낙하산 줄" -RandomNickNames[35]="불한당" -RandomNickNames[36]="그을음" -RandomNickNames[37]="감시병" -RandomNickNames[38]="수상한 자" -RandomNickNames[39]="요동" -RandomNickNames[40]="사기꾼" -RandomNickNames[41]="심리학자" -RandomNickNames[42]="슬라이더" -RandomNickNames[43]="태양" -RandomNickNames[44]="음파 탐지기" -RandomNickNames[45]="불똥" -RandomNickNames[46]="바느질" -RandomNickNames[47]="딱따구리" -RandomNickNames[48]="눈물" -RandomNickNames[49]="땜장이" -RandomNickNames[50]="터보" -RandomNickNames[51]="맹독" -RandomNickNames[52]="수증기" -RandomNickNames[53]="항공병" -RandomNickNames[54]="감시관" -RandomNickNames[55]="위스키" -RandomNickNames[56]="난폭한 녀석" -RandomNickNames[57]="줄루" ++RandomNickNames="천사" ++RandomNickNames="베타" ++RandomNickNames="주교" ++RandomNickNames="뼈다귀" ++RandomNickNames="큰 파도" ++RandomNickNames="브로커" ++RandomNickNames="비밀 당원" ++RandomNickNames="사이버" ++RandomNickNames="암호" ++RandomNickNames="데이터" ++RandomNickNames="집사" ++RandomNickNames="유쾌한 박사" ++RandomNickNames="의사" ++RandomNickNames="피드백" ++RandomNickNames="화염벽" ++RandomNickNames="천재" ++RandomNickNames="기즈모" ++RandomNickNames="작은 결함" ++RandomNickNames="납치" ++RandomNickNames="방해 전파" ++RandomNickNames="어릿광대" ++RandomNickNames="동요" ++RandomNickNames="번개" ++RandomNickNames="메이데이" ++RandomNickNames="메가" ++RandomNickNames="뉴턴" ++RandomNickNames="오버드라이브" ++RandomNickNames="패치" ++RandomNickNames="교수" ++RandomNickNames="래그타임" ++RandomNickNames="악동" ++RandomNickNames="수다쟁이" ++RandomNickNames="빨강" ++RandomNickNames="균열" ++RandomNickNames="낙하산 줄" ++RandomNickNames="불한당" ++RandomNickNames="그을음" ++RandomNickNames="감시병" ++RandomNickNames="수상한 자" ++RandomNickNames="요동" ++RandomNickNames="사기꾼" ++RandomNickNames="심리학자" ++RandomNickNames="슬라이더" ++RandomNickNames="태양" ++RandomNickNames="음파 탐지기" ++RandomNickNames="불똥" ++RandomNickNames="바느질" ++RandomNickNames="딱따구리" ++RandomNickNames="눈물" ++RandomNickNames="땜장이" ++RandomNickNames="터보" ++RandomNickNames="맹독" ++RandomNickNames="수증기" ++RandomNickNames="항공병" ++RandomNickNames="감시관" ++RandomNickNames="위스키" ++RandomNickNames="난폭한 녀석" ++RandomNickNames="줄루" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="마약 판매자" -RandomNickNames_Male[1]="마술사" -RandomNickNames_Male[2]="사제" -RandomNickNames_Male[3]="레인맨" -RandomNickNames_Male[4]="수탉" -RandomNickNames_Female[0]="여사제" -RandomNickNames_Female[1]="울프 마더" -RandomNickNames_Female[2]="블랙 위도우" -RandomNickNames_Female[4]="공작부인" ++RandomNickNames_Male="마약 판매자" ++RandomNickNames_Male="마술사" ++RandomNickNames_Male="사제" ++RandomNickNames_Male="레인맨" ++RandomNickNames_Male="수탉" ++RandomNickNames_Female="여사제" ++RandomNickNames_Female="울프 마더" ++RandomNickNames_Female="블랙 위도우" ++RandomNickNames_Female="공작부인" ;ALPHABETICAL ORDER @@ -1454,86 +1454,86 @@ RightAbilityTreeTitle="보조" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="올데이" -RandomNickNames[1]="올인" -RandomNickNames[2]="동물" -RandomNickNames[3]="멋쟁이" -RandomNickNames[4]="대륙" -RandomNickNames[5]="거금" -RandomNickNames[6]="심술쟁이" -RandomNickNames[7]="불꽃" -RandomNickNames[8]="붐붐" -RandomNickNames[9]="폭격기" -RandomNickNames[10]="버디" -RandomNickNames[11]="불독" -RandomNickNames[12]="돌진" -RandomNickNames[13]="클레이모어" -RandomNickNames[14]="파괴" -RandomNickNames[15]="데프콘" -RandomNickNames[16]="악마개" -RandomNickNames[17]="디젤" -RandomNickNames[18]="앙코르" -RandomNickNames[19]="화염구" -RandomNickNames[20]="냉장고" -RandomNickNames[21]="거너" -RandomNickNames[22]="해머" -RandomNickNames[23]="헬파이어" -RandomNickNames[24]="고주탑" -RandomNickNames[25]="말" -RandomNickNames[26]="볼케이노" -RandomNickNames[27]="허리케인" -RandomNickNames[28]="고물상" -RandomNickNames[29]="저거너트" -RandomNickNames[30]="녹아웃" -RandomNickNames[31]="킹콩" -RandomNickNames[32]="미친개" -RandomNickNames[33]="멜트 다운" -RandomNickNames[34]="무스" -RandomNickNames[35]="신성" -RandomNickNames[36]="신경질쟁이" -RandomNickNames[37]="니트로" -RandomNickNames[38]="지배자" -RandomNickNames[39]="핏불" -RandomNickNames[40]="방화광" -RandomNickNames[41]="레드라인" -RandomNickNames[42]="코뿔소" -RandomNickNames[43]="로켓" -RandomNickNames[44]="해풍" -RandomNickNames[45]="석판" -RandomNickNames[46]="강타" -RandomNickNames[47]="다혈질" -RandomNickNames[48]="스모키" -RandomNickNames[49]="늪지 괴물" -RandomNickNames[50]="티본" -RandomNickNames[51]="티렉스" -RandomNickNames[52]="탱크" -RandomNickNames[53]="타격가" -RandomNickNames[54]="번개" -RandomNickNames[55]="간지럼" -RandomNickNames[56]="꼬마" -RandomNickNames[57]="타이탄" -RandomNickNames[58]="다이너마이트" -RandomNickNames[59]="토치" -RandomNickNames[60]="전투견" -RandomNickNames[61]="전투마" -RandomNickNames[62]="야생 소년" ++RandomNickNames="올데이" ++RandomNickNames="올인" ++RandomNickNames="동물" ++RandomNickNames="멋쟁이" ++RandomNickNames="대륙" ++RandomNickNames="거금" ++RandomNickNames="심술쟁이" ++RandomNickNames="불꽃" ++RandomNickNames="붐붐" ++RandomNickNames="폭격기" ++RandomNickNames="버디" ++RandomNickNames="불독" ++RandomNickNames="돌진" ++RandomNickNames="클레이모어" ++RandomNickNames="파괴" ++RandomNickNames="데프콘" ++RandomNickNames="악마개" ++RandomNickNames="디젤" ++RandomNickNames="앙코르" ++RandomNickNames="화염구" ++RandomNickNames="냉장고" ++RandomNickNames="거너" ++RandomNickNames="해머" ++RandomNickNames="헬파이어" ++RandomNickNames="고주탑" ++RandomNickNames="말" ++RandomNickNames="볼케이노" ++RandomNickNames="허리케인" ++RandomNickNames="고물상" ++RandomNickNames="저거너트" ++RandomNickNames="녹아웃" ++RandomNickNames="킹콩" ++RandomNickNames="미친개" ++RandomNickNames="멜트 다운" ++RandomNickNames="무스" ++RandomNickNames="신성" ++RandomNickNames="신경질쟁이" ++RandomNickNames="니트로" ++RandomNickNames="지배자" ++RandomNickNames="핏불" ++RandomNickNames="방화광" ++RandomNickNames="레드라인" ++RandomNickNames="코뿔소" ++RandomNickNames="로켓" ++RandomNickNames="해풍" ++RandomNickNames="석판" ++RandomNickNames="강타" ++RandomNickNames="다혈질" ++RandomNickNames="스모키" ++RandomNickNames="늪지 괴물" ++RandomNickNames="티본" ++RandomNickNames="티렉스" ++RandomNickNames="탱크" ++RandomNickNames="타격가" ++RandomNickNames="번개" ++RandomNickNames="간지럼" ++RandomNickNames="꼬마" ++RandomNickNames="타이탄" ++RandomNickNames="다이너마이트" ++RandomNickNames="토치" ++RandomNickNames="전투견" ++RandomNickNames="전투마" ++RandomNickNames="야생 소년" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="야만인" -RandomNickNames_Male[1]="거인" -RandomNicknames_Male[2]="남자 보스" -RandomNickNames_Male[3]="카우보이" -RandomNickNames_Male[4]="얼뜨기" -RandomNickNames_Male[5]="네로" -RandomNickNames_Male[6]="아빠 곰" -RandomNickNames_Male[7]="거친 남자" -RandomNickNames_Female[0]="아마존" -RandomNicknames_Female[1]="여자 보스" -RandomNickNames_Female[2]="카우걸" -RandomNicknames_Female[3]="도미노" -RandomNickNames_Female[4]="프레야" -RandomNickNames_Female[5]="엄마 곰" -RandomNickNames_Female[6]="수장" -RandomNickNames_Female[7]="방화범" ++RandomNickNames_Male="야만인" ++RandomNickNames_Male="거인" ++RandomNickNames_Male="남자 보스" ++RandomNickNames_Male="카우보이" ++RandomNickNames_Male="얼뜨기" ++RandomNickNames_Male="네로" ++RandomNickNames_Male="아빠 곰" ++RandomNickNames_Male="거친 남자" ++RandomNickNames_Female="아마존" ++RandomNickNames_Female="여자 보스" ++RandomNickNames_Female="카우걸" ++RandomNickNames_Female="도미노" ++RandomNickNames_Female="프레야" ++RandomNickNames_Female="엄마 곰" ++RandomNickNames_Female="수장" ++RandomNickNames_Female="방화범" ;ALPHABETICAL ORDER @@ -1548,42 +1548,42 @@ RightAbilityTreeTitle="기관총 사수" +AbilityTreeTitles[2]="기관총 사수" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="역효과" -RandomNickNames[1]="바하" -RandomNickNames[2]="곰고양이" -RandomNickNames[3]="잔혹한" -RandomNickNames[4]="전기톱" -RandomNickNames[5]="허둥지둥" -RandomNickNames[6]="게임쇼" -RandomNickNames[7]="곤조" -RandomNickNames[8]="호커" -RandomNickNames[9]="코즈모" -RandomNickNames[10]="도시락" -RandomNickNames[11]="난동꾼" -RandomNickNames[12]="도살업자" -RandomNickNames[13]="무스" -RandomNickNames[14]="북극곰" -RandomNickNames[15]="너겟" -RandomNickNames[16]="핵" -RandomNickNames[17]="오거" -RandomNickNames[18]="팬케이크" -RandomNickNames[19]="기갑 부대" -RandomNickNames[20]="피스톤" -RandomNickNames[21]="투척자" -RandomNickNames[22]="스패로우" -RandomNickNames[23]="스파이크" -RandomNickNames[24]="요기" -RandomNickNames[25]="자퍼" -RandomNickNames_Male[0]="껄껄이" -RandomNickNames_Male[1]="딩거스" -RandomNickNames_Male[2]="미치광이" -RandomNickNames_Male[3]="너클" -RandomNickNames_Male[4]="바다코끼리" -RandomNickNames_Female[0]="버블" -RandomNickNames_Female[1]="가제트" -RandomNickNames_Female[2]="낄낄이" -RandomNickNames_Female[3]="망고" -RandomNickNames_Female[4]="페퍼" ++RandomNickNames="역효과" ++RandomNickNames="바하" ++RandomNickNames="곰고양이" ++RandomNickNames="잔혹한" ++RandomNickNames="전기톱" ++RandomNickNames="허둥지둥" ++RandomNickNames="게임쇼" ++RandomNickNames="곤조" ++RandomNickNames="호커" ++RandomNickNames="코즈모" ++RandomNickNames="도시락" ++RandomNickNames="난동꾼" ++RandomNickNames="도살업자" ++RandomNickNames="무스" ++RandomNickNames="북극곰" ++RandomNickNames="너겟" ++RandomNickNames="핵" ++RandomNickNames="오거" ++RandomNickNames="팬케이크" ++RandomNickNames="기갑 부대" ++RandomNickNames="피스톤" ++RandomNickNames="투척자" ++RandomNickNames="스패로우" ++RandomNickNames="스파이크" ++RandomNickNames="요기" ++RandomNickNames="자퍼" ++RandomNickNames_Male="껄껄이" ++RandomNickNames_Male="딩거스" ++RandomNickNames_Male="미치광이" ++RandomNickNames_Male="너클" ++RandomNickNames_Male="바다코끼리" ++RandomNickNames_Female="버블" ++RandomNickNames_Female="가제트" ++RandomNickNames_Female="낄낄이" ++RandomNickNames_Female="망고" ++RandomNickNames_Female="페퍼" [LWS_Ranger X2SoldierClassTemplate] @@ -1597,43 +1597,43 @@ RightAbilityTreeTitle="수비병" +AbilityTreeTitles[2]="수비병" +AbilityTreeTitles[3]="XCOM" -RandomNickNames[0]="야생마" -RandomNickNames[1]="수사슴" -RandomNickNames[2]="칠엽수" -RandomNickNames[3]="코발트" -RandomNickNames[4]="카우보이" -RandomNickNames[5]="채굴기" -RandomNickNames[6]="거지" -RandomNickNames[7]="서리" -RandomNickNames[8]="졸병" -RandomNickNames[9]="헐리우드" -RandomNickNames[10]="말" -RandomNickNames[11]="하울러" -RandomNickNames[12]="어치" -RandomNickNames[13]="강탈자" -RandomNickNames[14]="심판자" -RandomNickNames[15]="청새치" -RandomNickNames[16]="무스탕" -RandomNickNames[17]="아빠" -RandomNickNames[18]="화가" -RandomNickNames[19]="얼룩말" -RandomNickNames[20]="악동" -RandomNickNames[21]="록키" -RandomNickNames[22]="스쿠터" -RandomNickNames[23]="모기" -RandomNickNames[24]="밑바닥" -RandomNickNames[25]="스트레치" -RandomNickNames[26]="타격가" -RandomNickNames[27]="웨어울프" -RandomNickNames_Male[0]="먼지투성이" -RandomNickNames_Male[1]="더치" -RandomNickNames_Male[2]="탈곡기" -RandomNickNames_Male[3]="슬리크" -RandomNickNames_Male[4]="아저씨" -RandomNickNames_Female[0]="아줌마" -RandomNickNames_Female[1]="굿나잇" -RandomNickNames_Female[2]="메두사" -RandomNickNames_Female[3]="슈가" ++RandomNickNames="야생마" ++RandomNickNames="수사슴" ++RandomNickNames="칠엽수" ++RandomNickNames="코발트" ++RandomNickNames="카우보이" ++RandomNickNames="채굴기" ++RandomNickNames="거지" ++RandomNickNames="서리" ++RandomNickNames="졸병" ++RandomNickNames="헐리우드" ++RandomNickNames="말" ++RandomNickNames="하울러" ++RandomNickNames="어치" ++RandomNickNames="강탈자" ++RandomNickNames="심판자" ++RandomNickNames="청새치" ++RandomNickNames="무스탕" ++RandomNickNames="아빠" ++RandomNickNames="화가" ++RandomNickNames="얼룩말" ++RandomNickNames="악동" ++RandomNickNames="록키" ++RandomNickNames="스쿠터" ++RandomNickNames="모기" ++RandomNickNames="밑바닥" ++RandomNickNames="스트레치" ++RandomNickNames="타격가" ++RandomNickNames="웨어울프" ++RandomNickNames_Male="먼지투성이" ++RandomNickNames_Male="더치" ++RandomNickNames_Male="탈곡기" ++RandomNickNames_Male="슬리크" ++RandomNickNames_Male="아저씨" ++RandomNickNames_Female="아줌마" ++RandomNickNames_Female="굿나잇" ++RandomNickNames_Female="메두사" ++RandomNickNames_Female="슈가" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1648,79 +1648,79 @@ RightAbilityTreeTitle="명사수" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="정점" -RandomNickNames[1]="에이스" -RandomNickNames[2]="후유증" -RandomNickNames[3]="알파" -RandomNickNames[4]="블랙잭" -RandomNickNames[5]="명중" -RandomNickNames[6]="화살" -RandomNickNames[7]="실력자" -RandomNickNames[8]="영면" -RandomNickNames[9]="대성공" -RandomNickNames[10]="보스" -RandomNickNames[11]="명중" -RandomNickNames[12]="체크 메이트" -RandomNickNames[13]="치프" -RandomNickNames[14]="콜트" -RandomNickNames[15]="댈러스" -RandomNickNames[16]="데드볼트" -RandomNickNames[17]="데드아이" -RandomNickNames[18]="데드록" -RandomNickNames[19]="무용지물" -RandomNickNames[20]="D.O.A." -RandomNickNames[21]="이글 아이" -RandomNickNames[22]="얼간이" -RandomNickNames[23]="플랫라인" -RandomNickNames[24]="게임 타임" -RandomNickNames[25]="갱스터" -RandomNickNames[26]="묘지기" -RandomNickNames[27]="해트 트릭" -RandomNickNames[28]="호크 아이" -RandomNickNames[29]="가열기" -RandomNickNames[30]="전성기" -RandomNickNames[31]="암살자" -RandomNickNames[32]="헐리우드" -RandomNickNames[33]="선전" -RandomNickNames[34]="아이콘" -RandomNickNames[35]="자칼" -RandomNickNames[36]="심판자" -RandomNickNames[37]="소등" -RandomNickNames[38]="제재" -RandomNickNames[39]="위험한 도박" -RandomNickNames[40]="방랑자" -RandomNickNames[41]="바늘" -RandomNickNames[42]="청황색 기사" -RandomNickNames[43]="리퍼" -RandomNickNames[44]="스크래치" -RandomNickNames[45]="연쇄 저격" -RandomNickNames[46]="보안관" -RandomNickNames[47]="사수" -RandomNickNames[48]="쇼타임" -RandomNickNames[49]="슬리크" -RandomNickNames[50]="투척자" -RandomNickNames[51]="냉혈한" -RandomNickNames[52]="청부업자" -RandomNickNames[53]="아이" -RandomNickNames[54]="진실" -RandomNickNames[55]="묘비" -RandomNickNames[56]="최고" -RandomNickNames[57]="최상" -RandomNickNames[58]="이연사" -RandomNickNames[59]="장의사" -RandomNickNames[60]="밸런타인" ++RandomNickNames="정점" ++RandomNickNames="에이스" ++RandomNickNames="후유증" ++RandomNickNames="알파" ++RandomNickNames="블랙잭" ++RandomNickNames="명중" ++RandomNickNames="화살" ++RandomNickNames="실력자" ++RandomNickNames="영면" ++RandomNickNames="대성공" ++RandomNickNames="보스" ++RandomNickNames="명중" ++RandomNickNames="체크 메이트" ++RandomNickNames="치프" ++RandomNickNames="콜트" ++RandomNickNames="댈러스" ++RandomNickNames="데드볼트" ++RandomNickNames="데드아이" ++RandomNickNames="데드록" ++RandomNickNames="무용지물" ++RandomNickNames="D.O.A." ++RandomNickNames="이글 아이" ++RandomNickNames="얼간이" ++RandomNickNames="플랫라인" ++RandomNickNames="게임 타임" ++RandomNickNames="갱스터" ++RandomNickNames="묘지기" ++RandomNickNames="해트 트릭" ++RandomNickNames="호크 아이" ++RandomNickNames="가열기" ++RandomNickNames="전성기" ++RandomNickNames="암살자" ++RandomNickNames="헐리우드" ++RandomNickNames="선전" ++RandomNickNames="아이콘" ++RandomNickNames="자칼" ++RandomNickNames="심판자" ++RandomNickNames="소등" ++RandomNickNames="제재" ++RandomNickNames="위험한 도박" ++RandomNickNames="방랑자" ++RandomNickNames="바늘" ++RandomNickNames="청황색 기사" ++RandomNickNames="리퍼" ++RandomNickNames="스크래치" ++RandomNickNames="연쇄 저격" ++RandomNickNames="보안관" ++RandomNickNames="사수" ++RandomNickNames="쇼타임" ++RandomNickNames="슬리크" ++RandomNickNames="투척자" ++RandomNickNames="냉혈한" ++RandomNickNames="청부업자" ++RandomNickNames="아이" ++RandomNickNames="진실" ++RandomNickNames="묘비" ++RandomNickNames="최고" ++RandomNickNames="최상" ++RandomNickNames="이연사" ++RandomNickNames="장의사" ++RandomNickNames="밸런타인" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="카우보이" -RandomNickNames_Male[1]="대부" -RandomNickNames_Male[2]="우체부" -RandomNickNames_Male[3]="잠귀신" -RandomNickNames_Male[4]="멋쟁이" -RandomNickNames_Male[5]="세무관" -RandomNickNames_Male[6]="제우스" -RandomNickNames_Female[0]="남작 부인" -RandomNickNames_Female[1]="블랙 위도우" -RandomNicknames_Female[2]="재앙" -RandomNicknames_Female[3]="여왕벌" ++RandomNickNames_Male="카우보이" ++RandomNickNames_Male="대부" ++RandomNickNames_Male="우체부" ++RandomNickNames_Male="잠귀신" ++RandomNickNames_Male="멋쟁이" ++RandomNickNames_Male="세무관" ++RandomNickNames_Male="제우스" ++RandomNickNames_Female="남작 부인" ++RandomNickNames_Female="블랙 위도우" ++RandomNickNames_Female="재앙" ++RandomNickNames_Female="여왕벌" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1735,73 +1735,73 @@ RightAbilityTreeTitle="위반자" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="강도" -RandomNickNames[1]="블리츠" -RandomNickNames[2]="벽돌" -RandomNickNames[3]="도살자" -RandomNickNames[4]="둥근 톱" -RandomNickNames[5]="케이준" -RandomNickNames[6]="난도질" -RandomNickNames[7]="코브라" -RandomNickNames[8]="쿠거" -RandomNickNames[9]="코요테" -RandomNickNames[10]="충돌" -RandomNickNames[11]="다이아몬드" -RandomNickNames[12]="집행자" -RandomNickNames[13]="치명타" -RandomNickNames[14]="섬광" -RandomNickNames[15]="격노" -RandomNickNames[16]="악어" -RandomNickNames[17]="고스트" -RandomNickNames[18]="거너" -RandomNickNames[19]="사냥개" -RandomNickNames[20]="얼음" -RandomNickNames[21]="얼음송곳" -RandomNickNames[22]="상어" -RandomNickNames[23]="심판의 날" -RandomNickNames[24]="요물" -RandomNickNames[25]="괴물" -RandomNickNames[26]="무스탕" -RandomNickNames[27]="성기사" -RandomNickNames[28]="핏불" -RandomNickNames[29]="길잡이" -RandomNickNames[30]="링고" -RandomNickNames[31]="사무라이" -RandomNickNames[32]="전갈" -RandomNickNames[33]="쇼군" -RandomNickNames[34]="섀도" -RandomNickNames[35]="살해자" -RandomNickNames[36]="뱀" -RandomNickNames[37]="뱀의 눈" -RandomNickNames[38]="솔로" -RandomNickNames[39]="망령" -RandomNickNames[40]="스파이더" -RandomNickNames[41]="스토커" -RandomNickNames[42]="강철" -RandomNickNames[43]="스팅어" -RandomNickNames[44]="템플기사단" -RandomNickNames[45]="트로이" -RandomNickNames[46]="반달" -RandomNickNames[47]="바이킹" -RandomNickNames[48]="감시관" -RandomNickNames[49]="군 지도자" -RandomNickNames[50]="울버린" -RandomNickNames[51]="야생 소년" -RandomNickNames[52]="야생 동물" -RandomNickNames[53]="줄루" ++RandomNickNames="강도" ++RandomNickNames="블리츠" ++RandomNickNames="벽돌" ++RandomNickNames="도살자" ++RandomNickNames="둥근 톱" ++RandomNickNames="케이준" ++RandomNickNames="난도질" ++RandomNickNames="코브라" ++RandomNickNames="쿠거" ++RandomNickNames="코요테" ++RandomNickNames="충돌" ++RandomNickNames="다이아몬드" ++RandomNickNames="집행자" ++RandomNickNames="치명타" ++RandomNickNames="섬광" ++RandomNickNames="격노" ++RandomNickNames="악어" ++RandomNickNames="고스트" ++RandomNickNames="거너" ++RandomNickNames="사냥개" ++RandomNickNames="얼음" ++RandomNickNames="얼음송곳" ++RandomNickNames="상어" ++RandomNickNames="심판의 날" ++RandomNickNames="요물" ++RandomNickNames="괴물" ++RandomNickNames="무스탕" ++RandomNickNames="성기사" ++RandomNickNames="핏불" ++RandomNickNames="길잡이" ++RandomNickNames="링고" ++RandomNickNames="사무라이" ++RandomNickNames="전갈" ++RandomNickNames="쇼군" ++RandomNickNames="섀도" ++RandomNickNames="살해자" ++RandomNickNames="뱀" ++RandomNickNames="뱀의 눈" ++RandomNickNames="솔로" ++RandomNickNames="망령" ++RandomNickNames="스파이더" ++RandomNickNames="스토커" ++RandomNickNames="강철" ++RandomNickNames="스팅어" ++RandomNickNames="템플기사단" ++RandomNickNames="트로이" ++RandomNickNames="반달" ++RandomNickNames="바이킹" ++RandomNickNames="감시관" ++RandomNickNames="군 지도자" ++RandomNickNames="울버린" ++RandomNickNames="야생 소년" ++RandomNickNames="야생 동물" ++RandomNickNames="줄루" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="도끼병" -RandomNickNames_Male[1]="공작" -RandomNickNames_Male[2]="록키" -RandomNickNames_Male[3]="종마" -RandomNickNames_Male[4]="늑대 인간" ++RandomNickNames_Male="도끼병" ++RandomNickNames_Male="공작" ++RandomNickNames_Male="록키" ++RandomNickNames_Male="종마" ++RandomNickNames_Male="늑대 인간" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="아테나" -RandomNickNames_Female[1]="공작부인" -RandomNicknames_Female[2]="철의 여인" -RandomNicknames_Female[3]="철의 아가씨" -RandomNicknames_Female[4]="방패 든 아가씨" -RandomNickNames_Female[5]="발키리" ++RandomNickNames_Female="아테나" ++RandomNickNames_Female="공작부인" ++RandomNickNames_Female="철의 여인" ++RandomNickNames_Female="철의 아가씨" ++RandomNickNames_Female="방패 든 아가씨" ++RandomNickNames_Female="발키리" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -1816,47 +1816,47 @@ RightAbilityTreeTitle="검객" +AbilityTreeTitles[3]="XCOM" ;ALPHABETICAL ORDER -RandomNickNames[0]="클러치" -RandomNickNames[1]="코브라" -RandomNickNames[2]="별종" -RandomNickNames[3]="무용수" -RandomNickNames[4]="돌진전사" -RandomNickNames[5]="회피전문가" -RandomNickNames[6]="드래곤" -RandomNickNames[7]="펜싱 선수" -RandomNickNames[8]="공중제비" -RandomNickNames[9]="털복숭이" -RandomNickNames[10]="땅다람쥐" -RandomNickNames[11]="철퇴" -RandomNickNames[12]="깊은 밤" -RandomNickNames[13]="중성자" -RandomNickNames[14]="화가" -RandomNickNames[15]="파샤" -RandomNickNames[16]="밀렵꾼" -RandomNickNames[17]="수다쟁이" -RandomNickNames[18]="면도칼" -RandomNickNames[19]="살인광" -RandomNickNames[20]="왕족" -RandomNickNames[21]="수상한 자" -RandomNickNames[22]="방망이" -RandomNickNames[23]="스페이스바" -RandomNickNames[24]="파쇄 전문가" -RandomNickNames[25]="스토커" -RandomNickNames[26]="탤런" -RandomNickNames[27]="장의사" -RandomNickNames[28]="살쾡이" ++RandomNickNames="클러치" ++RandomNickNames="코브라" ++RandomNickNames="별종" ++RandomNickNames="무용수" ++RandomNickNames="돌진전사" ++RandomNickNames="회피전문가" ++RandomNickNames="드래곤" ++RandomNickNames="펜싱 선수" ++RandomNickNames="공중제비" ++RandomNickNames="털복숭이" ++RandomNickNames="땅다람쥐" ++RandomNickNames="철퇴" ++RandomNickNames="깊은 밤" ++RandomNickNames="중성자" ++RandomNickNames="화가" ++RandomNickNames="파샤" ++RandomNickNames="밀렵꾼" ++RandomNickNames="수다쟁이" ++RandomNickNames="면도칼" ++RandomNickNames="살인광" ++RandomNickNames="왕족" ++RandomNickNames="수상한 자" ++RandomNickNames="방망이" ++RandomNickNames="스페이스바" ++RandomNickNames="파쇄 전문가" ++RandomNickNames="스토커" ++RandomNickNames="탤런" ++RandomNickNames="장의사" ++RandomNickNames="살쾡이" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="굴곡기" -RandomNickNames_Male[1]="코치스" -RandomNickNames_Male[2]="멋쟁이" -RandomNickNames_Male[3]="기수" -RandomNickNames_Male[4]="잠귀신" -RandomNickNames_Male[5]="검술사" ++RandomNickNames_Male="굴곡기" ++RandomNickNames_Male="코치스" ++RandomNickNames_Male="멋쟁이" ++RandomNickNames_Male="기수" ++RandomNickNames_Male="잠귀신" ++RandomNickNames_Male="검술사" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="표범" -RandomNickNames_Female[1]="사이렌" -RandomNickNames_Female[2]="점화기" -RandomNickNames_Female[3]="다혈질" ++RandomNickNames_Female="표범" ++RandomNickNames_Female="사이렌" ++RandomNickNames_Female="점화기" ++RandomNickNames_Female="다혈질" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -2582,6 +2582,23 @@ ObjectiveTextPools[4]="LWOTC Gatecrasher" ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" ; End Translation +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="어드밴트 부대 행렬 기습" +Briefing="어드밴트 부대 행렬 기습" +PostMissionType="적 부대 기습하기" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="모든 적 목표물 무력화하기" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="모든 적 목표물 무력화하기" +ObjectiveTextPools[1]="모든 XCOM 병사 탈출시키기" +ObjectiveTextPools[2]="적 부대 기습하기" +ObjectiveTextPools[3]="어드밴트는 대개 대규모 단위로 부대를 움직입니다. 하지만 방어가 취약한 소형 어드밴트 부대를 발견했습니다 적절한 시기에 공격하면 이 지역에 대한 어드밴트 영향력을 약화시킬 수 있으며 연구 목적을 위한 적 시체를 조달할 수 있는 소중한 기회를 얻을 수 있게 됩니다." +; LWOTC Needs Translation +ObjectiveTextPools[4]="LWOTC Gatecrasher" +ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" +; End Translation + [Rendezvous_LW X2MissionTemplate] DisplayName="접선" Briefing="스파이와 어드밴트 부대의 접선 중단" @@ -4575,6 +4592,14 @@ BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Op ObjectiveTextPools[0]="최대한 많은 자원을 회수하기" ObjectiveTextPools[1]="모든 XCOM 병사 탈출시키기" +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="탈취" +Briefing="어드밴트 창고습격" +PostMissionType="탈취" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="최대한 많은 자원을 회수하기" +ObjectiveTextPools[1]="모든 XCOM 병사 탈출시키기" + [SupplyExtraction_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="어드밴트 상자를 표시하고 회수하기" ObjectiveTextPools[1]="어드밴트 상자를 표시하고 회수하기" @@ -4589,6 +4614,14 @@ ObjectiveTextPools[3]="모든 XCOM 병사 탈출시키기" ObjectiveTextPools[4]="탈취" ObjectiveTextPools[5]="저항군이 유용한 자원들이 저장되어 있는 어드밴트 창고를 발견하였습니다. 침입하여 어드밴트의 지원군이 도착하기 전에 최대한 많은 자원을 확보하여 탈출하십시오. 여러 자원 캐시가 있지만, 병사들은 각각 한 개의 자원 캐시만 확보할 수 있습니다." +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="어드밴트 자원 회수하기" +ObjectiveTextPools[1]="어드밴트 자원 확보하기" +ObjectiveTextPools[2]="추가자원을 회수 및 확보하기 (선택사항)" +ObjectiveTextPools[3]="모든 XCOM 병사 탈출시키기" +ObjectiveTextPools[4]="탈취" +ObjectiveTextPools[5]="저항군이 유용한 자원들이 저장되어 있는 어드밴트 창고를 발견하였습니다. 침입하여 어드밴트의 지원군이 도착하기 전에 최대한 많은 자원을 확보하여 탈출하십시오. 여러 자원 캐시가 있지만, 병사들은 각각 한 개의 자원 캐시만 확보할 수 있습니다." + [SmashNGrabQuestItem X2EquipmentTemplate] FriendlyName="어드밴트 자원 캐시" FriendlyNamePlural="어드밴트 자원 캐시" @@ -4693,3 +4726,99 @@ TacticalText=" 플라스마 블래스터는 파괴적인 에너지 빔 [SparkRifle_BM X2WeaponTemplate] TacticalText=" 엘레리움 페이즈캐넌은 SPARK의 피해량을 극대화시키도록 특별 설계된 소총으로, 강화 소총 기술의 전형입니다. 특수 훈련을 받지 않은 한, 주요 무기를 발사하면 병사의 턴이 종료됩니다.
플라스마 무기들은 피해를 입힐 때마다 대상 유닛이 1의 추가 대미지를 더 받게 만듭니다." + +[Overdrive X2AbilityTemplate] +LocFriendlyName="오버드라이브" +LocLongDescription="이번 턴에 행동력 3개를 사용할 수 있으며 어떠한 행동도 곧바로 턴을 종료하지 않습니다. 일반 사격을 여러 번 하면 작은 반동 페널티를 받습니다." +LocHelpText="이번 턴에 행동력 3개를 사용할 수 있으며 어떠한 행동도 곧바로 턴을 종료하지 않습니다. 일반 사격을 여러 번 하면 작은 반동 페널티를 받습니다." +LocPromotionPopupText=" 오버드라이브 발동 시 일반 사격 후마다 의 조준 페널티를 받습니다.
오버드라이브는 행동력을 소모하진 않지만, 턴 동안 쿨타임을 가집니다.
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="보루" +LocLongDescription="보너스 방어구 포인트를 받고, 인접한 모든 분대원에게 완전 엄폐를 제공합니다." +LocHelpText="보너스 방어구 포인트를 받고, 인접한 모든 분대원에게 완전 엄폐를 제공합니다." +LocPromotionPopupText=" 보루는 1 방어구 포인트를 부여합니다.
SPARK와 인접한 분대원은 완전 엄폐 보너스를 받습니다.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="무기 공장" +LocLongDescription="BIT는 중화기를 장착하고 사용할 수 있습니다." +LocHelpText="BIT는 중화기를 장착하고 사용할 수 있습니다." +LocPromotionPopupText=" 무기 공장은 SPARK가 중화기를 장착할 수 있게 합니다.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="레인메이커" +LocLongDescription="장착한 중화기는 의 추가 대미지를 입히고 효과 범위가 늘어납니다." +LocHelpText="장착한 중화기는 추가 대미지를 입히고 효과 범위가 늘어납니다." +LocPromotionPopupText=" 레인메이커는 모든 중화기가 의 추가 대미지를 입히게 합니다.
원형 범위에 작용하는 중화기는 반경이 만큼 증가합니다.
원뿔형 범위에 작용하는 중화기는 직경이 , 길이가 만큼 증가합니다.
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="위협" +LocLongDescription="적의 공격을 받으면, 일정 확률로 적을 공포 상태에 빠뜨립니다." +LocHelpText="적의 공격을 받으면, 일정 확률로 적을 공포 상태에 빠뜨립니다." +LocFlyOverText="위협" +LocPromotionPopupText=" SPARK의 방어구가 높은 단계일수록 공격자를 공포 상태에 빠트릴 확률이 증가합니다.
위협은 근접 공격과 광역 공격으로 발동될 수 있습니다.
경계 사격으로는 위협이 발동되지 않습니다.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="위협" +LocLongDescription="적의 공격을 받으면, 일정 확률로 시야 내의 적을 공포 상태에 빠뜨립니다." +LocHelpText="적의 공격을 받으면, 일정 확률로 시야 내의 적을 공포 상태에 빠뜨립니다." +LocFlyOverText="위협" +LocPromotionPopupText="" +LocMissMessage="위협 실패" + +[Repair X2AbilityTemplate] +LocFriendlyName="수리" +LocLongDescription="BIT를 보내 대미지를 입은 아군 로봇을 수리합니다. 고급 BIT는 수리 능력이 약간 더 뛰어납니다." +LocHelpText="BIT를 보내 대미지를 입은 아군 로봇을 수리합니다." +LocFlyOverText="수리" +LocPromotionPopupText=" 수리는 체력을 만큼 치료시킵니다.
BIT를 업그레이드하면 더 많은 체력을 치료할 수 있습니다.
수리를 첫 번째 행동으로 사용하면 턴이 종료되지 않습니다.
수리는 임무당 번씩 사용할 수 있습니다.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="채널링 필드" +LocLongDescription="공격을 받을 때마다 에너지의 일부가 (으)로 채널링됩니다. 이 에너지는 다음번 일반 사격 시 방출됩니다." +LocHelpText="공격을 받으면 에너지를 (으)로 채널링합니다. 채널링된 에너지는 다음번 일반 사격 시 방출됩니다." +LocFlyOverText="채널링된 에너지: +1" +LocPromotionPopupText=" 채널링 필드로 채널링된 에너지는 1 포인트마다 다음번 사격 대미지를 1만큼 증가시킵니다.
다음번 사격이 빗나가도 채널링 필드로 저장된 에너지는 소모됩니다.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="희생" +LocLongDescription="보호 필드를 생성하여 범위 내에 있는 아군을 향한 적의 공격을 이 유닛에게로 유도합니다. 능력 발동 시 방어력과 방어구 보너스를 얻습니다." +LocHelpText="보호 필드를 생성하여 적의 공격을 이 유닛에게로 유도합니다." +LocFlyOverText="희생" +LocPromotionPopupText=" 희생 발동 시 SPARK는 의 방어력과 의 방어구 포인트를 얻습니다.
희생은 턴 동안 쿨타임을 가집니다.
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="적응 조준" +LocLongDescription="오버드라이브 발동 후의 일반 사격은 더 이상 반동력 페널티를 주지 않습니다." +LocHelpText="오버드라이브 발동 후의 일반 사격은 더 이상 반동력 페널티를 주지 않습니다." +LocPromotionPopupText=" 적응 조준은 오버드라이브 발동 후의 연속 일반 사격이 주는 의 조준 페널티를 상쇄합니다.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="무쇠 주먹" +LocLongDescription="이동 범위 내의 적에게 강력한 근접 공격을 가합니다." +LocHelpText="이동 범위 내의 적에게 강력한 근접 공격을 가합니다." +LocPromotionPopupText=" 이동 커서를 적 위에 놓으면 무쇠 주먹 능력을 사용할 수 있습니다.
SPARK는 행동력 2개를 사용해서 \"돌진\"한 다음에도 인접한 적에게 무쇠 주먹을 사용할 수 있습니다.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="레킹 볼" +LocLongDescription="오버드라이브를 발동하면 이동 시 벽과 엄폐물을 부수어 통과합니다." +LocHelpText="오버드라이브를 발동하면 이동 시 벽과 엄폐물을 부수어 통과합니다." +LocPromotionPopupText=" 레킹 볼은 적의 측면을 노출시키는 용도로 활용할 수 있습니다.
SPARK가 엄폐물 및 환경을 파괴하기 위한 최적 경로로 이동할 수 있도록 경로를 설정하십시오.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="폭격" +LocLongDescription="BIT를 시야 내의 지점에 발사하여 강력한 폭발을 일으킵니다. 고급 BIT는 더 많은 대미지를 입힙니다." +LocHelpText="BIT를 발사하여 범위 내의 모든 유닛을 폭발시킵니다." +LocPromotionPopupText=" 폭격은 분대 시야 내 임의의 지역에 사용할 수 있습니다.
BIT를 업그레이드하면 더 많은 대미지를 입힐 수 있습니다.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="헌터 프로토콜" +LocLongDescription="적을 발견하면, %의 확률로 행동력 소모 없이 경계 사격을 가합니다." +LocHelpText="적을 발견하면, %의 확률로 행동력 소모 없이 경계 사격을 가합니다." +LocPromotionPopupText=" 적 발견 즉시 공격이 가능하므로, 헌터 프로토콜은 SPARK가 전장의 안개 속에서 정찰 임무를 이상적으로 수행하게 해줍니다.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="신성" +LocLongDescription="에너지 폭발을 일으켜 주위의 모든 적에게 대미지를 입힙니다. 노바는 행동력을 소모하지 않고 쿨타임이 없으나, 연속으로 사용하면 SPARK는 대미지를 입습니다." +LocHelpText="주위의 모든 적을 폭발시킵니다. 연속으로 노바를 사용하면 SPARK는 대미지를 입습니다." +LocPromotionPopupText=" 노바는 행동력을 소모하지 않으며 쿨타임이 없습니다.
매번 임무에서 노바를 첫 번째로 사용하면 SPARK는 대미지를 입지 않습니다.
이후의 모든 노바 사용은 SPARK에 누적되는 대미지를 입힙니다.
" diff --git a/LongWarOfTheChosen/Localization/XComGame.pol b/LongWarOfTheChosen/Localization/XComGame.pol index 54f5da589..485f2a1f0 100644 --- a/LongWarOfTheChosen/Localization/XComGame.pol +++ b/LongWarOfTheChosen/Localization/XComGame.pol @@ -24,12 +24,25 @@ m_strBlackMarketBody="Dowódco, udało nam się znaleźć czarny rynek. Zdaje si m_strIntroToPsiLabBody="Żółtodzioba można wyszkolić na agenta PSI, przydzielając go do laboratorium psionicznego. Zatrudnienie tam naukowca skróci czas realizacji projektów szkoleniowych." +m_strContinueTraining=IDŹ DO LABOLATORIUM PSIONICZNEGO +m_strPsiTrainingCompleteHelp=Agenci Psi mogą szkolić dodatkowe umiejętności po zdobyciu wystarczającego doświadczenia w terenie. + m_strHelpResHQGoodsDescription="Dowódco, na czarnym rynku można rekrutować nowych naukowców, techników i weteranów!" m_strLowIntelList[1]="Gdy nie masz nic do roboty, zacznij skanować Avengerem dowolną kryjówkę ruchu oporu, aby zyskać informacje." -m_strLowScientistsList[0]="Udaj się Avengerem na czarny rynek. Dzięki temu zobaczysz listę personelu, który możesz zrekrutować." -m_strLowEngineersList[0]="Udaj się Avengerem na czarny rynek. Dzięki temu zobaczysz listę personelu, który możesz zrekrutować." +m_strLowScientistsList[0]=Odwiedź Czarny Rynek Avengerem. Spowoduje to wyświetlenie wszystkich pracowników aktualnie dostępnych do rekrutacji. +m_strLowScientistsList[2]=Naukowiec może być dostępny na Czarnym Rynku i można go zrekrutować, płacąc zasobami. + +m_strLowEngineersList[0]=Odwiedź Czarny Rynek Avengerem. Spowoduje to wyświetlenie wszystkich pracowników aktualnie dostępnych do rekrutacji. +m_strLowEngineersList[2]=Technik może być dostępny na Czarnym Rynku i można go zrekrutować, płacąc zasobami. + +m_strRetributionAlertTitle="ZEMSTA WYBRAŃCA" +m_strRetributionAlertDescription="Wybraniec ograniczył działalność Ruchu Oporu w tym regionie, zmniejszając jego efektywność." +m_strRetributionAlertIncomeDecreasedTitle="KRYJÓWKA SABOTOWANA" +m_strRetributionAlertIncomeDescription="Wydajność działań zaopatrzenia, wywiadu i rekrutacji została zmniejszona o 20%" + +m_strInfirmaryIntroBody=Można tu zatrudnić naukowca, aby skrócić czas potrzebny żołnierzom na regenerację po ranach. Można tu obsadzić żołnierzy, aby usunąć wszelkie negatywne cechy, które nabyli w walce. [XComGame.UIAdventOperations] [UIAdventOperations] @@ -85,6 +98,11 @@ PsiShortNames[8]="Mis." RankNames[8]="Templariusz" ShortNames[8]="Tmp." ++AbilityTreeTitles[0]="Walka przyszłości" ++AbilityTreeTitles[1]="" ++AbilityTreeTitles[2]="Maszyna Wojenna" ++AbilityTreeTitles[3]="XCOM" + RankIcons[0]="UILibrary_Common.rank_rookie" RankIcons[1]="UILibrary_Common.rank_squaddie" RankIcons[2]="UILibrary_Common.rank_lieutenant" @@ -95,12 +113,24 @@ RankIcons[6]="UILibrary_Common.rank_colonel" RankIcons[7]="UILibrary_Common.rank_commander" RankIcons[8]="UILibrary_Common.rank_fieldmarshall" -; LWOTC: Hunker down doesn't remove burning in this mod [HunkerDown X2AbilityTemplate] LocFriendlyName="Kucnięcie" LocHelpText="Zwiększenie obrony o i uniku o . Działa tylko za osłoną." LocFlyOverText="Kucnięcie" +[ReturnFire X2AbilityTemplate] +LocHelpText="Kiedy jesteś celem ostrzału wroga, automatycznie oddaj ogień z pistoletu raz na turę." +LocLongDescription="Kiedy jesteś celem ostrzału wroga, automatycznie oddaj ogień z pistoletu raz na turę." + +[Quickdraw X2AbilityTemplate] +LocLongDescription="Neguje karę za mobilność za noszenie pistoletu, a oddanie strzału z pistoletu w pierwszej akcji nie kończy już Twojej tury." +LocHelpText="Neguje karę za mobilność za noszenie pistoletu, a oddanie strzału z pistoletu w pierwszej akcji nie kończy już Twojej tury." + +[LightningHands X2AbilityTemplate] +LocLongDescription="Strzelaj z pistoletu do celu. Ten atak nie kosztuje żadnej akcji." +LocHelpText="Strzelaj z pistoletu do celu. Ten atak nie kosztuje żadnej akcji." +LocPromotionPopupText=" Błyskawiczne Dłonie mogą dobrze łączyć się z innymi umiejętnościami, gdyż nie uniemożliwia to użycia innych zdolności w tej samej turze.
Błyskawiczne Dłonie mają czas odnowy
" + ;;;;;;;;;;;;;;;;;;;; TECHNICAL ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; [HeavyArmaments X2AbilityTemplate] @@ -128,9 +158,9 @@ LocHelpText="Wystrzelenie kierowanej bomby blasterowej we wskazane miejsce. Nie mieści się w standardowym granatniku XCOM i może być rzucony tylko w widocznego sojusznika.
Grenadier nie może korzystać z tej zdolności, gdy jest ukryty." +LocLongDescription="Specjalistyczny granat dymny, który powoduje, że wybrany sojusznik wchodzi do ukrycia." +LocHelpText="Ukryj pojedynczego sojusznika XCOM." +LocPromotionPopupText=" Ta umiejętność działa tylko na jednego wybranego sojusznika; pozostali w chmurze dymu nie są ukryci, ale otrzymują premię do obrony.
Używa jednej akcji i kończy twoją turę.
Jedno użycie na misję; umiejętności, które dodają ładunki granatów nie zapewniają żadnych bonusów.
Działa tylko na żołnierzach XCOM, ponieważ cywile nie są przeszkoleni w zakresie technik ukrywania się.
< Pocisk/> Mała chmura dymu zapewnia 20 punktów obrony, premie za gęsty dym nie mają zastosowania.
Nie pasuje do standardowego granatnika XCOM i należy rzucić w widocznego sojusznika.
nie może używać tej zdolności, gdy jest ukryta." [VanishingAct X2AbilityTemplate] LocFriendlyName="Granat \"Widmo\"" @@ -362,7 +416,7 @@ LocFriendlyName="Największe bum" LocLongDescription="Twoje granaty i standardowe rakiety mogą zadawać obrażenia krytyczne (% szans na + pkt. obrażeń)." LocHelpText="Twoje granaty i standardowe rakiety mogą zadawać obrażenia krytyczne." LocFlyOverText="Największe bum" -LocPromotionPopupText=" Granaty, standardowe rakiety i mikropociski MEC-ów mogą zadawać obrażenia krytyczne (% szans na + pkt. obrażeń).
Nie dotyczy granatów nie zadających obrażeń ani zdolności \"rakieta wstrząsowa\" i \"niszczyciel bunkrów\".
Trafienia krytyczne z użyciem granatów zadają dodatkowy +1 pkt obrażeń od ciągłych, szkodliwych efektów takich jak ogień, kwas czy gas."" +LocPromotionPopupText=" Granaty, standardowe rakiety i mikropociski MEC mogą zadać obrażenia krytyczne (% i szansy na + obrażenia).
Inne modyfikatory szansy na trafienie krytyczne nie mają wpływu na % szansy na obrażenia krytyczne.
Nie ma zastosowania do nieniszczących granatów, rakiety ogłuszającej ani zdolności Niszczyciela bunkrów.
Granaty trafią krytycznie zapewnia +1 obrażenia trwającym efektom zadającym obrażenia, takim jak ogień. ;;;;;;;;;;;;;;;;;;;; GUNNER ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; @@ -378,16 +432,25 @@ LocFriendlyName="Waleczność" LocLongDescription="Możesz podczas walki wręcz parować ataki swoim nożem bojowym i wyprowadzać nim kontrataki. Zyskujesz też + do uniku." LocHelpText="Możesz podczas walki wręcz parować ataki swoim nożem bojowym i wyprowadzać nim kontrataki." LocFlyOverText="Waleczność" -LocPromotionPopupText=" Podczas walki wręcz masz szansę na sparowanie pierwszego wymierzonego w ciebie ataku w turze i wyprowadzenie kontrataku za pomocą swojego noża bojowego.
Żołnierz zyskuje również + do uniku." +LocPromotionPopupText=" Sparujesz każdy atak wręcz skierowany przeciwko tobie i wykonasz kontratak swoją bronią białą.
Gracze walczący zapewniają + uniknięcie pierwszego ataku wręcz skierowanego przeciwko tobie w turze.
Żołnierz zyskuje także unik ." [Flush X2AbilityTemplate] LocFriendlyName="Wypłoszenie" LocLongDescription="Specjalny strzał z premią do celności, który zadaje niewielkie obrażenia, ale w razie trafienia zmusza cel do zmiany pozycji oraz obniża obronę celu i zmniejsza jego możliwości wykonania uniku." LocHelpText="Specjalny strzał z premią do celności, który zadaje niewielkie obrażenia, ale w razie trafienia zmusza cel do zmiany pozycji oraz obniża obronę celu i zmniejsza jego możliwości wykonania uniku." LocFlyOverText="Wypłoszenie" -LocPromotionPopupText=" Zużywa szt. amunicji.
Odnawianie trwa 2 tury.
Daje premię +30 do celności.
Atak nie powoduje trafień krytycznych i nie zapewnia efektów amunicji.
Cel ataku traci 10 pkt obrony oraz 10 pkt uniku, do czasu rozpoczęcia kolejnej tury przez XCOM." +LocPromotionPopupText=" Zużywa amunicję .
Umiejętność wymaga tur{y} odnowienia.
+ premię do celowania.
Nie można zadać krytycznego ciosu ani zastosować dodatkowych efektów amunicji.
Nie można użyć z ukrycia.
Cel traci obronę i < Umiejętność: FLUSH_DODGE_REDUCTION> unik. Debuff trwa tur." str_FlushEffect="Wypłoszony" +[HailofBullets X2AbilityTemplate] +LocPromotionPopupText=" Grad Pocisków wymaga punktów amunicji.
Umiejętność wymaga tur{y} odnowienia.
Grad Pocisków nie działa z karabinami snajperskimi.
" + +[ChainShot X2AbilityTemplate] +LocPromotionPopupText=" Strzał Łańcuchowy wymaga punktów amunicji.
Umiejętność wymaga tur{y} odnowienia.
Strzał Łańcuchowy może być niszczycielski przeciwko wrogom nie zasłaniającym osłony lub po wzmocnieniu premiami do celowania.
" + +[SaturationFire X2AbilityTemplate] +LocPromotionPopupText=" Nasycony Ogień wymaga punktów amunicji.
Umiejętność wymaga tur{y} odnowienia.
Nasycony Ogień wymaga standardowego strzału do każdego wroga w stożku i uszkodzi lub zniszczy losowe elementy osłony w stożku.
" + ;;;;;;;;;;;;;;;;;;;; RANGER ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; [PointBlank X2AbilityTemplate] @@ -395,14 +458,14 @@ LocFriendlyName="Z przyłożenia" LocLongDescription="Strzał z obrzyna do pobliskiego wroga." LocHelpText="Strzał z obrzyna." LocFlyOverText="Z przyłożenia" -LocPromotionPopupText=" Duża utrata celności przy strzale do przeciwnika oddalonego o więcej niż 4 pola.
Zużywa jedną akcję i nie kończy tury.
Strzelba ma dwa naboje.
" +LocPromotionPopupText=" Szybko traci celność poza zasięgiem czterech pól.
Wykorzystuje jedną akcję.
Strzelba ma dwie sztuki amunicji.
" [BothBarrels X2AbilityTemplate] LocFriendlyName="Obie lufy" LocLongDescription="Wystrzel z obu luf obrzyna w stronę pobliskiego przeciwnika, zadając mu podwójne obrażenia." LocHelpText="Wystrzel z obu luf obrzyna w stronę pobliskiego przeciwnika, zadając mu podwójne obrażenia." LocFlyOverText="Obie lufy" -LocPromotionPopupText=" Wystrzel z obu luf obrzyna w stronę pobliskiego przeciwnika, zadając mu podwójne obrażenia.
Zużywa szt. amunicji.
Zużywa jedną akcję. Nie kończy tury.
" +LocPromotionPopupText=" Wystrzel obie lufy obciętej strzelby w pobliskiego wroga, zadając podwójne obrażenia.
Zużywa amunicję.
Używa jednej akcji.< br/>" [PumpAction X2AbilityTemplate] LocFriendlyName="Repetowanie" @@ -443,7 +506,7 @@ LocFriendlyName="Namierzanie holograficzne" LocLongDescription="Namierz przeciwnika holograficznie, aby w tej turze uzyskać dla siebie i swoich sojuszników premię do celności wszystkich przeprowadzanych na niego ataków." LocHelpText="Namierz przeciwnika holograficznie, aby uzyskać premię, gdy będziesz go atakować." LocFlyOverText="Namierzanie holograficzne" -LocPromotionPopupText=" Namierzanie holograficzne zabiera jedną akcję i nie kończy twojej tury.
Efekt namierzania holograficznego utrzymuje się przez jedną turę.
Efekty wielokrotnego namierzania holograficznego tej samej wrogiej jednostki nie sumują się.
Premia do celności zapewniana przez podstawowy celownik holograficzny wynosi +. Bardziej zaawansowane celowniki holograficzne zapewniają odpowiednio + i +.
Namierzanie holograficzne nie powoduje ujawnienia ciebie ani twojej drużyny." +LocPromotionPopupText=" Namierzanie holograficzne zabiera jedną akcję.
Efekt namierzania holograficznego trwa do rozpoczęcia nowej tury.
Efekty wielokrotnego namierzania holograficznego tej samej wrogiej jednostki nie sumują się.
Premia do celności zapewniana przez podstawowy celownik holograficzny wynosi + i rośnie do + i + przy lepszej technologii.
Namierzanie holograficzne nie powoduje ujawnienia ciebie ani twojej drużyny." [RapidTargeting X2AbilityTemplate] LocFriendlyName="Szybkie namierzanie" @@ -487,9 +550,9 @@ LocPromotionPopupText=" Zdolności \"holografia HD\", \"niezależne nam [AlphaMikeFoxtrot X2AbilityTemplate] LocFriendlyName="Alpha Mike Foxtrot" LocFlyOverText="Alpha Mike Foxtrot" -LocLongDescription="Zadajesz swoją bronią podstawową o pkt. podstawowych obrażeń więcej." -LocHelpText="Zadajesz swoją bronią podstawową o pkt. podstawowych obrażeń więcej." -LocPromotionPopupText=" Zadajesz swoją bronią podstawową o pkt. podstawowych obrażeń więcej." +LocLongDescription="Zadajesz dodatkowe punkty obrażeń podstawowych i dodatkowe punkty dodatkowych obrażeń krytycznych swoją bronią główną." +LocHelpText="Zadajesz dodatkowe punkty obrażeń podstawowych i dodatkowe punkty dodatkowych obrażeń krytycznych swoją bronią główną." +LocPromotionPopupText=" Zadajesz dodatkowe punkty obrażeń podstawowych i dodatkowe punkty dodatkowych obrażeń krytycznych swoją bronią główną." ;;;;;;;;;;;;;;;;;;;; ASSAULT ABILITIES ;;;;;;;;;;;;;;;;;;;;;;; @@ -498,21 +561,21 @@ LocFriendlyName="Ogłuszenie" LocLongDescription="Strzał z miotacza łukowego w celu obezwładnienia celu." LocHelpText="Strzał z miotacza łukowego." LocFlyOverText="Ogłuszenie" -LocPromotionPopupText=" Miotacz łukowy jest skuteczny przeciwko celom znajdującym się w zasięgu wzroku żołnierza. Nie zadaje obrażeń. Po trafieniu ogłusza cele do końca ich następnej tury.
Czas trwania ogłuszenia ulepszonej wersji jest wydłużony.
Wymaga jednej akcji i po użyciu kończy turę żołnierza.
Można korzystać co drugą turę.
Bez dodatkowego szkolenia jest nieskuteczny przeciwko jednostkom zmechanizowanym." +LocPromotionPopupText=" Miotacz łukowy jest skuteczny przeciwko celom znajdującym się w zasięgu wzroku żołnierza. Nie zadaje obrażeń. Po trafieniu ogłusza cele do końca ich następnej tury.
Wymaga jednej akcji i po użyciu kończy turę żołnierza.
Można korzystać co drugą turę.
Bez dodatkowego szkolenia jest nieskuteczny przeciwko jednostkom zmechanizowanym." [EMPulser X2AbilityTemplate] -LocFriendlyName="Impulsor łukowy" +LocFriendlyName="Miotacz łukowy" LocLongDescription="Strzał z miotacza łukowego w celu obezwładnienia celu i uszkodzenia mechanicznych jednostek wroga." LocHelpText="Strzał z impulsora łukowego." -LocFlyOverText="Impulsor łukowy" -LocPromotionPopupText=" Miotacz łukowy jest skuteczny przeciwko celom znajdującym się w zasięgu wzroku żołnierza. Nie zadaje obrażeń. Po trafieniu ogłusza cele do końca ich następnej tury.
Czas trwania ogłuszenia ulepszonej wersji jest wydłużony.
Wymaga jednej akcji i po użyciu kończy turę żołnierza.
Można korzystać z niego co drugą turę.
Liczba obrażeń zadawanych jednostkom mechanicznym zaczyna się od 3 punktów i rośnie wraz z ulepszaniem technologii miotacza łukowego.
Zmniejsza obronę przeciwnika przed hakowaniem o 20.
" +LocFlyOverText="Miotacz łukowy" + Miotacz łukowy jest skuteczny w dowolnym miejscu w zasięgu wzroku żołnierza.
Wymaga jednej akcji i po wystrzale kończy turę żołnierza.
Można używać co drugą turę.< br/> Obrażenia jednostek mechanicznych zwiększają się wraz z ulepszaniem technologii miotacza łuku.
Zmniejsza obronę przed hackowaniem wroga o .
" [EMPulserPassive X2AbilityTemplate] -LocFriendlyName="Impulsor łukowy" -LocLongDescription="Twój miotacz łukowy zadaje teraz obrażenia mechanicznym jednostkom wroga i obniża ich obronę przed hakowaniem." +LocFriendlyName="Miotacz łukowy" +LocLongDescription="Strzał z miotacza łukowego w celu obezwładnienia celu i uszkodzenia mechanicznych jednostek wroga." LocHelpText="Strzał z impulsora łukowego." -LocFlyOverText="Impulsor łukowy" -LocPromotionPopupText=" Impulsor łukowy jest skuteczny przeciwko celom znajdującym się w zasięgu wzroku żołnierza. Nie zadaje obrażeń. Po trafieniu ogłusza cele do końca ich następnej tury.
Czas trwania ogłuszenia ulepszonej wersji jest wydłużony.
Wymaga jednej akcji i po użyciu kończy turę żołnierza.
Można korzystać z niego co drugą turę.
Liczba obrażeń zadawanych jednostkom mechanicznym zaczyna się od 3 punktów i rośnie wraz z ulepszaniem technologii miotacza łukowego.
Zmniejsza obronę przeciwnika przed hakowaniem o 20.
" +LocFlyOverText="Miotacz łukowy" + Miotacz łukowy jest skuteczny w dowolnym miejscu w zasięgu wzroku żołnierza.
Wymaga jednej akcji i po wystrzale kończy turę żołnierza.
Można używać co drugą turę.< br/> Obrażenia jednostek mechanicznych zwiększają się wraz z ulepszaniem technologii miotacza łuku.
Zmniejsza obronę przed hackowaniem wroga o .
" [Electroshock X2AbilityTemplate] LocFriendlyName="Elektrowstrząs" @@ -526,21 +589,21 @@ LocFriendlyName="Ogłuszający strzelec" LocLongDescription="Twój miotacz łukowy ma teraz premię do szansy trafienia." LocHelpText="Twój miotacz łukowy otrzymuje premię do szansy trafienia." LocFlyOverText="Ogłuszający strzelec" -LocPromotionPopupText=" Podstawowa wielkość premii do szansy trafienia wynosi +20 i rośnie wraz z ulepszaniem technologii miotaczy łukowych do maksymalnego poziomu +30." +LocPromotionPopupText=" Premia zaczyna się od + i rośnie wraz z ulepszaniem miotacza łukowego, maksymalnie do +." [StreetSweeper2 X2AbilityTemplate] LocFriendlyName="Uliczny wymiatacz" +LocFlyOverText="Uliczny wymiatacz" LocLongDescription="Atak strzelbą o polu rażenia w kształcie stożka zadający zwiększone obrażenia nieopancerzonym przeciwnikom. Blokowany przez ciężką osłonę." LocHelpText="Atak strzelbą o polu rażenia w kształcie stożka zadający zwiększone obrażenia nieopancerzonym przeciwnikom. Blokowany przez ciężką osłonę." -LocFlyOverText="Uliczny wymiatacz" -LocPromotionPopupText=" Atak strzelbą o średnim zasięgu i polu rażenia w kształcie stożka.
Pole rażenia jest blokowane przez ciężką osłonę.
Zużywa jedną akcję i sztuki amunicji. Odnowienie trwa 4 tury.
Zadaje obrażenia zwiększone o 3 nieopancerzonym celom znajdującym się w polu rażenia.
Atak nie może być wykorzystywany z bronią inną niż strzelba.
Atak ten może zadać obrażenia sojusznikom.
" +LocPromotionPopupText=" Atak ze strzelby średniego zasięgu, oparty na stożku.
Wzór rozprzestrzeniania się jest blokowany przez ciężką osłonę.
Używa jednej akcji i amunicji .
Umiejętność wymaga tur{y} odnowienia.
Zadaje dodatkowe obrażenia przeciwko nieopancerzonym celom w obszarze rozprzestrzeniania się.
Nie można używać z bronią inną niż strzelba.
Sojusznicy mogą zostać ranni w wyniku tego ataku.
" [ChainLightning X2AbilityTemplate] -LocFriendlyName="Seria błyskawic" -LocLongDescription="Wystrzel z miotacza łukowego do każdego widocznego wroga, którego da się ogłuszyć." -LocHelpText="Wystrzel z miotacza łukowego do każdego widocznego wroga, którego da się ogłuszyć." -LocFlyOverText="Seria błyskawic" -LocPromotionPopupText=" Możesz strzelić z miotacza łukowego do każdego widocznego wroga, którego da się ogłuszyć.
Użycie wymaga jednej akcji i kończy twoją turę.
Odnawianie trwa 5 tur.
Zdolność nie może zostać użyta przez żołnierza pozostającego w ukryciu." +LocFriendlyName="Łańcuch błyskawic" +LocLongDescription="Atak miotacza łukowego, który przeskakuje od celu do celu maksymalnie 4 razy, przy czym każdy cel znajduje się w promieniu 6 pól od siebie." +LocHelpText="Atak miotacza łukowego, który przeskakuje od celu do celu maksymalnie 4 razy, przy czym każdy cel znajduje się w promieniu 6 pól od siebie." +LocFlyOverText="Łańcuch błyskawic" +LocPromotionPopupText=" Wystrzeliwuje miotacz łukowy w cel w polu widzenia, przy czym łuk łączy się maksymalnie 4 razy z innymi celami w promieniu 6 pól od siebie.
Wymaga jednej akcji i kończy twoją turę.
Umiejętność wymaga tur{y} odnowienia.
Nie można go używać z ukrycia.; End Translation (3) [Leadership X2AbilityTemplate] LocFriendlyName="Przywództwo" @@ -592,38 +655,38 @@ LocFlyOverText="Elitarna luneta" [Hair_Trigger_LW_Bsc_Ability X2AbilityTemplate] LocFriendlyName="Miękki spust" -LocLongDescription="Otrzymujesz premię + do szansy trafienia strzału reakcji oddanego z broni głównej." +LocLongDescription="Otrzymujesz + (po karze za ogień reakcji), aby trafić strzałami w reakcji na ogień swoją bronią główną." LocHelpText="Miękki spust: premia do szansy trafienia strzału reakcji" LocFlyOverText="Miękki spust" [Hair_Trigger_LW_Adv_Ability X2AbilityTemplate] LocFriendlyName="Zaawansowany miękki spust" -LocLongDescription="Otrzymujesz premię + do szansy trafienia strzału reakcji oddanego z broni głównej." +LocLongDescription="Otrzymujesz + (po karze za ogień reakcji), aby trafić strzałami w reakcji na ogień swoją bronią główną." LocHelpText="Miękki spust: premia do szansy trafienia strzału reakcji" LocFlyOverText="Zaawansowany miękki spust" [Hair_Trigger_LW_Sup_Ability X2AbilityTemplate] LocFriendlyName="Elitarny miękki spust" -LocLongDescription="Otrzymujesz premię + do szansy trafienia strzału reakcji oddanego z głównej broni." +LocLongDescription="Otrzymujesz + (po karze za ogień reakcji), aby trafić strzałami w reakcji na ogień swoją bronią główną." LocHelpText="Miękki spust: premia do szansy trafienia strzału reakcji" LocFlyOverText="Elitarny miękki spust" [Stock_LW_Bsc_Ability X2AbilityTemplate] LocFriendlyName="Stabilizacja broni" -LocLongDescription="Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celności i + do szansy na trafienie krytyczne następnego strzału z aktualnie wybranej broni. Premia przepada jeśli następną akcją nie jest strzał lub objęty nią żołnierz zostanie ranny." -LocHelpText="Stabilizacja broni: premia do szansy trafienia następnego strzału, jeśli żołnierz nie jest ranny, ani nie wykonał przed strzałem innej akcji" +LocLongDescription="Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celowania i trafienia krytycznego przy następnym strzale z wyposażonej broni. Premia zostanie utracona, jeśli wykonasz działania inne niż strzelanie lub zostaniesz ranny." +LocHelpText="Stabilizacja broni: premia do trafienia przy następnym strzale, jeśli nie jesteś ranny ani nie wykonasz innej akcji" LocFlyOverText="Stabilizacja broni" [Stock_LW_Adv_Ability X2AbilityTemplate] LocFriendlyName="Stabilizacja broni" -LocLongDescription="Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celności i + do szansy na trafienie krytyczne następnego strzału z aktualnie wybranej broni. Premia przepada jeśli następną akcją nie jest strzał lub objęty nią żołnierz zostanie ranny." -LocHelpText="Stabilizacja broni: premia do szansy trafienia następnego strzału, jeśli żołnierz nie jest ranny, ani nie wykonał przed strzałem innej akcji" +"Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celowania i trafienia krytycznego przy następnym strzale z wyposażonej broni. Premia zostanie utracona, jeśli wykonasz działania inne niż strzelanie lub zostaniesz ranny." +LocHelpText="Stabilizacja broni: premia do trafienia przy następnym strzale, jeśli nie jesteś ranny ani nie wykonasz innej akcji" LocFlyOverText="Stabilizacja broni" [Stock_LW_Sup_Ability X2AbilityTemplate] LocFriendlyName="Stabilizacja broni" -LocLongDescription="Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celności i + do szansy na trafienie krytyczne następnego strzału z aktualnie wybranej broni. Premia przepada jeśli następną akcją nie jest strzał lub objęty nią żołnierz zostanie ranny" -LocHelpText="Stabilizacja broni: premia do szansy trafienia następnego strzału, jeśli żołnierz nie jest ranny, ani nie wykonał przed strzałem innej akcji" +"Aktywuj zdolność \"stabilizacja broni\", aby uzyskać premię + do celowania i trafienia krytycznego przy następnym strzale z wyposażonej broni. Premia zostanie utracona, jeśli wykonasz działania inne niż strzelanie lub zostaniesz ranny." +LocHelpText="Stabilizacja broni: premia do trafienia przy następnym strzale, jeśli nie jesteś ranny ani nie wykonasz innej akcji" LocFlyOverText="Stabilizacja broni" [Needle_Rounds_Ability X2AbilityTemplate] @@ -647,10 +710,10 @@ LocHelpText="Premia +2 do obrażeń przy trafieniu w nieopancerzony cel. +1 punk [Redscreen_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Pociski \"Czerwony Ekran\"" LocFlyOverText="Pociski \"Czerwony Ekran\"" -LocLongDescription="Każde trafienie obniża obronę celu przed hakowaniem celu o punktów." -LocHelpText="Każde trafienie obniża obronę celu przed hakowaniem celu o punktów." +LocLongDescription="Obniża obronę celu przed hakowaniem . Nie kumuluje się, ale odświeża." +LocHelpText="Obniża obronę celu przed hakowaniem . Nie kumuluje się, ale odświeża." -[Stiletto_Rounds_Ability_PP X2AbilityTemplate] +[Stiletto_Rounds_Ability X2AbilityTemplate] LocFriendlyName="Pociski \"Stiletto\"" LocFlyOverText="Pociski \"Stiletto\"" LocLongDescription="Premia +2 do obrażeń przy trafieniu jednostki obcych niebędącej robotem. +1 punkt obrażeń dla wszystkich rodzajów przeciwników." @@ -812,6 +875,12 @@ FriendlyNamePlural="Magnetyczne obrzyny" BriefSummary="Ulepszona wersja obrzyna, w której zastosowano technologię przyśpieszania magnetycznego, by zwiększyć jego siłę rażenia." TacticalText=" Ulepszona wersja obrzyna, w której zastosowano technologię przyśpieszania magnetycznego, by zwiększyć jego siłę rażenia.
Bez ulepszeń oferuje tylko dwa strzały na misję.
" +[SawedOffShotgun_BM X2WeaponTemplate] +FriendlyName="Plasmowy obrzyn" +FriendlyNamePlural="Plasmowe obrzyny" +BriefSummary="Ulepszona wersja obrzyna, w której zastosowano technologię podgrzewania plazmowego, by zwiększyć jego siłę rażenia." +TacticalText=" Ulepszona wersja obrzyna, w której zastosowano technologię podgrzewania plazmowego, by zwiększyć jego siłę rażenia.
Bez ulepszeń oferuje tylko dwa strzały na misję.
" + [ArcThrower_CV X2WeaponTemplate] FriendlyName="Miotacz łukowy" FriendlyNamePlural="Miotacze łukowe" @@ -868,6 +937,21 @@ BriefSummary="Niebezpieczna broń biała służąca do obrony podczas walki w zw TacticalText=" Atak nożem zabiera jedną akcję i nie kończy twojej tury.
" AbilityDescName="nóż bojowy" +;LWOTC needs translation +[CombatKnife_BM X2WeaponTemplate] +FriendlyName="Zaawansowane wibroostrze" +FriendlyNamePlural="Zaawansowane wibroostrza" +BriefSummary="Niebezpieczna broń biała służąca do obrony podczas walki w zwarciu. Zaawansowane wibroostrze zostało udoskonalone, aby było ostrzejsze, mocniejsze i bardziej precyzyjne." +TacticalText=" Atak nożem zabiera jedną akcję i nie kończy twojej tury.
" +AbilityDescName="nóż bojowy" + +[LWGauntlet_CV X2MultiWeaponTemplate] +FriendlyName="Rękawica" +FriendlyNamePlural="Rękawice" +BriefSummary="Ta kombinacja miotacza ognia i minirakiet została opracowana dla naszych techników, aby radzili sobie w różnych sytuacjach bojowych." +TacticalText=" Rękawica XCOM to zaawansowane urządzenie, w którym mieści się zarówno wyrzutnia minirakiet, jak i miotacz ognia.
Wyrzutnia rakiet początkowo unosi jedną rakietę, a jej promień wynosi trzy pola efektu.
Może celować we wszystko w zasięgu wzroku.
Obrażenia od rakiet spadają w miejscu trafienia.
Miotacz ognia to broń broń krótkiego zasięgu, która zadaje obrażenia wielu celom w obszarze działania w kształcie stożka.
Miotacz ognia ma dwa ładunki i nie uszkadza jednostek mechanicznych bez ulepszeń.
Korzystanie z którejkolwiek umiejętności rękawicy wymaga jednej akcji i kończy twoją turę.
Na celność rakiety wpływa cel żołnierza, odległość do celu oraz to, czy żołnierz wykonał już jakieś akcje w tej turze. Niska celność rakiety zaowocuje wyższą wartością rozrzutu, co oznacza, że istnieje większe prawdopodobieństwo, że nie trafią w cel przy większych odległościach. Maksymalny możliwy rozrzut rakiety jest wyświetlany w wyskakującym okienku, a wartość pojawiająca się wraz z kursorem celu pokazuje oczekiwany (średni) rozrzut strzału w tę lokalizację.” +AbilityDescName="rękawica" + ; This should probably never really be seen as it's a "hidden" item like the XPad [EvacFlare X2WeaponTemplate] FriendlyName="Flara ewakuacyjna" @@ -886,39 +970,128 @@ FriendlyName="Karabin magnetyczny" FriendlyNamePlural="Karabiny magnetyczne" [AssaultRifle_CG X2WeaponTemplate] -FriendlyName="Karabin cewkowy" -FriendlyNamePlural="Karabiny cewkowe" -BriefSummary="Potężna przeciwpancerna broń cewkowa średniego zasięgu, która pełni funkcje karabinu szturmowego." -TacticalText=" Broń cewkowa ignoruje 1 punkt pancerza wroga.
Oddanie strzału z broni głównej żołnierza kończy jego turę, jeśli nie przeszedł on specjalnego szkolenia.\n Używaj ulepszeń zdobytych na jednostkach ADVENT-u, żeby zwiększyć skuteczność taktyczną karabinów cewkowych.
" +FriendlyName="Karabin Gaussa" +FriendlyNamePlural="Karabiny Gaussa" +BriefSummary="Potężna przeciwpancerna broń Gaussa średniego zasięgu, która pełni funkcje karabinu szturmowego." +TacticalText=" Broń Gaussa ignoruje 1 punkt pancerza wroga.
Oddanie strzału z broni głównej żołnierza kończy jego turę, jeśli nie przeszedł on specjalnego szkolenia.\n Używaj ulepszeń zdobytych na jednostkach ADVENT-u, żeby zwiększyć skuteczność taktyczną karabinów Gaussa.
" AbilityDescName="karabin szturmowy" [Cannon_CG X2WeaponTemplate] FriendlyName="Działko Gaussa" FriendlyNamePlural="Działka Gaussa" -BriefSummary="Potężna, automatyczna broń cewkowa o olbrzymiej szybkostrzelności." -TacticalText=" Broń cewkowa ignoruje 1 punkt pancerza wroga.
Działka to automatyczna broń przewyższająca karabiny pod względem ilości amunicji i wielkości zadawanych obrażeń. Ich wadą jest to, że są nieporęczne.
Używaj ulepszeń zdobytych na jednostkach ADVENT-u, żeby zwiększyć skuteczność taktyczną działek cewkowych.
" +BriefSummary="Potężna, automatyczna broń Gaussa o olbrzymiej szybkostrzelności." +TacticalText=" Broń Gaussa ignoruje 1 punkt pancerza wroga.
Działka to automatyczna broń przewyższająca karabiny pod względem ilości amunicji i wielkości zadawanych obrażeń. Ich wadą jest to, że są nieporęczne.
Używaj ulepszeń zdobytych na jednostkach ADVENT-u, żeby zwiększyć skuteczność taktyczną działek Gaussa.
" AbilityDescName="działko" [SniperRifle_CG X2WeaponTemplate] FriendlyName="Długi karabin Gaussa" FriendlyNamePlural="Długie karabiny Gaussa" -BriefSummary="Przedłużony karabin cewkowy wykorzystywany przez strzelców wyborowych." -TacticalText=" Broń cewkowa ignoruje 1 punkt pancerza wroga.\n Bez specjalnego szkolenia strzał z karabinu snajperskiego zazwyczaj wymaga wydania obu akcji.\n Karabiny snajperskie są mniej celne z bliska, ale zabójczo skuteczne z dużej odległości.\n Używaj ulepszeń zdobytych od wrogów, żeby zwiększyć skuteczność taktyczną długiego karabinu Gaussa." +BriefSummary="Przedłużony karabin Gaussa wykorzystywany przez strzelców wyborowych." +TacticalText=" Broń Gaussa ignoruje 1 punkt pancerza wroga.\n Bez specjalnego szkolenia strzał z karabinu snajperskiego zazwyczaj wymaga wydania obu akcji.\n Karabiny snajperskie są mniej celne z bliska, ale zabójczo skuteczne z dużej odległości.\n Używaj ulepszeń zdobytych od wrogów, żeby zwiększyć skuteczność taktyczną długiego karabinu Gaussa." AbilityDescName="karabin snajperski" [Shotgun_CG X2WeaponTemplate] -FriendlyName="Strzelba rozpryskowa" -FriendlyNamePlural="Strzelby rozpryskowe" +FriendlyName="Strzelba rozpryskowa Gaussa" +FriendlyNamePlural="Strzelba rozpryskowa Gaussa" BriefSummary="Cewkowa broń o małym zasięgu pełniąca rolę strzelby." -TacticalText=" Broń cewkowa ignoruje 1 punkt pancerza wroga.
Broń przypominająca strzelbę jest niezwykle skuteczna w walce z bliska, ale jej celność gwałtownie spada wraz z dystansem.\n Używaj ulepszeń odebranych wrogom, żeby zwiększyć skuteczność taktyczną strzelby rozpryskowej." +TacticalText=" Broń Gaussa ignoruje 1 punkt pancerza wroga.
Broń przypominająca strzelbę jest niezwykle skuteczna w walce z bliska, ale jej celność gwałtownie spada wraz z dystansem.\n Używaj ulepszeń odebranych wrogom, żeby zwiększyć skuteczność taktyczną strzelby rozpryskowej." AbilityDescName="strzelba" [SMG_CG X2WeaponTemplate] -FriendlyName="Cewkowiec maszynowy" -FriendlyNamePlural="Cewkowiec maszynowy" -BriefSummary="Lżejsza wersja karabinu cewkowego, strzelająca mniejszymi pociskami, ale zapewniająca jej użytkownikowi większą mobilność na polu walki." -TacticalText=" Broń cewkowa ignoruje 1 punkt pancerza wroga.\n W porównaniu z karabinami szturmowymi broń przypominająca pistolety maszynowe daje premie do mobilności, celności w walce na krótki dystans i do ukrywania się. Zadaje jednak mniejsze obrażenia, ma mniejszy zapas amunicji i otrzymuje kary do celności przy większych odległościach.
" -AbilityDescName="PM" +FriendlyName="SMG Gaussa" +FriendlyNamePlural="SMG Gaussa" +BriefSummary="Lżejsza wersja karabinu Gaussa, strzelająca mniejszymi pociskami, ale zapewniająca jej użytkownikowi większą mobilność na polu walki." +TacticalText=" Bronie Gaussa automatycznie przebijają (ignorują) 1 pancerz wroga.
Bronie w stylu pistoletu maszynowego zapewniają dodatkową mobilność, celność w zwarciu i maskowanie w porównaniu do karabinów szturmowych, ale zadają mniejsze obrażenia i podlegają karom do celności na dużym dystansie .
" +AbilityDescName="SMG" + +; Bullpup changes and new templates +[Bullpup_CV X2WeaponTemplate] +TacticalText=" Broń typu Bullpup jest niezwykle skuteczna na bliskim dystansie i została zaprojektowana do taktyki „uderz i uciekaj”.\n Zwiększa także mobilność Renegatów i poprawia zdolność do prześlizgiwania się niezauważonym przez siły ADVENTU.\n Korzystaj z ulepszeń zrabowanych wrogom, aby poprawić skuteczność taktyczną." + +[Bullpup_LS X2WeaponTemplate] +FriendlyName="Kal-13 \"Bullpup\"" +FriendlyNamePlural="Kal-13 \"Bullpups\"" +BriefSummary="Możemy wyprodukować zmodyfikowany laserowy pistolet maszynowy, którego mogą używać Renegaci. Chociaż dr Tygan słusznie stwierdził, że w rzeczywistości nie jest to Bullpup, jego kompaktowa rama i dodatkowe ulepszenia, które wprowadziliśmy, wystarczą, aby poważnie rozważ jego użycie w bitwie.” +TacticalText=" Bronie laserowe mają dodatkowy cel.\n Bronie typu Bullpup są niezwykle skuteczne na bliskim dystansie i są przeznaczone do taktyki uderz i uciekaj.\n Zwiększa także mobilność Renegatów i poprawia zdolność zdolność do prześlizgiwania się niezauważonym przez siły ADVENTU.\n Korzystaj z ulepszeń zrabowanych wrogom, aby poprawić skuteczność taktyczną." +AbilityDescName="bullpup" + +[Bullpup_MG X2WeaponTemplate] +TacticalText=" Bronie typu Bullpup są niezwykle skuteczne na bliskim dystansie i są przeznaczone do taktyki uderz i uciekaj.\n Zwiększa także mobilność Renegatów i poprawia zdolność zdolność do prześlizgiwania się niezauważonym przez siły ADVENTU.\n Korzystaj z ulepszeń zrabowanych wrogom, aby poprawić skuteczność taktyczną." + +[Bullpup_CG X2WeaponTemplate] +FriendlyName="Kal-69 \"Bullpup\"" +FriendlyNamePlural="Kal-69 \"Bullpups\"" +BriefSummary="Ponieważ rama Bullpup, którą Renegaci wykorzystują w swojej broni, okazała się zbyt słaba, aby móc kontrolować odrzut broni Gaussa i wytrzymać potencjalne uszkodzenia, zamiast tego zdecydowaliśmy się zaadaptować model naszych SMG do użytku w terenie, tak jak to zrobiliśmy z Kal-13 „Bullpup”.” +TacticalText=" Bronie Gaussa automatycznie przebijają (ignorują) 1 pancerz wroga.\n Bronie typu Bullpup są niezwykle skuteczne na bliskim dystansie i są przeznaczone do taktyki uderz i uciekaj.\n Zwiększa także mobilność Renegatów i poprawia zdolność zdolność do prześlizgiwania się niezauważonym przez siły ADVENTU.\n Korzystaj z ulepszeń zrabowanych wrogom, aby poprawić skuteczność taktyczną." +AbilityDescName="bullpup" + +[Bullpup_BM X2WeaponTemplate] +TacticalText=" Broń plazmowa powoduje, że cele otrzymują 1 dodatkowe obrażenia przy przyszłych trafieniach.\n Bronie typu Bullpup są niezwykle skuteczne na bliskim dystansie i są przeznaczone do taktyki uderz i uciekaj.\n Zwiększa także mobilność Renegatów i poprawia zdolność zdolność do prześlizgiwania się niezauważonym przez siły ADVENTU.\n Korzystaj z ulepszeń zrabowanych wrogom, aby poprawić skuteczność taktyczną." + +; Vektor Rifle changes and new crossbows +[VektorRifle_CV X2WeaponTemplate] +TacticalText=" Karabin wektorowy podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną." + +[CrossbowVektor_CV X2WeaponTemplate] +FriendlyName="Kusza taktyczna" +FriendlyNamePlural="Kusze taktyczne" +BriefSummary="Cicha kusza bloczkowa, którą wielu Żniwiarzy woli od konwencjonalnej broni palnej. +TacticalText=" Kusza podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną." +AbilityDescName="kusza" + +[Vektor_LS X2WeaponTemplate] +FriendlyName="Laserowy karabin wektorowy" +FriendlyNamePlural="Laserowe karabiny wektorowe" +BriefSummary="Eksperymentalny projekt broni laserowej, wywodzący się ze starej Rosji, wektorowy karabin laserowy, ma parametry zbliżone do tradycyjnych karabinów wyborowych używanych przez Żniwiarzy. Teraz wyposażony w nowoczesną osłonę ze stopu i kompaktowe źródło zasilania, jest to całkiem potężna broń w rękach utalentowanego snajpera." +TacticalText=" Broń laserowa otrzymuje premię do celowania.
Karabin wektorowy podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną. +AbilityDescName="karabin wektorowy" + +[VektorRifle_MG X2WeaponTemplate] +TacticalText=" Karabin Vektor podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną. + +[Vektor_CG X2WeaponTemplate] +FriendlyName="Temnotyczna Lanca" +FriendlyNamePlural="Temnotyczne Lance" +BriefSummary="Pomimo oczywistej siły ognia naszej technologii karabinu Gaussa, brak niezawodności i kosztowna konserwacja sprawiły, że Żniwiarze jak dotąd niechętnie adaptowali je do starego karabinu Temnotycznego. Ta nowa broń jest wynikiem kompromisu, w ramach którego dołożyliśmy wszelkich starań, aby zminimalizować liczbę części, które mogłyby ulec uszkodzeniu lub pęknąć podczas pracy w terenie." +TacticalText=" Bronie Gaussa automatycznie przebijają (ignorują) 1 pancerz wroga.
Karabin wektorowy podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną. +AbilityDescName="karabin wektorowy" + +[VektorRifle_BM X2WeaponTemplate] +TacticalText=" Broń plazmowa powoduje, że cele otrzymują 1 dodatkowe obrażenia przy przyszłych trafieniach.
To najbardziej zaawansowany wariant karabinu wektorowego dostępny w arsenale XCOM.
Karabin wektorowy podlega karze za trafienie z bliskiej odległości, ale można go użyć w zasięgu wzroku drużyny.
Broń podlega rosnącej karze do celowania z 4 pól poza zasięgiem wzroku drużyny.
Wykorzystaj ulepszenia zrabowane wrogom, aby zwiększyć skuteczność taktyczną. + +[SPARKChaingun X2WeaponTemplate] +FriendlyName="Ciężki Chaingun" +FriendlyNamePlural="Ciężkie Chainguny" +BriefSummary="Masywny Chaingun o niszczycielskich możliwościach przeciwpiechotnych.” +TacticalText=" Konstrukcja tej broni opiera się na planach R. Shena z oryginalnej inwazji obcych.\n Jest funkcjonalnie identyczna z działkiem automatycznym. " +AbilityDescName="Ciężki Chaingun" + +[SparkRifle_LS X2WeaponTemplate] +FriendlyName="Ciężki Railgun" +FriendlyNamePlural="Ciężkie Railguny" +BriefSummary="Ciężki Railgun wystrzeliwuje pociski dużego kalibru z ekstremalną prędkością, które zadają ogromne obrażenia." +TacticalText=" Broń laserowa otrzymuje premię do celowania.\n Ciężki Railgun jest laserowym odpowiednikiem działka automatycznego." +AbilityDescName="Ciężki Railgun" + +[SparkRifle_CG X2WeaponTemplate] +FriendlyName="Działko cząsteczkowe" +FriendlyNamePlural="Działka cząsteczkowe" +BriefSummary="Działko cząsteczkowe wykorzystuje kilka konturów przyspieszenia, aby wytworzyć skupioną wiązkę doładowanych cząstek, która pozostaje skuteczna w każdym zakresie.” +TacticalText=" Bronie Gaussa automatycznie przebijają (ignorują) 1 pancerz wroga.
Działko cząsteczkowe zasilanym technologią Gaussa odpowiednikiem działka automatycznego." +AbilityDescName="działko cząsteczkowe" + +[BattleScanner X2WeaponTemplate] +TacticalText=" Skanery Bitewne ujawniają obszar ukryty za „mgłą wojny” przez wiele tur.\n Skanery Bitewne ujawniają także ukrytych lub przebranych wrogów.\n Doradca Kryjówki niosący Skaner Bitewny zmniejszy szansę werbowania rebeliantów o 40% (kumuluje się z innymi podobnymi umiejętnościami)." + +; LWOTC Needs Translation (2) +[AdvStunLancerM1_StunLance X2WeaponTemplate] +AbilityDescName="Lanca obezwładniająca" + +[AdvStunLancerM2_StunLance X2WeaponTemplate] +AbilityDescName="Lanca obezwładniająca" + +[AdvStunLancerM3_StunLance X2WeaponTemplate] +AbilityDescName="Lanca obezwładniająca" ;;;;;;;;;;;;;;;;;; GEAR LOC OVERRIDES ;;;;;;;;;;;;;;;;;;;; @@ -993,21 +1166,21 @@ m_strRemoveUpgrade="USUŃ ULEPSZENIE" [FreeFireUpgrade_Bsc X2WeaponUpgradeTemplate] FriendlyName="Miękki spust" FriendlyNamePlural="Miękkie spusty" -BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji." +BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji (po karze za reakcje)." TinySummary="Premia do celności strzału reakcji" LootTooltip="Po zainstalowaniu to ulepszenie broni zapewnia premię do celności strzałów reakcji." [FreeFireUpgrade_Adv X2WeaponUpgradeTemplate] FriendlyName="Zaawansowany miękki spust" FriendlyNamePlural="Zaawansowane miękkie spusty" -BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji." +BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji (po karze za reakcje)." TinySummary="Premia do celności strzału reakcji" LootTooltip="Po zainstalowaniu to ulepszenie broni zapewnia premię do celności strzałów reakcji." [FreeFireUpgrade_Sup X2WeaponUpgradeTemplate] FriendlyName="Elitarny miękki spust" FriendlyNamePlural="Elitarne miękkie spusty" -BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji." +BriefSummary="Żołnierz otrzymuje premię + do celności strzałów reakcji (po karze za reakcje)." TinySummary="Premia do celności strzału reakcji" LootTooltip="Po zainstalowaniu to ulepszenie broni zapewnia premię do celności strzałów reakcji." @@ -1074,13 +1247,20 @@ BriefSummary="W ogromnym stopniu tłumi dzwięki wydobywające się z broni żo TinySummary="Skraca czas infiltracji podczas misji" LootTooltip="Te ulepszenie broni, kiedy jest zainstalowane, redukuje czas jaki jest wymagany do przeprowadzenia inflirtacji danej misji. Także tłumi dźwięki broni w czasie walki." +[CritUpgrade_Bsc X2WeaponUpgradeTemplate] +BriefSummary="Zwiększa szansę na trafienie krytyczne o +%." + +[CritUpgrade_Adv X2WeaponUpgradeTemplate] +BriefSummary="Zwiększa szansę na trafienie krytyczne o +%." + [CritUpgrade_Sup X2WeaponUpgradeTemplate] FriendlyName="Elitarny celownik laserowy" FriendlyNamePlural="Elitarne celowniki laserowe" +BriefSummary="Zwiększa szansę na trafienie krytyczne o +%." [ClipSizeUpgrade_Sup X2WeaponUpgradeTemplate] -FriendlyName="Elitarny większy magazynek" -FriendlyNamePlural="Elitarne większe magazynki" +FriendlyName="Elitarny powiększony magazynek" +FriendlyNamePlural="Elitarne powiększone magazynki" [ReloadUpgrade_Sup X2WeaponUpgradeTemplate] FriendlyName="Elitarna automatyczna ładownica" @@ -1241,8 +1421,8 @@ TacticalText=" Premia +2 do obrażeń przy trafieniu w nieopancerzony c [RedScreenRounds X2AmmoTemplate] FriendlyName="Pociski \"Czerwony Ekran\"" FriendlyNamePlural="Pociski \"Czerwony Ekran\"" -BriefSummary="Każde trafienie obniża obronę przed hakowaniem przeciwnika o 25 punktów." -TacticalText=" Każde trafienie obniża obronę przed hakowaniem przeciwnika o 25 punktów.
W danej chwili można korzystać tylko z jednego rodzaju ulepszonej amunicji." +BriefSummary="Obniża obronę wroga przed hackowaniem o . Nie kumuluje się ze sobą, ale odświeża." +TaktyczneText=" Obniża obronę wroga przed hackowaniem o .
Kumuluje się z innymi źródłami redukcji obrony przed hackowaniem, takimi jak bomby \"Niebieski Ekran\".
Tylko jedno ulepszenie amunicji może być wyposażone na raz.” [NeedleRounds X2AmmoTemplate] FriendlyName="Pociski igłowe" @@ -1256,6 +1436,9 @@ FriendlyNamePlural="Pociski \"Rozrywacz\"" BriefSummary="Każde trafienie odbiera wrogowi 2 punkt pancerza." TacticalText=" Każde trafienie odbiera wrogowi 12 punkt pancerza.
W danej chwili można korzystać tylko z jednego rodzaju ulepszonej amunicji." +[APRounds X2AmmoTemplate] +BriefSummary="Te śmiercionośne pociski, ręcznie wykonane z ultramocnych, ultralekkich stopów obcych, skutecznie ominą pancerz wroga, zadając nieograniczone obrażenia." + [HighPressureTanks X2WeaponTemplate] FriendlyName="Zbiorniki wysokociśnieniowe" FriendlyNamePlural="Zbiorniki wysokociśnieniowe" @@ -1275,6 +1458,11 @@ BriefSummary="Zapewnia premię do zdolności psionicznych kosztem woli." TacticalText=" Zapewnia 10 punktów ofensywy PSI kosztem 10 punktów woli." UnknownUtilityCategory="Neurobat" +[SmashNGrabQuestItem X2EquipmentTemplate] +FriendlyName="Pakiet zasobów ADVENT-u" +FriendlyNamePlural="Pakiety zasobów ADVENT-u" +BriefSummary="Mały pakiet cennych zasobów." + ;;;;;;;;;;;;;;;;;;;; CLASS TEMPLATES ;;;;;;;;;;;;;;;;;;;;;;; [LWS_Technical X2SoldierClassTemplate] @@ -1287,76 +1475,77 @@ RightAbilityTreeTitle="Ogniowy" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Ogniowy" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Anioł" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Biskup" -RandomNickNames[3]="Strzykawa" -RandomNickNames[4]="Łamacz" -RandomNickNames[5]="Broker" -RandomNickNames[6]="Krypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Szyfr" -RandomNickNames[9]="Dane" -RandomNickNames[10]="Diakon" -RandomNickNames[11]="Dr Zdrówko" -RandomNickNames[12]="Doktorek" -RandomNickNames[13]="Kontra" -RandomNickNames[14]="Zapora" -RandomNickNames[15]="Geniusz" -RandomNickNames[16]="Gizmo" -RandomNickNames[17]="Usterka" -RandomNickNames[18]="Gwizdek" -RandomNickNames[19]="Zakłócacz" -RandomNickNames[20]="Błazen" -RandomNickNames[21]="Spazm" -RandomNickNames[22]="Błyskawica" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Przesterowanie" -RandomNickNames[27]="Łata" -RandomNickNames[28]="Profesor" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Szelma" -RandomNickNames[31]="Grzechotnik" -RandomNickNames[32]="Rudzielec" -RandomNickNames[33]="Szczelina" -RandomNickNames[34]="Linka" -RandomNickNames[35]="Łotr" -RandomNickNames[36]="Piekarz" -RandomNickNames[37]="Strażnik" -RandomNickNames[38]="Krętacz" -RandomNickNames[39]="Drgawa" -RandomNickNames[40]="Zmiennik" -RandomNickNames[41]="Psychiatra" -RandomNickNames[42]="Ślizgacz" -RandomNickNames[43]="Słonecznik" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Iskra" -RandomNickNames[46]="Szwacz" -RandomNickNames[47]="Korek" -RandomNickNames[48]="Łezka" -RandomNickNames[49]="Druciarz" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Jadzior" -RandomNickNames[52]="Opar" -RandomNickNames[53]="Ptaszor" -RandomNickNames[54]="Nadzór" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Dzikus" -RandomNickNames[57]="Zulus" ++RandomNickNames="Anioł" ++RandomNickNames="Beta" ++RandomNickNames="Biskup" ++RandomNickNames="Strzykawa" ++RandomNickNames="Łamacz" ++RandomNickNames="Broker" ++RandomNickNames="Krypto" ++RandomNickNames="Cyber" ++RandomNickNames="Szyfr" ++RandomNickNames="Dane" ++RandomNickNames="Diakon" ++RandomNickNames="Dr Zdrówko" ++RandomNickNames="Doktorek" ++RandomNickNames="Kontra" ++RandomNickNames="Zapora" ++RandomNickNames="Geniusz" ++RandomNickNames="Gizmo" ++RandomNickNames="Usterka" ++RandomNickNames="Gwizdek" ++RandomNickNames="Zakłócacz" ++RandomNickNames="Błazen" ++RandomNickNames="Spazm" ++RandomNickNames="Błyskawica" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Przesterowanie" ++RandomNickNames="Łata" ++RandomNickNames="Profesor" ++RandomNickNames="Ragtime" ++RandomNickNames="Szelma" ++RandomNickNames="Grzechotnik" ++RandomNickNames="Rudzielec" ++RandomNickNames="Szczelina" ++RandomNickNames="Linka" ++RandomNickNames="Łotr" ++RandomNickNames="Piekarz" ++RandomNickNames="Strażnik" ++RandomNickNames="Krętacz" ++RandomNickNames="Drgawa" ++RandomNickNames="Zmiennik" ++RandomNickNames="Psychiatra" ++RandomNickNames="Ślizgacz" ++RandomNickNames="Słonecznik" ++RandomNickNames="Sonar" ++RandomNickNames="Iskra" ++RandomNickNames="Szwacz" ++RandomNickNames="Korek" ++RandomNickNames="Łezka" ++RandomNickNames="Druciarz" ++RandomNickNames="Turbo" ++RandomNickNames="Jadzior" ++RandomNickNames="Opar" ++RandomNickNames="Ptaszor" ++RandomNickNames="Nadzór" ++RandomNickNames="Whiskey" ++RandomNickNames="Dzikus" ++RandomNickNames="Zulus" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Candyman" -RandomNickNames_Male[1]="Iluzja" -RandomNickNames_Male[2]="Kapłan" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Kogut" -RandomNickNames_Female[0]="Kapłanka" -RandomNickNames_Female[1]="Wilczyca" -RandomNickNames_Female[2]="Czarna Wdowa" -RandomNickNames_Female[4]="Hrabina" ++RandomNickNames_Male="Candyman" ++RandomNickNames_Male="Iluzja" ++RandomNickNames_Male="Kapłan" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Kogut" ++RandomNickNames_Female="Kapłanka" ++RandomNickNames_Female="Wilczyca" ++RandomNickNames_Female="Czarna Wdowa" ++RandomNickNames_Female="Hrabina" ;ALPHABETICAL ORDER [LWS_Specialist X2SoldierClassTemplate] @@ -1369,78 +1558,149 @@ RightAbilityTreeTitle="Haker" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Haker" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Anioł" -RandomNickNames[1]="Beta" -RandomNickNames[2]="Biskup" -RandomNickNames[3]="Strzykawa" -RandomNickNames[4]="Łamacz" -RandomNickNames[5]="Broker" -RandomNickNames[6]="Krypto" -RandomNickNames[7]="Cyber" -RandomNickNames[8]="Szyfr" -RandomNickNames[9]="Dane" -RandomNickNames[10]="Diakon" -RandomNickNames[11]="Dr Zdrówko" -RandomNickNames[12]="Doktorek" -RandomNickNames[13]="Kontra" -RandomNickNames[14]="Zapora" -RandomNickNames[15]="Geniusz" -RandomNickNames[16]="Gizmo" -RandomNickNames[17]="Usterka" -RandomNickNames[18]="Gwizdek" -RandomNickNames[19]="Zakłócacz" -RandomNickNames[20]="Błazen" -RandomNickNames[21]="Spazm" -RandomNickNames[22]="Błyskawica" -RandomNickNames[23]="Mayday" -RandomNickNames[24]="Mega" -RandomNickNames[25]="Newton" -RandomNickNames[26]="Przesterowanie" -RandomNickNames[27]="Łata" -RandomNickNames[28]="Profesor" -RandomNickNames[29]="Ragtime" -RandomNickNames[30]="Szelma" -RandomNickNames[31]="Grzechotnik" -RandomNickNames[32]="Rudzielec" -RandomNickNames[33]="Szczelina" -RandomNickNames[34]="Linka" -RandomNickNames[35]="Łotr" -RandomNickNames[36]="Piekarz" -RandomNickNames[37]="Strażnik" -RandomNickNames[38]="Krętacz" -RandomNickNames[39]="Drgawa" -RandomNickNames[40]="Zmiennik" -RandomNickNames[41]="Psychiatra" -RandomNickNames[42]="Ślizgacz" -RandomNickNames[43]="Słonecznik" -RandomNickNames[44]="Sonar" -RandomNickNames[45]="Iskra" -RandomNickNames[46]="Szwacz" -RandomNickNames[47]="Korek" -RandomNickNames[48]="Łezka" -RandomNickNames[49]="Druciarz" -RandomNickNames[50]="Turbo" -RandomNickNames[51]="Jadzior" -RandomNickNames[52]="Opar" -RandomNickNames[53]="Ptaszor" -RandomNickNames[54]="Nadzór" -RandomNickNames[55]="Whiskey" -RandomNickNames[56]="Dzikus" -RandomNickNames[57]="Zulus" ++RandomNickNames="Angel" ++RandomNickNames="Beta" ++RandomNickNames="Bishop" ++RandomNickNames="Bones" ++RandomNickNames="Breaker" ++RandomNickNames="Broker" ++RandomNickNames="Crypto" ++RandomNickNames="Cyber" ++RandomNickNames="Cypher" ++RandomNickNames="Data" ++RandomNickNames="Deacon" ++RandomNickNames="Dr. Feelgood" ++RandomNickNames="Doc" ++RandomNickNames="Feedback" ++RandomNickNames="Firewall" ++RandomNickNames="Genius" ++RandomNickNames="Gizmo" ++RandomNickNames="Glitch" ++RandomNickNames="Hijack" ++RandomNickNames="Jammer" ++RandomNickNames="Jester" ++RandomNickNames="Jolt" ++RandomNickNames="Lightning" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Overdrive" ++RandomNickNames="Patch" ++RandomNickNames="Professor" ++RandomNickNames="Ragtime" ++RandomNickNames="Rascal" ++RandomNickNames="Rattler" ++RandomNickNames="Red" ++RandomNickNames="Rift" ++RandomNickNames="Ripcord" ++RandomNickNames="Rogue" ++RandomNickNames="Scorch" ++RandomNickNames="Sentinel" ++RandomNickNames="Shady" ++RandomNickNames="Shakes" ++RandomNickNames="Shifter" ++RandomNickNames="Shrink" ++RandomNickNames="Slider" ++RandomNickNames="Solar" ++RandomNickNames="Sonar" ++RandomNickNames="Sparks" ++RandomNickNames="Stitch" ++RandomNickNames="Tapper" ++RandomNickNames="Teardrop" ++RandomNickNames="Tinker" ++RandomNickNames="Turbo" ++RandomNickNames="Venom" ++RandomNickNames="Vapor" ++RandomNickNames="Warbird" ++RandomNickNames="Warden" ++RandomNickNames="Whiskey" ++RandomNickNames="Wild Thing" ++RandomNickNames="Zulu" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Candyman" -RandomNickNames_Male[1]="Iluzja" -RandomNickNames_Male[2]="Kapłan" -RandomNickNames_Male[3]="Rainman" -RandomNickNames_Male[4]="Kogut" -RandomNickNames_Female[0]="Kapłanka" -RandomNickNames_Female[1]="Wilczyca" -RandomNickNames_Female[2]="Czarna Wdowa" -RandomNickNames_Female[4]="Hrabina" ++RandomNickNames_Male="Candyman" ++RandomNickNames_Male="Magic Man" ++RandomNickNames_Male="Priest" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Rooster" ++RandomNickNames_Female="Priestess" ++RandomNickNames_Female="Wolfmother" ++RandomNickNames_Female="Black Widow" ++RandomNickNames_Female="Duchess" ;ALPHABETICAL ORDER +;ALPHABETICAL ORDER ++RandomNickNames="Anioł" ++RandomNickNames="Beta" ++RandomNickNames="Biskup" ++RandomNickNames="Strzykawa" ++RandomNickNames="Łamacz" ++RandomNickNames="Broker" ++RandomNickNames="Krypto" ++RandomNickNames="Cyber" ++RandomNickNames="Szyfr" ++RandomNickNames="Dane" ++RandomNickNames="Diakon" ++RandomNickNames="Dr Zdrówko" ++RandomNickNames="Doktorek" ++RandomNickNames="Kontra" ++RandomNickNames="Zapora" ++RandomNickNames="Geniusz" ++RandomNickNames="Gizmo" ++RandomNickNames="Usterka" ++RandomNickNames="Gwizdek" ++RandomNickNames="Zakłócacz" ++RandomNickNames="Błazen" ++RandomNickNames="Spazm" ++RandomNickNames="Błyskawica" ++RandomNickNames="Mayday" ++RandomNickNames="Mega" ++RandomNickNames="Newton" ++RandomNickNames="Przesterowanie" ++RandomNickNames="Łata" ++RandomNickNames="Profesor" ++RandomNickNames="Ragtime" ++RandomNickNames="Szelma" ++RandomNickNames="Grzechotnik" ++RandomNickNames="Rudzielec" ++RandomNickNames="Szczelina" ++RandomNickNames="Linka" ++RandomNickNames="Łotr" ++RandomNickNames="Piekarz" ++RandomNickNames="Strażnik" ++RandomNickNames="Krętacz" ++RandomNickNames="Drgawa" ++RandomNickNames="Zmiennik" ++RandomNickNames="Psychiatra" ++RandomNickNames="Ślizgacz" ++RandomNickNames="Słonecznik" ++RandomNickNames="Sonar" ++RandomNickNames="Iskra" ++RandomNickNames="Szwacz" ++RandomNickNames="Korek" ++RandomNickNames="Łezka" ++RandomNickNames="Druciarz" ++RandomNickNames="Turbo" ++RandomNickNames="Jadzior" ++RandomNickNames="Opar" ++RandomNickNames="Ptaszor" ++RandomNickNames="Nadzór" ++RandomNickNames="Whiskey" ++RandomNickNames="Dzikus" ++RandomNickNames="Zulus" +;ALPHABETICAL ORDER ++RandomNickNames_Male="Candyman" ++RandomNickNames_Male="Iluzja" ++RandomNickNames_Male="Kapłan" ++RandomNickNames_Male="Rainman" ++RandomNickNames_Male="Kogut" ++RandomNickNames_Female="Kapłanka" ++RandomNickNames_Female="Wilczyca" ++RandomNickNames_Female="Czarna Wdowa" ++RandomNickNames_Female="Hrabina" +;ALPHABETICAL ORDER [LWS_Grenadier X2SoldierClassTemplate] DisplayName="Grenadier" @@ -1452,91 +1712,91 @@ RightAbilityTreeTitle="Wsparcie" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Wsparcie" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Dniówka" -RandomNickNames[1]="Na całego" -RandomNickNames[2]="Zwierzak" -RandomNickNames[3]="Biba" -RandomNickNames[4]="Burak" -RandomNickNames[5]="Burżuj" -RandomNickNames[6]="Wredota" -RandomNickNames[7]="Ognik" -RandomNickNames[8]="Bum Bum" -RandomNickNames[9]="Bombiarz" -RandomNickNames[10]="Spoko" -RandomNickNames[11]="Buldog" -RandomNickNames[12]="Szarża" -RandomNickNames[13]="Claymore" -RandomNickNames[14]="Ładunek" -RandomNickNames[15]="Defcon" -RandomNickNames[16]="Piesu" -RandomNickNames[17]="Diesel" -RandomNickNames[18]="Bis" -RandomNickNames[19]="Ognik" -RandomNickNames[20]="Lodówa" -RandomNickNames[21]="Artyleria" -RandomNickNames[22]="Młot" -RandomNickNames[23]="Wypalacz" -RandomNickNames[24]="Wieżowiec" -RandomNickNames[25]="Bysior" -RandomNickNames[26]="Wulkan" -RandomNickNames[27]="Huragan" -RandomNickNames[28]="Złom" -RandomNickNames[29]="Olbrzym" -RandomNickNames[30]="Nokaut" -RandomNickNames[31]="Kong" -RandomNickNames[32]="Piechu" -RandomNickNames[33]="Roztop" -RandomNickNames[34]="Łoś" -RandomNickNames[35]="Nova" -RandomNickNames[36]="Świntuch" -RandomNickNames[37]="Nitro" -RandomNickNames[38]="Nadzorca" -RandomNickNames[39]="Pitbull" -RandomNickNames[40]="Iskra" -RandomNickNames[41]="Szrama" -RandomNickNames[42]="Nosorożec" -RandomNickNames[43]="Rakieta" -RandomNickNames[44]="Bryza" -RandomNickNames[45]="Beton" -RandomNickNames[46]="Miazga" -RandomNickNames[47]="Złośnik" -RandomNickNames[48]="Dymek" -RandomNickNames[49]="Bagniak" -RandomNickNames[50]="Zderzak" -RandomNickNames[51]="T-Rex" -RandomNickNames[52]="Czołg" -RandomNickNames[53]="Grzmot" -RandomNickNames[54]="Grom" -RandomNickNames[55]="Smyracz" -RandomNickNames[56]="Kruszyna" -RandomNickNames[57]="Tytan" -RandomNickNames[58]="Dynamit" -RandomNickNames[59]="Pochodnia" -RandomNickNames[60]="Pies Wojny" -RandomNickNames[61]="Ogier" -RandomNickNames[62]="Dzikus" ++RandomNickNames="Dniówka" ++RandomNickNames="Na całego" ++RandomNickNames="Zwierzak" ++RandomNickNames="Biba" ++RandomNickNames="Burak" ++RandomNickNames="Burżuj" ++RandomNickNames="Wredota" ++RandomNickNames="Ognik" ++RandomNickNames="Bum Bum" ++RandomNickNames="Bombiarz" ++RandomNickNames="Spoko" ++RandomNickNames="Buldog" ++RandomNickNames="Szarża" ++RandomNickNames="Claymore" ++RandomNickNames="Ładunek" ++RandomNickNames="Defcon" ++RandomNickNames="Piesu" ++RandomNickNames="Diesel" ++RandomNickNames="Bis" ++RandomNickNames="Ognik" ++RandomNickNames="Lodówa" ++RandomNickNames="Artyleria" ++RandomNickNames="Młot" ++RandomNickNames="Wypalacz" ++RandomNickNames="Wieżowiec" ++RandomNickNames="Bysior" ++RandomNickNames="Wulkan" ++RandomNickNames="Huragan" ++RandomNickNames="Złom" ++RandomNickNames="Olbrzym" ++RandomNickNames="Nokaut" ++RandomNickNames="Kong" ++RandomNickNames="Piechu" ++RandomNickNames="Roztop" ++RandomNickNames="Łoś" ++RandomNickNames="Nova" ++RandomNickNames="Świntuch" ++RandomNickNames="Nitro" ++RandomNickNames="Nadzorca" ++RandomNickNames="Pitbull" ++RandomNickNames="Iskra" ++RandomNickNames="Szrama" ++RandomNickNames="Nosorożec" ++RandomNickNames="Rakieta" ++RandomNickNames="Bryza" ++RandomNickNames="Beton" ++RandomNickNames="Miazga" ++RandomNickNames="Złośnik" ++RandomNickNames="Dymek" ++RandomNickNames="Bagniak" ++RandomNickNames="Zderzak" ++RandomNickNames="T-Rex" ++RandomNickNames="Czołg" ++RandomNickNames="Grzmot" ++RandomNickNames="Grom" ++RandomNickNames="Smyracz" ++RandomNickNames="Kruszyna" ++RandomNickNames="Tytan" ++RandomNickNames="Dynamit" ++RandomNickNames="Pochodnia" ++RandomNickNames="Pies Wojny" ++RandomNickNames="Ogier" ++RandomNickNames="Dzikus" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Barbarzyńca" -RandomNickNames_Male[1]="Wielkolud" -RandomNicknames_Male[2]="Szefu" -RandomNickNames_Male[3]="Kowboj" -RandomNickNames_Male[4]="Głąb" -RandomNickNames_Male[5]="Neron" -RandomNickNames_Male[6]="Tata Miś" -RandomNickNames_Male[7]="Dzikus" -RandomNickNames_Female[0]="Amazonka" -RandomNicknames_Female[1]="Szefowa" -RandomNickNames_Female[2]="Dojarka" -RandomNicknames_Female[3]="Domino" -RandomNickNames_Female[4]="Freya" -RandomNickNames_Female[5]="Miśka" -RandomNickNames_Female[6]="Tajniaczka" -RandomNickNames_Female[7]="Podpalaczka" ++RandomNickNames_Male="Barbarzyńca" ++RandomNickNames_Male="Wielkolud" ++RandomNickNames_Male="Szefu" ++RandomNickNames_Male="Kowboj" ++RandomNickNames_Male="Głąb" ++RandomNickNames_Male="Neron" ++RandomNickNames_Male="Tata Miś" ++RandomNickNames_Male="Dzikus" ++RandomNickNames_Female="Amazonka" ++RandomNickNames_Female="Szefowa" ++RandomNickNames_Female="Dojarka" ++RandomNickNames_Female="Domino" ++RandomNickNames_Female="Freya" ++RandomNickNames_Female="Miśka" ++RandomNickNames_Female="Tajniaczka" ++RandomNickNames_Female="Podpalaczka" ;ALPHABETICAL ORDER - [LWS_Gunner X2SoldierClassTemplate] DisplayName="Artylerzysta" ClassSummary="Artylerzysta wyszkolony w posługiwaniu się ciężką bronią automatyczną potrafi osłonić swoją drużynę ogniem przygważdżającym i zadać wrogom poważne obrażenia bezpośrednim ostrzałem." @@ -1547,44 +1807,44 @@ RightAbilityTreeTitle="Artylerzysta KM" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Artylerzysta KM" +AbilityTreeTitles[3]="XCOM" - -RandomNickNames[0]="Kontra" -RandomNickNames[1]="Baja" -RandomNickNames[2]="Binturong" -RandomNickNames[3]="Brutal" -RandomNickNames[4]="Piła" -RandomNickNames[5]="Flądra" -RandomNickNames[6]="Efekciarz" -RandomNickNames[7]="Gonzo" -RandomNickNames[8]="Sokolnik" -RandomNickNames[9]="Kozmo" -RandomNickNames[10]="Żarłok" -RandomNickNames[11]="Okrutnik" -RandomNickNames[12]="Haczyk" -RandomNickNames[13]="Łoś" -RandomNickNames[14]="Nanuk" -RandomNickNames[15]="Kruszyna" -RandomNickNames[16]="Atomek" -RandomNickNames[17]="Ogr" -RandomNickNames[18]="Naleśnik" -RandomNickNames[19]="Pancerniak" -RandomNickNames[20]="Tłoczycho" -RandomNickNames[21]="Rewolwer" -RandomNickNames[22]="Wróbel" -RandomNickNames[23]="Kolec" -RandomNickNames[24]="Yogi" -RandomNickNames[25]="Zarfer" -RandomNickNames_Male[0]="Rechot" -RandomNickNames_Male[1]="Dyngus" -RandomNickNames_Male[2]="Maniak" -RandomNickNames_Male[3]="Piącha" -RandomNickNames_Male[4]="Mors" -RandomNickNames_Female[0]="Bańka" -RandomNickNames_Female[1]="Gadżet" -RandomNickNames_Female[2]="Chichot" -RandomNickNames_Female[3]="Mango" -RandomNickNames_Female[4]="Pieprz" - ++AbilityTreeTitles[4]="Pistolety" + ++RandomNickNames="Kontra" ++RandomNickNames="Baja" ++RandomNickNames="Binturong" ++RandomNickNames="Brutal" ++RandomNickNames="Piła" ++RandomNickNames="Flądra" ++RandomNickNames="Efekciarz" ++RandomNickNames="Gonzo" ++RandomNickNames="Sokolnik" ++RandomNickNames="Kozmo" ++RandomNickNames="Żarłok" ++RandomNickNames="Okrutnik" ++RandomNickNames="Haczyk" ++RandomNickNames="Łoś" ++RandomNickNames="Nanuk" ++RandomNickNames="Kruszyna" ++RandomNickNames="Atomek" ++RandomNickNames="Ogr" ++RandomNickNames="Naleśnik" ++RandomNickNames="Pancerniak" ++RandomNickNames="Tłoczycho" ++RandomNickNames="Rewolwer" ++RandomNickNames="Wróbel" ++RandomNickNames="Kolec" ++RandomNickNames="Yogi" ++RandomNickNames="Zarfer" ++RandomNickNames_Male="Rechot" ++RandomNickNames_Male="Dyngus" ++RandomNickNames_Male="Maniak" ++RandomNickNames_Male="Piącha" ++RandomNickNames_Male="Mors" ++RandomNickNames_Female="Bańka" ++RandomNickNames_Female="Gadżet" ++RandomNickNames_Female="Chichot" ++RandomNickNames_Female="Mango" ++RandomNickNames_Female="Pieprz" [LWS_Ranger X2SoldierClassTemplate] DisplayName="Łowca" @@ -1596,44 +1856,45 @@ RightAbilityTreeTitle="Obrońca" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Obrońca" +AbilityTreeTitles[3]="XCOM" - -RandomNickNames[0]="Koniu" -RandomNickNames[1]="Kozioł" -RandomNickNames[2]="Kasztan" -RandomNickNames[3]="Kobalt" -RandomNickNames[4]="Kowboj" -RandomNickNames[5]="Kopacz" -RandomNickNames[6]="Sokole oko" -RandomNickNames[7]="Szron" -RandomNickNames[8]="Trep" -RandomNickNames[9]="Hollywood" -RandomNickNames[10]="Bysior" -RandomNickNames[11]="Wyjec" -RandomNickNames[12]="Sójka" -RandomNickNames[13]="Partyzant" -RandomNickNames[14]="Sędzia" -RandomNickNames[15]="Marlin" -RandomNickNames[16]="Mustang" -RandomNickNames[17]="Tato" -RandomNickNames[18]="Malarz" -RandomNickNames[19]="Srokacz" -RandomNickNames[20]="Szelma" -RandomNickNames[21]="Rocky" -RandomNickNames[22]="Skuter" -RandomNickNames[23]="Komar" -RandomNickNames[24]="Suwak" -RandomNickNames[25]="Giętak" -RandomNickNames[26]="Grzmot" -RandomNickNames[27]="Wilkołak" -RandomNickNames_Male[0]="Pyłek" -RandomNickNames_Male[1]="Holender" -RandomNickNames_Male[2]="Strąku" -RandomNickNames_Male[3]="Cwaniak" -RandomNickNames_Male[4]="Ojczulek" -RandomNickNames_Female[0]="Cioteczka" -RandomNickNames_Female[1]="Dobranocka" -RandomNickNames_Female[2]="Meduza" -RandomNickNames_Female[3]="Słodka" ++AbilityTreeTitles[4]="Pistolety" + ++RandomNickNames="Koniu" ++RandomNickNames="Kozioł" ++RandomNickNames="Kasztan" ++RandomNickNames="Kobalt" ++RandomNickNames="Kowboj" ++RandomNickNames="Kopacz" ++RandomNickNames="Sokole oko" ++RandomNickNames="Szron" ++RandomNickNames="Trep" ++RandomNickNames="Hollywood" ++RandomNickNames="Bysior" ++RandomNickNames="Wyjec" ++RandomNickNames="Sójka" ++RandomNickNames="Partyzant" ++RandomNickNames="Sędzia" ++RandomNickNames="Marlin" ++RandomNickNames="Mustang" ++RandomNickNames="Tato" ++RandomNickNames="Malarz" ++RandomNickNames="Srokacz" ++RandomNickNames="Szelma" ++RandomNickNames="Rocky" ++RandomNickNames="Skuter" ++RandomNickNames="Komar" ++RandomNickNames="Suwak" ++RandomNickNames="Giętak" ++RandomNickNames="Grzmot" ++RandomNickNames="Wilkołak" ++RandomNickNames_Male="Pyłek" ++RandomNickNames_Male="Holender" ++RandomNickNames_Male="Strąku" ++RandomNickNames_Male="Cwaniak" ++RandomNickNames_Male="Ojczulek" ++RandomNickNames_Female="Cioteczka" ++RandomNickNames_Female="Dobranocka" ++RandomNickNames_Female="Meduza" ++RandomNickNames_Female="Słodka" ;ALPHABETICAL ORDER [LWS_Sharpshooter X2SoldierClassTemplate] @@ -1646,81 +1907,82 @@ RightAbilityTreeTitle="Strzelec precyzyjny" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Strzelec precyzyjny" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Górka" -RandomNickNames[1]="As" -RandomNickNames[2]="Zamiatacz" -RandomNickNames[3]="Alfa" -RandomNickNames[4]="Oczko" -RandomNickNames[5]="Dziesiątka" -RandomNickNames[6]="Piorun" -RandomNickNames[7]="Ważniak" -RandomNickNames[8]="Śpioch" -RandomNickNames[9]="Szycha" -RandomNickNames[10]="Szef" -RandomNickNames[11]="Dziesiątka" -RandomNickNames[12]="Szach-mat" -RandomNickNames[13]="Wodzu" -RandomNickNames[14]="Colt" -RandomNickNames[15]="Dallas" -RandomNickNames[16]="Zapadka" -RandomNickNames[17]="Sokole oko" -RandomNickNames[18]="Impas" -RandomNickNames[19]="Leśnik" -RandomNickNames[20]="Kiler" -RandomNickNames[21]="Orzeł" -RandomNickNames[22]="Kulka" -RandomNickNames[23]="Siepacz" -RandomNickNames[24]="Gracz" -RandomNickNames[25]="Gangster" -RandomNickNames[26]="Grabarz" -RandomNickNames[27]="Hat Trick" -RandomNickNames[28]="Bystrzak" -RandomNickNames[29]="Grzała" -RandomNickNames[30]="Pojedynek" -RandomNickNames[31]="Likwidator" -RandomNickNames[32]="Hollywood" -RandomNickNames[33]="Podjarka" -RandomNickNames[34]="Ikona" -RandomNickNames[35]="Szakal" -RandomNickNames[36]="Sędzia" -RandomNickNames[37]="Wygaszacz" -RandomNickNames[38]="Blokada" -RandomNickNames[39]="Wyborowiec" -RandomNickNames[40]="Wędrowiec" -RandomNickNames[41]="Igła" -RandomNickNames[42]="Jeździec" -RandomNickNames[43]="Żniwiarz" -RandomNickNames[44]="Zadzior" -RandomNickNames[45]="Seria" -RandomNickNames[46]="Szeryf" -RandomNickNames[47]="Strzelec" -RandomNickNames[48]="Szpaner" -RandomNickNames[49]="Cwaniak" -RandomNickNames[50]="Rewolwer" -RandomNickNames[51]="Lód" -RandomNickNames[52]="Czyściciel" -RandomNickNames[53]="Dzieciak" -RandomNickNames[54]="Prawda" -RandomNickNames[55]="Nagrobek" -RandomNickNames[56]="Debeściak" -RandomNickNames[57]="Fachura" -RandomNickNames[58]="Dublet" -RandomNickNames[59]="Rębajło" -RandomNickNames[60]="Romans" ++RandomNickNames="Górka" ++RandomNickNames="As" ++RandomNickNames="Zamiatacz" ++RandomNickNames="Alfa" ++RandomNickNames="Oczko" ++RandomNickNames="Dziesiątka" ++RandomNickNames="Piorun" ++RandomNickNames="Ważniak" ++RandomNickNames="Śpioch" ++RandomNickNames="Szycha" ++RandomNickNames="Szef" ++RandomNickNames="Dziesiątka" ++RandomNickNames="Szach-mat" ++RandomNickNames="Wodzu" ++RandomNickNames="Colt" ++RandomNickNames="Dallas" ++RandomNickNames="Zapadka" ++RandomNickNames="Sokole oko" ++RandomNickNames="Impas" ++RandomNickNames="Leśnik" ++RandomNickNames="Kiler" ++RandomNickNames="Orzeł" ++RandomNickNames="Kulka" ++RandomNickNames="Siepacz" ++RandomNickNames="Gracz" ++RandomNickNames="Gangster" ++RandomNickNames="Grabarz" ++RandomNickNames="Hat Trick" ++RandomNickNames="Bystrzak" ++RandomNickNames="Grzała" ++RandomNickNames="Pojedynek" ++RandomNickNames="Likwidator" ++RandomNickNames="Hollywood" ++RandomNickNames="Podjarka" ++RandomNickNames="Ikona" ++RandomNickNames="Szakal" ++RandomNickNames="Sędzia" ++RandomNickNames="Wygaszacz" ++RandomNickNames="Blokada" ++RandomNickNames="Wyborowiec" ++RandomNickNames="Wędrowiec" ++RandomNickNames="Igła" ++RandomNickNames="Jeździec" ++RandomNickNames="Żniwiarz" ++RandomNickNames="Zadzior" ++RandomNickNames="Seria" ++RandomNickNames="Szeryf" ++RandomNickNames="Strzelec" ++RandomNickNames="Szpaner" ++RandomNickNames="Cwaniak" ++RandomNickNames="Rewolwer" ++RandomNickNames="Lód" ++RandomNickNames="Czyściciel" ++RandomNickNames="Dzieciak" ++RandomNickNames="Prawda" ++RandomNickNames="Nagrobek" ++RandomNickNames="Debeściak" ++RandomNickNames="Fachura" ++RandomNickNames="Dublet" ++RandomNickNames="Rębajło" ++RandomNickNames="Romans" ;ALPHABETICAL ORDER -RandomNicknames_Male[0]="Kowboj" -RandomNickNames_Male[1]="Mafiozo" -RandomNickNames_Male[2]="Listonosz" -RandomNickNames_Male[3]="Dziadek" -RandomNickNames_Male[4]="Chudy" -RandomNickNames_Male[5]="Poborca" -RandomNickNames_Male[6]="Zeus" -RandomNickNames_Female[0]="Baronowa" -RandomNickNames_Female[1]="Czarna Wdowa" -RandomNicknames_Female[2]="Plaga" -RandomNicknames_Female[3]="Królowa" ++RandomNickNames_Male="Kowboj" ++RandomNickNames_Male="Mafiozo" ++RandomNickNames_Male="Listonosz" ++RandomNickNames_Male="Dziadek" ++RandomNickNames_Male="Chudy" ++RandomNickNames_Male="Poborca" ++RandomNickNames_Male="Zeus" ++RandomNickNames_Female="Baronowa" ++RandomNickNames_Female="Czarna Wdowa" ++RandomNickNames_Female="Plaga" ++RandomNickNames_Female="Królowa" ;ALPHABETICAL ORDER [LWS_Assault X2SoldierClassTemplate] @@ -1733,75 +1995,75 @@ RightAbilityTreeTitle="Rozrabiaka" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Rozrabiaka" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Bandzior" -RandomNickNames[1]="Pędziwiatr" -RandomNickNames[2]="Cegła" -RandomNickNames[3]="Rzeźnik" -RandomNickNames[4]="Piła" -RandomNickNames[5]="Cajun" -RandomNickNames[6]="Szczena" -RandomNickNames[7]="Kobra" -RandomNickNames[8]="Puma" -RandomNickNames[9]="Kojot" -RandomNickNames[10]="Karambol" -RandomNickNames[11]="Diament" -RandomNickNames[12]="Egzekutor" -RandomNickNames[13]="Śmierć" -RandomNickNames[14]="Błysk" -RandomNickNames[15]="Furia" -RandomNickNames[16]="Krokodyl" -RandomNickNames[17]="Duch" -RandomNickNames[18]="Artyleria" -RandomNickNames[19]="Ogar" -RandomNickNames[20]="Lód" -RandomNickNames[21]="Szpikulec" -RandomNickNames[22]="Zębacz" -RandomNickNames[23]="Dzień Sądu" -RandomNickNames[24]="Zboczek" -RandomNickNames[25]="Potwór" -RandomNickNames[26]="Mustang" -RandomNickNames[27]="Paladyn" -RandomNickNames[28]="Pitbull" -RandomNickNames[29]="Tropiciel" -RandomNickNames[30]="Ringo" -RandomNickNames[31]="Samuraj" -RandomNickNames[32]="Skorpion" -RandomNickNames[33]="Szogun" -RandomNickNames[34]="Cień" -RandomNickNames[35]="Śmierć" -RandomNickNames[36]="Wąż" -RandomNickNames[37]="Oczy węża" -RandomNickNames[38]="Solo" -RandomNickNames[39]="Widmo" -RandomNickNames[40]="Pająk" -RandomNickNames[41]="Skradacz" -RandomNickNames[42]="Stal" -RandomNickNames[43]="Żądło" -RandomNickNames[44]="Templariusz" -RandomNickNames[45]="Trojan" -RandomNickNames[46]="Wandal" -RandomNickNames[47]="Wiking" -RandomNickNames[48]="Nadzór" -RandomNickNames[49]="Watażka" -RandomNickNames[50]="Rosomak" -RandomNickNames[51]="Dzikus" -RandomNickNames[52]="Dzikusek" -RandomNickNames[53]="Zulus" ++RandomNickNames="Bandzior" ++RandomNickNames="Pędziwiatr" ++RandomNickNames="Cegła" ++RandomNickNames="Rzeźnik" ++RandomNickNames="Piła" ++RandomNickNames="Cajun" ++RandomNickNames="Szczena" ++RandomNickNames="Kobra" ++RandomNickNames="Puma" ++RandomNickNames="Kojot" ++RandomNickNames="Karambol" ++RandomNickNames="Diament" ++RandomNickNames="Egzekutor" ++RandomNickNames="Śmierć" ++RandomNickNames="Błysk" ++RandomNickNames="Furia" ++RandomNickNames="Krokodyl" ++RandomNickNames="Duch" ++RandomNickNames="Artyleria" ++RandomNickNames="Ogar" ++RandomNickNames="Lód" ++RandomNickNames="Szpikulec" ++RandomNickNames="Zębacz" ++RandomNickNames="Dzień Sądu" ++RandomNickNames="Zboczek" ++RandomNickNames="Potwór" ++RandomNickNames="Mustang" ++RandomNickNames="Paladyn" ++RandomNickNames="Pitbull" ++RandomNickNames="Tropiciel" ++RandomNickNames="Ringo" ++RandomNickNames="Samuraj" ++RandomNickNames="Skorpion" ++RandomNickNames="Szogun" ++RandomNickNames="Cień" ++RandomNickNames="Śmierć" ++RandomNickNames="Wąż" ++RandomNickNames="Oczy węża" ++RandomNickNames="Solo" ++RandomNickNames="Widmo" ++RandomNickNames="Pająk" ++RandomNickNames="Skradacz" ++RandomNickNames="Stal" ++RandomNickNames="Żądło" ++RandomNickNames="Trojan" ++RandomNickNames="Wandal" ++RandomNickNames="Wiking" ++RandomNickNames="Nadzór" ++RandomNickNames="Watażka" ++RandomNickNames="Rosomak" ++RandomNickNames="Dzikus" ++RandomNickNames="Dzikusek" ++RandomNickNames="Zulus" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Topornik" -RandomNickNames_Male[1]="Księciunio" -RandomNickNames_Male[2]="Rocky" -RandomNickNames_Male[3]="Ogier" -RandomNickNames_Male[4]="Wilczarz" ++RandomNickNames_Male="Topornik" ++RandomNickNames_Male="Księciunio" ++RandomNickNames_Male="Rocky" ++RandomNickNames_Male="Ogier" ++RandomNickNames_Male="Wilczarz" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Atena" -RandomNickNames_Female[1]="Hrabina" -RandomNicknames_Female[2]="Żelazna" -RandomNicknames_Female[3]="Stalowa" -RandomNicknames_Female[4]="Tarcza" -RandomNickNames_Female[5]="Walkiria" ++RandomNickNames_Female="Atena" ++RandomNickNames_Female="Hrabina" ++RandomNickNames_Female="Żelazna" ++RandomNickNames_Female="Stalowa" ++RandomNickNames_Female="Tarcza" ++RandomNickNames_Female="Walkiria" ;ALPHABETICAL ORDER [LWS_Shinobi X2SoldierClassTemplate] @@ -1814,49 +2076,50 @@ RightAbilityTreeTitle="Kenshi" +AbilityTreeTitles[1]="" +AbilityTreeTitles[2]="Kenshi" +AbilityTreeTitles[3]="XCOM" ++AbilityTreeTitles[4]="Pistolety" ;ALPHABETICAL ORDER -RandomNickNames[0]="Szpon" -RandomNickNames[1]="Kobra" -RandomNickNames[2]="Sztylet" -RandomNickNames[3]="Taniec" -RandomNickNames[4]="Biegacz" -RandomNickNames[5]="Kombinator" -RandomNickNames[6]="Smok" -RandomNickNames[7]="Szermierz" -RandomNickNames[8]="Pływak" -RandomNickNames[9]="Futrzak" -RandomNickNames[10]="Suseł" -RandomNickNames[11]="Maczuga" -RandomNickNames[12]="Północ" -RandomNickNames[13]="Neutron" -RandomNickNames[14]="Malarz" -RandomNickNames[15]="Pasza" -RandomNickNames[16]="Kłusownik" -RandomNickNames[17]="Grzechotnik" -RandomNickNames[18]="Brzytwa" -RandomNickNames[19]="Rozpruwacz" -RandomNickNames[20]="Szlachta" -RandomNickNames[21]="Krętacz" -RandomNickNames[22]="Patyk" -RandomNickNames[23]="Spacja" -RandomNickNames[24]="Drzazga" -RandomNickNames[25]="Skradacz" -RandomNickNames[26]="Szpon" -RandomNickNames[27]="Rębajło" -RandomNickNames[28]="Żbik" ++RandomNickNames="Szpon" ++RandomNickNames="Kobra" ++RandomNickNames="Sztylet" ++RandomNickNames="Taniec" ++RandomNickNames="Biegacz" ++RandomNickNames="Kombinator" ++RandomNickNames="Smok" ++RandomNickNames="Szermierz" ++RandomNickNames="Pływak" ++RandomNickNames="Futrzak" ++RandomNickNames="Suseł" ++RandomNickNames="Maczuga" ++RandomNickNames="Północ" ++RandomNickNames="Neutron" ++RandomNickNames="Malarz" ++RandomNickNames="Pasza" ++RandomNickNames="Kłusownik" ++RandomNickNames="Grzechotnik" ++RandomNickNames="Brzytwa" ++RandomNickNames="Rozpruwacz" ++RandomNickNames="Szlachta" ++RandomNickNames="Krętacz" ++RandomNickNames="Patyk" ++RandomNickNames="Spacja" ++RandomNickNames="Drzazga" ++RandomNickNames="Skradacz" ++RandomNickNames="Szpon" ++RandomNickNames="Rębajło" ++RandomNickNames="Żbik" ;ALPHABETICAL ORDER -RandomNickNames_Male[0]="Giętki" -RandomNickNames_Male[1]="Cochise" -RandomNickNames_Male[2]="Chudy" -RandomNickNames_Male[3]="Dżokej" -RandomNickNames_Male[4]="Dziadek" -RandomNickNames_Male[5]="Fechmistrz" ++RandomNickNames_Male="Giętki" ++RandomNickNames_Male="Cochise" ++RandomNickNames_Male="Chudy" ++RandomNickNames_Male="Dżokej" ++RandomNickNames_Male="Dziadek" ++RandomNickNames_Male="Fechmistrz" ;ALPHABETICAL ORDER -RandomNickNames_Female[0]="Pantera" -RandomNickNames_Female[1]="Syrena" -RandomNickNames_Female[2]="Sreberko" -RandomNickNames_Female[3]="Złośnik" ++RandomNickNames_Female="Pantera" ++RandomNickNames_Female="Syrena" ++RandomNickNames_Female="Sreberko" ++RandomNickNames_Female="Złośnik" ;ALPHABETICAL ORDER [LW_RebelSoldier X2SoldierClassTemplate] @@ -1872,6 +2135,7 @@ DisplayName="Członkowie ruchu oporu" [Reward_ResistanceMEC X2RewardTemplate] DisplayName="MEC ruchu oporu" +RewardDetails="Otrzymasz MEC Ruchu Oporu, który będzie strzec jednej z Twoich Kryjówek." [Reward_NewResources X2RewardTemplate] DisplayName="Nowe zasoby" @@ -1900,6 +2164,13 @@ DisplayName="Położenie regionalnego sztabu ADVENT-u" [Reward_FactionInfluence_LW X2RewardTemplate] DisplayName="Zwiększenie wpływów we frakcji" +[Reward_EnemyCorpses X2RewardTemplate] +DisplayName="Ciała wrogów" +RewardDetails="Otrzymasz wybór losowych zwłok wrogów." + +[Reward_Dummy_StatBoost X2RewardTemplate] +DisplayName="Zwiększenia statystyk" + ; POI Templates [POI_Rebels X2PointOfInterestTemplate] DisplayNames[0]="Ochotnicy" @@ -1942,6 +2213,10 @@ POIImages[2]="img:///UILibrary_StrategyImages.X2StrategyMap.POI_Abandoned" ;;;;;;;;;;;;;;;;;;;;;; STRATEGIC LOC ;;;;;;;;;;;;;;;;;;;;;;; ;;;; New Strategy-level Objectives +[LW_T2_M0_Outpost X2ObjectiveTemplate] +Title="Zarządzaj kryjówką" +LocLongDescription="Przydzielaj rebeliantom zadania w oparciu o to, czego od nich oczekujesz („wywiad” do wykrywania misji, „zaopatrzenie” do generowania zaopatrzenia i „rekrutacja” do rekrutacji nowych rebeliantów do kryjówk i żółtodziobów). Możesz także wyznaczyć doradcę ktyjówki, który będzie pomagał w różnych czynnościach i (jeśli doradcą jest żołnierzem) pomoże wykryć szpiega wśród rebeliantów." + [LW_T2_M0_Liberate_Region X2ObjectiveTemplate] Title="Wyzwól region spod kontroli ADVENT-u" LocLongDescription="Pozbądź się ADVENT-u z tego regionu, by zapewnić w nim bezpieczeństwo ludzkości i ruchowi oporu. Wyzwolenie regionu powinno dać Ruchowi Oporu na tyle swobodny dostęp do infrastruktury ADVENT-u, że będziemy mogli odkryć prawdziwy cel ich działania na Ziemi, zanim będzie za późno." @@ -2048,7 +2323,12 @@ ObjectiveTextPools[2]="Ewakuuj wszystkich operatorów XCOM." [DefaultCovertEscape_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="Dotrzyj na miejsce spotkania" -ObjectiveTextPools[1]="Extract at least one covert operative" +ObjectiveTextPools[1]="Ewakuuj przynajmniej jednego tajnego agenta" +ObjectiveTextPools[2]="Ewakuuj wszystkich żołnierzy XCOM" + +[DefaultCovertEscape_NonPCP_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Dotrzyj na miejsce spotkania" +ObjectiveTextPools[1]="Ewakuuj przynajmniej jednego tajnego agenta" ObjectiveTextPools[2]="Ewakuuj wszystkich żołnierzy XCOM" [DefaultExtract_LW X2MissionNarrativeTemplate] @@ -2064,7 +2344,7 @@ ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" [DefaultRescue_Vehicle_LW X2MissionNarrativeTemplate] ObjectiveTextPools[0]="Tury na odwrót Skyrangera" -ObjectiveTextPools[1]="Uratuj VIP-a z pojazdu ADVENT-u" +ObjectiveTextPools[1]="Uratuj VIP-a z więzienia ADVENT-u" ObjectiveTextPools[2]="Ewakuuj VIP-a na wskazanej pozycji" ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" @@ -2362,6 +2642,20 @@ PreMissionNarratives[0]="XPACK_NarrativeMoments.X2_XP_CEN_T_Sabotage_Transmitter PreMissionNarratives[1]="XPACK_NarrativeMoments.X2_XP_CEN_T_Sabotage_Transmitter_Dropship_Intro_B" PreMissionNarratives[2]="XPACK_NarrativeMoments.X2_XP_CEN_T_Sabotage_Transmitter_Dropship_Intro_C" +[CovertEscape_LW X2MissionTemplate] +DisplayName="Ucieknij z tajnej operacji" +Briefing="Tajna Operacja - Ucieknij drużynie poszukującej ADVENT-u" +PostMissionType="Ucieknij z tajnej operacji" +BriefingImage="img:///UILibrary_Common.Xcom_default" +ObjectiveTextPools[0]="Opuść strefę walki" + +[CovertEscape_NonPCP_LW X2MissionTemplate] +DisplayName="Ucieknij z tajnej operacji" +Briefing="Tajna Operacja - Ucieknij drużynie poszukującej ADVENT-u" +PostMissionType="Ucieknij z tajnej operacji" +BriefingImage="img:///UILibrary_Common.Xcom_default" +ObjectiveTextPools[0]="Opuść strefę walki" + [ProtectDevice_LW X2MissionTemplate] DisplayName="Chroń urządzenie" Briefing="Chroń urządzenie" @@ -2565,6 +2859,53 @@ ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" ObjectiveTextPools[4]="Ucieczka z więzienia" ObjectiveTextPools[5]="Grupa kontaktów ruchu oporu została ujęta podczas łapanki ADVENT-u i jest przetrzymywana w celach na tym obszarze. Po więźniów wysłano pojazdy, które mają przewieźć ich w nieznane miejsce, więc mamy niewiele czasu na przeprowadzenie akcji ratunkowej. Jeśli uda się nam dokonać skutecznej ewakuacji, będą oni cennym źródłem informacji podczas organizowania operacji w tym regionie." +[SupplyExtraction_LW X2MissionTemplate] +DisplayName="Wyodrębnij materiały ADVENT" +Briefing="Zdobądź materiały ADVENT" +PostMissionType="Znisz i złup" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="Zabezpiecz i wyodrębnij zapasy ADVENT-u" +ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" + +[SmashNGrab_LW X2MissionTemplate] +DisplayName="Wyodrębnij materiały ADVENT" +Briefing="Zdobądź materiały ADVENT" +PostMissionType="Znisz i złup" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="Zabezpiecz i wyodrębnij zapasy ADVENT-u" +ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" + +[BigSmashNGrab_LW X2MissionTemplate] +DisplayName="Wyodrębnij materiały ADVENT" +Briefing="Zdobądź materiały ADVENT" +PostMissionType="Znisz i złup" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" +ObjectiveTextPools[0]="Zabezpiecz i wyodrębnij zapasy ADVENT-u" +ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" + +[SupplyExtraction_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Oznacz i odzyskaj skrzynie ADVENT-u" +ObjectiveTextPools[1]="Odzyskaj co najmniej 4 skrzynie" +ObjectiveTextPools[2]="Ewakuuj wszystkich żołnierzy XCOM" +ObjectiveTextPools[3]="LUB: Wyeliminuj wszystkie pozostałe wrogie cele" + +[DefaultSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Zdobądź zasoby ADVENT-u" +ObjectiveTextPools[1]="Wyodrębnij zasoby ADVENT-u" +ObjectiveTextPools[2]="Odzyskaj i wyodrębnij dodatkowe zasoby (opcjonalnie)" +ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" +ObjectiveTextPools[4]="Znisz i złup" +ObjectiveTextPools[5]="Ruch Oporu odkrył wrażliwy magazyn ADVENT-u, pełen cennych zapasów i zasobów. Włam się, złap, co się da, i uciekaj, zanim przybędą posiłki ADVENTU. W tej misji będzie wiele skrzynek celów, ale każdy żołnierz może mieć przy sobie tylko jeden zasobnik zasobów." + +[DefaultBigSmashNGrab_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Zdobądź zasoby ADVENT-u" +ObjectiveTextPools[1]="Wyodrębnij zasoby ADVENT-u" +ObjectiveTextPools[2]="Odzyskaj i wyodrębnij dodatkowe zasoby (opcjonalnie)" +ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" +ObjectiveTextPools[4]="Znisz i złup" +ObjectiveTextPools[5]="Ruch Oporu odkrył wrażliwy magazyn ADVENT-u, pełen cennych zapasów i zasobów. Włam się, złap, co się da, i uciekaj, zanim przybędą posiłki ADVENTU. W tej misji będzie wiele skrzynek celów, ale każdy żołnierz może mieć przy sobie tylko jeden zasobnik zasobów." + + [TroopManeuvers_LW X2MissionTemplate] DisplayName="Przeprowadź zasadzkę na kolumnę żołnierzy ADVENT-u" Briefing="Przeprowadź zasadzkę na kolumnę żołnierzy ADVENT-u" @@ -2577,10 +2918,24 @@ ObjectiveTextPools[0]="Zneutralizuj wszystkich wrogów" ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" ObjectiveTextPools[2]="Przeprowadź zasadzkę na oddziały wroga" ObjectiveTextPools[3]="ADVENT zazwyczaj przemieszcza swoje siły w dużych grupach, jednak udało się nam zlokalizować mały oddział zdany tylko na siebie. Atak przeprowadzony w odpowiednim momencie zaszkodzi działaniom ADVENT-u w tym regionie i pozwoli nam pozyskać zwłoki niezbędne do prowadzenia badań naukowych." -; LWOTC Needs Translation -ObjectiveTextPools[4]="LWOTC Gatecrasher" -ObjectiveTextPools[5]="Welcome to the first mission of LWOTC!

The objective is simple: kill all the enemies.

Note that this is one of the few missions that allows for retrieval of enemy corpses, which are needed for research and building many items. Kills with explosives destroy corpses in LWOTC!" -; End Translation +ObjectiveTextPools[4]="LWOTC Taran" +ObjectiveTextPools[5]="Witamy w pierwszej misji LWOTC!

Cel jest prosty: zabić wszystkich wrogów.

Pamiętaj, że jest to jedna z niewielu misji, która pozwala na odzyskanie zwłok wroga , które są potrzebne do badań i budowy wielu przedmiotów. Zabójstwa przy użyciu materiałów wybuchowych niszczą zwłoki w LWOTC!" + +[CovertOpsTroopManeuvers_LW X2MissionTemplate] +DisplayName="Przeprowadź zasadzkę na kolumnę żołnierzy ADVENT-u" +Briefing="Przeprowadź zasadzkę na kolumnę żołnierzy ADVENT-u" +PostMissionType="Przeprowadź zasadzkę na oddziały wroga" +BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Guerrilla_Ops" +ObjectiveTextPools[0]="Zneutralizuj wszystkich wrogów" + +[DefaultCovertOpsTroopManeuvers_LW X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="Zneutralizuj wszystkich wrogów" +ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" +ObjectiveTextPools[2]="Przeprowadź zasadzkę na oddziały wroga" +ObjectiveTextPools[3]="ADVENT zazwyczaj przemieszcza swoje siły w dużych grupach, jednak udało się nam zlokalizować mały oddział zdany tylko na siebie. Atak przeprowadzony w odpowiednim momencie zaszkodzi działaniom ADVENT-u w tym regionie i pozwoli nam pozyskać zwłoki niezbędne do prowadzenia badań naukowych." +ObjectiveTextPools[4]="LWOTC Taran" +ObjectiveTextPools[5]="Witamy w pierwszej misji LWOTC!

Cel jest prosty: zabić wszystkich wrogów.

Pamiętaj, że jest to jedna z niewielu misji, która pozwala na odzyskanie zwłok wroga , które są potrzebne do badań i budowy wielu przedmiotów. Zabójstwa przy użyciu materiałów wybuchowych niszczą zwłoki w LWOTC!" + [Rendezvous_LW X2MissionTemplate] DisplayName="Spotkanie" @@ -2658,6 +3013,11 @@ ObjectiveTextPools[4]="Nasze działania związane z pozyskiwaniem zasobów w tym MissionPinLabel="Zwykła misja modyfikacji LWS" MissionExpiredText="Ta misja jest już niedostępna." +[DefaultChosenAvengerDefense X2MissionNarrativeTemplate] +ObjectiveTextPools[0]="(opcjonalnie) Zasadź X4 z tyłu Wieżyczek !OSTRZEŻENIE! MATERIAŁ WYBUCHOWY WYBUCHNIE NA KONIEC TURY" +ObjectiveTextPools[1]="Podłóż bombę, aby zniszczyć mobilny generator prądu !OSTRZEŻENIE! MATERIAŁ WYBUCHOWY WYBUCHNIE NA KONIEC TURY" +ObjectiveTextPools[2]="Zneutralizuj wszystkich wrogów" + [XComGame.UIMission] [UIMission] m_strMissionDifficulty="BIEŻĄCA AKTYWNOŚĆ WROGA" @@ -2686,11 +3046,12 @@ MissionDifficultyLabels[15]="Chmara+++++" MissionDifficultyLabels[16]="Chmara++++++" MissionDifficultyLabels[17]="Chmara+++++++" MissionDifficultyLabels[18]="Chmara++++++++" +MissionDifficultyLabels[19]="Przesadzony" [AdvancedWarfareCenter X2FacilityTemplate_Infirmary] -DisplayName="Ośrodek taktyk zaawansowanych" -CompletedSummary="Żołnierze o wystarczająco wysokiej randze mogą szkolić się w korzystaniu z dodatkowych zdolności, które nie należą do ich drzewka.\nDostępne jest nowe miejsce dla personelu - szybsze leczenie żołnierza.\nDostępne jest nowe miejsce dla personelu - zmiana zdolności żołnierza." -Summary="Po zbudowaniu OTZ żołnierze mogą szkolić się w wykorzystywaniu dodatkowych zdolności ofensywnych, defensywnych i związanych z bronią zapasową, które nie są dostępne dla ich klasy. Zatrudniając w OTZ naukowca, przyspieszysz powrót żołnierzy do zdrowia." +DisplayName="Szpital" +CompletedSummary="Żołnierze mają teraz szansę wyleczyć się z negatywnych cech po ukończeniu wielu misji taktycznych, nie odnosząc obrażeń.\nDostępne nowe miejsce dla personelu: zwiększa szybkość leczenia żołnierza\nDostępne nowe miejsce dla personelu: usuń wszystkie negatywne cechy" +Summary="W ambulatorium można zatrudnić naukowca, aby skrócić czas potrzebny żołnierzom na regenerację po kontuzjach. Można tu obsadzić żołnierzy, aby usunąć negatywne cechy nabyte w walce. Ulepszenie modułu hiperwitalnego pozwala na tymczasowe zawieszenie zdrowia żołnierza na czas pojedynczego rozmieszczenia bojowego." [OfficerTrainingSchool X2FacilityTemplate] DisplayName="Szkoła działań partyzanckich" @@ -2706,6 +3067,18 @@ m_strGoodRating="Zadowalająco" CannotBeDodged="Zeruje parametr uniku celu." EndTurnLabel="" +ReaperTutorialTitle="Cień Żniwiarza" +ReaperTutorialText="Żniwiarze używają zaawansowanego urządzenia maskującego zwanego „Cieniem”, które działa jak bardzo silna forma ukrycia przez 2 tury. Będąc w Cieniu, Żniwiarze mają zwiększoną mobilność, a ich wrogowie mają wyjątkowo krótkie promienie wykrywania. Mogą także rzucać nożami, nie niszcząc Cienia." + +TemplarTutorialTitle="Skupienie Templariusza" +TemplarTutorialText="Templariusze zyskują Skupienie podczas misji za pomocą Rozdarcia, niezależnie od tego, czy trafi, czy nie. Skupienie można przeznaczyć na potężne zdolności, z których niektóre mają zwiększoną skuteczność, gdy są używane na wyższych poziomach Skupienia." + +TemplarMomentumTutorialTitle="Pęd Templariuszy i Parowanie" +TemplarMomentumTutorialText="Po użyciu Rozdarcia Templariusze zawsze uruchamiają Momentum, akcję swobodnego ruchu, która pozwala im wrócić do bezpiecznej osłony lub użyć Jeden za Wszystkich, aby uzupełnić niektóre ataki. Jeden za Wszystkich zapewnia ablacyjną premię Templariuszy, jednocześnie znacznie obniżając ich obronę." + +SkirmisherTutorialTitle="Renegat" +SkirmisherTutorialText="Renegat to mobilna jednostka, która może strzelać ze swojego Bullpupa w jednostki flankujące, aby odzyskać akcję, pozwalając im ponownie strzelić, poruszyć się, rzucić granat lub zrobić coś innego. Chwytak zwiększa ich wszechstronność, pozwalając Renegatowi szybko przemierzać pole bitwy i zajmować dogodne pozycje." + [ContinentBonus_QuidProQuo X2GameplayMutatorTemplate] SummaryText="Przedmioty z czarnego rynku kosztują o %VALUE% szt. zasobów mniej." @@ -2835,14 +3208,14 @@ LongDescription="Dzięki opiniom żołnierzy oraz zespołu technicznego lepiej p UnlockedDescription="Prototyp dodany do wyposażenia" [Coilguns X2TechTemplate] -DisplayName="Broń cewkowa" +DisplayName="Broń Gaussa" CodeName="Laertes" Summary="Pora przejść od inżynierii wstecznej zdobytej broni do stworzenia zupełnie nowego rodzaju magnetycznego uzbrojenia, które przewyższa to, czym dysponuje ADVENT." LongDescription="Zasady działania broni magnetycznej opartej na cewkach znane były od bardzo dawna, jednak wprowadzenie ich w życie wymagało zrozumienia materiałów i źródeł zasilania obcych. Udało się nam stworzyć broń, która przewyższa siłą ognia swoje odpowiedniki używane przez oddziały ADVENT-u. Wykorzystywane przez nas pociski pokryte są warstwą ablacyjnego tworzywa, które topi się, gdy pocisk wędruje wewnątrz lufy z prędkością większą niż ta uzyskiwana w systemach kinetycznych obcych. Pocisk taki jest nawet w stanie przebić cienki pancerz. R. Tygan." UnlockedDescription="Prototyp dodany do wyposażenia" [AdvancedCoilguns X2TechTemplate] -DisplayName="Zaawansowana broń cewkowa" +DisplayName="Zaawansowana broń Gaussa" CodeName="Firefox" Summary="Możemy rozpocząć prace nad wyspecjalizowaną bronią cewkową." LongDescription="Przystosowanie nowej technologii broni cewkowej do naszych definicji ról na polu walki było prawdziwym wyzwaniem. Cewki wymagają precyzyjnego procesu wytwarzania, aby zachować odpowiednią trajektorię pocisku przemieszczającego się w lufie broni. Nawet niewielkie odchylenie miałoby tragiczne skutki dla broni i jej użytkownika. To prawdopodobnie z tego powodu ADVENT nigdy nie wykorzystał tej technologii. Jest zbyt kosztowna, wymaga dużych nakładów pracy i nie nadaje się do masowej produkcji na potrzeby ogromnej armii kiepsko wyszkolonych klonów. Jednakże stanowi świetne uzbrojenie dla niewielkiej kadry doświadczonych żołnierzy. R. Tygan." @@ -3023,6 +3396,27 @@ CodeName="Fajita" LongDescription="Przetworzenie tego elitarnego mutona zakończyło się sukcesem. R. Tygan." UnlockedDescription="Pozyskano ze zwłok elitarnego mutona: szt. stopów metali" +[RenderAdventPriestCorpse X2TechTemplate] +DisplayName="Przetwórz zwłoki kapłana ADVENT-u" +Summary="Z powodu szeroko stosowanej przez nas taktyki ataku i ucieczki rzadko udaje się nam pozyskać szczątki obcych i jednostek ADVENT-u. A stanowią one cenny materiał badawczy oraz źródło inspiracji dla naszych projektów konstrukcyjnych. Poza tym jesteśmy w stanie przetwarzać je, by pozyskać cenne materiały o wszechstronnych zastosowaniach. Z Kapłana ADVENT-u uda nam się pozyskać 3 sztuk stopów metali." +CodeName="Omelette" +LongDescription="Przetworzenie tego kapłana ADVENT-u zakończyło się sukcesem. R. Tygan." +UnlockedDescription="Pozyskano ze zwłok kapłana ADVENT-u: szt. stopów metali" + +[RenderAdventPurifierCorpse X2TechTemplate] +DisplayName="Przetwórz zwłoki oczyszczacza ADVENT-u" +Summary="Z powodu szeroko stosowanej przez nas taktyki ataku i ucieczki rzadko udaje się nam pozyskać szczątki obcych i jednostek ADVENT-u. A stanowią one cenny materiał badawczy oraz źródło inspiracji dla naszych projektów konstrukcyjnych. Poza tym jesteśmy w stanie przetwarzać je, by pozyskać cenne materiały o wszechstronnych zastosowaniach. Z Oczyszczacza ADVENT-u uda nam się pozyskać 3 sztuk stopów metali." +CodeName="Paneer" +LongDescription="Przetworzenie tego oczyszczacza ADVENT-u zakończyło się sukcesem. R. Tygan." +UnlockedDescription="Pozyskano ze zwłok oczyszczacza ADVENT-u: szt. stopów metali" + +[RenderSpectreCorpse X2TechTemplate] +DisplayName="Render Spectre Corpse" +Summary="Z powodu szeroko stosowanej przez nas taktyki ataku i ucieczki rzadko udaje się nam pozyskać szczątki obcych i jednostek ADVENT-u. A stanowią one cenny materiał badawczy oraz źródło inspiracji dla naszych projektów konstrukcyjnych. Poza tym jesteśmy w stanie przetwarzać je, by pozyskać cenne materiały o wszechstronnych zastosowaniach. Z Widma powinniśmy być w stanie odzyskać 4 kryształy elerium." +CodeName="Blueberry" +LongDescription="Przetworzenie tego widma zakończyło się sukcesem R. Tygan." +UnlockedDescription="Pozyskano ze zwłok widma: kryształów Elerium" + [ResistanceRadio X2TechTemplate] DisplayName="Radio ruchu oporu" Summary="Budując kopie sprzętu komunikacyjnego, który opracowaliśmy na pokładzie Avengera, będziemy mogli stworzyć naziemne przekaźniki, które powiększą nasz zasięg. Dzięki temu nasze kryjówki będą sprawniej wykonywały swoje zadania i będzie nam łatwiej skontaktować się z regionami najbardziej oddalonymi od sztabu." @@ -3031,7 +3425,7 @@ LongDescription="Avenger świetnie się nadaje do koordynowania naszej sieci kom UnlockedDescription="Dostępne są przekaźniki radiowe. WAŻNE: Żeby zbudować Przekaźnik Radiowy, przemieść Avengera do regionu, w którym chcesz budować, otwórz okno zarządzania Kryjówką klikając ikonę wieży w tym regionie i kliknij umieszczony w prawym górnym rogu okna przycisk ZBUDUJ PRZEKAŹNIK RADIOWY." [PlatedArmor X2TechTemplate] -DisplayName="Pancerz bojowy" +DisplayName="Pancerz płytowy" Summary="Wiemy już na tyle dużo o pancerzu ADVENT-u, że możemy pokusić się o wyprodukowanie naszej własnej wersji, wykazującej się tą samą budową płytową. Pierwsze prototypy nikogo nie zachwycą pod względem estetycznym, ale będą zarówno lekkie, jak i wytrzymałe." CodeName="Yorrick" LongDescription="Zdobyliśmy na tyle dużo części pancerza ADVENT-u, że możemy zacząć przystosowywać zewnętrzne płyty do potrzeb naszych żołnierzy. Zdaje się, że są one wykonane z tego samego materiału, którego obcy użyli do stworzenia kadłuba Avengera. Jest to niezwykle wytrzymała substancja o niecodziennych właściwościach magnetycznych. Pola otaczające te płyty zapewniają dodatkową ochronę przed uzbrojeniem magnetycznym, szczególnie przed bronią Gaussa, często wykorzystywaną przez ADVENT. R. Tygan." @@ -3724,10 +4118,12 @@ Description="Ogromny skład informacji wroga." ; Dark Events [DarkEvent_AlloyPadding X2DarkEventTemplate] -SummaryText="ADVENT inwestuje w ulepszanie swojego sprzętu bojowego. Niektórzy z ich żołnierzy otrzymają dodatkowe opancerzenie." +DisplayName="Trwałe: zbroja ze stopu ADVENT-u" +SummaryText="ADVENT inwestuje w ulepszenie swojego sprzętu bojowego, dodając zbroję niektórym żołnierzom na polu bitwy. [DarkEvent_ViperRounds X2DarkEventTemplate] -SummaryText="ADVENT używa w swojej broni trucizny żmij, przez co część jego żołnierzy strzela trującymi pociskami." +DisplayName="Trwałe: trujące pociski" +SummaryText="ADVENT dodaje truciznę żmii do swojej broni, dając niektórym żołnierzom trujące pociski. [DarkEvent_RapidResponse X2DarkEventTemplate] SummaryText="Obcy usprawniają procedury reakcji na zagrożenie, zwiększając tempo wysyłania posiłków w trakcie trwania niektórych misji." @@ -3749,7 +4145,7 @@ SummaryText="Obcy wysyłają bezimiennych, by przeniknęli do naszych kryjówek. QuoteText="\"Ten nowy koleś, Johnson, jest coś zbyt chętny do pomocy\"." QuoteTextAuthor="- niezidentyfikowany członek ruchu oporu" PreMissionText="Większa szansa na to, że nowo przyjęci członkowie ruchu oporu to bezimienni" -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: szpiedzy w kryjówce" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: szpiedzy w kryjówce" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: szpiedzy w kryjówce" [DarkEvent_MinorBreakthrough2 X2DarkEventTemplate] @@ -3758,7 +4154,7 @@ SummaryText="Obcy robią spore postępy w pracach nad tajnym projektem strategic QuoteText="\"Obawiam się, że oni już nie eksperymentują. Oni się doskonalą\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Obcy robią postępy w pracach nad tajnym projektem" -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: niewielki przełom" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: niewielki przełom" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: niewielki przełom" [DarkEvent_MajorBreakthrough2 X2DarkEventTemplate] @@ -3767,7 +4163,7 @@ SummaryText="Naukowcy obcych robią ogromne postępy w pracach nad tajnym projek QuoteText="\"Skuteczność, z jaką potrafią działać nasi wrogowie, jest naprawdę przerażająca\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Obcy robią ogromne postępy w pracach nad tajnym projektem." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: duży przełom" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: duży przełom" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: duży przełom" [DarkEvent_AirPatrols X2DarkEventTemplate] @@ -3776,17 +4172,17 @@ SummaryText="Patrole powietrzne obcych zmniejszają skuteczność wykrywania akt QuoteText="\"Odebrali nam dostęp do sporej części naszego nieba\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="W czasie trwania tego wydarzenia skuteczność wykrywania działań obcych przez Avengera spada o połowę." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: patrole powietrzne" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: patrole powietrzne" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: patrole powietrzne" [DarkEvent_MutonEngineers X2DarkEventTemplate] -DisplayName="Eksperci od wyburzeń" +DisplayName="Trwałe: Eksperci od wyburzeń" SummaryText="Obcy wysyłają jednostki o ulepszonych zdolnościach niszczenia osłon." QuoteText="\"Zaraz rąbnie!\"" QuoteTextAuthor="- niezidentyfikowany kapral XCOM" PreMissionText="Zapewnia niektórym żołnierzom i mutonom ADVENT-u zdolność \"saper\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: mutonowi technicy" -PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: mutonowi technicy" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: eksperci od wyburzeń" +PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: Eksperci od wyburzeń" [DarkEvent_RuralCheckpoints_LW X2DarkEventTemplate] DisplayName="Wiejskie punkty kontrolne ADVENT-u" @@ -3794,7 +4190,7 @@ SummaryText="ADVENT utrudnia przerzucanie zapasów ruchu oporu, co zmniejsza sku QuoteText="\"Zdaje się, że ADVENT-owi znudziło się już siedzenie w miastach\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zmniejsza skuteczność członków ruchu oporu, którym przydzielono zadanie zajmowania się zasobami." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: wiejskie punkty kontrolne ADVENT-u" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: wiejskie punkty kontrolne ADVENT-u" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: wiejskie punkty kontrolne ADVENT-u" [DarkEvent_CounterintelligenceSweep X2DarkEventTemplate] @@ -3803,7 +4199,7 @@ SummaryText="ADVENT poluje na szpiegów ruchu oporu, utrudniając nam zdobywanie QuoteText="\"ADVENT wszędzie ma swoich ludzi\"." QuoteTextAuthor="- dr Tygan" PreMissionText="W trakcie tego wydarzenia rebelianci gromadzący dane wywiadowcze są o połowę mniej wydajni." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: działania kontrwywiadowcze" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: działania kontrwywiadowcze" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: działania kontrwywiadowcze" [DarkEvent_RuralPropagandaBlitz X2DarkEventTemplate] @@ -3812,16 +4208,16 @@ SummaryText="ADVENT próbuje ograniczyć rekrutację nowych członków ruchu opo QuoteText="\"Jednego możecie być pewni - ADVENT karmi ludzi propagandą. A ludzie ją łykają\"." QuoteTextAuthor="- dr Tygan" PreMissionText="W trakcie tego wydarzenia rebelianci zajmujący się rekrutacją są o połowę mniej wydajni." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: błyskawiczna wiejska propaganda" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: błyskawiczna wiejska propaganda" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: błyskawiczna wiejska propaganda" [DarkEvent_ADVENTScopes X2DarkEventTemplate] -DisplayName="Lunety ADVENT-u" +DisplayName="Trwałe: Lunety ADVENT-u" SummaryText="ADVENT inwestuje w ulepszenie swojej broni." QuoteText="\"ADVENT dysponuje wieloma technologiami wojskowymi, ale jego oddziały wyposażone są przede wszystkim w sprzęt służący do kontrolowania ludności cywilnej. Ta zmiana oznacza podjęcie bezpośrednich działań wymierzonych w nas i naszych sojuszników\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Zapewnia jednostkom ADVENT-u premię do ataku." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: lunety ADVENT-u" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: lunety ADVENT-u" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: lunety ADVENT-u" [DarkEvent_ADVENTScopes X2HackRewardTemplate] @@ -3839,12 +4235,12 @@ FriendlyName="Mroczne wydarzenie: celowniki laserowe ADVENT-u" Description="Żołnierze ADVENT-u zyskują +10 do szansy na trafienie krytyczne." [DarkEvent_ADVENTLaserSights X2DarkEventTemplate] -DisplayName="Celowniki laserowe ADVENT-u" +DisplayName="Trwałe: Celowniki laserowe ADVENT-u" SummaryText="ADVENT inwestuje w ulepszenie swoich systemów celowniczych, zwiększając tym szanse na trafienia krytyczne." QuoteText="\"Żołnierze ADVENT-u będą jeszcze większym zagrożeniem dla naszych oddziałów, jeśli uda im się wprowadzić do walki te nowe projekty broni\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zapewnia jednostkom ADVENT-u premię do szansy na krytyczne trafienie naszych żołnierzy." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: celowniki laserowe ADVENT-u" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: celowniki laserowe ADVENT-u" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: celowniki laserowe ADVENT-u" [ADVENTLaserSight X2AbilityTemplate] @@ -3858,12 +4254,12 @@ FriendlyName="Mroczne wydarzenie: zapory ogniowe ADVENT-u" Description="Wrogie roboty dostają +15 do ochrony przed hakowaniem." [DarkEvent_Firewalls X2DarkEventTemplate] -DisplayName="Zapory ogniowe ADVENT-u" +DisplayName="Trwałe: Zapory ogniowe ADVENT-u" SummaryText="ADVENT zaczyna stosować ochronę przeciw naszym próbom hakowania." QuoteText="\"Roboty ADVENT-u nie będą już tak łatwym celem dla naszych specjalistów\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Zapewnia wrogim robotom zwiększoną obronę przeciw naszym próbom hakowania." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: zapory ogniowe ADVENT-u" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: zapory ogniowe ADVENT-u" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: zapory ogniowe ADVENT-u" [ADVENTFirewalls X2AbilityTemplate] @@ -3877,12 +4273,12 @@ FriendlyName="Mroczne wydarzenie: kondycja obcych" Description="Niektórzy przeciwnicy zyskują 1 punkt zdrowia." [DarkEvent_AlienConditioning1 X2DarkEventTemplate] -DisplayName="Kondycja obcych" +DisplayName="Trwałe: Kondycja obcych" SummaryText="Obcy wysyłają do walki wytrzymalsze jednostki, dysponujące dodatkowym punktem życia." QuoteText="\"Obcy musieli opracować nową, ulepszoną formułę produkowania klonów\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Zapewnia niektórym przeciwnikom dodatkowy punkt zdrowia." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: kondycja obcych" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: kondycja obcych" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: kondycja obcych" [AlienConditioning1 X2AbilityTemplate] @@ -3894,12 +4290,12 @@ FriendlyName="Mroczne wydarzenie: przystosowanie obcych" Description="Niektórzy przeciwnicy zyskują 1 punkt zdrowia." [DarkEvent_AlienConditioning2 X2DarkEventTemplate] -DisplayName="Przystosowanie obcych" +DisplayName="Trwałe: Przystosowanie obcych" SummaryText="Obcy wysyłają do walki ulepszone jednostki dysponujące dodatkowym punktem życia." QuoteText="\"Po dwóch dziesięcioleciach badań obcy potrafią już wysyłać do walki jednostki lepiej przygotowane do funkcjonowania w ziemskim środowisku\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Zapewnia niektórym przeciwnikom dodatkowy punkt zdrowia." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: przystosowanie obcych" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: przystosowanie obcych" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: przystosowanie obcych" [AlienConditioning2 X2AbilityTemplate] @@ -3911,12 +4307,12 @@ FriendlyName="Mroczne wydarzenie: przeżywalność obcych" Description="Niektórzy przeciwnicy zyskują 1 punkt zdrowia." [DarkEvent_AlienConditioning3 X2DarkEventTemplate] -DisplayName="Przeżywalność obcych" +DisplayName="Trwałe: Przeżywalność obcych" SummaryText="Obcy wysyłają do walki silniejsze jednostki dysponujące dodatkowym punktem życia." QuoteText="\"Nie tylko my doskonalimy w tej wojnie swoje zdolności bojowe\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zapewnia niektórym przeciwnikom dodatkowy punkt zdrowia." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: przeżywalność obcych" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: przeżywalność obcych" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: przeżywalność obcych" [AlienConditioning3 X2AbilityTemplate] @@ -3926,12 +4322,12 @@ LocLongDescription="+1 do punktów zdrowia" ;;; VETERAN UNITS [DarkEvent_VeteranUnits X2DarkEventTemplate] -DisplayName="Weterani" +DisplayName="Trwałe: Weterani" SummaryText="Obcy wysyłają doświadczone jednostki bojowe dysponujące premią do celności." QuoteText="\"Sieć dowodzenia ADVENT-u ma raczej niewielki potencjał rozwoju, ale niektóre z ich jednostek bojowych z czasem stają się coraz skuteczniejsze\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Zapewnia niektórym wrogim jednostkom premię do celności." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: weterani" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: weterani" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: weterani" [DarkEvent_VeteranUnits X2HackRewardTemplate] @@ -3950,7 +4346,7 @@ SummaryText="ADVENT zaczyna korzystać z zaawansowanych egzoszkieletów." QuoteText="\"ADVENT wysyła do walki prototypy, których celem jest ulepszenie mobilności zarówno klonów, jak i robotów bojowych\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Zapewnia wielu jednostkom ADVENT-u premię do mobilności." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (zaawansowane siłowniki)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (zaawansowane siłowniki)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (zaawansowane siłowniki)" [DarkEvent_AdvancedServos X2HackRewardTemplate] @@ -3969,7 +4365,7 @@ SummaryText="Obcy wysyłają do walki jednostki, które trudniej trafić." QuoteText="\"Żeby ich zabić, trzeba ich trafić\"." QuoteTextAuthor="- anonimowy szeregowy" PreMissionText="Zapewnia niektórym jednostkom ADVENT-u premię do obrony." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (obrona)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (obrona)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (obrona)" [DarkEvent_TacticalUpgrades X2HackRewardTemplate] @@ -3987,7 +4383,7 @@ SummaryText="Obcy wysyłają do walki jednostki, które dostają premię do panc QuoteText="\"Wyścig zbrojeń między nami a ADVENT-em staje się coraz bardziej zażarty\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zapewnia niektórym jednostkom obcych atut \"instynkt przetrwania\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt przetrwania)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt przetrwania)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt przetrwania)" [DarkEvent_WilltoSurvive X2HackRewardTemplate] @@ -4001,7 +4397,7 @@ SummaryText="Przeciwnik zaczyna korzystać z jednostek, które zadają zwiększo QuoteText="\"Wygrasz czy przegrasz, na koniec i tak plazma wypali ci flaki\"." QuoteTextAuthor="- anonimowy szeregowy" PreMissionText="Zapewnia niektórym jednostkom obcych atut \"środek ciężkości\"." -PostMissionSuccessText="Mroczne wydarzenie: ulepszenia taktyczne (obrażenia)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (obrażenia)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (obrażenia)" [DarkEvent_CenterMass X2HackRewardTemplate] @@ -4015,7 +4411,7 @@ SummaryText="Lansjerzy ADVENT-u zyskują zdolność \"z bliska\", która zapewni QuoteText="\"Nie dajcie tym lansjerom się do was zbliżyć\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Daje lansjerom ADVENT-u zdolność \"z bliska\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (z bliska)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (z bliska)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (z bliska)" [DarkEvent_Infighter X2HackRewardTemplate] @@ -4029,7 +4425,7 @@ SummaryText="Niektórzy przeciwnicy dostają zdolność \"potężny\", która za QuoteText="\"Będziemy potrzebowali większych bomb\"." QuoteTextAuthor="- anonimowy sierżant sztabowy" PreMissionText="Zapewnia niektórym przeciwnikom zdolność \"potężny\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (potężny)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (potężny)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (potężny)" [DarkEvent_Formidable X2HackRewardTemplate] @@ -4043,7 +4439,7 @@ SummaryText="Zapewnia niektórym przeciwnikom zdolność \"zabójczy\", dzięki QuoteText="\"Obcy chyba uwielbiają słony smak naszych łez\"." QuoteTextAuthor="- kapral John Teasdale" PreMissionText="Zapewnia niektórym przeciwnikom zdolność \"zabójczy\", dzięki której dostają premię +2 do obrażeń zadawanych bronią główną." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (zabójczy)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (zabójczy)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (zabójczy)" [DarkEvent_Lethal X2HackRewardTemplate] @@ -4057,7 +4453,7 @@ SummaryText="Niektórzy przeciwnicy zyskują zdolność \"rozrywacz\", która sp QuoteText="\"Jak na mnie mówisz? Taktyczny pancerz ablacyjny? Co to?\"" QuoteTextAuthor="- anonimowy żółtodziób" PreMissionText="Zapewnia niektórym przeciwnikom zdolność \"rozrywacz\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (rozrywacz)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (rozrywacz)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (rozrywacz)" [DarkEvent_Shredder X2HackRewardTemplate] @@ -4071,7 +4467,7 @@ SummaryText="Wiele żmij i spokrewnionych z nimi gatunków zyskuje zdolność \" QuoteText="\"Ogromne, uzbrojone po zęby, plujące jadem, inteligentne węże? Na to się pisałem?\"" QuoteTextAuthor="- anonimowy kapral" PreMissionText="Zapewnia wielu wężowym przeciwnikom zdolność \"instynkt myśliwego\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt myśliwego)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt myśliwego)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (instynkt myśliwego)" [DarkEvent_HuntersInstinct X2HackRewardTemplate] @@ -4085,7 +4481,7 @@ SummaryText="Niektórzy lansjerzy i inni przeciwnicy zyskują zdolność \"błys QuoteText="\"Nie cierpię tych kolesi\"." QuoteTextAuthor="- anonimowy sierżant zbrojmistrz" PreMissionText="Daje niektórym lansjerom i innym przeciwnikom zdolność \"błyskawiczny refleks\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (błyskawiczny refleks)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (błyskawiczny refleks)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (błyskawiczny refleks)" [DarkEvent_LightningReflexes_LW X2HackRewardTemplate] @@ -4099,7 +4495,7 @@ SummaryText="Archoni otrzymują zdolność \"specjalista od walki bezpośredniej QuoteText="\"Nie bez powodu nasi żołnierze nazywają ich aniołami śmierci\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zapewnia archonom zdolność \"specjalista od walki bezpośredniej\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (specjalista od walki bezpośredniej)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (specjalista od walki bezpośredniej)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (specjalista od walki bezpośredniej)" [DarkEvent_CloseCombatSpecialist X2HackRewardTemplate] @@ -4112,7 +4508,7 @@ SummaryText="Niektórzy przeciwnicy dostają zdolność \"draśnięcie\", która QuoteText="\"Najlepszy sposób na uniknięcie postrzelenia to unikanie ostrzału\"." QuoteTextAuthor="- anonimowy szeregowy" PreMissionText="Zapewnia niektórym przeciwnikom zdolność \"draśnięcie\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (draśnięcie)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (draśnięcie)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (draśnięcie)" [DarkEvent_GrazingFire X2HackRewardTemplate] @@ -4125,7 +4521,7 @@ SummaryText="Lansjerzy i inni przeciwnicy dostają zdolność \"rzezimieszek\", QuoteText="\"Poznajemy ich słabe strony, ale oni w tym czasie robią dokładnie to samo\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Daje lansjerom i innym przeciwnikom zdolność \"rzezimieszek\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (rzezimieszek)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (rzezimieszek)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (rzezimieszek)" [DarkEvent_Cutthroat X2HackRewardTemplate] @@ -4138,7 +4534,7 @@ SummaryText="Wartownicy ADVENT-u otrzymują zdolność \"zmysł bojowy\", która QuoteText="\"Ci wartownicy ADVENT-u chyba mają oczy dookoła głowy. Może to część ich modyfikacji genetycznych\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Daje wartownikom ADVENT-u zdolność \"zmysł bojowy\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł bojowy)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł bojowy)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł bojowy)" [DarkEvent_CombatAwareness X2HackRewardTemplate] @@ -4151,7 +4547,7 @@ SummaryText="Roboty ADVENT-u zyskują zdolność \"żelazna skóra\", która zna QuoteText="\"Pomysł, że średniowieczną bronią można zabić kosmiczne roboty, zawsze wydawał mi się lekko pomylony\"." QuoteTextAuthor="- anonimowy brytyjski szeregowy" PreMissionText="Daje robotom ADVENT-u zdolność \"żelazna skóra\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (żelazna skóra)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (żelazna skóra)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (żelazna skóra)" [DarkEvent_IronSkin X2HackRewardTemplate] @@ -4164,7 +4560,7 @@ SummaryText="Niektórzy przeciwnicy zyskują zdolność \"zmysł taktyczny\", kt QuoteText="\"Według wywiadu obcy tworzą jednostki wyspecjalizowane w operacjach antypartyzanckich\"." QuoteTextAuthor="- główny oficer Bradford" PreMissionText="Zapewnia niektórym wrogim jednostkom zdolność \"zmysł taktyczny\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł taktyczny)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł taktyczny)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (zmysł taktyczny)" [DarkEvent_TacticalSense X2HackRewardTemplate] @@ -4177,7 +4573,7 @@ SummaryText="Niektóre wrogie jednostki zyskują zdolność \"agresja\", która QuoteText="\"Chyba ich wkurzyliśmy\"." QuoteTextAuthor="- anonimowy twardziel" PreMissionText="Zapewnia niektórym wrogim jednostkom zdolność \"agresja\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (agresja)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (agresja)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (agresja)" [DarkEvent_Aggression X2HackRewardTemplate] @@ -4190,7 +4586,7 @@ SummaryText="Kodeksy zyskują zdolność \"wytrzymałość\", która zmniejsza s QuoteText="\"Nie wiemy, jakim cudem te istoty istnieją w naszym Wszechświecie, a także czemu nasza broń zadaje im w ogóle obrażenia\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Daje kodeksom zdolność \"wytrzymałość\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (wytrzymałość)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (wytrzymałość)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (wytrzymałość)" [DarkEvent_Resilience X2HackRewardTemplate] @@ -4203,7 +4599,7 @@ SummaryText="Kodeksy zyskują zdolność \"krok cienia\", która całkowicie chr QuoteText="\"Obcy zdają się eksperymentować z krótkodystansową teleportacją swoich kodeksów\"." QuoteTextAuthor="- dr Tygan" PreMissionText="Daje kodeksom zdolność \"krok cienia\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (krok cienia)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (krok cienia)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (krok cienia)" [DarkEvent_Shadowstep X2HackRewardTemplate] @@ -4216,7 +4612,7 @@ SummaryText="Niektóre roboty ADVENT-u i część innych jednostek dostają zdol QuoteText="\"Niech ktoś powie Shen, żeby wynalazła dla nas jakieś wsparcie powietrzne. Będzie nam potrzebne\"." QuoteTextAuthor="- anonimowy sierżant" PreMissionText="Daje kodeksom zdolność \"ograniczenie szkód\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (ograniczenie szkód)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (ograniczenie szkód)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (ograniczenie szkód)" [DarkEvent_DamageControl X2HackRewardTemplate] @@ -4229,7 +4625,7 @@ SummaryText="Niektóre jednostki obcych zyskują zdolność \"trudny cel\", któ QuoteText="\"\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Daje niektórym jednostkom obcych zdolność \"trudny cel\"." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: ulepszenia taktyczne (trudny cel)" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: ulepszenia taktyczne (trudny cel)" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: ulepszenia taktyczne (trudny cel)" [DarkEvent_HardTarget X2HackRewardTemplate] @@ -4242,7 +4638,7 @@ SummaryText="Obcy wysyłają do walki silniejszego i bardziej śmiercionośnego QuoteText="\"Nie wiemy, czy ci obcy to posiłki spoza planety czy raczej nowy projekt z ich fabryki klonów. Tak czy inaczej są oni o wiele groźniejsi niż dotychczas\"." QuoteTextAuthor="- główna technik Shen" PreMissionText="Obcy wysyłają do walki silniejszego i bardziej śmiercionośnego bezimiennego." -PostMissionSuccessText="Zapobieżenie mrocznemu wydarzeniu: potężniejszy bezimienny" +PostMissionSuccessText="Zapobiegnięto mrocznemu wydarzeniu: potężniejszy bezimienny" PostMissionFailureText="Nie udało się zapobiec mrocznemu wydarzeniu: potężniejszy bezimienny" [DarkEvent_GreaterFaceless X2HackRewardTemplate] @@ -4528,6 +4924,14 @@ DisplayName="Odparte ataki ADVENT-u:" [ResAct_RaidsLost X2ResistanceActivityTemplate] DisplayName="Skuteczne ataki ADVENT-u:" +; just fix typo +[Insanity X2AbilityTemplate] +LocPromotionPopupText="Szaleństwo ma czas odnowienia .
Szaleństwo wymaga rywalizacji pomiędzy statystyką Siły Psi Operatora Psi a wolą celu.
Szaleństwo może dezorientować, ogłuszać , lub kontrolować umysł celu, jeśli się powiedzie.
Mechaniczni wrogowie są całkowicie odporni na szaleństwo.
Szaleństwo wymaga jednej akcji i nie kończy twojej tury.
" + +[XComGame.UIEndGameStats] +Victory=ZWYCIĘSTWO W LONG WAR +NumberColonels=ILOŚĆ GSGTS + [ShapedCharge X2GrenadeTemplate] FriendlyName="Ładunek Kumulacyjny" FriendlyNamePlural="Ładunki Kumulacyjne" @@ -4543,6 +4947,12 @@ LocFriendlyName="Uśpienie" LocHelpText="Usypia pobliskiego ogłuszonego, spanikowanego, lub zdezorientowanego sojusznika, pozbawiając przytomności na resztę misji" LocFlyOverText="Uśpiony" +[Shredder X2AbilityTemplate] +LocFriendlyName="Zniszczenie" +LocLongDescription="Twoja główna broń niszczy zbroję." +LocHelpText="Twoja główna broń niszczy zbroję." +LocPromotionPopupText=" Udany strzał z broni konwencjonalnej zniszczy 1 pancerz celu .
Bardziej zaawansowana broń zniszczy więcej pancerza celu.
" + [Interact_SmashNGrab X2AbilityTemplate] LocFriendlyName="Otwórz/zamknij skrzynię" LocHelpText="Otwarcie lub zamknięcie skrzyni." @@ -4559,117 +4969,104 @@ TacticalText=" Wzmacniacz PSI zwiększa siłę psioniczną agenta PSI o [Reward_Radio_Relay X2RewardTemplate] DisplayName="Przekaźnik Radiowy" -[SupplyExtraction_LW X2MissionTemplate] -DisplayName="Pozyskanie zasobów ADVENT-u" -Briefing="Zdobądź zasoby ADVENT-u" -PostMissionType="Włamanie" -BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" -ObjectiveTextPools[0]="Zdobądź i zabierz zasoby ADVENT-u" -ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" - -[SmashNGrab_LW X2MissionTemplate] -DisplayName="Włamanie" -Briefing="Nalot na magazyn ADVENT-u" -PostMissionType="Włamanie" -BriefingImage="img:///UILibrary_StrategyImages.X2StrategyMap.Alert_Resistance_Ops_Appear" -ObjectiveTextPools[0]="Przechwyć tyle zasobów ile dasz radę" -ObjectiveTextPools[1]="Ewakuuj wszystkich żołnierzy XCOM" +; New for 1.3 -[SupplyExtraction_LW X2MissionNarrativeTemplate] -ObjectiveTextPools[0]="Oznacz i zdobądź skrzynie ADVENT-u" -ObjectiveTextPools[1]="Oznacz i zdobądź skrzynie ADVENT-u" -ObjectiveTextPools[2]="Ewakuuj wszystkich żołnierzy XCOM" -ObjectiveTextPools[3]="Albo: zneutralizuj resztę wrogów" +[MissionTimers] +TimerSmashNGrabTitle="Posiłki" +TimerSmashNGrabSubtitle="Tury do przybycia obcych" +TimerDefendTitle="Posiłki" +TimerDefendSubtitle="Tury do przybycia ADVENT-u" -[DefaultSmashNGrab_LW X2MissionNarrativeTemplate] -ObjectiveTextPools[0]="Przechwyć zasoby od ADVENT-u" -ObjectiveTextPools[1]="Ewakuuj się z przechwyconym zasobami od ADVENT-u" -ObjectiveTextPools[2]="Przechwyć i zgarnij dodatkowe zasoby (opcjonalnie)" -ObjectiveTextPools[3]="Ewakuuj wszystkich żołnierzy XCOM" -ObjectiveTextPools[4]="Włamanie" -ObjectiveTextPools[5]="Ruch oporu odkrył słabo zabezpieczony magazyn od ADVENT-u wypełniony sprzętem i zasobami. Dostań się do środka, zgarnij ile się tylko da i zabieraj się stąd zanim ADVENT sprowadzi posiłki. W magazynie znajduje się mnóstwo skrzynek z zasobami, ale twoi żołnierze mogą tylko nieść po jednej naraz." +[InTheZone X2AbilityTemplate] +LocPromotionPopupText=" Seria seryjna ma na celu połączenie zabójstw wroga w jednej akcji, ponieważ każde zabójstwo jest w zasadzie darmowe.
Każde udane zabójstwo powoduje jednak zmniejszenie szansy na trafienie krytyczne i obrażeń.
Umiejętność wymaga tur{y} odnowienia.
" -[SmashNGrabQuestItem X2EquipmentTemplate] -FriendlyName="Skrzynia z zapasami ADVENT-u" -FriendlyNamePlural="Skrzynie z zapasami ADVENT-u" -BriefSummary="Mała paczka z cenną zawartością." - -[MissionTimers] -TimerSmashnGrabTitle="Posiłki obcych" -TimerSmashNGrabSubTitle="Pozostało tur do przybycia posiłków obcych" +[Fuse X2AbilityTemplate] +LocLongDescription="Jeśli wróg ma przy sobie materiały wybuchowe, Agent Psi może je zdalnie zdetonować. Darmowa akcja." +LocHelpText="Jeśli wróg ma przy sobie materiały wybuchowe, Agent Psi może je zdalnie zdetonować. Darmowa akcja." +LocPromotionPopupText=" Fuzja wymaga tur{y} odnowienia.
" [BulletShred X2AbilityTemplate] -LocLongDescription="Strzał rozrywający ma dużą szansę na zadanie obrażeń krytycznych, a każde kolejne dowolne trafienie w cel zada mu + dodatkowych obrażeń." -LocHelpText="Strzał rozrywający ma dużą szansę na zadanie obrażeń krytycznych, a każde kolejne dowolne trafienie w cel zada mu zwiększone obrażenia." +LocLongDescription="Strzał Rozrywający zapewnia premię % do szans na trafienie krytyczne i gwarantuje, że cel otrzyma dodatkowe + obrażenia od wszystkich ataków w przyszłości." +LocHelpText="Strzał Rozrywający zapewnia premię % do szans na trafienie krytyczne i gwarantuje, że cel otrzyma dodatkowe + obrażenia od wszystkich ataków w przyszłości." +LocPromotionPopupText=" Rozerwanie wymaga punktów amunicji .
Rozerwanie wymaga tur{y} odnowienia.
Rozerwane cele otrzymują dodatkowe obrażenia przed każdym atakiem.
" -[Solace_LW X2AbilityTemplate] -LocFriendlyName="Ukojenie" -LocFlyOverText="Ukojenie" -LocLongDescription="Operatora PSI otacza aura, która automatycznie blokuje mentalne osłabienia nałożone na niego i pobliskich członków drużyny." -LocHelpText="Operatora PSI otacza aura, która automatycznie blokuje mentalne osłabienia nałożone na niego i pobliskich członków drużyny." -LocPromotionPopupText=" Ukojenie oczyszcza umysł z dezorientacji, kontroli umysłu, paniki oraz efektów ogłuszenia.
" +[Faceoff X2AbilityTemplate] +LocPromotionPopupText=" Dogrywka najlepiej sprzyja agresywnej pozycji w polu, dająca dużą szansę na trafienie w wiele celów.
Dogrywka wymaga turodnowienia.
Nie można użyć z ukrycia." -[Whirlwind2 X2AbilityTemplate] -LocFriendlyName="Trąba powietrzna" -LocLongDescription="Jeżeli trafisz przeciwnika podczas walki wręcz otrzymasz jeden dodatkowy ruch." -LocHelpText="Otrzymasz jeden dodatkowy ruch po skutecznym trafieniu przeciwnika w walce wręcz." -LocFlyOverText="Trąba powietrzna" -LocPromotionPopupText=" Żołnierz może zyskać tylko jeden dodatkowy ruch na turę dzięki tej zdolności.
Nie można jej stosować jeżeli zdolność \"Żniwiarz\" jest aktywna.
" +[FanFire X2AbilityTemplate] +LocPromotionPopupText=" Każdy strzał daje osobną szansę na trafienie.
Śmiercionośny ognień może zadać niszczycielskie obrażenia, jeśli każdy strzał trafi.
Umiejętność wymaga tur{y} odnowienia.
" -[QuickStudy X2AbilityTemplate] -LocFriendlyName="Szybkie przyswajanie wiedzy" -LocLongDescription="Kształć oficerów w szkole ruchu oporu oraz ucz żołnierzy nowych umiejętności w OTZ, w połowie krótszym czasie niż zwykle." -LocHelpText="Kształć oficerów w szkole ruchu oporu oraz ucz żołnierzy nowych umiejętności w OTZ, w połowie krótszym czasie niż zwykle." -LocPromotionPopupText=" Kształć oficerów w szkole ruchu oporu oraz ucz żołnierzy nowych umiejętności w OTZ, w połowie krótszym czasie niż zwykle." +[SoulSteal X2AbilityTemplate] +LocLongDescription="Wewnętrzny ogień leczy rannego agenta i zapewnia ablacyjne HP, ale zwiększa czas odnowienia o 1" +LocHelpText="Wewnętrzny ogień leczy rannego agenta i zapewnia ablacyjne HP, ale zwiększa czas odnowienia o 1" +LocPromotionPopupText=" Wewnętrzny ogień uzupełni utracone zdrowie rannego agenta i zapewni 3/4/6 ablacyjnego punktu wytrzymałości na 3 tury.
Agent może zwiększyć swoje zdrowie do nie więcej niż 15 punktów życia podczas korzystania z tej umiejętności." -[CoupDeGrace2 X2AbilityTemplate] -LocFriendlyName="Dobicie" -LocFlyOverText="Dobicie" -LocLongDescription="Bonus do trafienia, obrażeń, a także szansy na obrażenia krytyczne w walce wręcz wobec zdezorientowanych, ogłuszonych lub spanikowanych przeciwników." -LocHelpText="Bonus do trafienia, obrażeń, a także szansy na obrażenia krytyczne w walce wręcz wobec zdezorientowanych, ogłuszonych lub spanikowanych przeciwników." -LocPromotionPopupText=" Zdolnośc \"Dobicie\" daje bonus +50% do celności, +50% do szansy na obrażenia krytyczne oraz dodatkowo +2 do obrażeń wobec ogłuszonych lub spanikowanych żołnierzy.
Przyznany bonus jest mniejszy wobec tylko zdezorientowanych przeciwników." +[Domination X2AbilityTemplate] +LocPromotionPopupText=" Dominacja wymaga konfrontacji statystyki Siły Psi Agenta Psi z Wolą celu.
Jeśli próba Dominacji się nie powiedzie, następują 4 tura odnowienia, zanim będzie można podjąć kolejną próbę dominacji.
< Bullet/> Jeśli Agent Psi umrze lub opuści pole bitwy, dominacja zostaje przerwana.
" -[SoulSteal X2AbilityTemplate] -LocLongDescription="Wewnętrzny ogień przenosi połowę zadanych obrażeń z powrotem do Operatora PSI lecząc go lub gwarantując dodatkowe punkty tarczy gdy jest zdrowy." -LocHelpText="Wewnętrzny ogień leczy rany Operatora PSI lub zapewnia punkty tarczy. -LocPromotionPopupText=" Wewnętrzny ogień uzupełnia utracone punkty życia rannych Operatorów PSI lub też zapewnia dodatkowy punkt tarczy dla w pełni zdrowego.
Operator PSI może uzyskać maksymalnie do 8 dodatkowych punktów tarczy w wyniku posługiwania się Wewnętrznym Ogniem." +[VoidRift X2AbilityTemplate] +LocPromotionPopupText=" Wygeneruj wybuchowe pole energii psionicznej, które natychmiast niszczy wszystko w środku. Organiczni wrogowie mają szansę doznać szaleństwa.
Szczelina pustki rozrywa cele na 1. Wartość rozerwania wzrasta wraz z lepszą technologią.
Umiejętność wymaga tur{y}{y} odnowienia.
" + +[CoveringFire X2AbilityTemplate] +LocLongDescription="Strzały reakcjipowodują ograniczenie celności u wrogów i mogą być teraz wywołane dowolną akcją wroga, a nie tylko ruchem." +LocPromotionPopupText=" Jeżeli akcja wroga wywoła ogień osłonowy, zostanie on rozpatrzony, zanim przeciwnik dokończy swoje działanie.
Dodatkowo, zdolność \"Ogień osłonowy\" obniża celność każdej jednostce przeciwnika, wobec której jest prowadzony ostrzał, niezależnie od tego czy jest ogień osłonowy czy też nie.
" [GrenadeLauncher_MG X2GrenadeLauncherTemplate] BriefSummary="W zaawansowanym granatniku użyto technologii magnetycznej aby wystrzeliwać granaty dalej niż ze zwykłego granatnika." TacticalText=" Zaawansowany granatnik posiada zwiększony zasięg w porównaniu do zasięgu zwykłego granatnika.\n." +[GrenadeLauncher_BM X2GrenadeLauncherTemplate] +FriendlyName="Granatnik wiązkowy" +FriendlyNamePlural="Granatnik wiązkowy" +BriefSummary="Granatnik wiązkowy łączy w sobie nasze najnowsze przełomowe osiągnięcia w zakresie napędu opartego na technologii wiązek i systemów celowania wspomaganych sztuczną inteligencją, aby dostarczać ładunki z niespotykaną precyzją." +TacticalText=" Granatnik wiązkowy przekształca dowolny granat w autonomiczny pocisk, który z łatwością może omijać przeszkody." + [FlashbangGrenade X2GrenadeTemplate] TacticalText=" Granaty błyskowe nie zadają obrażeń, ale dezorientują i oszałamiają wrogów na dużym obszarze.
Sojusznicy z drużyny unikną negatywnych efektów jego działania.
Niektórzy potężni przeciwnicy mogą być zdolni do bycia odpornymi na ich działanie." ThrownAbilityHelpText="Dezorientuje wrogie jednostki w polu rażenia." LaunchedAbilityHelpText="Dezorientuje wrogie jednostki w polu rażenia." -[CoveringFire X2AbilityTemplate] -LocPromotionPopupText=" Jeżeli akcja wroga wywoła ogień osłonowy, zostanie on rozpatrzony, zanim przeciwnik dokończy swoje działanie.
Dodatkowo, zdolność \"Ogień osłonowy\" obniża celność każdej jednostce przeciwnika, wobec której jest prowadzony ostrzał, niezależnie od tego czy jest ogień osłonowy czy też nie.
" +[Whirlwind2 X2AbilityTemplate] +LocFriendlyName="Trąba powietrzna" +LocLongDescription="Jeżeli trafisz przeciwnika podczas walki wręcz otrzymasz jeden dodatkowy ruch." +LocHelpText="Otrzymasz jeden dodatkowy ruch po skutecznym trafieniu przeciwnika w walce wręcz." +LocFlyOverText="Trąba powietrzna" +LocPromotionPopupText=" Dzięki tej zdolności żołnierz może zyskać tylko jeden ruch na turę.
" -[InTheZone X2AbilityTemplate] -LocPromotionPopupText=" Seria może zlikwidować wielu wrogów w jednej akcji, ponieważ zabicie każdego z nich jest praktycznie darmowe.
Każda udana likwidacja zmniejsza jednak szansę trafienia krytycznego.
Odnawianie serii trwa następującą liczbę tur: .
Każde zabicie przeciwnika redukuje zadawane obrażenia przy kolejnych trafieniach.
" +[Solace_LW X2AbilityTemplate] +LocFriendlyName="Ukojenie" +LocFlyOverText="Ukojenie" +LocLongDescription="Agenta PSI otacza aura, która automatycznie blokuje mentalne osłabienia nałożone na niego i pobliskich członków drużyny." +LocHelpText="Agenta PSI otacza aura, która automatycznie blokuje mentalne osłabienia nałożone na niego i pobliskich członków drużyny." +LocPromotionPopupText=" Ukojenie usuwa efekty dezorientacji, kontroli umysłu, paniki i ogłuszenia.
Ukojenie wymaga jednej akcji i nie kończy twojej tury.
Umiejętność wymaga tur(y) odnowienia.
" -[ThreatAssessment X2AbilityTemplate] -LocLongDescription="Protokół wsparcia daje celowi ogień osłonowy przy strzale w trybie warty." -LocPromotionPopupText=" Protokół wsparcia daje celowi ogień osłonowy przy strzale w trybie warty." +[QuickStudy X2AbilityTemplate] +LocFriendlyName="Szybka nauka" +LocLongDescription="Naucz się umiejętności oficerskich w o połowę krótszym czasie." +LocHelpText="Naucz się umiejętności oficerskich w o połowę krótszym czasie." +LocPromotionPopupText=" Naucz się umiejętności oficerskich w o połowę krótszym czasie." [DoubleTap2 X2AbilityTemplate] LocFriendlyName="Dublet" LocFlyOverText="Dublet" LocLongDescription="Aktywuj zdolność: Zwykły strzał z dodatkową, gwarantowaną akcją wykonania kolejnego strzału lub ustanowienia Warty." LocHelpText="Wystrzel, a następnie uzyskaj dodatkowy, gwarantowany strzał lub ustanowienie warty." -LocPromotionPopupText=" Aktywuj zdolność: Zwykły strzał z dodatkową, gwarantowaną akcją wykonania kolejnego strzału w odniesieniu do zdolności: \"Zwykły Strzał\", \"Precyzyjny Strzał\", \"Sokole Oko\", \"Kubikiri\" lub \"Warta\".
-turowy czas odnowienia.
" +LocPromotionPopupText=" Aktywuj, aby oddać standardowy strzał i uzyskać drugą akcję ograniczoną do kilku różnych umiejętności strzeleckich lub Overwatch.
Dublet wymaga tur(y) odnowienia .
" [DoubleTap2Bonus X2AbilityTemplate] LocFriendlyName="Dublet" LocFlyOverText="Dublet" [RescueProtocol X2AbilityTemplate] -LocFriendlyName="Procedura Ratunkowa" -LocFlyoverText="Procedura Ratunkowa" -LocLongDescription="Użyj Gremlina do przywrócenia punktu ruchu dla wybranego sojusznika." -LocHelpText="Przywraca punkt ruchu dla wybranego sojusznika." -LocPromotionPopupText=" Zdolność \"Procedura Ratunkowa\" może zostać użyta tylko na sojuszniku, który zużył wszystkie punkty akcji.
Nie można użyć gdy sojusznik jest w ukryciu, jest przygwożdżony lub pełni wartę.
Sojusznik nie może być, w tej samej turze, jednocześnie celem Zdolności \"Rozkaz\" oraz Procedury Ratunkowej.
Zużywa 1 punkt akcji.
Ilość możliwych użyć zwiększa się wraz z rozwojem technologicznym Gremlina.
+LocFriendlyName="Procedura ratunkowa" +LocFlyoverText="Procedura ratunkowa" +LocLongDescription="Użyj swojego Gremlina, aby przyznać sojusznikowi akcję ruchu i zapewnić mu niewielką premię do uników i mobilności." +LocHelpText="Użyj swojego Gremlina, aby przyznać sojusznikowi akcję ruchu i zapewnić mu niewielką premię do uników i mobilności." +LocPromotionPopupText=" Procedura ratunkowa zapewnia + unik i + mobilność.
Procedury można używać tylko na sojusznikach, którym nie pozostały żadne punkty akcji.
Nie można go użyć na jednostkach ukrytych, tłumiących lub nadzorujących.
Sojusznik nie może skorzystać jednocześnie z Procedury dowodzenia i ratunkowej.
Używa jednej akcji i nie kończy tury.
Procedura ratunkowa ma ładunków na misję.
Ładunki rosną wraz z ulepszoną technologią Gremlin.
" + +[Blademaster X2AbilityTemplate] +LocLongDescription="Wszystkie ataki wręcz zadają o + dodatkowe obrażenia i mają o + zwiększone celowanie." +LocHelpText="Dodatkowe obrażenia i celowanie we wszystkich atakach wręcz." [AssaultRifle_BM X2WeaponTemplate] TacticalText=" Karabin plazmowy to niezwykle potężna i uniwersalna broń główna piechoty.\n Oddanie strzału z broni głównej żołnierza zawsze kończy jego turę.\n Używaj ulepszeń zdobytych od wrogów, żeby zwiększyć taktyczną przydatność karabinu plazmowego.
Broń plazmowa powoduje, że cel otrzymuje dodatkowy 1 punkt obrażeń od każdego kolejnego udanego trafienia." @@ -4685,3 +5082,1811 @@ TacticalText=" Blaster plazmowy wystrzeliwuje promień niszczycielskiej [SparkRifle_BM X2WeaponTemplate] TacticalText=" Działko fazowe z elerium, zaprojektowane specjalnie, by zmaksymalizować siłę rażenia Sparków, to szczyt osiągnięć w tej dziedzinie.\n Oddanie strzału z broni głównej jednostki kończy turę, jeśli nie przeszła ona specjalnego szkolenia.
Broń plazmowa powoduje, że cel otrzymuje dodatkowy 1 punkt obrażeń od każdego kolejnego udanego trafienia." + +[Skirmisher X2SoldierClassTemplate] +AbilityTreeTitles[4]="Pistolety" + +[Reaper X2SoldierClassTemplate] +AbilityTreeTitles[4]="Pistolety" + +[Templar X2SoldierClassTemplate] +RankNames[0]="Żółtodziób" +RankNames[1]="Nowicjusz" +RankNames[2]="Akolita" +RankNames[3]="Adept" +RankNames[4]="Uczeń" +RankNames[5]="Mistyk" +RankNames[6]="Czarodziej" +RankNames[7]="Mag" +RankNames[8]="Mistrz" + +ShortNames[0]="Żółt." +ShortNames[1]="Nowi." +ShortNames[2]="Akol." +ShortNames[3]="Adp." +ShortNames[4]="Ucz." +ShortNames[5]="Mtk." +ShortNames[6]="Czar." +ShortNames[7]="Mag." +ShortNames[8]="Mstr." + +RankIcons[0]= "UILibrary_Common.rank_rookie" +RankIcons[1]= "UILibrary_Common.psirank_initiate" +RankIcons[2]= "UILibrary_Common.psirank_acolyte" +RankIcons[3]= "UILibrary_Common.psirank_adept" +RankIcons[4]= "UILibrary_Common.psirank_disciple" +RankIcons[5]= "UILibrary_Common.psirank_mystic" +RankIcons[6]= "UILibrary_Common.psirank_warlock" +RankIcons[7]= "UILibrary_Common.psirank_magus" +RankIcons[8]= "UILibrary_LW_PerkPack.psirank_Master" + +[Retribution X2AbilityTemplate] +LocFriendlyName="Zamsta" +LocLongDescription="Darmowe ataki na wszystkich wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz podczas tur wroga." +LocHelpText="Darmowe ataki na wszystkich wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz podczas tur wroga." +LocFlyOverText="Zamsta" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Odwet zostanie aktywowany, jeśli ten wróg spróbuje zaatakować Renegata.
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, Odwet zostanie aktywowany, gdy wróg znajdzie się w zasięgu walki wręcz.
Odwet nie aktywuje się w twojej turze.
" + +[RetributionAttack X2AbilityTemplate] +LocFriendlyName="Zamsta" +LocLongDescription="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz czyli Burza Ostrzy." +LocHelpText="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz czyli Burza Ostrzy." +LocFlyOverText="Zamsta" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Odwet zostanie aktywowany, jeśli ten wróg spróbuje zaatakować Renegata.
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, Odwet zostanie aktywowany, gdy wróg znajdzie się w zasięgu walki wręcz.
" + +[Battlemaster X2AbilityTemplate] +LocFriendlyName="Mistrz bitewny" +LocLongDescription="Renegacito elitarni żołnierze, ze względu na ich przeszłość w ADVENT-cie, co zapewnia im miejsce na granat." +LocHelpText="Renegacito elitarni żołnierze, ze względu na ich przeszłość w ADVENT-cie, co zapewnia im miejsce na granat." +LocPromotionPopupText=" Dodatkowy granat można umieścić w unikalnym miejscu przeznaczonym wyłącznie na granaty.
" + +[SkirmisherGrapple X2AbilityTemplate] +LocPromotionPopupText=" Chwytak pozwala Renegatowi zająć pozycję bez użycia akcji.
Umiejętność wymaga tur(y) odnowienia." + +[Reckoning_LW X2AbilityTemplate] +LocFriendlyName="Rozliczenie" +LocLongDescription="Odblokuj szarżę." +LocHelpText="Odblokuj szarżę." +LocFlyOverText="Rozliczenie" +LocPromotionPopupText=" Możesz aktywować zdolność Szarży, umieszczając kursor ruchu nad wrogiem i klikając prawym przyciskiem myszy.
Szarża kosztuje 1 punkt akcji, nie kończy się turą i wymaga tur(y) odnowienia.
Renegat może wykonać doskok za pomocą ataku Szarży, ale nadal będzie to kosztować tylko 1 punkt akcji.
" + +[SkirmisherFleche X2AbilityTemplate] +LocFriendlyName="Szarża" +LocLongDescription="Zaatakuj dowolnego wroga w zasięgu ruchu za pomocą ." +LocHelpText="Zaatakuj dowolnego wroga w zasięgu ruchu za pomocą ." +LocPromotionPopupText=" Możesz aktywować zdolność Szarży, umieszczając kursor ruchu nad wrogiem i klikając prawym przyciskiem myszy.
Szarża kosztuje 1 punkt akcji, nie kończy się turą i wymaga tur(y) odnowienia.
Renegat może wykonać doskok za pomocą ataku Szarży, ale nadal będzie to kosztować tylko 1 punkt akcji.
" + +[SkirmisherSlash X2AbilityTemplate] +LocFriendlyName="Ripjack Slash" +LocFlyOverText="Ripjack Slash" +LocLongDescription="Zaatakuj sąsiadujący cel pazurami. Nie kończy tury." +LocHelpText="Zaatakuj sąsiadujący cel pazurami. Nie kończy tury." +LocPromotionPopupText=" Ciosu pazurami można używać wyłącznie przeciwko sąsiadującym celom.
" + +[SupremeFocus X2AbilityTemplate] +LocFriendlyName="Najwyższe skupienie" +LocLongDescription="Maksymalny poziom skupienia zostaje zwiększony do 4." +LocHelpText="Maksymalny poziom skupienia zostaje zwiększony do 4." +LocPromotionPopupText=" Skupienie poziom 4: obrażenia rozdarcia +, mobilność +, unik +
" + +[UITacticalHUD_SoldierInfo] +FocusLevelDescriptions[0]="" +FocusLevelDescriptions[1]="Obrażenia rozdarcia +\nmobliność +\nunik +" +FocusLevelDescriptions[2]="Obrażenia rozdarcia +\nmobliność +\nunik +" +FocusLevelDescriptions[3]="Obrażenia rozdarcia +\nmobliność +\nunik +" +FocusLevelDescriptions[4]="Obrażenia rozdarcia +\nmobliność +\nunik +" + +[TemplarFocus X2AbilityTemplate] +LocPromotionPopupText=" Templariusze rozpoczynają misje słabsi niż inni żołnierze, ale mogą stać się niezwykle potężni przy wyższych poziomach skupienia.
Skupienie zdobywa się atakując wrogów za pomocą Rozdarcia (nawet pudła się liczą).
" + +[Rend X2AbilityTemplate] +LocLongDescription="Atak wręcz z szansą na ogłuszenie lub zdezorientowanie celu. Wyzwala Momentum i generuje Skupienie na atakach." +LocHelpText="Atak wręcz z szansą na ogłuszenie lub zdezorientowanie celu. Wyzwala Momentum i generuje Skupienie na atakach." +LocPromotionPopupText=" Używanie Rozdarcia jest podstawową metodą Templariusza generowania Skupienia.
Po rzuceniu Rozdarcia Templariusz zyskuje Pęd, pozwalający mu na jedną akcję ruchu. Użyj tego, aby powrócić do osłony po ataku.
Rozdarcie ma % szansy na ogłuszenie za każde skupienie. Ogłuszone cele również zostaną odrzucone.
Rozdarcie ma % szans na dezorientację przy każdym skupieniu.
" + +[Whiplash X2AbilityTemplate] +LocLongDescription="Attack an enemy with an electrical lash. This attack has a turn cooldown." +LocHelpText="An attack with an electrical lash. Extra damage to robotic units. turn cooldown." +LocPromotionPopupText=" Whiplash does extra damage to robotic enemies.
Bicz wymaga jednej akcji i nie kończy Twojej tury.
Umiejętność wym tur(y) odnowienia.
" + +[SkirmisherInterrupt X2AbilityTemplate] +LocLongDescription="Potężna forma Warty. Zamiast strzelać automatycznie, wykonaj dowolną pojedynczą akcję. Darmowa akcja." +LocHelpText="Potężna forma Warty. Zamiast strzelać automatycznie, wykonaj dowolną pojedynczą akcję. Darmowa akcja." +LocPromotionPopupText=" Jest to akcja darmowa.
Niektóre akcje nie są dostępne podczas Przerwania, np. Warta.
Umiejętność wymaga tur(y) odnowienia." + +[Pillar X2AbilityTemplate] +LocLongDescription="Summon a pillar of Psionic energy to act as a high cover point. Free action, does not cost focus." +LocHelpText="Summon high cover at a target location. Free action, does not cost focus." +LocPromotionPopupText=" The pillar will last for a number of turns equal to the Templar's Focus level when summoned.
Pillar is a free action.
Can be used after Rend.
Umiejętność wymaga tur(y) odnowienia.
" + +[StunStrike X2AbilityTemplate] +LocLongDescription="Uderz wroga siłą psioniczną, ogłuszając go. Kosztuje 1 Skupienie." +LocHelpText="Uderz wroga siłą psioniczną, ogłuszając go. Kosztuje 1 Skupienie." +LocPromotionPopupText=" Stun Strike has a % chance to hit, increased by % for each Focus level.
Stun Strike has a % chance to stun the target if successful.
Stun Strike does not end the Templar's turn.
Umiejętność wymaga tur(y) odnowienia.
" + +[BondmateTeamwork X2AbilityTemplate] +LocHelpText="Przyznaj dodatkowy punkt ruchu towarzyszowi więzi. Ma pojedynczy ładunek dzielony pomiędzy towarzyszami więzi." +LocLongDescription="Przyznaj dodatkowy punkt ruchu towarzyszowi więzi. Ma pojedynczy ładunek dzielony pomiędzy towarzyszami więzi." + +[BondmateTeamwork_Improved X2AbilityTemplate] +LocHelpText="Przyznaj dodatkowy punkt akcji towarzyszowi więzi. Ma jeden lub dwa ładunki na misję, w zależności od poziomu więzi, dzielone pomiędzy sojuszników." +LocLongDescription="Przyznaj dodatkowy punkt akcji towarzyszowi więzi. Ma jeden lub dwa ładunki na misję, w zależności od poziomu więzi, dzielone pomiędzy sojuszników." + +[Shadow X2AbilityTemplate] +LocLongDescription="Zapewnia żołnierzowi Cień, zaawansowaną formę ukrycia, która trwa 2 tury." +LocHelpText="Zapewnia żołnierzowi Cień, zaawansowaną formę ukrycia, która trwa 2 tury." +LocPromotionPopupText=" Cień zmniejsza zasięg wykrywania maksymalnie do kilku pól.
Żniwiarz ma zwiększoną mobilność w Cieniu.
Wejście w cień jest darmową akcją wymagającą tur(y) odnowienia.
Cień uniemożliwia wykrycie przez wieże ADVENT-u.
" + +[SilentKiller X2AbilityTemplate] +LocLongDescription="Gwarantuje, że Żniwiarz pozostanie w Cieniu przy zabójczych strzałach." +LocHelpText="Gwarantuje, że Żniwiarz pozostanie w Cieniu przy zabójczych strzałach." +LocPromotionPopupText=" Pozwala Żniwiarzowi bezpiecznie pozostać w Cieniu, jeśli zabije jednostkę swoją bronią główną." + +[ShadowRising X2AbilityTemplate] +LocLongDescription="Skraca czas odnowienia Cienia o 1 turę." +LocHelpText="Skraca czas odnowienia Cienia o 1 turę." +LocPromotionPopupText=" Skraca czas odnowienia Cienia o 1 turę.
" + +[BloodTrail X2AbilityTemplate] +LocFriendlyName="Krwawy ślad" +LocLongDescription="Ataki zadają + obrażeń i ignorują do uniku, jeśli cel został ranny w tej turze." +LocHelpText="Ataki zadają + obrażeń i ignorują do uniku, jeśli cel został ranny w tej turze." +LocPromotionPopupText=" Działa tylko w tej samej turze, w której wróg doznał obrażeń.
Działa ze wszystkimi rodzajami broni, łącznie z granatami.
" + +[PaleHorse X2AbilityTemplate] +LocFriendlyName="Żniwa dusz" +LocLongDescription="Zapewnia +% szansy na trafienie krytyczne. Każde zabicie tego żołnierza dodaje +% szansy na trafienie krytyczne, maksymalnie do +%." +LocHelpText="Zapewnia +% szansy na trafienie krytyczne. Każde zabicie tego żołnierza dodaje +% szansy na trafienie krytyczne, maksymalnie do +%." +LocFlyoverText="Żniwa dusz" +LocPromotionPopupText=" Dodatkowa szansa na trafienie krytyczne dotyczy zarówno broni głównej, jak i dodatkowej.
Premia +% maksymalnej szansy na trafienie krytyczne dotyczy tylko zabójstwa, tj. dodaje do +< Umiejętność: PALE_HORSE_BASE_CRIT/>% premii." + +[Sting X2AbilityTemplate] +LocFriendlyName="Żądło" +LocLongDescription="Będąc w Cieniu, wystrzel strzał, który namierza holograficznie +. Celuj i rozrywaj, aby uzyskać . Gwarantowane pozostanie w Cieniu." +LocHelpText="Oddaj strzał będąc w Cieniu. Gwarantowane pozostanie w Cieniu." +LocPromotionPopupText=" Sting pozwala Żniwiarzowi zaatakować w sytuacjach, w których absolutnie nie chce zostać ujawniony.
Żądło ma ładunki na misję, wymaga punktów amunicji i wymaga tur(y) odnowienia.
" + +[RemoteStart X2AbilityTemplate] +LocFriendlyName="Zdalne uruchamianie" +LocLongDescription="Zdetonuj ładunek wybuchowy, powodując, że zada on podwójne obrażenia w promieniu dwukrotnie większym od normalnego. Nie ujawnia Żniwiarza." +LocHelpText="Zdetonuj ładunek wybuchowy, powodując, że zada on podwójne obrażenia w promieniu dwukrotnie większym od normalnego. Nie ujawnia Żniwiarza." +LocPromotionPopupText=" Upewnij się, że towarzysze z drużyny opuścili strefę wybuchu!
Zdalne uruchomienie wymaga amunicji i wymaga tur(y) odnowienia.
Zdalne uruchamianie ma użycie(a) na misję.
" + +[HomingMine X2AbilityTemplate] +LocPromotionPopupText=" Strzały w zaminowany cel gwarantują trafienie.
Mina samonaprowadzająca ma 4 ładunki na misję.
Mina samonaprowadzająca wymaga jednej akcji i nie kończy Twojej tury.
" + +[Hero_Tracking X2AbilityTemplate] +LocFriendlyName="Śledzenie" +LocLongDescription="Wykrywasz pobliskie jednostki nawet bez linii wzroku." +LocHelpText="Wykrywasz pobliskie jednostki nawet bez linii wzroku." +LocFlyOverText="Śledzenie" +LocPromotionPopupText=" Śledzenie pozwala jednostce wykryć jednostki znajdujące się za ścianami i innymi elementami blokującymi pole widzenia.
Śledzenie wykrywa wrogów w promieniu do 14 pól.
Wykryte jednostki pojawią się jako zarys wizualny.
Jednostki pozostaną wykryte do końca tury gracza. Jeśli w tym momencie znajdą się poza zasięgiem śledzenia, będą liczone jako niewykryte.
" + +[Hero_TrackingTrigger X2AbilityTemplate] +LocFriendlyName="Śledzenie" +LocFlyOverText="Śledzenie" + +[SkirmisherReflex X2AbilityTemplate] +LocLongDescription="Po strzale zyskujesz jedną dodatkową akcję w następnej turze. Uruchamia się nie częściej niż raz na turę. Ataki przeciwko tobie podlegają karze - do szans na trafienie krytyczne." +LocHelpText="Po strzale zyskujesz jedną dodatkową akcję w następnej turze. Uruchamia się nie częściej niż raz na turę. Ataki przeciwko tobie podlegają karze - do szans na trafienie krytyczne." +LocPromotionPopupText=" Chwytak czyni Renegata doskonałym zwiadowcą, a Refleks nagradza jego agresywną pozycję.
Refleks można aktywować tylko raz na turę.
" + +[FullThrottle X2AbilityTemplate] +LocLongDescription="Zyskaj + mobilność przy każdym zabiciu w tej turze. Trwa tur(y), łącznie z obecną." +LocHelpText="Zyskaj + mobilność przy każdym zabiciu w tej turze. Trwa tur(y), łącznie z obecną." +LocPromotionPopupText=" Zabijaj bezpiecznie na początku tury, aby wykorzystać pełne przyspieszenie.
Tylko zabójstwa Renegataliczą się do pełnego przyspieszenia.
" + +[Judgment X2AbilityTemplate] +LocFriendlyName="Osąd" +LocLongDescription="Ma szansę wywołać panikę u każdego wroga, który zaatakuje tę jednostkę. Im wyższa Wola tej jednostki, tym większa szansa na panikę." +LocHelpText="Ma szansę wywołać panikę u każdego wroga, który zaatakuje tę jednostkę. Im wyższa Wola tej jednostki, tym większa szansa na panikę." +LocFlyOverText="Osąd" +LocPromotionPopupText=" Osąd może zostać wywołany przez ataki wręcz i ataki obszarowe.
Osąd nie zostanie aktywowany, jeśli zostaniesz celem ostrzału Warty.
Szansa na panikę wynosi % i zależy od niej zarówno Wola atakującej jednostki, jak i Wola jednostki posiadającej Osąd.
Osąd działa najlepiej na jednostki o wysokiej Woli.
" + +[ManualOverride_LW X2AbilityTemplate] +LocFriendlyName="Ręczne Nadpisanie" +LocLongDescription="Skraca czasy odnowienia wszystkich umiejętności wybranego żołnierza sojuszniczego o maksymalnie tur." +LocHelpText="Skraca czasy odnowienia wszystkich umiejętności wybranego żołnierza sojuszniczego o maksymalnie tur." +LocPromotionPopupText=" Wykorzystuj zdolności sojuszników wcześniej i często, aby w pełni wykorzystać ręczne nadpisanie.
Kosztuje 1 akcję.
Umiejętność wymaga tur(y) odnawiania.
" + +[Battlelord X2AbilityTemplate] +LocLongDescription="Po tym jak każdy wróg w zasięgu wzroku wykona swoją turę, podejmij natychmiastową akcję. Żadne punkty akcji nie zostaną zwrócone (np. za Uderz i biegnij)." +LocHelpText="Po tym jak każdy wróg w zasięgu wzroku wykona swoją turę, podejmij natychmiastową akcję. Żadne punkty akcji nie zostaną zwrócone (np. za Uderz i biegnij)." +LocPromotionPopupText=" Władca bitwy może pozwolić Renegatowi zwyciężyć w najbardziej krytycznych okolicznościach.
Umiejętność wymaga tur(y) odnowienia.
Tury Zagubionych i ujawnienie wrogiej druzyny nie przyznają natychmiastowej akcji.
Zdolności zwracające punkty akcji, takie jak Nieubłagany i Uderz i biegnij, nie będą działać w trybie władcy bitwy." + +[TemplarGrazingFire X2AbilityTemplate] +LocFriendlyName="Draśnięcie" +LocFlyOverText="Draśnięcie" +LocLongDescription="Nietrafione strzały z pistoletu automatycznego podlegają dodatkowemu rzutowi i stają się draśnięciami." +LocHelpText="Pudła mogą stać się draśnięciami" +LocPromotionPopupText=" Niecelne strzały z pistoletu automatycznego żołnierza zazwyczaj mają % szansy, że staną się draśnięciem.
Efekt ten pojawia się po normalnym przetwarzaniu typu trafienie-chybienie-draśnięcie.
Cel z puntkami uniku odejmuje ten wynik do szansy powodzenia umiejętności." + +[TemplarFleche X2AbilityTemplate] +LocFriendlyName="Strzała" +LocFlyOverText="Strzała" +LocLongDescription="Atakuj mieczem dowolnego wroga w zasięgu ruchu. Zadaje +1 obrażeń za każde pole pomiędzy twoją pozycją początkową a celem." +LocHelpText="Atakuj mieczem dowolnego wroga w zasięgu ruchu. Zadaje dodatkowe obrażenia przy atakach z dystansu." +LocPromotionPopupText=" Możesz aktywować zdolność, umieszczając kursor ruchu nad wrogiem.
Żołnierz może wykonać ruch „Doskok”, wykorzystując obie akcje do ruchu, i nadal wywołać atak przeciwko sąsiadującemu wrogowi.
Strzała zadaje 1 dodatkowe obrażenia za każde pole pomiędzy pozycją jednostki na początku swojej tury a pozycją celu.
" + +[TemplarSolace X2AbilityTemplate] +LocFriendlyName="Ukojenie" +LocFlyOverText="Ukojenie" +LocLongDescription="Templariusz może natychmiast wyleczyć upośledzenie umysłowe członka drużyny." +LocHelpText="Templariusz może natychmiast wyleczyć upośledzenie umysłowe członka drużyny." +LocPromotionPopupText=" Ukojenie oczyszcza z dezorientacji, kontroli umysłu, paniki i efektów ogłuszenia.
Ukojenie wymaga jednej akcji i nie kończy Twojej tury.
Umiejętność wymaga tur(y) odnowienia.
" + +[Ghost X2AbilityTemplate] +LocPromotionPopupText=" Duchy zaczynają z Skupieniem równym Skupieniu Templariusza w momencie stworzenia minus 1.
Duchy nie mogą zyskać Skupienia i znikają, gdy całe Skupienie zostanie wydane lub ich zdrowie osiągnie 0.
Rozdarcie kosztuje 1 Skupienie, gdy jest używane przez Duchy.
Duch musi zostać rzucony na zwłoki humanoidalnego wroga i nie może zostać rzucony na to samo ciało dwa razy.
Duch wymaga tur(y) odnownienia.
Duchy nie mogą zyskać następujących umiejętności: Volt, Uderzenie Tarczą, Zdolności Tarczy, Odparcie, Odbicie, Ukojenie, Przewód Pustki, Burza Ostrzy, Apoteoza, Wyższa Umiejętność, Burza Jonowa i Podtrzymanie.
" + +; (2) Shard and Caster gauntlet tactical text and the brief +; summaries for the caster gauntlets have been updated. +; (3) Removed references to Fleche +[ShardGauntlet_CV X2PairedWeaponTemplate] +TacticalText=" Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykorzystaniu obu akcji do poruszania się lub doskoczenia do zasięgu swojego ruchu.\n Decyzja o zaatakowaniu wroga w walce wręcz może być decydująca; Należy zachować ostrożność.\n Wypatruj możliwości ulepszenia skuteczności naszej broni białej - wróg może mieć dostęp do znacznie lepszej technologii." + +[ShardGauntlet_MG X2PairedWeaponTemplate] +TacticalText=" Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykorzystaniu obu akcji do poruszania się lub doskoczenia do zasięgu swojego ruchu.\n Decyzja o zaatakowaniu wroga w walce wręcz może być decydująca; Należy zachować ostrożność.\n Wypatruj możliwości ulepszenia skuteczności naszej broni białej - wróg może mieć dostęp do znacznie lepszej technologii." + +[ShardGauntlet_BM X2PairedWeaponTemplate] +TacticalText=" Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykorzystaniu obu akcji do poruszania się lub doskoczenia do zasięgu swojego ruchu.\n Decyzja o zaatakowaniu wroga w walce wręcz może być decydująca; Należy zachować ostrożność.\n" + +[CasterGauntlet_CV X2PairedWeaponTemplate] +FriendlyName="Rękawice Czarownika" +FriendlyNamePlural="Rękawice Czarownika" +BriefSummary="Specjalistyczne rękawice, które rezygnują z dodatkowych obrażeń w walce wręcz, jak rękawice odłamkowe, w celu generowania skupienia poprzez zdolność Kanału. Sparowane rękawice templariuszy zostały zaprojektowane, aby wzmacniać energię psioniczną użytkownika, ale w swej istocie nadal są rękawicami – mocnymi, metalowymi rękawicami zdolnymi wytrzymać ekstrema znacznie przekraczające to, co może wytrzymać samo ciało." +TacticalText=" Zapewnia 1 początkowe skupienie i umiejętność Kanał, która daje wrogom szansę na spadek skupienia po śmierci.
Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykonaniu obu akcji do poruszania się lub doskoku do granic ich możliwości zasięgu ruchu.\n Decyzja o zaangażowaniu wroga w walkę wręcz może być decydująca; zachowaj ostrożność.\n Wypatruj okazji do poprawy skuteczności naszej broni białej - wróg może mieć dostęp do znacznie lepszej technologii." +AbilityDescName="rękawice" + +[CasterGauntlet_MG X2PairedWeaponTemplate] +FriendlyName="Rękawice Maga" +FriendlyNamePlural="Rękawice Maga" +BriefSummary="Specjalistyczne rękawice, które rezygnują z dodatkowych obrażeń w walce wręcz, jak rękawice odłamkowe, w celu generowania skupienia poprzez zdolność Kanału. Sparowane rękawice templariuszy zostały zaprojektowane, aby wzmacniać energię psioniczną użytkownika, ale w swej istocie nadal są rękawicami – mocnymi, metalowymi rękawicami zdolnymi wytrzymać ekstrema znacznie przekraczające to, co może wytrzymać samo ciało. Dzięki warstwom magnetycznym nałożonym na istniejącą konstrukcję zapewniają one teraz znacznie więcej niż pierwotne ulepszenia, do których zostały stworzone." +TacticalText=" Zapewnia 1 początkowe skupienie i umiejętność Kanał, która daje wrogom szansę na spadek skupienia po śmierci.
Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykonaniu obu akcji do poruszania się lub doskoku do granic ich możliwości zasięgu ruchu.\n Decyzja o zaangażowaniu wroga w walkę wręcz może być decydująca; zachowaj ostrożność.\n Wypatruj okazji do poprawy skuteczności naszej broni białej - wróg może mieć dostęp do znacznie lepszej technologii." +AbilityDescName="rękawice" + +[CasterGauntlet_BM X2PairedWeaponTemplate] +FriendlyName="Rękawice Arcymaga" +FriendlyNamePlural="Rękawice Arcymaga" +BriefSummary="Specjalistyczne rękawice, które rezygnują z dodatkowych obrażeń w walce wręcz, jak rękawice odłamkowe, w celu generowania skupienia poprzez zdolność Kanału. Małe ogniwo energetyczne Elerium, wydobyte z nieznanego elementu technologii ADVENT-u, zapewniło Templariuszom możliwość dalszego wzmacniania energii psionicznej wykorzystywanej przez te rękawice. Nadal nie wiadomo, czy to ich mistrzostwo w tej mocy, czy też stworzona przez nich technologia pozwala na takie połączenie przeciwstawnych sił." +TacticalText=" Zapewnia 1 początkowe skupienie i umiejętność Kanał, która daje wrogom szansę na spadek skupienia po śmierci.
Templariusze mogą atakować sąsiadujących wrogów swoim ostrzem nawet po wykonaniu obu akcji do poruszania się lub doskoku do granic ich możliwości zasięgu ruchu.\n Decyzja o zaangażowaniu wroga w walkę wręcz może być decydująca; zachowaj ostrożność.\n" +AbilityDescName="rękawice" + +[AmmoDump_LW X2AbilityTemplate] +LocFriendlyName="Sabotaż broni" +LocHelpText="Wyłącza broń, wyrzucając amunicję." +LocLongDescription="Wyłącza broń, wyrzucając amunicję." +LocFlyOverText="Sabotaż broni" + +;(2) Added the Cooldown Text +[ShieldAllyM1 X2AbilityTemplate] +LocFriendlyName="Największy mistrz Czarnoksiężnika" +LocHelpText="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocLongDescription="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocFlyOverText="Największy mistrz Czarnoksiężnika" + +[ShieldAllyM2 X2AbilityTemplate] +LocFriendlyName="Największy mistrz Czarnoksiężnika" +LocHelpText="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocLongDescription="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocFlyOverText="Największy mistrz Czarnoksiężnika" + +[ShieldAllyM3 X2AbilityTemplate] +LocFriendlyName="Największy mistrz Czarnoksiężnika" +LocHelpText="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocLongDescription="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocFlyOverText="Największy mistrz Czarnoksiężnika" + +[ShieldAllyM4 X2AbilityTemplate] +LocFriendlyName="Największy mistrz Czarnoksiężnika" +LocHelpText="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocLongDescription="Daje sojusznikowi tarczę, celność, szansę na trafienie krytyczne, wolę i premię do ataku Psi. Kiedy sojusznik żyje, Czarnoksiężnik zyskuje % redukcji obrażeń. Wymaga tur(y) odnowienia." +LocFlyOverText="Największy mistrz Czarnoksiężnika" + +[PsiMindControl X2AbilityTemplate] +LocFriendlyName="Kontrola umysłu" +LocLongDescription="Przejmij aktywną kontrolę nad umysłem celu, zmuszając go do zwrócenia się przeciwko swoim towarzyszom. Wymaga tur(y) odnowienia." +LocHelpText="Załóż pełną kontrolę mentalną nad celem przez krótki czas. Wymaga tur(y) odnowienia." +LocFlyOverText="Kontrola umysłu" + +[ChosenImmuneMelee X2AbilityTemplate] +LocFriendlyName="Oczekiwanie" +LocLongDescription="Otrzymuje o 50% mniej obrażeń od gwałtownych ataków wręcz." +LocHelpText="Otrzymuje o 50% mniej obrażeń od gwałtownych ataków wręcz." + +[BlastShield X2AbilityTemplate] +LocFriendlyName="Osłona uderzeniowa" +LocLongDescription="Otrzymuje o 50% mniej obrażeń od ataków wybuchowych." +LocHelpText="Otrzymuje o 50% mniej obrażeń od ataków wybuchowych." + +[ChosenCritImmune X2AbilityTemplate] +LocFriendlyName="Zbalansowany" +LocHelpText="Praktycznie odporny na trafienia krytyczne." +LocLongDescription="Ten Wybraniec jest praktycznie odporny na trafienia krytyczne." + +[MC_Stock_Strike X2AbilityTemplate] +LocFriendlyName="Uderzenie" +LocHelpText="Uderz Żołnierza kontrolowanego umysłem kolbą swojej broni, ogłuszając cel na 1 turę." +LocLongDescription="Uderz Żołnierza kontrolowanego umysłem kolbą swojej broni, ogłuszając cel na 1 turę." +LocFlyOverText="BONK" + +[GetUp X2AbilityTemplate] +LocFriendlyName="Powstań!" +LocHelpText="Usuń efekt nieświadomości z żołnierza." +LocLongDescription="Usuń efekt nieświadomości z żołnierza." +LocFlyOverText="Powstań!" + +;(2) Added the Cooldown Text +[ChosenSummonFollowers X2AbilityTemplate] +LocFriendlyName="Przywołaj obcych" +LocHelpText="Przyzwij obcych. Wymaga tur(y) odnowienia." +LocLongDescription="Przyzwij obcych." +LocFlyOverText="Przyzywanie obcnych" + +[Lethargy X2AbilityTemplate] +LocFriendlyName="Ospały" +LocHelpText="Jednostka cierpi na zmniejszoną celność i mobilność." +LocLongDescription="Jednostka cierpi na zmniejszoną celność i mobilność." + +[CombatRushOnCrit X2AbilityTemplate] +LocFriendlyName="Szarża Bojowa (przy trafieniu krytycznym)" +LocFlyOverText="Szarża Bojowa (przy trafieniu krytycznym)" +LocHelpText="Kiedy otrzymasz trafienie krytyczne, pobliscy humanoidalni sojusznicy otrzymają tymczasowe premie do celowania, szansy na trafienie krytyczne i mobilności." +LocLongDescription="Kiedy otrzymasz trafienie krytyczne, pobliscy humanoidalni sojusznicy otrzymają tymczasowe premie do celowania, szansy na trafienie krytyczne i mobilności." + +[LocationScout X2SitRepTemplate] +Description="Ruch oporu umieścił czujniki ruchu niskiego zasięgu, które łączą się z komunikacją twojej drużyny. Twoi żołnierze będą w stanie wykryć jednostki wroga, które znajdują się poza zasięgiem wzroku." + +[LargeMap X2SitRepTemplate] +FriendlyName="Wielka mapa" +Description="Obszar działań jest większy niż zwykle, więc dotarcie do celu zajmie Ci prawdopodobnie więcej czasu." + +[VeryLargeMap X2SitRepTemplate] +FriendlyName="Bardzo wielka mapa" +Description="Obszar działań jest dużo większy niż zwykle, więc dotarcie do celu zajmie Ci prawdopodobnie więcej czasu." + +[ProjectMiranda X2SitRepTemplate] +FriendlyName="Projekt Miranda" +Description="ADVENT testuje na tym obszarze technologię pacyfikacji, która powoduje ospałość wszystkich jednostek niebędących robotami. Będą mieli kary za celowanie i mobilność." + +[SomethingInTheAir X2SitRepTemplate] +FriendlyName="Coś wisi w powietrzu" +Description="Być może jest to coś w powietrzu, ale cokolwiek to jest, powoduje, że żołnierze uruchamiają Szarżę Bojową za każdym razem, gdy zadają obrażenia krytyczne. Uważaj, to działa również w przypadku ADVENT-u!" + +[DarkEventBarrierSitRep X2SitRepTemplate] +FriendlyName="Bariera" +Description="ADVENT testuje w terenie kilka unikalnych systemów obronnych, aby przeciwdziałać postępowi XCOM w dziedzinie psioniki i hakowania. Technologia wroga i obrona psioniczna są podwojone." + +[DarkEventDarkTowerSitRep X2SitRepTemplate] +FriendlyName="Czarna wieża" +Description="Nie wiemy, co się dzieje w tym obszarze, ale nasi żołnierze otrzymają większe trafienie Wolą niż zwykle." + +[DarkEventHighAlertSitRep X2SitRepTemplate] +FriendlyName="Wysoki alarm" +Description="ADVENT jest w stanie najwyższej gotowości, więc utrzymanie ukrycia w momencie rozpoczęcia misji jest niemożliwe." + +[DarkEventInfiltratorSitRep X2SitRepTemplate] +FriendlyName="Beztwarzowi szpiedzy" +Description="ADVENT umieszcza szpiegów w miejscach, w których spodziewają się ataku. Podczas tej misji prawdopodobnie spotkasz cywili będących kosmitami." + +[DarkEventInfiltratorChryssalidSitRep X2SitRepTemplate] +FriendlyName="Szpiedzy Chryssalidów" +Description="ADVENT staje się coraz bardziej zdesperowany! Zaczęli rozmieszczać te paskudne stworzenia na obszarach zamieszkałych. Podczas tej misji uważaj na zakopane Chryssalidy!" + +[DarkEventRapidResponseSitRep X2SitRepTemplate] +FriendlyName="Natychmiastowa odpowiedź" +Description="ADVENT zintensyfikował szkolenie w zakresie szybkiego reagowania, więc teraz posiłki przybędą na misję wcześniej niż zwykle." + +[DarkEventReturnFireSitRep X2SitRepTemplate] +FriendlyName="Ogień zwrotny" +Description="Nietrafione strzały w stronę Oficerów i Kapłanów ADVENT-u spowodują ogień zwrotny." + +[DarkEventSealedArmorSitRep X2SitRepTemplate] +FriendlyName="Zapieczętowana zbroja" +Description="ADVENT wdraża nowy pancerz oparty na materiałach odpornych na wpływ środowiska. Jednostki ADVENT-u są odporne na zagrożenia środowiskowe, takie jak trucizna, ogień i lód." + +[DarkEventUndyingLoyaltySitRep X2SitRepTemplate] +FriendlyName="Nieśmiertelna lojalność" +Description="Nie wiemy, jaką magią voodoo posługuje się wróg, ale słyszeliśmy raporty o powstaniu z martwych jego jednostek. Kiedy powalisz wroga, upewnij się, że pozostaje na ziemi!" + +[DarkEventVigilanceSitRep X2SitRepTemplate] +FriendlyName="Czujność" +Description="Obcy są w stanie najwyższej gotowości, co utrudnia XCOM złapanie ich z zaskoczenia. Ich promienie detekcji są większe." + +[ViperKing X2SitRepTemplate] +FriendlyName="Król Żmij" +Description="Podczas tej misji spodziewany jest Król Żmij. Bądź ostrożny!" + +[BerserkerQueen X2SitRepTemplate] +FriendlyName="Królowa Berserkerów" +Description="Podczas tej misji spodziewana jest Królowa Berserkerów. Bądź ostrożny!" + +[ArchonKing X2SitRepTemplate] +FriendlyName="Król Archonów" +Description="Podczas tej misji spodziewany jest Król Archonów. Bądź ostrożny!" + +[CombatRushOnCritEffect X2SitRepEffect_GrantAbilities] +FriendlyName="Krytyczna szarża bojowa" +Description="Szarża bojowa aktywowana, gdy jednostka trafi krytycznie." + +[LethargyEffect X2SitRepEffect_GrantAbilities] +FriendlyName="Letarg" +Description="Jednostki mają -20 Celności i -2 Mobilności." + +[IncreaseTimer1Effect_LW X2SitRepEffect_ModifyTacticalStartState] +FriendlyName="Zwiększony czas" +Description="Jeśli ta misja ma licznik czasu, wydłuża się on o 1 turę." + +[IncreaseTimer2Effect_LW X2SitRepEffect_ModifyTacticalStartState] +FriendlyName="Zwiększony czas" +Description="Jeśli ta misja ma licznik czasu, wydłuża się on o 2 tury." + +[IncreaseTimer4Effect_LW X2SitRepEffect_ModifyTacticalStartState] +FriendlyName="Zwiększony czas" +Description="Jeśli ta misja ma licznik czasu, wydłuża się on o 4 tury." + +[CovertActionRisk_Failure_Easy X2CovertActionRiskTemplate] +RiskName="Porażka" + +[CovertActionRisk_Failure_Moderate X2CovertActionRiskTemplate] +RiskName="Porażka" + +[CovertActionRisk_Failure_Hard X2CovertActionRiskTemplate] +RiskName="Porażka" + +; Purifier autopsy no longer unlocks reinforced vest underlay +[AutopsyAdventPurifier X2TechTemplate] +UnlockedDescription="" + +[InfilSitRep_Easy X2SitRepTemplate] +FriendlyName="Bez infiltracji (drobna)" +Description="Jednostki wroga będą nieco trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[InfilSitRep_Moderate X2SitRepTemplate] +FriendlyName="Bez infiltracji (umiarkowana)" +Description="Jednostki wroga będą znacznie trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[InfilSitRep_Hard X2SitRepTemplate] +FriendlyName="Bez infiltracji (znacząca)" +Description="Jednostki wroga będą znacząco trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[InfilSitRep_UltraHard X2SitRepTemplate] +FriendlyName="Bez infiltracji (niemożliwa?)" +Description="Jednostki wroga będą tak trudne, że walka będzie praktycznie niemożliwa do wygrania, ponieważ nie infiltrujesz." + +; LWOTC Needs Translation (2) +[ToughScaling X2AbilityTemplate] +LocFriendlyName="Bez infiltracji (drobna)" +LocLongDescription="Jednostki wroga będą nieco trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[ButchScaling X2AbilityTemplate] +LocFriendlyName="Bez infiltracji (umiarkowana)" +LocLongDescription="Jednostki wroga będą znacznie trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[RockHardScaling X2AbilityTemplate] +LocFriendlyName="Bez infiltracji (znacząca)" +LocLongDescription="Jednostki wroga będą znacząco trudniejsze do pokonania, ponieważ nie infiltrujesz." + +[MonstrousScaling X2AbilityTemplate] +LocFriendlyName="Bez infiltracji (niemożliwa?)" +LocLongDescription="Jednostki wroga będą tak trudne, że walka będzie praktycznie niemożliwa do wygrania, ponieważ nie infiltrujesz." + +[ResistanceRing_UpgradeI X2FacilityUpgradeTemplate] +Summary="Odblokuj dodatkowe miejsce na personel, aby jeszcze bardziej skrócić czas trwania tajnych akcji." + +[DifficultMissionCompleted X2AbilityPointTemplate] +ActionFriendlyName="na trudną misję" + +[VeryDifficultMissionCompleted X2AbilityPointTemplate] +ActionFriendlyName="na bardzo trudną misję" + +[CovertAction_EnemyCorpses X2CovertActionTemplate] +ActionObjective="Ukradnij zwłoki" + +[CovertAction_IntenseTraining X2CovertActionTemplate] +ActionObjective="Zwiększenie treningu" + +[CovertAction_ResistanceMec X2CovertActionTemplate] +ActionObjective="Zdobądź MECa dla ruchu oporu" + +[CovertAction_RecruitRebels X2CovertActionTemplate] +ActionObjective="Rekrutuj rebeliantów" + +[CovertActionNarrative_EnemyCorpses_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Napad na kostnicę wroga" +ActionPreNarrative="Odkryliśmy, gdzie porzucali zwłoki po wszystkich walkach, w których brałeś udział. Może to być szansa na przyspieszenie rozwoju Twojej technologii." +ActionPostNarrative="Twojemu zespołowi udało się zebrać podczas nalotu kilka cennych zwłok wroga." + +[CovertActionNarrative_EnemyCorpses_Reapers X2CovertActionNarrativeTemplate] +ActionName="Napad na kostnicę wroga" +ActionPreNarrative="Odkryliśmy, gdzie porzucali zwłoki po wszystkich walkach, w których brałeś udział. Może to być szansa na przyspieszenie rozwoju Twojej technologii." +ActionPostNarrative="Twojemu zespołowi udało się zebrać podczas nalotu kilka cennych zwłok wroga." + +[CovertActionNarrative_EnemyCorpses_Templars X2CovertActionNarrativeTemplate] +ActionName="Napad na kostnicę wroga" +ActionPreNarrative="Odkryliśmy, gdzie porzucali zwłoki po wszystkich walkach, w których brałeś udział. Może to być szansa na przyspieszenie rozwoju Twojej technologii." +ActionPostNarrative="Twojemu zespołowi udało się zebrać podczas nalotu kilka cennych zwłok wroga." + +[CovertActionNarrative_IntenseTraining_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Podejmij ciężki trening (koszt: 5 AP)" +ActionPreNarrative="Czas włożyć trochę wysiłku i udoskonalić się. Weź udział w szkoleniu, żołnierzu!" +ActionPostNarrative="Twój żołnierz jest teraz lepszy." + +[CovertActionNarrative_IntenseTraining_Reapers X2CovertActionNarrativeTemplate] +ActionName="Podejmij ciężki trening (koszt: 5 AP)" +ActionPreNarrative="Czas włożyć trochę wysiłku i udoskonalić się. Weź udział w szkoleniu, żołnierzu!" +ActionPostNarrative="Twój żołnierz jest teraz lepszy." + +[CovertActionNarrative_IntenseTraining_Templars X2CovertActionNarrativeTemplate] +ActionName="Podejmij ciężki trening (koszt: 5 AP)" +ActionPreNarrative="Czas włożyć trochę wysiłku i udoskonalić się. Weź udział w szkoleniu, żołnierzu!" +ActionPostNarrative="Twój żołnierz jest teraz lepszy." + +[CovertActionNarrative_ResistanceMec_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Napad na fabrykę robotów" +ActionPreNarrative="Odkryliśmy fabrykę, której ADVENT używa do budowy i utrzymywania swoich sił zmechanizowanych. Nie powinieneś mieć żadnych problemów ze znalezieniem nieaktywnego, ale nienaruszonego MECa do „rekrutacji”, podczas gdy nasze siły odwracają uwagę ochrony." +ActionPostNarrative="Twojemu zespołowi udało się zabezpieczyć nienaruszoną jednostkę MEC. Został przeprogramowany, otrzymał nowe malowanie i wysłany do pobliskiej Kryjówki Ruchu Oporu." + +[CovertActionNarrative_ResistanceMec_Reapers X2CovertActionNarrativeTemplate] +ActionName="Napad na fabrykę robotów" +ActionPreNarrative="Odkryliśmy fabrykę, której ADVENT używa do budowy i utrzymywania swoich sił zmechanizowanych. Nie powinieneś mieć żadnych problemów ze znalezieniem nieaktywnego, ale nienaruszonego MECa do „rekrutacji”, podczas gdy nasze siły odwracają uwagę ochrony." +ActionPostNarrative="Twojemu zespołowi udało się zabezpieczyć nienaruszoną jednostkę MEC. Został przeprogramowany, otrzymał nowe malowanie i wysłany do pobliskiej Kryjówki Ruchu Oporu." + +[CovertActionNarrative_ResistanceMec_Templars X2CovertActionNarrativeTemplate] +ActionName="Napad na fabrykę robotów" +ActionPreNarrative="Odkryliśmy fabrykę, której ADVENT używa do budowy i utrzymywania swoich sił zmechanizowanych. Nie powinieneś mieć żadnych problemów ze znalezieniem nieaktywnego, ale nienaruszonego MECa do „rekrutacji”, podczas gdy nasze siły odwracają uwagę ochrony." +ActionPostNarrative="Twojemu zespołowi udało się zabezpieczyć nienaruszoną jednostkę MEC. Został przeprogramowany, otrzymał nowe malowanie i wysłany do pobliskiej Kryjówki Ruchu Oporu." + +[CovertActionNarrative_RecruitRebels_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Szukaj rekrutów ruchu oporu" +ActionPreNarrative="Dowiedzieliśmy się o małej grupie dysydentów w regionie, którzy mogą chcieć nam bezpośrednio pomóc. Wejdź i zobacz, czy możesz ich zwerbować do kryjówki." +ActionPostNarrative="Twój zespół przekonał kilku dysydentów, aby przyłączyli się do naszej sprawy." + +[CovertActionNarrative_RecruitRebels_Reapers X2CovertActionNarrativeTemplate] +ActionName="Szukaj rekrutów ruchu oporu" +ActionPreNarrative="Dowiedzieliśmy się o małej grupie dysydentów w regionie, którzy mogą chcieć nam bezpośrednio pomóc. Wejdź i zobacz, czy możesz ich zwerbować do kryjówki." +ActionPostNarrative="Twój zespół przekonał kilku dysydentów, aby przyłączyli się do naszej sprawy." + +[CovertActionNarrative_RecruitRebels_Templars X2CovertActionNarrativeTemplate] +ActionName="Szukaj rekrutów ruchu oporu" +ActionPreNarrative="Dowiedzieliśmy się o małej grupie dysydentów w regionie, którzy mogą chcieć nam bezpośrednio pomóc. Wejdź i zobacz, czy możesz ich zwerbować do kryjówki." +ActionPostNarrative="Twój zespół przekonał kilku dysydentów, aby przyłączyli się do naszej sprawy." + +[AbilityPoints X2ItemTemplate] +FriendlyName="Punkt umiejętności" +FriendlyNamePlural="Punkty umiejętności" +BriefSummary="Pula punktów, które można wykorzystać do nadawania umiejętności i statystyk swoim żołnierzom." + +[XComGame.UIArmory_Loadout] +[UIArmory_Loadout] +m_strInventoryLabels[eInvSlot_Pistol]="PISTOLET" + +[LW_PhaseWalk X2AbilityTemplate] +LocFriendlyName="Spacer fazowy" +LocLongDescription="Tymczasowo wyjdź z istnienia, aby teleportować się do pobliskiej lokalizacji." +LocHelpText="Tymczasowo wyjdź z istnienia, aby teleportować się do pobliskiej lokalizacji." +LocFlyOverText="Spacer fazowy" +LocPromotionPopupText=" Tymczasowo wyłącz istnienie, aby teleportować się do pobliskiej lokalizacji.
Docelowa płytka musi być widoczna (działa z wizją drużyny).
Spacer fazowy wymaga jednej akcji i nie kończy Twojej tury.
Przejście fazowe wymaga tur(y) odnowienia.
Przejście fazowe ma promień pól.
Poruszanie się za pomocą Spaceru fazowego może aktywować pewne zdolności reakcji.
" + +[LW_NullWard X2AbilityTemplate] +LocFriendlyName="Oddział zerowy" +LocLongDescription="Rzuć psioniczne tarcze wokół żołnierza i pobliskich sojuszników. Tarcze zapadną się, jeśli ten żołnierz zginie." +LocHelpText="Rzuć psioniczne tarcze wokół pobliskich sojuszników i siebie." +LocFlyOverText="Oddział zerowy" +LocPromotionPopupText=" Rzuć psioniczne tarcze wokół żołnierza i pobliskich sojuszników. Tarcze zapadną się, jeśli ten żołnierz zostanie zabity.
Ochrona fazowa zapewnia ablacyjne punkty wytrzymałości.
Ulepszone Psi zapewniają dodatkowe premie do ablacyjnych punktów wytrzymałości.< br/> Fazowa ochrona wymaga jednej akcji i nie kończy twojej tury.
Umiejętność wymaga tur(y) odnowienia.
Fazowa ochrona ma promień 8 płytek.
" + +[LW_SoulStorm X2AbilityTemplate] +LocFriendlyName="Burza dusz" +LocLongDescription="Przywołuj meteoryty energii psionicznej, aby zadać obrażenia wrogom na docelowym obszarze i zniszczyć ich osłonę." +LocHelpText="Przywołuj meteoryty energii psionicznej, aby zadać obrażenia wrogom na docelowym obszarze i zniszczyć ich osłonę." +LocFlyOverText="Burza dusz" +LocPromotionPopupText="Przyzywaj meteoryty energii psionicznej, aby zadać obrażenia wrogom znajdującym się na docelowym obszarze i zniszczyć ich osłonę.
Obszar działania Burzy skupia się na użytkowniku.
Nie może niszczyć podłóg ani sufitów .
Burza dusz wymaga jednej akcji i kończy twoją turę.
Umiejętność wymaga tur(y) odnowienia.
Burza ma promień 4 płytek.
" + +[TheLostGrappler X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP2_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP3_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP4_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP5_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP6_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP7_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP8_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP9_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP10_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP11_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostGrapplerHP12_LW X2CharacterTemplate] +strCharacterName="Zagubiony Łapacz" + +[TheLostBrute X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP10_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP11_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP12_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP14_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP15_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP16_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[LWTheLostBruteHP18 X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP21_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP23_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[TheLostBruteHP25_LW X2CharacterTemplate] +strCharacterName="Zagubiony Brutal" + +[LostBladestorm X2AbilityTemplate] +LocFriendlyName="Łapanie" +LocLongDescription="Bezpłatne ataki wręcz na wszystkich wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocHelpText="Bezpłatne ataki wręcz na wszystkich wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocFlyOverText="Łapanie" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Łapanie zostanie aktywowane, jeśli ten wróg spróbuje zaatakować .
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, wówczas Łapanie uruchomi się, gdy wróg znajdzie się w zasięgu walki wręcz.
" + +[Bladestorm X2AbilityTemplate] +LocFriendlyName="Burza ostrzy" +LocLongDescription="Darmowe ataki na wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocHelpText="Darmowe ataki na wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocFlyOverText="Burza ostrzy" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Burza Ostrzy zostanie aktywowana, jeśli ten wróg spróbuje zaatakować .
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, wówczas Burza Ostrzy uruchomi się, gdy wróg znajdzie się w zasięgu walki wręcz.
Burza Ostrzy nie aktywuje się w twojej turze.
" + +[TemplarBladestorm X2AbilityTemplate] +LocFriendlyName="Burza ostrzy" +LocLongDescription="Darmowe ataki na wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocHelpText="Darmowe ataki na wrogów, którzy wchodzą, wychodzą lub atakują z zasięgu walki wręcz w turach wroga." +LocFlyOverText="Burza ostrzy" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Burza Ostrzy zostanie aktywowana, jeśli ten wróg spróbuje zaatakować .
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, wówczas Burza Ostrzy uruchomi się, gdy wróg znajdzie się w zasięgu walki wręcz.
Burza Ostrzy nie aktywuje się w twojej turze.
" + +[Concentration_LW X2AbilityTemplate] +LocFriendlyName="Koncentracja" +LocFlyOverText="Koncentracja" +LocLongDescription="Twoje draśnięte ataki są automatycznie ulepszane do normalnych trafień." +LocHelpText="Twoje draśnięte ataki są automatycznie ulepszane do normalnych trafień." +LocPromotionPopupText=" Ataki, które normalnie drasnęłyby cel, są automatycznie ulepszane do normalnych trafień.
Dotyczy broni głównej, broni dodatkowej i pistoletów.
" + +[LikeLightning_LW X2AbilityTemplate] +LocFriendlyName="Jak błyskawica" +LocFlyOverText="Jak błyskawica" +LocLongDescription="Kiedy aktywujesz Strzał w biegu, czas odnowienia Twojego Miotacza Łukowego zostaje natychmiast zresetowany do 0." +LocHelpText="Kiedy aktywujesz Strzał w biegu, czas odnowienia Twojego Miotacza Łukowego zostaje natychmiast zresetowany do 0." +LocPromotionPopupText=" Kiedy aktywujesz Strzał w biegu, czas odnowienia Twojego Miotacza Łukowego zostaje natychmiast usunięty.
Nie dotyczy Łańcucha Błyskawic.
" + +[Maim_LW X2AbilityTemplate] +LocFriendlyName="Okaleczenie" +LocFlyOverText="Okaleczenie" +LocLongDescription="Oddaj strzał ze swojej broni głównej, który unieruchamia cel do końca jego następnej tury. Używa amunicji . Wymaga tur(y) odnowienia." +LocHelpText="Oddaj strzał ze swojej broni głównej, który unieruchamia cel do końca jego następnej tury. Używa amunicji . Wymaga tur(y) odnowienia." +LocPromotionPopupText=" Oddaj strzał ze swojej broni podstawowej, który zadaje normalne obrażenia i unieruchamia cel do końca jego następnej tury.
Przydatny do izolowania ważnego celu podczas zasadzki.
Używa amunicji . Wymaga tur(y) odnowienia." + +[Preservation_LW X2AbilityTemplate] +LocFriendlyName="Ochrona" +LocFlyOverText="Ochrona" +LocLongDescription="Kiedy twoje ukrycie zostanie zniszczone, zyskaj + obrony na tur." +LocHelpText="Kiedy twoje ukrycie zostanie zniszczone, zyskaj + obrony na tur. +LocPromotionPopupText=" Kiedy twoje ukrycie zostanie zniszczone, zyskaj + obrony na tur.
" + +[LickYourWounds_LW X2AbilityTemplate] +LocFriendlyName="Wyliż swoje rany" +LocFlyOverText="Wyliż swoje rany" +LocLongDescription="Kucnięcie przywraca zdrowia po użyciu, maksymalnie do na misję oraz usuwa truciznę, oparzenia i oparzenia kwasem." +LocHelpText="Kucnięcie przywraca zdrowia po użyciu, maksymalnie do na misję oraz usuwa truciznę, oparzenia i oparzenia kwasem" +LocPromotionPopupText=" Kucnięcie przywraca zdrowia po użyciu, maksymalnie do na misję.
Usuwa truciznę, oparzenia i oparzenia kwasem.
" + +[Impulse_LW X2AbilityTemplate] +LocFriendlyName="Impuls" +LocFlyOverText="Impuls" +LocLongDescription="Twoje ataki dystansowe zyskują celnośći i szansy na trafienie krytyczne, jeśli wykonałeś ruch w tej turze." +LocHelpText="Twoje ataki dystansowe zyskują celnośći i szansy na trafienie krytyczne, jeśli wykonałeś ruch w tej turze." +LocPromotionPopupText=" Twoje ataki dystansowe zyskują celnośći i szansy na trafienie krytyczne, jeśli wykonałeś ruch w tej turze.
" + +[LockNLoad_LW X2AbilityTemplate] +LocFriendlyName="Zablokuj i załaduj" +LocFlyOverText="Zablokuj i załaduj" +LocLongDescription="Zabójstwa bronią główną przywracają amunicji." +LocHelpText="Zabójstwa bronią główną przywracają amunicji." +LocPromotionPopupText=" Zabójstwa bronią główną przywracają amunicji.
" + +[TrenchWarfare_LW X2AbilityTemplate] +LocFriendlyName="Wojna okopowa" +LocFlyOverText="Wojna okopowa" +LocLongDescription="Jeśli podczas swojej tury zabijesz przynajmniej jednego wroga, automatycznie powoduje kucnięcie na jej końcu. +LocHelpText="Jeśli podczas swojej tury zabijesz przynajmniej jednego wroga, automatycznie powoduje kucnięcie na jej końcu." +LocPromotionPopupText=" Jeśli podczas swojej tury zabijesz przynajmniej jednego wroga, automatycznie powoduje kucnięcie na jej końcu.
Kucniesz tylko wtedy, gdy normalnie będziesz w stanie.
" + +[Dedication_LW X2AbilityTemplate] +LocFriendlyName="Dedykacja" +LocFlyOverText="Dedykacja" +LocLongDescription="Darmowa akcja. Zyskaj mobilność i ignoruj ogień reakcyjny do końca tury. Wymaga tur(y) odnowienia." +LocHelpText="Darmowa akcja. Zyskaj mobilność i ignoruj ogień reakcyjny do końca tury. Wymaga tur(y) odnowienia." +LocPromotionPopupText=" Zyskaj mobilność i ignoruj ogień reakcyjny do końca tury.
Darmowa akcja.
Wymaga tur(y) odnowienia." + +[Corpsman_LW X2AbilityTemplate] +LocFriendlyName="Sanitariusz" +LocFlyOverText="Sanitariusz" +LocLongDescription="Zapewnia darmowy zestaw medyczny." +LocHelpText="Zapewnia darmowy zestaw medyczny." +LocPromotionPopupText=" Zapewnia darmowy zestaw medyczny.
Zamiast tego zostanie dostarczony Nanomedikit, jeśli zostaną zakończone niezbędne badania.
" + +[OpenFire_LW X2AbilityTemplate] +LocFriendlyName="Otwarty ogień" +LocFlyOverText="Otwarty ogień" +LocLongDescription="Twoje ataki dystansowe zyskują celowania i obrażeń krytycznych przeciwko celom, które mają pełne zdrowie." +LocHelpText="Twoje ataki dystansowe zyskują celowania i obrażeń krytycznych przeciwko celom, które mają pełne zdrowie." +LocPromotionPopupText=" Twoje ataki dystansowe zyskują celowania i obrażeń krytycznych przeciwko celom, które mają pełne zdrowie.
" + +[WatchThemRun_LW X2AbilityTemplate] +LocFriendlyName="Patrz jak uciekają" +LocFlyOverText="Patrz jak uciekają" +LocLongDescription="Po rzuceniu lub wystrzeleniu granatu automatycznie przejdziesz do w tryb Warty." +LocHelpText="Po rzuceniu lub wystrzeleniu granatu automatycznie przejdziesz do w tryb Warty." +LocPromotionPopupText=" Po rzuceniu lub wystrzeleniu granatu automatycznie przejdziesz do w tryb Warty.
" + +[Avenger_LW X2AbilityTemplate] +LocFriendlyName="Mściciel" +LocFlyOverText="Mściciel" +LocLongDescription="Raz na turę oddaj strzał reakcyjny za pomocą w widocznego wroga, który strzelił do widocznego sojusznika." +LocHelpText="Raz na turę oddaj strzał reakcyjny za pomocą w widocznego wroga, który strzelił do widocznego sojusznika." +LocPromotionPopupText=" Mściciel nie zostanie aktywowany, jeśli ta jednostka zostanie ostrzelana.
Można aktywować tylko podczas tury wroga.
Można aktywować tylko raz na turę.
" + +[Predator_LW X2AbilityTemplate] +LocFriendlyName="Predator" +LocFlyOverText="Predator" +LocLongDescription="Twoje ataki dystansowe zyskują dodatkowej celności i dodatkowej szansy na trafienie krytyczne przeciwko wrogom, którzy są oskrzydleni lub poza osłoną." +LocHelpText="Twoje ataki dystansowe zyskują dodatkowej celności i dodatkowej szansy na trafienie krytyczne przeciwko wrogom, którzy są oskrzydleni lub poza osłoną." +LocPromotionPopupText=" Twoje ataki dystansowe zyskują dodatkowej celności i dodatkowej szansy na trafienie krytyczne przeciwko wrogom, którzy są oskrzydleni lub poza osłoną.
" + +[Stiletto_LW X2AbilityTemplate] +LocFriendlyName="Stiletto" +LocFlyOverText="Stiletto" +LocLongDescription= "Strzały z przebijają pancerz." +LocHelpText="Strzały z przebijają pancerz." +LocPromotionPopupText=" Strzały z przebijają pancerz.
" + +[Reposition_LW X2AbilityTemplate] +LocFriendlyName="Zmień położenie" +LocFlyOverText="Zmień położenie" +LocLongDescription="Raz na turę zyskujesz dodatkową akcję ruchu po oddaniu standardowego strzału z broni głównej do oskrzydlonego lub odsłoniętego celu." +LocHelpText="Raz na turę zyskujesz dodatkową akcję ruchu po oddaniu standardowego strzału z broni głównej do oskrzydlonego lub odsłoniętego celu." +LocPromotionPopupText=" Raz na turę zyskujesz dodatkową akcję ruchu po oddaniu standardowego strzału z broni głównej do oskrzydlonego lub odsłoniętego celu.
Działa z uderz i uciekaj
+ +[NeutralizingAgents_LW X2AbilityTemplate] +LocFriendlyName="Środki neutralizujące" +LocFlyOverText="Środki neutralizujące" +LocLongDescription="Protokół Pomocy neutralizuje teraz ogień, truciznę, kwas i krwawienie." +LocHelpText="Protokół Pomocy neutralizuje teraz ogień, truciznę, kwas i krwawienie." +LocPromotionPopupText=" Protokół Pomocy neutralizuje teraz ogień, truciznę, kwas i krwawienie.
" + +[SurvivalInstinct_LW X2AbilityTemplate] +LocFriendlyName="Instynkt przetrwania" +LocLongDescription="Zyskuje obrony i szansy na trafienie krytyczne gdy postać jest ranna." +LocHelpText="Zyskuje obrony i szansy na trafienie krytyczne gdy postać jest ranna." +LocFlyOverText="Instynkt przetrwania" +LocPromotionPopupText=" Jeśli powrócisz do pełnego zdrowia, premie zostaną utracone.
" + +[WeaponHandling_LW X2AbilityTemplate] +LocFriendlyName="Obsługa broni" +LocLongDescription="Zmniejsza karę za celowanie przy strzałach z bliskiej odległości o %." +LocHelpText="Zmniejsza karę za celowanie przy strzałach z bliskiej odległości o %." +LocFlyOverText="Obsługa broni" +LocPromotionPopupText=" Obsługa broni nie wpływa na karę za celowanie wynikającą ze strzału migawkowego.
" + +[ThatsCloseEnough_LW X2AbilityTemplate] +LocFriendlyName="Wystarczająco blisko" +LocFlyOverText="Wystarczająco blisko" +LocLongDescription="Podczas tur wroga strzelaj z miotacza łukowego do dowolnego widocznego wroga w obszarze pól(pola), który się porusza lub strzela. Dzieli czas odnowienia ze zdolnością Ogłuszenie miotaczem łukowym." +LocHelpText="Podczas tur wroga strzelaj z miotacza łukowego do dowolnego widocznego wroga w obszarze pól(pola), który się porusza lub strzela. Dzieli czas odnowienia ze zdolnością Ogłuszenie miotaczem łukowym." +LocPromotionPopupText=" Nie zostanie aktywowana, jeśli żołnierz jest ukryty.
Ta umiejętność może być aktywowana razy na turę.
" + +[QuickZap_LW X2AbilityTemplate] +LocFriendlyName="Szybkie porażenie" +LocFlyOverText="Szybkie porażenie" +LocLongDescription="Aktywuj tę umiejętność, aby Twój następny strzał z miotacza łukowego był akcją bezpłatną. Wymaga tur(y) odnowienia." +LocHelpText="Aktywuj tę umiejętność, aby Twój następny strzał z miotacza łukowego był akcją bezpłatną. Wymaga tur(y) odnowienia." +LocPromotionPopupText=" Aktywuj tę umiejętność, aby Twój następny strzał z miotacza łukowego był akcją bezpłatną.
Wymaga tur(y) odnowienia."
Applies to the abilities Stun, Arc Pulser and Chain Lightning.
" + +[Hipfire_LW X2AbilityTemplate] +LocFriendlyName="Strzał z biodra" +LocFlyOverText="Strzał z biodra" +LocLongDescription="Strzał z obrzyna nie kończy już tury." +LocHelpText="Strzał z obrzyna nie kończy już tury." +LocPromotionPopupText=" Dzięki tej zdolności Martwy punkt i Dwie lufy nie kończą tury, pozwalając żołnierzowi na oddanie strzału lub poruszanie się później.
" + +[NoneShallPass_LW X2AbilityTemplate] +LocFriendlyName="Nikt nie przejdzie" +LocFlyOverText="Nikt nie przejdzie" +LocLongDescription="Podczas tur wroga wystrzel darmowy strzał reakcyjny, który może trafić krytycznie przy użyciu obrzyna w dowolnego widocznego wroga w obszarze , który się porusza lub strzela. Można aktywować tylko raz na turę." +LocHelpText="Podczas tur wroga wystrzel darmowy strzał reakcyjny, który może trafić krytycznie przy użyciu obrzyna w dowolnego widocznego wroga w obszarze , który się porusza lub strzela." +LocPromotionPopupText=" Nie aktywuje się, jeśli żołnierz jest ukryty.
Uruchamia się tylko raz na turę.
Zużywa 1 amunicję i aktywuje się tylko wtedy, gdy obrzyn jest załadowany.
Może trafić krytycznie.
Działa podczas dowolnej tury wroga: obcego, Zagubionego, Wybranego i Władcy.
" + +[ScrapMetal_LW X2AbilityTemplate] +LocFriendlyName="Złom" +LocFlyOverText="Złom: odnowienie amunicji" +LocLongDescription="Zabójstwa bronią główną przywracają jedną sztukę aminicji do obrzyna." +LocHelpText="Zabójstwa bronią główną przywracają jedną sztukę aminicji do obrzyna." +LocPromotionPopupText=" Zabójstwa bronią główną przywracają jedną sztukę aminicji do obrzyna."
Nie dotyczy to zabójstw dokonanych przy użyciu samego obrzyna.
Ta umiejętność nie może zapewnić amunicji, jeśli aminicja obrzyna osiągnęła już wartość początkową.
" + +[ScrapMetalTrigger_LW X2AbilityTemplate] +LocFriendlyName="Złom: odnowienie amunicji" + +[Brutality_LW X2AbilityTemplate] +LocFriendlyName="Brutalność" +LocFlyOverText="Brutalność" +LocLongDescription="Zabijanie organicznych wrogów za pomocą obrzyna ma % szansy na wywołanie paniki innych organicznych wrogów w obrębie pól od celu." +LocHelpText="Zabijanie organicznych wrogów za pomocą obrzyna ma % szansy na wywołanie paniki innych organicznych wrogów w obrębie pól od celu." +LocPromotionPopupText=" Wykorzystaj Brutalność jako narzędzie kontroli tłumu, aby pozwolić żołnierzowi na bardziej agresywne poruszanie się do przodu i połącz ją ze zdolnością Bezwzględność, aby zwiększyć swoją siłę zabijania.
" + +[Ruthless_LW X2AbilityTemplate] +LocFriendlyName="Bezwzględność" +LocLongDescription="Zabicie spanikowanego lub zdezorientowanego wroga za pomocą obrzyna zwraca jeden punkt akcji." +LocHelpText="Zabicie spanikowanego lub zdezorientowanego wroga za pomocą obrzyna zwraca jeden punkt akcji." +LocFlyOverText="Bezwzględność" +LocPromotionPopupText=" Sprytnie łącząc efekty Brutalność i Bezwględność, możesz zabić wielu wrogów na turę za pomocą swojego obrzyna.
Nie ma ograniczeń co do liczby aktywacji Bezwzględności na turę.
" + +[ZoneOfControl_LW X2AbilityTemplate] +LocFriendlyName = "Strefa kontroli" +LocHelpText = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocLongDescription = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocPromotionPopupText = " Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności.
" + +[ZoCCleanse X2AbilityTemplate] +LocFriendlyName = "Strefa kontroli" +LocHelpText = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocLongDescription = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocPromotionPopupText = " Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności.
" + +[ZoCPassive X2AbilityTemplate] +LocFriendlyName = "Strefa kontroli" +LocHelpText = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocLongDescription = "Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności." +LocPromotionPopupText = " Wszyscy wrogowie w promieniu pól otrzymują kary w wysokości do celowania i mobilności.
" + +[ApexPredator_LW X2AbilityTemplate] +LocFriendlyName = "Pierwotny Łowca" +LocFlyOverText = "Pierwotny Łowca" +LocHelpText = "Trafienia krytyczne twoją bronią główną mają szansę wywołać panikę celu i pobliskich wrogów." +LocLongDescription = "Trafienia krytyczne twoją bronią główną mają szansę wywołać panikę celu i pobliskich wrogów." +LocPromotionPopupText = " Trafienia krytyczne twoją bronią główną mają szansę wywołać panikę celu i pobliskich (w promieniu pól) wrogów.
Szansa na panikę wynosi % i jest zmniejszona przez warotść Woli celu." + +[BlindingProtocol_LW X2AbilityTemplate] +LocFriendlyName = "Protokół oslepienia" +LocFlyOverText = "Protokół oslepienia" +LocHelpText = "Wyślij Gremlina, aby wystrzelił mały granat błyskowy na wrogi cel, dezorientując wszystkie jednostki wroga w małym promieniu (zmniejszając ich celność o i mobilność o )." +LocLongDescription = "Wyślij Gremlina, aby wystrzelił mały granat błyskowy na wrogi cel, dezorientując wszystkie jednostki wroga w małym promieniu (zmniejszając ich celność o i mobilność o ). +LocPromotionPopupText = " Działa z Widzeniem drużynowym.
Protokół Oślepienia wymaga tur(y) odnowienia i kończy turę.
" + +[LeadTheTarget_LW X2AbilityTemplate] +LocFriendlyName = "Prowadź cel" +LocFlyOverText = "Prowadź cel" +LocHelpText = "Daje +% zwiększoną szansę na trafienie, ale opóźnia strzał do czasu, aż cel wykona akcję w swojej turze. Kosztuje dwie akcje i wymaga tur(y) odnowienia." +LocLongDescription = "Daje +% zwiększoną szansę na trafienie, ale opóźnia strzał do czasu, aż cel wykona akcję w swojej turze. Kosztuje dwie akcje i wymaga tur(y) odnowienia." +LocPromotionPopupText = " Ostrożnie prowadź cel, zwiększając szansę na trafienie o +%, ale opóźniając strzał do tury wybranego wroga. Zabiera dwie akcje.
Prowadzenie Umiejętność wymaga tur(y) odnowienia.
" + +[LeadTheTargetShot_LW X2AbilityTemplate] +LocFriendlyName = "Prowadź cel" +LocFlyOverText = "Prowadź cel" + +[TargetFocus_LW X2AbilityTemplate] +LocFriendlyName = "Skupienie na celu" +LocHelpText = "Twoje ataki dystansowe zyskują + celowania i przebijania pancerza przeciwko niemożliwym do flankowania wrogom. " +LocLongDescription = "Twoje ataki dystansowe zyskują + celowania i przebijania pancerza przeciwko niemożliwym do flankowania wrogom. " +LocPromotionPopupText = " Twoje ataki dystansowe zyskują + celowania i przebijania pancerza przeciwko niemożliwym do flankowania wrogom.
Wrogowie, których nie można oskrzydlić, to ci, którzy nie mogą się ukryć, np. Drony, MEC i Berserkerzy.
" + +[AimAssist_LW X2AbilityTemplate] +LocFriendlyName = "Asysta celowania" +LocHelpText = "Zdobądź dodatkowe + celowanie i + trafienie krytyczne przeciwko jednostkom namierzanym holograficznie." +LocLongDescription = "Zdobądź dodatkowe + celowanie i + trafienie krytyczne przeciwko jednostkom namierzanym holograficznie." +LocPromotionPopupText = " Zdobądź dodatkowe + celowanie i + trafienie krytyczne przeciwko jednostkom namierzanym holograficznie.
" + +[SuperCharge_LW X2AbilityTemplate] +LocFriendlyName = "Leczenie miotaczem" +LocHelpText = "Możesz używać miotacza łukowego do leczenia przyjaznych jednostek mechanicznych." +LocLongDescription = "Możesz używać miotacza łukowego do leczenia przyjaznych jednostek mechanicznych." +LocPromotionPopupText = " Rozpoczyna każdą bitwę z ładunkami , które leczą HP,
Działa na każdą przyjazną jednostkę robotyczną, w tym SPARK, MEC ruchu oporu i zhakowane jednostki ADVENT-u.
" + +[ShootingSharp_LW X2AbilityTemplate] +LocFriendlyName = "Precyzyjne celowanie" +LocHelpText = "Twoje ataki dystansowe zyskują + przebicia pancerza i + celowania przeciwko jednostkom za osłoną." +LocLongDescription = "Twoje ataki dystansowe zyskują + przebicia pancerza i + celowania przeciwko jednostkom za osłoną." +LocPromotionPopupText = "Twoje ataki dystansowe zyskują + przebicia pancerza i + celowania przeciwko jednostkom za osłoną.
" + +[Unlimitedpower_LW X2AbilityTemplate] +LocFriendlyName = "Nielimitowana moc" +LocHelpText = "Strzał z miotacza łukowego nie kończy już Twojej tury." +LocLongDescription = "Strzał z miotacza łukowego nie kończy już Twojej tury." +LocPromotionPopupText = " Działa ze wszystkimi umiętnościami miotacza łukowego
" + +[Overkill_LW X2AbilityTemplate] +LocFriendlyName = "Przesada" +LocHelpText = "Twoje ataki dystansowe zadają o + więcej obrażeń jednostkom posiadającym 50% HP lub mniej." +LocLongDescription = "Twoje ataki dystansowe zadają o + więcej obrażeń jednostkom posiadającym 50% HP lub mniej." +LocPromotionPopupText = " Twoje ataki dystansowe zadają o + więcej obrażeń jednostkom posiadającym 50% HP lub mniej.
" + +[Disassembly_LW X2AbilityTemplate] +LocFriendlyName= "Demontaż" +LocHelpText = "Zabicie wroga zapewnia kumulowaną premię hakowania +, która trwa 3 tury." +LocLongDescription = "Zabicie wroga zapewnia kumulowaną premię hakowania +, która trwa 3 tury." +LocPromotionPopupText = " Zabicie wroga zapewnia kumulowaną premię hakowania +, która trwa 3 tury.
" + +[LightningSlash_LW X2AbilityTemplate] +LocFriendlyName="Błyskawiczny cios" +LocLongDescription="Zaatakuj dowolnego wroga w niebieskim zasięgu ruchu za pomocą . Atak nie kończy tury." +LocHelpText="Zaatakuj dowolnego wroga w niebieskim zasięgu ruchu za pomocą . Atak nie kończy tury." +LocPromotionPopupText=" Zaatakuj dowolnego wroga w niebieskim zasięgu ruchu za pomocą .
Atak nie kończy tury.
Wymaga tur(y) odnowienia.
" + +[InspireAgility_LW X2AbilityTemplate] +LocFriendlyName="Inspiruj zwinnością" +LocFlyOverText="Inspiruj zwinnością" +LocLongDescription="Daj sojuszniczej jednostce Unik do początku twojej następnej tury. Zabicie wrogiej jednostki zapewnia dodatkowy ładunek. Można użyć raz na turę. Rozpoczyna się od jednego ładunku i jest akcją bezpłatną." +LocHelpText="Daj sojuszniczej jednostce Unik do początku twojej następnej tury. Zabicie wrogiej jednostki zapewnia dodatkowy ładunek. Można użyć raz na turę. Rozpoczyna się od jednego ładunku i jest akcją bezpłatną." +LocPromotionPopupText=" Daj sojuszniczej jednostce Uniku do początku twojej następnej tury.
Zabicie wrogiej jednostki zapewnia dodatkowy ładunek.
Można użyć raz na turę.
Rozpoczyna się od jednego ładunku i jest akcją bezpłatną.
" + +[PrimaryReturnFire X2AbilityTemplate] +LocFriendlyName="Ogień Powrotny" +LocHelpText="Gdy zostaniesz celem ostrzału wroga, automatycznie odpal swoją raz na turę." +LocLongDescription="Gdy zostaniesz celem ostrzału wroga, automatycznie odpal swoją raz na turę." +LocPromotionPopupText=" Ogień Powrotny aktywuje się tylko raz na turę.
Ogień Powrotny może zostać wywołany przez ataki wręcz i ataki obszarowe.
Ogień Powrotny nie zostanie aktywowany, gdy zostanie jest się celem strzału reakcji.
" + +[PrimaryReturnFireShot X2AbilityTemplate] +LocFriendlyName="Ogień Powrotny" +LocHelpText="Gdy zostaniesz celem ostrzału wroga, automatycznie odpal swoją raz na turę." +LocLongDescription="Gdy zostaniesz celem ostrzału wroga, automatycznie odpal swoją raz na turę." +LocPromotionPopupText=" Ogień Powrotny aktywuje się tylko raz na turę.
Ogień Powrotny może zostać wywołany przez ataki wręcz i ataki obszarowe.
Ogień Powrotny nie zostanie aktywowany, gdy zostanie jest się celem strzału reakcji.
" + +[DeadeyeSnapShot X2AbilityTemplate] +LocFriendlyName="Marte oko (Strzał precyzyjny)" +LocLongDescription="Oddaj strzał z niewielką karą za celowanie, aby znacząco zwiększyć obrażenia." +LocHelpText="Oddaj strzał z niewielką karą za celowanie, aby znacząco zwiększyć obrażenia." +LocPromotionPopupText=" Umiejętność zmniejsza ogólną szansę trafienia strzału o %, ale zwiększa podstawowe obrażenia strzału o %.
Wymaga tur(y) odnowienia.
" + +[DeadeyeDamage_SnapShot X2AbilityTemplate] +LocFriendlyName="Marte oko (Strzał precyzyjny)" +LocLongDescription="Oddaj strzał z niewielką karą za celowanie, aby znacząco zwiększyć obrażenia." +LocHelpText="Oddaj strzał z niewielką karą za celowanie, aby znacząco zwiększyć obrażenia." +LocPromotionPopupText=" Umiejętność zmniejsza ogólną szansę trafienia strzału o %, ale zwiększa podstawowe obrażenia strzału o %.
Wymaga tur(y) odnowienia.
" + +[Deadeye X2AbilityTemplate] +LocPromotionPopupText=" Umiejętność zmniejsza ogólną szansę trafienia strzału o %, ale zwiększa podstawowe obrażenia strzału o %.
Wymaga tur(y) odnowienia.
Działa ze Strzałem precyzyjnym.
" + +; AdvPriest Abilities +[HolyWarriorM1 X2AbilityTemplate] +LocFriendlyName="Święty wojownik" +LocHelpText="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocLongDescription="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocFlyOverText="Święty wojownik" + +[HolyWarriorM2 X2AbilityTemplate] +LocFriendlyName="Święty wojownik" +LocHelpText="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocLongDescription="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocFlyOverText="Święty wojownik" + +[HolyWarriorM3 X2AbilityTemplate] +LocFriendlyName="Święty wojownik" +LocHelpText="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocLongDescription="Kapłan dokonuje połączenia umysłu z inną jednostką. Jednostka ta zyskuje premie do statystyk podczas trwania fuzji." +LocFlyOverText="Święty wojownik" + +[ChosenDragonRounds X2AbilityTemplate] +LocFriendlyName="Piekielna Furia" +LocFlyOverText="Piekielna Furia" +LocLongDescription="Twoja główna broń podpali twoich wrogów." +LocHelpText="Twoja główna broń podpali twoich wrogów." + +[ChosenDragonRoundsPassive X2AbilityTemplate] +LocFriendlyName="Piekielna Furia" +LocFlyOverText="Piekielna Furia" +LocLongDescription="Twoja główna broń podpali twoich wrogów." +LocHelpText="Twoja główna broń podpali twoich wrogów." + +[ChosenVenomRounds X2AbilityTemplate] +LocFriendlyName="Toksyczny Koszmar" +LocFlyOverText="Toksyczny Koszmar" +LocLongDescription="Twoja główna broń zatruje twoich wrogów." +LocHelpText="Twoja główna broń zatruje twoich wrogów." + +[ChosenVenomRoundsPassive X2AbilityTemplate] +LocFriendlyName="Toksyczny Koszmar" +LocFlyOverText="Toksyczny Koszmar" +LocLongDescription="Twoja główna broń zatruje twoich wrogów." +LocHelpText="Twoja główna broń zatruje twoich wrogów." + +[ChosenBleedingRounds X2AbilityTemplate] +LocFriendlyName="Uderz tam gdzie boli" +LocFlyOverText="Uderz tam gdzie boli" +LocLongDescription="Twoja główna broń wywoła krwawienie u twoich wrogów." +LocHelpText="Twoja główna broń wywoła krwawienie u twoich wrogów." + +[ChosenBleedingRoundsPassive X2AbilityTemplate] +LocFriendlyName="Uderz tam gdzie boli" +LocFlyOverText="Uderz tam gdzie boli" +LocLongDescription="Twoja główna broń wywoła krwawienie u twoich wrogów." +LocHelpText="Twoja główna broń wywoła krwawienie u twoich wrogów." + +[MindScorchDangerZone X2AbilityTemplate] +LocFriendlyName="Wysokie napięcie" +LocLongDescription="Zyskaj -promienia dla Spalenia umysłem." +LocHelpText="Zyskaj -promienia dla Spalenia umysłem." +LocPromotionPopupText=" Zyskaj -promienia dla Spalenia umysłem." + +[MindScorchTerror X2AbilityTemplate] +LocFriendlyName="Terroryzuj" +LocLongDescription="Daje szanse na panike podczas użynia Spalenia umysłem." +LocHelpText="Daje szanse na panike podczas użynia Spalenia umysłem." +LocPromotionPopupText=" Spalenie umysłem może wywołać panikę.
Szansa na panikę zależy od statystyki ataku psionicznego Czarnoksiężnika w stosunku do Woli celu." + +[MindScorch X2AbilityTemplate] +LocFriendlyName="Spalenie umysłem" +LocHelpText="Czarnoksiężnik otwiera swój umysł na cel, zadając obrażenia i mając % szansy na spalenie celu swoim szaleństwem. tur(y) odnowienia." +LocLongDescription="Czarnoksiężnik otwiera swój umysł na cel, zadając obrażenia i mając szansę na spalenie celu swoim szaleństwem. tur(y) odnowienia. + +[ChosenKidnap X2AbilityTemplate] +LocFriendlyName="Porwanie" +LocLongDescription="Porywa nieprzytomną lub wykrwawiającą się jednostkę. Kosztuje 2 akcje, 1 turę odnowienia." +LocHelpText="Porywa nieprzytomną lub wykrwawiającą się jednostkę. Kosztuje 2 akcje, 1 turę odnowienia.n." +LocFlyOverText="Porwanie" + +[ChosenKeen X2AbilityTemplate] +LocFriendlyName="Wykrwawienie" +LocLongDescription="Tylko dla żołnierzy (nie rebeliantów) Wykrwawienie jest 100% szansą, gdy zostanie zadany śmiertelny cios, gdy obecny jest Wybraniec." +LocHelpText="Tylko dla żołnierzy (nie rebeliantów) Wykrwawienie jest 100% szansą, gdy zostanie zadany śmiertelny cios, gdy obecny jest Wybraniec." +LocFlyOverText="Wykrwawienie" + +[CombatReadiness X2AbilityTemplate] +LocFriendlyName="Czytanie walki" +LocLongDescription="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający." +LocHelpText="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający. +LocFlyOverText="Czytanie walki" + +[CombatReadinessPassive X2AbilityTemplate] +LocFriendlyName="Czytanie walki" +LocLongDescription="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający." +LocHelpText="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający. +LocFlyOverText="Czytanie walki" + +[Banzai_LW X2AbilityTemplate] +LocFriendlyName="Banzai" +LocLongDescription="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający." +LocHelpText="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający. +LocFlyOverText="Banzai" + +[BanzaiPassive_LW X2AbilityTemplate] +LocFriendlyName="Banzai" +LocLongDescription="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający." +LocHelpText="Zdobądź kumulującą się celność i premi do obrony za osłoną na resztę swojej tury i usuń debuff unieruchamiający. +LocFlyOverText="Banzai" + +[ChosenAssassin X2CharacterTemplate] +strCharacterName="Zabójczyni" +strAcquiredText="Zabójczyni, będąca teraz zagrożeniem w walce wręcz, jest molochem, który podbiegnie do ciebie i cię tnie, gdy tylko jest to możliwe. Nie można niedoceniać jej początkowo niskich, ale stale rosnących obrażeń." + +[ChosenAssassinM2 X2CharacterTemplate] +strCharacterName="Zabójczyni" +strAcquiredText="Zabójczyni, będąca teraz zagrożeniem w walce wręcz, jest molochem, który podbiegnie do ciebie i cię tnie, gdy tylko jest to możliwe. Nie można niedoceniać jej początkowo niskich, ale stale rosnących obrażeń." + +[ChosenAssassinM3 X2CharacterTemplate] +strCharacterName="Zabójczyni" +strAcquiredText="Zabójczyni, będąca teraz zagrożeniem w walce wręcz, jest molochem, który podbiegnie do ciebie i cię tnie, gdy tylko jest to możliwe. Nie można niedoceniać jej początkowo niskich, ale stale rosnących obrażeń." + +[ChosenAssassinM4 X2CharacterTemplate] +strCharacterName="Zabójczyni" +strAcquiredText="Zabójczyni, będąca teraz zagrożeniem w walce wręcz, jest molochem, który podbiegnie do ciebie i cię tnie, gdy tylko jest to możliwe. Nie można niedoceniać jej początkowo niskich, ale stale rosnących obrażeń." + +[ChosenWarlock X2CharacterTemplate] +strCharacterName="Czarnoksiężnik" +strAcquiredText="Największy mistrz Starszego jest niezwykle niebezpieczną jednostką wsparcia i królem średniego zasięgu, zdolnym do całkowitego obezwładnienia twoich żołnierzy i znacznego wzmocnienia jego wojowników." + +[ChosenWarlockM2 X2CharacterTemplate] +strCharacterName="Czarnoksiężnik" +strAcquiredText="Największy mistrz Starszego jest niezwykle niebezpieczną jednostką wsparcia i królem średniego zasięgu, zdolnym do całkowitego obezwładnienia twoich żołnierzy i znacznego wzmocnienia jego wojowników." + +[ChosenWarlockM3 X2CharacterTemplate] +strCharacterName="Czarnoksiężnik" +strAcquiredText="Największy mistrz Starszego jest niezwykle niebezpieczną jednostką wsparcia i królem średniego zasięgu, zdolnym do całkowitego obezwładnienia twoich żołnierzy i znacznego wzmocnienia jego wojowników." + +[ChosenWarlockM4 X2CharacterTemplate] +strCharacterName="Czarnoksiężnik" +strAcquiredText="Największy mistrz Starszego jest niezwykle niebezpieczną jednostką wsparcia i królem średniego zasięgu, zdolnym do całkowitego obezwładnienia twoich żołnierzy i znacznego wzmocnienia jego wojowników." + +[ChosenSniper X2CharacterTemplate] +strCharacterName="Łowczy" +strAcquiredText="Łowczy jest mistrzem walki na daleki dystans, nieustannie atakuje twoich żołnierzy, jednocześnie pokonując ich niebezpiecznymi strzałami z flanki. Słaby w walce w zwarciu, ale nie należy go lekceważyć." + +[ChosenSniperM2 X2CharacterTemplate] +strCharacterName="Łowczy" +strAcquiredText="Łowczy jest mistrzem walki na daleki dystans, nieustannie atakuje twoich żołnierzy, jednocześnie pokonując ich niebezpiecznymi strzałami z flanki. Słaby w walce w zwarciu, ale nie należy go lekceważyć." + +[ChosenSniperM3 X2CharacterTemplate] +strCharacterName="Łowczy" +strAcquiredText="Łowczy jest mistrzem walki na daleki dystans, nieustannie atakuje twoich żołnierzy, jednocześnie pokonując ich niebezpiecznymi strzałami z flanki. Słaby w walce w zwarciu, ale nie należy go lekceważyć." + +[ChosenSniperM4 X2CharacterTemplate] +strCharacterName="Łowczy" +strAcquiredText="Łowczy jest mistrzem walki na daleki dystans, nieustannie atakuje twoich żołnierzy, jednocześnie pokonując ich niebezpiecznymi strzałami z flanki. Słaby w walce w zwarciu, ale nie należy go lekceważyć." + +[BloodThirst_LW X2AbilityTemplate] +LocFriendlyName="Pragnienie krwi" +LocLongDescription="Za każdym razem, gdy atakujesz bronią białą, otrzymujesz kumulujące się zwiększenie obrażeń do ataków wręcz. Bonus zależy od wybranego poziomu, +/// obrażeń dla T1/T2/T3/T4. Znika po udanym porwaniu." +LocHelpText="Za każdym razem, gdy atakujesz bronią białą, otrzymujesz kumulujące się zwiększenie obrażeń do ataków wręcz. Bonus zależy od wybranego poziomu, +/// obrażeń dla T1/T2/T3/T4. Znika po udanym porwaniu." +LocFlyOverText="Pragnienie krwi" + +[BloodThirstPassive_LW X2AbilityTemplate] +LocFriendlyName="Pragnienie krwi" +LocLongDescription="Za każdym razem, gdy atakujesz bronią białą, otrzymujesz kumulujące się zwiększenie obrażeń do ataków wręcz. Bonus zależy od wybranego poziomu, +/// obrażeń dla T1/T2/T3/T4. Znika po udanym porwaniu." +LocHelpText="Za każdym razem, gdy atakujesz bronią białą, otrzymujesz kumulujące się zwiększenie obrażeń do ataków wręcz. Bonus zależy od wybranego poziomu, +/// obrażeń dla T1/T2/T3/T4. Znika po udanym porwaniu." +LocFlyOverText="Pragnienie krwi" + +[PreciseStrike_LW X2AbilityTemplate] +LocFriendlyName="Precyzyjne uderzenie" +LocLongDescription="Twoje ataki wręcz przebijają 3 punkty pancerza." +LocHelpText="Twoje ataki wręcz przebijają 3 punkty pancerza." +LocFlyOverText="Precyzyjne uderzenie" + +[PsychoticRage_LW X2AbilityTemplate] +LocFriendlyName="Psychotyczna wściekłość" +LocHelpText="Zyskaj 50% premii do obrażeń, gdy masz 35% HP lub mniej." +LocLongDescription="Zyskaj 50% premii do obrażeń, gdy masz 35% HP lub mniej." +LocFlyOverText="Psychotyczna wściekłość" + +[YouCannotHide_LW X2AbilityTemplate] +LocFriendlyName="Nie ukryjesz się" +LocHelpText="Zdobądź 100 punktów celności swoją bronią główną." +LocLongDescription="Zdobądź 100 punktów celności swoją bronią główną." +LocFlyOverText="Uciekaj." + +[RebelHPUpgrade_T1 X2AbilityTemplate] +LocFriendlyName="Kamizelka ze stopu" +LocLongDescription="Badania nad zbroją płytową zapewniły naszym żołnierzom ruchu oporu lepszą ochronę." +LocHelpText="Badania nad zbroją płytową zapewniły naszym żołnierzom ruchu oporu lepszą ochronę." +LocFlyOverText="Kamizelka ze stopu" + +[RebelHPUpgrade_T2 X2AbilityTemplate] +LocFriendlyName="Zaawansowana kamizelka ze stopu" +LocLongDescription="Badania nad pancerzami wspomaganymi zapewniły naszym żołnierzom ruchu oporu jeszcze lepszą ochronę." +LocHelpText="Badania nad pancerzami wspomaganymi zapewniły naszym żołnierzom ruchu oporu jeszcze lepszą ochronę." +LocFlyOverText="Zaawansowana kamizelka ze stopu" + +[ChosenRifle_XCOM X2WeaponTemplate] +FriendlyName="Zakłócacz" +FriendlyNamePlural="Zakłócacze" +BriefSummary="Pomimo swojej obsesji na punkcie mocy psionicznej, nawet Czarnoksiężnik nosił w potrzebie bardziej tradycyjną broń." +TacticalText=" Strzały z karabinu są darmowe, o ile strzał jest krytyczny.\n Karabin ma większą szansę na trafienie krytyczne przeciwko innym jednostkom psionicznym.\n Strzał z broni głównej zawsze kończy turę żołnierza.\n" +AbilityDescName="karabin" + +[ChosenShotgun_XCOM X2WeaponTemplate] +FriendlyName="Arashi" +FriendlyNamePlural="Arashi" +BriefSummary="Niezawodna broń Zabójczyni, w zwarciu jest nie mniej niebezpieczna niż jej miecz." +TacticalText=" Arashi pozwala noszącemu leczyć obrażenia poprzez zadawanie obrażeń i jest celniejszy niż większość strzelb na dłuższych dystansach.\n Broń typu strzelba jest bardzo skuteczna na bliskim dystansie, ale jej celność szybko spada na większym dystansie.\n" +AbilityDescName="strzelba" + +[ChosenSword_XCOM X2WeaponTemplate] +FriendlyName="Katana" +FriendlyNamePlural="Katany" +BriefSummary="Cenna broń Zabójczyni, wykuta rękami nie z tej Ziemi. Mówi się, że staje się silniejsza, gdy spożywa krew swoich wrogów." +TacticalText=" Katana zaczyna z niskimi obrażeniami, otrzymując tymczasową premię do obrażeń przy każdym trafieniu." +AbilityDescName="miecz" + +[ChosenSniperRifle_XCOM X2WeaponTemplate] +FriendlyName="Mroczna Lanca" +FriendlyNamePlural="Mroczne Lance" +BriefSummary="Ten karabin należący do Łowczego prawdopodobnie widział więcej śmierci, niż możemy sobie wyobrazić." +TacticalText=" Ten karabin jest w stanie zadać szaleńcze obrażenia seryjne jednostkom, które zostały oznaczone na śmierć.
Jednak ze względu na swój rozmiar okazało się, że naszym agentom trudno jest go przeładować.
" +AbilityDescName="karabin snajperski" + +[ChosenSniperPistol_XCOM X2WeaponTemplate] +FriendlyName="Mroczny Pazury" +FriendlyNamePlural="Mroczne Pazury" +BriefSummary="Choć mogłoby się wydawać, że naśladuje konstrukcję tradycyjnych rewolwerów występujących na Ziemi, zastosowana w nim technologia wcale nie jest konwencjonalna." +TacticalText=" Mroczny Pazur to niezwykle potężny pistolet przeciwko rannym wrogom." +AbilityDescName="pistol" + +[XCOMBloodThirst_LW X2AbilityTemplate] +LocFriendlyName="Pragnienie krwi" +LocLongDescription="Za każdym razem, gdy atakujesz swoją bronią białą, uzyskaj kumulujące się + zwiększenie obrażeń do twoich ataków wręcz. Trwa 5 tur." +LocHelpText="Za każdym razem, gdy atakujesz bronią białą, uzyskaj kumulujące się + zwiększenie obrażeń do twoich ataków wręcz." +LocFlyOverText="Pragnienie krwi" + +[XCOMBloodThirstPassive_LW X2AbilityTemplate] +LocFriendlyName="Pragnienie krwi" +LocLongDescription="Za każdym razem, gdy atakujesz swoją bronią białą, uzyskaj kumulujące się + zwiększenie obrażeń do twoich ataków wręcz. Trwa 5 tur." +LocHelpText="Za każdym razem, gdy atakujesz bronią białą, uzyskaj kumulujące się + zwiększenie obrażeń do twoich ataków wręcz." +LocFlyOverText="Pragnienie krwi" + +[OverbearingSuperiority_LW X2AbilityTemplate] +LocFriendlyName="Nadmierna wyższość" +LocLongDescription="Za każdym razem, gdy otrzymasz trafienie krytyczne swoją bronią główną, Twoje akcje zostaną zwrócone." +LocHelpText="Za każdym razem, gdy otrzymasz trafienie krytyczne swoją bronią główną, Twoje akcje zostaną zwrócone." +LocFlyOverText="Nadmierna wyższość" + +[DisruptorRifleCrit X2AbilityTemplate] +LocFriendlyName="Gniew przeciw niegodnym" +LocLongDescription="Zyskaj + trafienia krytycznego przeciwko jednostkom psionicznym." +LocHelpText="Zyskaj + trafienia krytycznego przeciwko jednostkom psionicznym." +LocFlyOverText="Gniew przeciw niegodnym" + +[XCOMHunterMark_LW X2AbilityTemplate] +LocFriendlyName="Znak śmierci" +LocLongDescription="Oznacz cel na śmierć, a standardowe strzały i strzały precyzyjne przeciwko tej jednostce zostaną zwrócone. Kończy turę żołnierza. Efekt Trwa do końca następnej tury XCOM." +LocHelpText="Oznacz cel na śmierć, dzięki czemu Twoje strzały przeciwko tej jednostce zostaną zwrócone." +LocFlyOverText="Znak śmierci" + +[Fatality_LW X2AbilityTemplate] +LocFriendlyName="Fatality" +LocLongDescription="Zyskaj +100 celowania i trafień krytycznych przeciwko jednostkom o 35% HP lub niższym przy użyciu ." +LocHelpText="Zyskaj +100 celowania i trafień krytycznych przeciwko jednostkom o 35% HP lub niższym przy użyciu ." +LocFlyOverText="Fatality" + +[Vampirism_LW X2AbilityTemplate] +LocFriendlyName="Wampiryzm" +LocLongDescription="Zadawanie obrażeń tą bronią leczy cię o tę samą wartość." +LocHelpText="Zadawanie obrażeń tą bronią leczy cię o tę samą wartość." +LocFlyOverText="Wampiryzm" + +[VampirismPassive_LW X2AbilityTemplate] +LocFriendlyName="Wampiryzm" +LocLongDescription="Zadawanie obrażeń tą bronią leczy cię o tę samą wartość." +LocHelpText="Zadawanie obrażeń tą bronią leczy cię o tę samą wartość." +LocFlyOverText="Wampiryzm" + +[ChosenLowProfile X2AbilityTemplate] +LocFriendlyName="Zwinność" +LocLongDescription="Otrzymujesz kumulującą się premię do obrony po otrzymaniu obrażeń w tej turze." +LocHelpText="Otrzymujesz kumulującą się premię do obrony po otrzymaniu obrażeń w tej turze." + +[ChosenLowProfileTrigger X2AbilityTemplate] +LocFriendlyName="Zwinność" +LocLongDescription="Otrzymujesz kumulującą się premię do obrony po otrzymaniu obrażeń w tej turze." +LocHelpText="Otrzymujesz kumulującą się premię do obrony po otrzymaniu obrażeń w tej turze." + +[ComplexReload_LW X2AbilityTemplate] +LocFriendlyName="Kompleksowe przeładowanie" +LocHelpText="Przeładuj swoją główną broń. Kończy turę." +LocFlyOverText="Przeładowuję" + +[XcomGame.X2StrategyGameRulesetDataStructures] +[X2StrategyGameRulesetDataStructures] +ComIntLabels[eComInt_Standard]="Bardzo niskie" +ComIntLabels[eComInt_AboveAverage]="Niskie" +ComIntLabels[eComInt_Gifted]="Umiarkowane" +ComIntLabels[eComInt_Genius]="Wysokie" +ComIntLabels[eComInt_Savant]="Bardzo Wysokie" + +[AssassinPrimeReactionPassive X2AbilityTemplate] +LocFriendlyName="Główna reakcja Wybrańca" +LocLongDescription="Zyskuje cięcie, akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocHelpText="Zyskuje akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocFlyOverText="Główna reakcja Wybrańca" + +[HunterPrimeReactionPassive X2AbilityTemplate] +LocFriendlyName="Główna reakcja Wybrańca" +LocLongDescription="Zyskuje akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocHelpText="Zyskuje akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocFlyOverText="Główna reakcja Wybrańca" + +[WarlockPrimeReactionPassive X2AbilityTemplate] +LocFriendlyName="Główna reakcja Wybrańca" +LocLongDescription="Zyskuje akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocHelpText="Zyskuje akcję ruchu lub gotowość bojową po otrzymaniu obrażeń w turze XCOM" +LocFlyOverText="Główna reakcja Wybrańca" + +[ChosenImmunitiesPassive X2AbilityTemplate] +LocFriendlyName="Odporność Wybrańców" +LocLongDescription="Wybrańcy są odporni na ogłuszenie, dezorientację i mróz." +LocHelpText="Wybrańcy są odporni na ogłuszenie, dezorientację i mróz." +LocFlyOverText="Odporność Wybrańców" + +;(2) Added the Cooldown Text +[HarborWave X2AbilityTemplate] +LocFriendlyName="Fala psioniczna" +LocLongDescription="Wyślij falę psioniczną, która zadaje obrażenia. Otrzymuje bonusy od Żądzy Krwi. Wymaga tur(y) odnowienia." +LocHelpText="Wyślij falę psioniczną, która zadaje obrażenia. Otrzymuje bonusy od Żądzy Krwi. Wymaga tur(y) odnowienia." +LocFlyOverText="Fala psioniczna" + +[Brawler X2AbilityTemplate] +LocFriendlyName="Awanturnik" +LocFlyOverText="Awanturnik" +LocLongDescription="Otrzymujesz % mniej obrażeń przeciwko atakom w promieniu czterech pól." +LocHelpText="Otrzymujesz % mniej obrażeń przeciwko atakom w promieniu czterech pól. +LocPromotionPopupText=" Otrzymujesz % mniej obrażeń przeciwko atakom w promieniu czterech pól.
" + +[InstantReactionTime X2AbilityTemplate] +LocFriendlyName="Natychmiastowy czas reakcji" +LocFlyOverText="Natychmiastowy czas reakcji" +LocLongDescription="Zyskaj uniku przed każdym atakiem za każde pole oddalone od atakującego." +LocHelpText="Zyskaj uniku przed każdym atakiem za każde pole oddalone od atakującego." +LocPromotionPopupText="Zyskaj uniku przed każdym atakiem za każde pole oddalone od atakującego." + +[AssassinSlash_LW X2AbilityTemplate] +LocFriendlyName="Cięcie Zabójczyni" +LocFlyOverText="Cięcie Zabójczyni" +LocLongDescription="Zaatakuj sąsiedni cel mieczem. Używa jednej akcji i gwarantuje trafienie." +LocHelpText="Zaatakuj sąsiedni cel mieczem. Używa jednej akcji i gwarantuje trafienie." +LocPromotionPopupText=" Atakuj mieczem sąsiedni cel.
Wykorzystuje jedną akcję i nie kończy automatycznie Twojej tury, więc możliwe są dwa ataki na turę." + +[ReactionFireAgainstCoverBonus X2AbilityTemplate] +LocFriendlyName="Przeciwosłonowy strzał reakcji" +LocHelpText="Zmniejsza premię do obrony zapewnianą przez osłonę podczas strzałów Warty" + +[SmokeFlankingCritProtection X2AbilityTemplate] +LocFriendlyName="Dym antykrytyczny" +LocHelpText="Neguje premię krytyczną z flanki" + +[ImpactCompensation_LW X2AbilityTemplate] +LocFriendlyName="Kompensacja uderzenia" +LocFlyOverText="Kompensacja uderzenia" +LocLongDescription="Po otrzymaniu obrażeń zyskujesz kumulującą się redukcję obrażeń % do końca swojej tury. Maksymalna liczba kumulacji: ." +LocHelpText="Po otrzymaniu obrażeń zyskujesz kumulującą się redukcję obrażeń % do końca swojej tury. Maksymalna liczba kumulacji: ." +LocPromotionPopupText=" Zapewnia redukcję obrażeń opartą na procentach skalowania, która wzrasta w miarę otrzymywania większych obrażeń.
Kumulacje resetują się do 0 na początku twojej tury.
Kumulacje działają mnożąco." + +[ImpactCompensationPassive_LW X2AbilityTemplate] +LocFriendlyName="Kompensacja uderzenia" +LocFlyOverText="Kompensacja uderzenia" +LocLongDescription="Po otrzymaniu obrażeń zyskujesz kumulującą się redukcję obrażeń % do końca swojej tury. Maksymalna liczba kumulacji: ." +LocHelpText="Po otrzymaniu obrażeń zyskujesz kumulującą się redukcję obrażeń % do końca swojej tury. Maksymalna liczba kumulacji: ." + +[MovingTarget_LW X2AbilityTemplate] +LocFriendlyName="Ruchomy cel" +LocFlyOverText="Otrzymujesz dodatkowe + Obrony i + Uniku przed ogniem reakcji." +LocLongDescription="YOtrzymujesz dodatkowe + Obrony i + Uniku przed ogniem reakcji." +LocHelpText="Otrzymujesz dodatkowe + Obrony i + Uniku przed ogniem reakcji." +LocPromotionPopupText="Otrzymujesz dodatkowe + Obrony i + Uniku przed ogniem reakcji." + +[ChosenAction_Retribution X2ChosenActionTemplate] +SummaryText="Brutalne rozprawienie się z Ruchem Oporu, obniżające cały dochód rebeliantów (wywiad, rekrutacja i zaopatrzenie) w regionie na dni." + +[XComGameState_AdventChosen] +KnowledgeGainFirstBullet[eChosenKnowledge_Start]="" +KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]=" " +KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="Wybrańcy zwiększają ryzyko tajnych działań!" +KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="Wybrańcy mogą sabotować Avengera!" +KnowledgeGainFirstBullet[eChosenKnowledge_Raider]="Wybrańcy mogą zaatakować Avengera!" +KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="Wybrańcy może wywołać dodatkowe mroczne wydarzenie!" + +; Remove this section +; [X2Ability_LW_ChosenAbilities] + +[Magnum_LW X2AbilityTemplate] +LocFriendlyName="Magnum" +LocLongDescription="Standardowe strzały pistoletowe nie mają kary za duży zasięg." +LocHelpText="Standardowe strzały pistoletowe nie mają kary za duży zasięg." +LocFlyOverText="Magnum" +LocPromotionPopupText=" Dotyczy tylko standardowego strzału pistoletowego i Warty z pistoletem.
Nie dotyczy specjalnych umiejętności, takich jak Błyskawiczne Dłonie, Rewolwerowiec czy Zwarcie.
" + +[HunterFlashbang X2GrenadeTemplate] +FriendlyName="Granat błyskowy" +FriendlyNamePlural="Granaty błyskowe" +BriefSummary="Granat Błyskowy zakłóca i dezorientuje wrogów w bardzo dużym promieniu, zadając znaczne kary ofensywne." +TacticalText=" Granaty błyskowe nie zadają obrażeń, ale dezorientują i zakłócają spokój wrogów w dużym promieniu.
Nie ma to wpływu na sojuszniczych członków drużyny.
Niektórzy potężni wrogowie mogą być w stanie oprzeć się ich efekty." +ThrownAbilityName="Rzuć granat błyskowy Łowczego" +ThrownAbilityHelpText="Dezorientuj wrogie cele na dotkniętym obszarze. Darmowa akcja." +LaunchedAbilityname="Uruchom granat błyskowy" +LaunchedAbilityHelpText="Dezorientuj wrogie cele na dotkniętym obszarze." + +[Disabler X2AbilityTemplate] +LocFriendlyName="Dezaktywator" +LocFlyOverText="Dezaktywator" +LocLongDescription="Twoje ataki pistoletowe wyłączają broń twojego celu." +LocHelpText="Twoje ataki pistoletowe wyłączają broń twojego celu." + +[AdvPurifierm2Flamethrower X2WeaponTemplate] +FriendlyName="Miotacz ognia Oczyszczacza" +FriendlyNamePlural="Miotacze ognia Oczyszczacza" +BriefSummary="Miotacz ognia Oczyszczacza" +TacticalText="Miotacz ognia Oczyszczacza" +AbilityDescName="Miotacz ognia Oczyszczacza" + +[AdvPurifierm3Flamethrower X2WeaponTemplate] +FriendlyName="Miotacz ognia Oczyszczacza" +FriendlyNamePlural="Miotacze ognia Oczyszczacza" +BriefSummary="Miotacz ognia Oczyszczacza" +TacticalText="Miotacz ognia Oczyszczacza" +AbilityDescName="Miotacz ognia Oczyszczacza" + +[Solace X2AbilityTemplate] +LocFriendlyName="Aura ukojenia" +LocLongDescription="Kapłan otoczony jest aurą, która natychmiast neguje lub blokuje wszelkie upośledzenia umysłowe jego samego i pobliskich członków drużyny." +LocHelpText="Kapłan otoczony jest aurą, która natychmiast neguje lub blokuje wszelkie upośledzenia umysłowe jego samego i pobliskich członków drużyny." +LocFlyOverText="Ukojenie" +LocPromotionPopupText=" Ukojenie ma promień 4 pól.
Przejście obok dotkniętych sojuszników natychmiast usunie ich upośledzenia umysłowe.
" + +[AssassinBladestorm X2AbilityTemplate] +LocFriendlyName="Burza ostrzy" +LocLongDescription="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz." +LocHelpText="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz." +LocFlyOverText="Burza ostrzy" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Burza Ostrzy zostanie aktywowana, jeśli ten wróg spróbuje zaatakować .
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, wówczas Burza Ostrzy uruchomi się, gdy wróg znajdzie się w zasięgu walki wręcz.
" + +[AssassinBladestormAttack X2AbilityTemplate] +LocFriendlyName="Burza ostrzy" +LocLongDescription="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz." +LocHelpText="Darmowe ataki na każdego wroga, który wejdzie lub zaatakuje z zasięgu walki wręcz." +LocFlyOverText="Burza ostrzy" +LocPromotionPopupText=" Jeśli wróg rozpocznie swoją turę na sąsiednim kafelku, Burza Ostrzy zostanie aktywowana, jeśli ten wróg spróbuje zaatakować .
Jeśli wróg nie rozpocznie swojej tury na sąsiednim kafelku, wówczas Burza Ostrzy uruchomi się, gdy wróg znajdzie się w zasięgu walki wręcz.
" + +[TemplarBallisticShield_CV X2WeaponTemplate] +FriendlyName="Tarcza Templariusza MK1" +FriendlyNamePlural="Tarcze Templariusza MK1" +BriefSummary="Jedna z najstarszych form dodatkowej ochrony znana ludzkości. Ludzie używają jakiejś formy tarczy od najwcześniejszych dni używania narzędzi. Ten jest standardowym modelem antybalistycznym z metalowymi lub ceramicznymi płytkami zaprojektowanymi tak, aby zapobiegać penetracji broni dużego kalibru." +TacticalText="Jedna z najstarszych form dodatkowej ochrony znana ludzkości. Ludzie używają jakiejś formy tarczy od najwcześniejszych dni używania narzędzi. Ten jest standardowym modelem antybalistycznym z metalowymi lub ceramicznymi płytkami zaprojektowanymi tak, aby zapobiegać penetracji broni dużego kalibru." + +[TemplarBallisticShield_MG X2WeaponTemplate] +FriendlyName="Tarcza Templariusza MK2" +FriendlyNamePlural="Tarcze Templariusza MK2" +BriefSummary="Zastosowanie obcych stopów sprawiło, że Tarcza Balistyczna jest nie tylko lekka, ale także mocniejsza. Złożone polimery i ceramika umożliwiają również lepszą dystrybucję ciepła, ponieważ tacy użytkownicy są mniej narażeni na obrażenia odłamkami i stopionym materiałem w przypadku stosowania własnych środków ochronnych. Aby ułatwić planowanie taktyczne, można zainstalować opcjonalny tablet LED." +TacticalText="Zastosowanie obcych stopów sprawiło, że Tarcza Balistyczna jest nie tylko lekka, ale także mocniejsza. Złożone polimery i ceramika umożliwiają również lepszą dystrybucję ciepła, ponieważ tacy użytkownicy są mniej narażeni na obrażenia odłamkami i stopionym materiałem w przypadku stosowania własnych środków ochronnych. Aby ułatwić planowanie taktyczne, można zainstalować opcjonalny tablet LED." + +[TemplarBallisticShield_BM X2WeaponTemplate] +FriendlyName="Tarcza Templariusza MK3" +FriendlyNamePlural="Tarcze Templariusza MK3" +BriefSummary="Postępy w miniaturyzacji pozwalają tej tarczy pomieścić nie tylko konwencjonalną obronę materialną, ale także bardziej ezoteryczne środki, takie jak tarcze energetyczne. Nanomateriały umożliwiają jego samonaprawę w terenie, a w sytuacjach awaryjnych mogą nawet służyć jako port ładowania. Zintegrowany system holograficzny pozwala na większą świadomość sytuacyjną." +TacticalText="Postępy w miniaturyzacji pozwalają tej tarczy pomieścić nie tylko konwencjonalną obronę materialną, ale także bardziej ezoteryczne środki, takie jak tarcze energetyczne. Nanomateriały umożliwiają jego samonaprawę w terenie, a w sytuacjach awaryjnych mogą nawet służyć jako port ładowania. Zintegrowany system holograficzny pozwala na większą świadomość sytuacyjną." + +[TemplarBallisticShield_GenerateCover X2AbilityTemplate] +LocFriendlyName="Tarcza Templariusza" +LocHelpText="Zapewnia sojusznikom połowę osłony." +LocLongDescription="Zapewnia sojusznikom połowę osłony." +LocFlyOverText="Tarcza Templariusza" + +; LWOTC Needs Translation(2) +[TemplarBallisticShield_CV X2AbilityTemplate] +LocFriendlyName="Tarcza Templariusza" +LocHelpText="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocLongDescription="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocFlyOverText="Tarcza Templariusza" + +[TemplarBallisticShield_MG X2AbilityTemplate] +LocFriendlyName="Tarcza Templariusza" +LocHelpText="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocLongDescription="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocFlyOverText="Tarcza Templariusza" + +[TemplarBallisticShield_BM X2AbilityTemplate] +LocFriendlyName="Tarcza Templariusza" +LocHelpText="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocLongDescription="Zapewnia sojusznikom połowę osłony. Daje tej jednostce premie za niską osłonę, nawet gdy jest oflankowana." +LocFlyOverText="Tarcza Templariusza" + +[ShieldBash_LW X2AbilityTemplate] +LocFriendlyName="Uderzenie tarczą" +LocHelpText="Uderz tarczą sąsiadującego wroga, zadając obrażenia i odrzucając cel o 2 pola. Darmowa akcja." +LocLongDescription="Uderz tarczą sąsiadującego wroga, zadając obrażenia i odrzucając cel o 2 pola. Darmowa akcja." +LocPromotionPopupText=" Obrażenia są równe podstawowym obrażeniom aktualnie wyposażonej tarczy.
Uderzenie Tarczą to darmowa akcja z czasem odnowienia .
Może obierać za cel wrogów również w sąsiednich płytkach po przekątnej.
" +LocFlyOverText="Uderzenie tarczą" + +[TemplarInvert X2AbilityTemplate] +LocFriendlyName="Inwersja" +LocLongDescription="Zamień lokalizację z jednostki. Kosztuje 1 Skupienie." +LocHelpText="Zamień lokalizację z jednostki. Kosztuje 1 Skupienie." +LocPromotionPopupText=" Inwersja ma czas odnowienia tury i nie kończy tury Templariusza.
Może obierać za cel zarówno jednostki sojusznicze, jak i wrogie.
Nie może obierać za cel Wybrańców.
" + +[OneForAll X2AbilityTemplate] +LocFriendlyName="Jeden za wszystkich" +LocHelpText="Zapewnij wysoką osłonę członkom drużyny, gdziekolwiek stoisz, i zyskaj -30 punktów obrony. Poruszanie się lub atak anuluje efekt. Zapewnia dodatkowe ablacyjne HP zależne od poziomu tarczy na czas trwania efektu." +LocLongDescription="Zapewnij wysoką osłonę członkom drużyny, gdziekolwiek stoisz, i zyskaj -30 punktów obrony. Poruszanie się lub atak anuluje efekt. Zapewnia dodatkowe ablacyjne HP zależne od poziomu tarczy na czas trwania efektu." +LocFlyOverText="Jeden za wszystkich" + + +[GreaterPadding_CV X2AbilityTemplate] +LocFriendlyName="Lepsza wyściółka" +LocFlyOverText="Lepsza wyściółka" +LocLongDescription="Skróć czas gojenia ran dla tego żołnierza o HP. Nie działa, jeśli żołnierz się wykrwawi." +LocHelpText="Skróć czas gojenia ran dla swojego żołnierza." +LocPromotionPopupText=" Większa wyściółka zmniejsza liczbę punktów wytrzymałości, które żołnierz musi wyleczyć po zranieniu w bitwie o .
Nie wpływa na żołnierzy, którzy odnieśli śmiertelne rany i są ustabilizowani przed wykrwawieniem." + +[GreaterPadding_MG X2AbilityTemplate] +LocFriendlyName="Lepsza wyściółka" +LocFlyOverText="Lepsza wyściółka" +LocLongDescription="Skróć czas gojenia ran dla tego żołnierza o HP. Nie działa, jeśli żołnierz się wykrwawi." +LocHelpText="Skróć czas gojenia ran dla swojego żołnierza." +LocPromotionPopupText=" Większa wyściółka zmniejsza liczbę punktów wytrzymałości, które żołnierz musi wyleczyć po zranieniu w bitwie o .
Nie wpływa na żołnierzy, którzy odnieśli śmiertelne rany i są ustabilizowani przed wykrwawieniem." + +[GreaterPadding_BM X2AbilityTemplate] +LocFriendlyName="Lepsza wyściółka" +LocFlyOverText="Lepsza wyściółka" +LocLongDescription="Skróć czas gojenia ran dla tego żołnierza o HP. Nie działa, jeśli żołnierz się wykrwawi." +LocHelpText="Skróć czas gojenia ran dla swojego żołnierza." +LocPromotionPopupText=" Większa wyściółka zmniejsza liczbę punktów wytrzymałości, które żołnierz musi wyleczyć po zranieniu w bitwie o .
Nie wpływa na żołnierzy, którzy odnieśli śmiertelne rany i są ustabilizowani przed wykrwawieniem." + +[Indomitable X2AbilityTemplate] +LocFriendlyName="Nieposkromiony" +LocHelpText="Raz na turę zyskujesz 1 punkt skupienia, gdy zostaniesz zaatakowany." +LocLongDescription="Raz na turę zyskujesz 1 punkt skupienia, gdy zostaniesz zaatakowany." +LocPromotionPopupText" Raz na turę zyskujesz 1 punkt skupienia, gdy zostaniesz zaatakowany.
Dotyczy zarówno ataków wręcz, jak i dystansowych.
" +LocFlyOverText="Nieposkromiony" + +[VoltFocusOnKills X2AbilityTemplate] +LocFriendlyName="Po szoku" +LocHelpText="Zabójstwa Voltem zapewniają 1 skupienie." +LocLongDescription="Zabójstwa Voltem zapewniają 1 skupienie." +LocFlyOverText="Po szoku" + +[DoubleRendFocus X2AbilityTemplate] +LocFriendlyName="Wyższa zdolność" +LocHelpText="Rozdarcie zapewnia dodatkowy punkt skupienia." +LocLongDescription="Rozdarcie zapewnia dodatkowy punkt skupienia." +LocFlyOverText="Wyższa zdolność" +LocPromotionPopupText"Rozdarcie zapewnia dodatkowy punkt skupienia." + +[DoubleRendFocusPassive X2AbilityTemplate] +LocFriendlyName="Wyższa zdolność" +LocHelpText="Rozdarcie zapewnia dodatkowy punkt skupienia." +LocLongDescription="Rozdarcie zapewnia dodatkowy punkt skupienia." +LocFlyOverText="Wyższa zdolność" + +[Volt X2AbilityTemplate] +LocFriendlyName="Volt" +LocLongDescription="Atak obszarowy nie kończący tury, który sprawia, że cele są łatwiejsze do trafienia. Kosztuje 1 Skupienie." +LocHelpText="Atak obszarowy nie kończący tury, który sprawia, że cele są łatwiejsze do trafienia. Kosztuje 1 Skupienie." +LocPromotionPopupText=" Volt nie ma czasu odnowienia, ale kosztuje 1 Skupienie.
Volt zwiększa celność twojej drużyny o + przeciwko celom.
" + +[Amplify X2AbilityTemplate] +LocFriendlyName="Wzmocnienie" +LocLongDescription="Oznacz pojedynczy cel soczewką psioniczną, powodując, że otrzyma on dodatkowe % obrażeńia z kolejnych 3 ataków. Kosztuje 1 Skupienie, darmowa akcja." +LocHelpText="Oznacz pojedynczy cel soczewką psioniczną, powodując, że otrzyma on dodatkowe % obrażeńia z kolejnych 3 ataków. Kosztuje 1 Skupienie, darmowa akcja." +LocHitMessage="Wzmocniony" +LocPromotionPopupText=" Wzmocnienie będzie trwać przez 3 przypadki obrażeń.
Wzmocnienie jest akcją bezpłatną.
Wymaga tur(y) odnowienia.
" + +[CrusaderRage_LW X2AbilityTemplate] +LocFriendlyName="Wściekłość Krzyżowca" +LocHelpText="Zyskaj 25% premii do obrażeń za każde brakujące 25% HP, aż do 50% premii do obrażeń. Skróć czas gojenia ran dla tego żołnierza o 8 HP" +LocLongDescription="Zyskaj 25% premii do obrażeń za każde brakujące 25% HP, aż do 50% premii do obrażeń. Skróć czas gojenia ran dla tego żołnierza o 8 HP" +LocPromotionPopupText=" Redukcja ran nie działa, jeśli podczas misji żołnierz wszedł w stan wykrwawienia.
" +LocFlyOverText="Psychotyczna wściekłość" + +[Sidearm_CV X2WeaponTemplate] +FriendlyName="PM" +FriendlyNamePlural="PMy" +BriefSummary="Jeśli z jakiegoś powodu ich moc zawiedzie, nasi żołnierze mogą polegać na stosunkowo konwencjonalnym układzie pistoletów, który został zmodyfikowany w celu zwiększenia szybkostrzelności i ogólnej obsługi. Ta prosta konstrukcja przyczynia się do niezawodności broni pomimo niespójnej jakości materiałów w jej konstrukcji." +TacticalText="Pistolet automatyczny ma znacznie krótszy zasięg niż pistolet, mniejsze obrażenia podstawowe, ale wyższe obrażenia krytyczne i ogromną premię do trafień krytycznych." +AbilityDescName="pm" + +[Sidearm_MG X2WeaponTemplate] +FriendlyName="Magnetyczny PM" +FriendlyNamePlural="Magnetyczne PMy" +BriefSummary="Wprowadzenie magnetycznego przyspieszacza pocisków do pistoletu automatycznego używanego przez naszych Żołnierzy wydawałoby się sprzeczne z pierwotną konstrukcją tej broni. Mimo to w jakiś sposób sprawiliśmy, że to zadziałało. Próby tej broni w pomieszczeniach zamkniętych są obecnie zabronione." +TacticalText=" Magnetyczne pistolety automatyczne są znacznie skuteczniejsze niż ich konwencjonalne prekursory.\n< Pistolet automatyczny ma znacznie krótszy zasięg niż pistolet, mniejsze obrażenia podstawowe, ale wyższe obrażenia krytyczne i ogromną premię do trafień krytycznych." +AbilityDescName="pm" + +[Sidearm_BM X2WeaponTemplate] +FriendlyName="Wiązkowy PM" +FriendlyNamePlural="Wiązkowe PMy +BriefSummary="Ten wariant pistoletu automatycznego jest jednym z bardziej imponujących osiągnięć w ramach naszego wspólnego wysiłku mającego na celu zmniejszenie rozmiaru przenośnych ogniw Elerium. Teraz z pełną mocą, broń dostarcza skupione impulsy energii, które mogą zadać poważne obrażenia wszystkim celom oprócz najciężej opancerzonych." +TacticalText=" Wiązkowy PM to najpotężniejszy pistolet dostępny dla naszych żołnierzy.\n Pistolet automatyczny ma znacznie krótszy zasięg niż pistolet, mniejsze obrażenia podstawowe, ale wyższe obrażenia krytyczne i ogromną premię do trafień krytycznych." +AbilityDescName="pm" + +[Paramedic_LW X2AbilityTemplate] +LocFriendlyName="Sanitariusz" +LocLongDescription="Odblokowuje możliwość wykonania doskoku, aby użyć apteczki na sojuszniku. Zdobądź darmowy zestaw medyczny. Wyposażone apteczki mają dodatkowe ładunki." +LocHelpText="Odblokowuje możliwość wykonania doskoku, aby użyć apteczki na sojuszniku. Zdobądź darmowy zestaw medyczny. Wyposażone apteczki mają dodatkowe ładunki." +LocPromotionPopupText=" "Odblokowuje możliwość wykonania doskoku, aby użyć apteczki na sojuszniku. Zdobądź darmowy zestaw medyczny. Wyposażone apteczki mają dodatkowe ładunki." +[ParaMedikitHeal X2AbilityTemplate] +LocFriendlyName="Medyczne leczenie" +LocLongDescription="Biegnij w stronę Sojusznika i ulecz go, korzystając ze swojego zestawu medycznego." +LocHelpText="Biegnij w stronę Sojusznika i ulecz go, korzystając ze swojego zestawu medycznego." + +[ParaMedikitStabilize X2AbilityTemplate] +LocFriendlyName="Medyczna stabilizacja" +LocLongDescription="Biegnij w stronę Sojusznika i ustabilizuj go, korzystając ze swojego zestawu medycznego." +LocHelpText="Biegnij w stronę Sojusznika i ustabilizuj go, korzystając ze swojego zestawu medycznego." + +[SoulReaper X2AbilityTemplate] +LocFriendlyName="Wygnanie" +LocLongDescription="Strzelaj do celu, aż skończy ci się amunicja lub cel umrze. Każdy strzał ma o celowanie mniejsze niż poprzedni. Ujawnia Żniwiarza. " +LocHelpText="Strzelaj do celu, aż skończy ci się amunicja lub cel umrze. Każdy strzał ma o celowanie mniejsze niż poprzedni. Ujawnia Żniwiarza." +LocFlyoverText="Wygnanie" +LocPromotionPopupText=" Każdy strzał w wygnaniu daje osobną szansę na trafienie.
Wygnania nie można aktywować, jeśli pozostała tylko 1 sztuka amunicji.
Strzały wygnania mogą być krytyczne.
" + +[TotalCombat X2AbilityTemplate] +LocFriendlyName="Walka totalna" +LocLongDescription="Zyskaj 1 mobilność i 5 celowania. Rzucenie granatu lub użycie przedmiotu nie kończy już tury, a granaty nie mają czasu odnowienia. Dodatkowo możesz rzucać granaty o 3 pola dalej, a ich promień zwiększa się o 1. Zapewnia miejsce tylko na granaty." +LocHelpText="Zyskaj 1 mobilność i 5 celowania. Rzucenie granatu lub użycie przedmiotu nie kończy już tury, a granaty nie mają czasu odnowienia. Dodatkowo możesz rzucać granaty o 3 pola dalej, a ich promień zwiększa się o 1. Zapewnia miejsce tylko na granaty." +LocPromotionPopupText=" Walka totalna dodaje jeszcze więcej elastyczności do tur , umożliwiając podejmowanie działań dokładnie wtedy, gdy jest to potrzebne.
Usuwa czas odnowienia granatów.
Przyznaje lotną mieszankę, dlatego nie kumuluje się z nią." + +[PackMaster_LW X2AbilityTemplate] +LocFriendlyName="Mistrz pakowania" +LocFlyOverText="Mistrz pakowania" +LocLongDescription="Zapewnia +1 ładunek do każdego wyposażonego przedmiotu użytkowego i granatu." +LocHelpText="Zapewnia +1 ładunek do każdego wyposażonego przedmiotu użytkowego i granatu." +LocPromotionPopupText=" Zapewnia +1 ładunek do każdego wyposażonego przedmiotu użytkowego i granatu.
Dotyczy miejsca na granaty oraz standardowych miejsc na narzędzia, ale nie innych miejsc.
Dodatkowe granaty dostarczane przez zdolności nie otrzymują dodatkowych ładunków.
" + +[SkirmisherInterrupt_LW X2AbilityTemplate] +LocFriendlyName="Przerwanie" +LocLongDescription="Potężna forma Warty. Zamiast strzelać automatycznie, wykonaj dowolną pojedynczą akcję. Darmowa akcja." +LocHelpText="Potężna forma Warty. Zamiast strzelać automatycznie, wykonaj dowolną pojedynczą akcję. Darmowa akcja." +LocPromotionPopupText=" Jest to akcja darmowa.
Niektóre akcje nie są dostępne podczas przerwania, np. Warta.
Umiejętność wymaga tur(y) odnowienia." + +[ArcWavePassive X2AbilityTemplate] +LocFriendlyName="Fala łukowa" +LocLongDescription="Generuje falę energii psionicznej w kierunku ataku. Obrażenia rosną wraz z poziomem Rękawicy." +LocHelpText="Generuje falę energii psionicznej w kierunku ataku." +LocPromotionPopupText=" Fala łukowa nie wpływa na cel pierwotnego ataku Rozdarcia.
Fala łukowa zadaje 4/7/10 obrażeń w zależności od poziomu broni.
Fala łukowa przemieszcza się przez obiekty w otoczeniu.
" + +[IonicStorm X2AbilityTemplate] +LocFriendlyName="Ionic Storm" +LocLongDescription="Przywołaj błyskawicę, która uderzy wszystkich pobliskich wrogów. Kosztuje całe skupienie." +LocHelpText="Przywołaj błyskawicę, która uderzy wszystkich pobliskich wrogów. Kosztuje całe skupienie." +LocPromotionPopupText=" Promień burzy zwiększa się przy wyższych poziomach Skupienia.
Burza zadaje podwójne obrażenia jednostkom psionicznym.
Umiejętność wymaga tur(y) odnowienia.
" + +[Sabotage_LongRangeComms X2SabotageTemplate] +SummaryText="Po niedawnym sabotażu Wybrańców usiłowaliśmy utrzymać komunikację dalekiego zasięgu. Nasze tajne działania zostaną opóźnione o 2 tygodnie." +ShortSummaryText="Nasze tajne działania zostały opóźnione o 2 tygodnie!" + +[Unstoppable_LW X2AbilityTemplate] +LocFriendlyName="Niepowstrzymany" +LocLongDescription="Mobilność tej jednostki nie może spaść poniżej ." +LocHelpText="Mobilność tej jednostki nie może spaść poniżej ." +LocFlyOverText="Niepowstrzymany" +LocPromotionPopupText="Mobilność tej jednostki nie może spaść poniżej ." + +[UnstoppablePassive_LW X2AbilityTemplate] +LocFriendlyName="Niepowstrzymany" +LocLongDescription="Mobilność tej jednostki nie może spaść poniżej ." +LocHelpText="Mobilność tej jednostki nie może spaść poniżej ." +LocFlyOverText="Niepowstrzymany" +LocPromotionPopupText="Mobilność tej jednostki nie może spaść poniżej ." + +[TargetingAimAndCrit X2AbilityTemplate] +LocLongDescription="Zwiększona celność żołnierza o i szansa na trafienie krytyczne o na tur(y)." + +[TargetingDodge X2AbilityTemplate] +LocLongDescription="Zwiększona szansa na unik żołnierza o na tur(y)." + +[TargetingCrit X2AbilityTemplate] +LocLongDescription="Zwiększona szansa na trafienie krytyczne żołnierza o na tur(y)." + +[Hypnography X2AbilityTemplate] +LocLongDescription="Wola wszystkich wrogów zmniejszona o %." + +[MicroMissiles X2AbilityTemplate] +LocHelpText="Wyceluj w obszar wybuchowym atakiem rakietowym." + +[FlashbangResistancePassive X2AbilityTemplate] +LocFriendlyName="Odporność na błyskj" +LocLongDescription="Ta jednostka ma % szansy na odparcie dezorientacji spowodowanej granatami hukowymi." +LocHelpText="Ta jednostka ma % szansy na odparcie dezorientacji spowodowanej granatami hukowymi." + +[Infiltration X2AbilityTemplate] +LocLongDescription="Wieże bezpieczeństwa ADVENT-u nie mogą zobaczyć tej jednostki, gdy jest ukryta lub znajduje się w Cieniu." +LocHelpText="Wieże bezpieczeństwa ADVENT-u nie mogą zobaczyć tej jednostki, gdy jest ukryta lub znajduje się w Cieniu." + +[MindShield X2AbilityTemplate] +LocLongDescription="Sprawia, że noszący jest odporny na negatywne stany psychiczne, takie jak panika, kontrola umysłu i ogłuszenia." + +[Sustain X2AbilityTemplate] +LocLongDescription="Jeśli jednostka otrzyma wystarczające obrażenia, aby zostać zabita, natychmiast zostaje wprowadzona w Stazę na 1 turę, a jej zdrowie zostaje zmniejszone tylko do 1 PŻ. Może się to zdarzyć tylko raz na misję." +LocHelpText="Jeśli jednostka otrzyma wystarczające obrażenia, aby zostać zabita, natychmiast zostaje wprowadzona w Stazę na 1 turę, a jej zdrowie zostaje zmniejszone tylko do 1 PŻ. Może się to zdarzyć tylko raz na misję." +LocPromotionPopupText=" Uważaj, ponieważ podtrzymywana jednostka może zachować szkodliwe efekty stanu, takie jak trucizna lub oparzenie, po wyjściu ze stazy.
" + +[SustainTriggered X2AbilityTemplate] +LocLongDescription="Jednostka zginęłaby, ale została uratowana i umieszczona w Stazie na 1 turę. Taka sytuacja nie może się powtórzyć podczas tej misji." +LocHelpText="Jednostka zginęłaby, ale została uratowana i umieszczona w Stazie na 1 turę. Taka sytuacja nie może się powtórzyć podczas tej misji.." + +[Overdrive X2AbilityTemplate] +LocFriendlyName="Przeciążenie" +LocLongDescription="Wykonaj trzy akcje w tej turze - żadna z nich nie zakończy tury. Oddanie kilku zwykłych strzałów skutkuje niewielką karą za odrzut." +LocHelpText="Wykonaj trzy akcje w tej turze - żadna z nich nie zakończy tury. Oddanie kilku zwykłych strzałów skutkuje niewielką karą za odrzut." +LocPromotionPopupText=" Kara % do celności za odrzut jest naliczana po każdym zwykłym strzale, gdy działa przeciążenie.
Nie trzeba płacić za uruchomienie przeciążenia, ale jego odnawianie trwa następującą liczbę tur: .
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Bastion" +LocLongDescription="Zyskujesz dodatkowy punkt pancerza, a sąsiadujący z tobą członkowie drużyny zawsze mają wysoką osłonę." +LocHelpText="Zyskujesz dodatkowy punkt pancerza, a sąsiadujący z tobą członkowie drużyny zawsze mają wysoką osłonę." +LocPromotionPopupText=" Bastion daje dodatkowy punkt pancerza.
Każdy członek drużyny stojący w sąsiedztwie Sparka otrzyma premię do obrony za wysoką osłonę.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Arsenał" +LocLongDescription="BIT może korzystać z broni ciężkiej." +LocHelpText="BIT może korzystać z broni ciężkiej." +LocPromotionPopupText=" Arsenał pozwala wyposażyć Sparka w broń ciężką.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Zaklinacz deszczu" +LocLongDescription="Posiadana broń ciężka zadaje dodatkowo pkt. obrażeń i ma większe pole rażenia." +LocHelpText="Posiadana broń ciężka zadaje poważniejsze obrażenia i ma większe pole rażenia." +LocPromotionPopupText=" Zaklinacz deszczu dodaje pkt. obrażeń do wszystkich rodzajów broni ciężkiej.
Broń ciężka o okrągłym polu rażenia zwiększa je o .
Broń ciężka o stożkowym polu rażenia zwiększa jego średnicę o i długość o .
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Zastraszenie" +LocLongDescription="Szansa na wywołanie paniki u atakującego wroga, gdy jednostka zostanie wzięta na cel." +LocHelpText="Szansa na wywołanie paniki u atakującego wroga, gdy jednostka zostanie wzięta na cel." +LocFlyOverText="Zastraszenie" +LocPromotionPopupText=" Szanse na wywołanie paniki u atakującego wzrastają wraz z wyższymi poziomami pancerzy Sparka.
Zastraszenie może być wywołane przez ataki wręcz i obszarowe.
Zastraszenie nie zadziała, gdy jednostka stanie się celem ostrzału w trybie warty.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Zastraszenie" +LocLongDescription="Szansa na wywołanie paniki u każdego widocznego wroga, gdy jednostka zostanie wzięta na cel." +LocHelpText="Szansa na wywołanie paniki u każdego widocznego wroga, gdy jednostka zostanie wzięta na cel." +LocFlyOverText="Zastraszenie" +LocPromotionPopupText="" +LocMissMessage="Zastraszenie nieudane" + +[Repair X2AbilityTemplate] +LocFriendlyName="Naprawa" +LocLongDescription="Wyślij BIT-a do uszkodzonego mechanicznego sojusznika i napraw go. Zaawansowane BIT-y mogą naprawiać więcej." +LocHelpText="Wyślij BIT-a, aby naprawił uszkodzonego mechanicznego sojusznika." +LocFlyOverText="Naprawa" +LocPromotionPopupText=" Naprawa przywróci pkt. zdrowia.
Ulepszenie BIT-a zwiększy liczbę naprawianych PZ.
Użycie naprawy jako pierwszej akcji nie spowoduje zakończenia tury.
Naprawa ma określoną liczbę ładunków na misję: .
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Pole przesyłające" +LocLongDescription="Za każdym razem, gdy stajesz się celem ataku, część energii jest przesyłana do twojej broni (). Uwalniasz ją potem przy kolejnym zwykłym strzale." +LocHelpText="Gdy jesteś celem ataku, przesyłasz energię do broni (), a następnie uwalniasz ją przy zwykłym strzale." +LocFlyOverText="Przesłana energia: +1" +LocPromotionPopupText=" Każdy punkt energii używany przez pole przesyłające zwiększa obrażenia następnego ataku z twojej broni () o 1.
Energia magazynowana przez pole przesyłające zostanie zużyta, nawet jeśli następny strzał chybi.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Poświęcenie" +LocLongDescription="Utworzenie obszaru ochronnego. Wszystkie ataki na znajdujących się w nim sojuszników zostaną skierowane na ciebie. Otrzymujesz w tym czasie premię do obrony i pancerza." +LocHelpText="Utworzenie obszaru ochronnego, który przekierowuje na ciebie ataki wroga." +LocFlyOverText="Poświęcenie" +LocPromotionPopupText=" Spark otrzymuje + do obrony i + do pancerza, gdy działa poświęcenie.
Odnawianie trwa następującą liczbę tur: .
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Celowanie adaptacyjne" +LocLongDescription="Gdy przeciążenie jest aktywne, zwykłe strzały nie są objęte karą za odrzut." +LocHelpText="Gdy przeciążenie jest aktywne, zwykłe strzały nie są objęte karą za odrzut." +LocPromotionPopupText=" Celowanie adaptacyjne znosi % kary do celowania za kolejne zwykłe strzały, gdy działa przeciążenie.
" + +[Strike X2AbilityTemplate] +LocFriendlyName="Atak" +LocLongDescription="Wykonaj potężny atak wręcz na dowolnego wroga, który znajduje się w zasięgu ruchu." +LocHelpText="Wykonaj potężny atak wręcz na dowolnego wroga, który znajduje się w zasięgu ruchu." +LocPromotionPopupText=" Możesz użyć ataku, naprowadzając kursor ruchu na wroga.
Spark może wykonać ruch sprintem, zużywając obie akcje na przemieszczenie się, i nadal użyć ataku przeciwko wrogowi na sąsiednim polu.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Kula do wyburzania" +LocLongDescription="Gdy przeciążenie jest aktywne, podczas ruchu możesz przebijać się przez ściany i osłony." +LocHelpText="Gdy przeciążenie jest aktywne, podczas ruchu możesz przebijać się przez ściany i osłony." +LocPromotionPopupText=" Kula do wyburzania może służyć do odsłaniania wrogów na strzały z flanki.
Użyj punktów nawigacyjnych ruchu, żeby poprowadzić Sparka optymalną drogą pozwalającą niszczyć osłony i otoczenie.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Bombardowanie" +LocLongDescription="Wystrzel BIT-a na dowolną widoczną pozycję, gdzie spowoduje on potężną eksplozję. Zaawansowane BIT-y powodują większe obrażenia." +LocHelpText="Wystrzel BIT-a, aby spowodować wybuch rażący wszystkie jednostki w zasięgu." +LocPromotionPopupText=" Bombardowanie można przeprowadzić na dowolnej pozycji w zasięgu widoku drużynowego.
Ulepszenie BIT-a zwiększy obrażenia zadawane przez bombardowanie.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Protokół myśliwego" +LocLongDescription="Gdy wróg zostaje odkryty, istnieje % szans na oddanie darmowego strzału w trybie warty." +LocHelpText="Gdy wróg zostaje odkryty, istnieje % szans na oddanie darmowego strzału w trybie warty." +LocPromotionPopupText=" Dzięki protokołowi myśliwego Spark jest idealną jednostką zwiadowczą we mgle wojny, ponieważ może natychmiast zaatakować każdego wykrytego wroga.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Nova" +LocLongDescription="Wywołaj wybuch energii zadający obrażenia wszystkim pobliskim jednostkom. Nie wymaga to akcji ani odnawiania, ale kolejne użycia powodują uszkadzanie Sparka." +LocHelpText="Wybuch trafiający wszystkie pobliskie jednostki. Kolejne użycia powodują uszkadzanie Sparka." +LocPromotionPopupText=" Nova nie zabiera punktów akcji i nie wymaga czasu na odnowienie.
Pierwszy atak novą w każdej misji nie zada Sparkowi obrażeń.
Wszystkie następne ataki novą zadadzą Sparkowi kumulujące się pkt. obrażeń.
" diff --git a/LongWarOfTheChosen/Localization/XComGame.rus b/LongWarOfTheChosen/Localization/XComGame.rus index 6e7e092a3..d24bca6a7 100644 --- a/LongWarOfTheChosen/Localization/XComGame.rus +++ b/LongWarOfTheChosen/Localization/XComGame.rus @@ -430,6 +430,10 @@ LocPromotionPopupText=" Способность требует Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела." +TacticalText=" Стреломет гораздо точнее и мощнее стандартной винтовки.\n Каждый выстрел может оглушить цель, а также игнорирует параметр \"Уклонение\" у цели.\n Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела. При убийстве стреломет восполняет патрон." [AlienHunterRifle_MG X2WeaponTemplate] -TacticalText=" Добавление магнитной катушки увеличивает урон от каждого выстрела.\n Каждый выстрел может оглушить цель, а также игнорирует параметр \"Уклонение\" у цели.\n Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела." +TacticalText=" Добавление магнитной катушки увеличивает урон от каждого выстрела.\n Каждый выстрел может оглушить цель, а также игнорирует параметр \"Уклонение\" у цели.\n Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела. При убийстве стреломет восполняет патрон." [AlienHunterRifle_BM X2WeaponTemplate] -TacticalText=" Усиленный заряд элерия делает стреломет еще смертоноснее.\n Каждый выстрел может оглушить цель, а также игнорирует параметр \"Уклонение\" у цели.\n Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела.
Плазменное оружие наносит цели 1 дополнительного урона при каждом последующем попадании." +TacticalText=" Усиленный заряд элерия делает стреломет еще смертоноснее.\n Каждый выстрел может оглушить цель, а также игнорирует параметр \"Уклонение\" у цели.\n Генетически модифицированные пришельцы с высокой вероятностью могут быть оглушены.\n Выстреливает один мощный заряд и требует перезарядки после каждого выстрела.
Плазменное оружие наносит цели 1 дополнительного урона при каждом последующем попадании. При убийстве стреломет восполняет патрон." [Shadowfall X2AbilityTemplate] LocFriendlyName="Шаг в тень" @@ -3015,6 +3043,10 @@ LocHelpText="Призывает метеориты пси-энергии, что LocFlyOverText="Пси-шторм" LocPromotionPopupText="Не может разрушить этажи зданий." +[TheLostGrappler X2CharacterTemplate] +strCharacterName="Странник-боец" + + [TheLostGrapplerHP2_LW X2CharacterTemplate] strCharacterName="Странник-боец" @@ -3048,6 +3080,9 @@ strCharacterName="Странник-боец" [TheLostGrapplerHP12_LW X2CharacterTemplate] strCharacterName="Странник-боец" +[TheLostBrute X2CharacterTemplate] +strCharacterName="Странник-зверь" + [TheLostBruteHP10_LW X2CharacterTemplate] strCharacterName="Странник-зверь" @@ -3404,6 +3439,20 @@ LocHelpText="Автоматически отвечает на огонь про LocLongDescription="Автоматически отвечает на огонь противника (оружие: ) один раз за ход." LocPromotionPopupText="Ответный огонь работает только один раз за ход.
Ответный огонь могут вызвать также атаки по области и атаки оружием ближнего боя.
Ответный огонь не срабатывает при стрельбе по вам из наблюдения.
" +;Lwotc translated +[TriggerBot X2AbilityTemplate] +LocFriendlyName="Ответная агрессия" +LocHelpText="Автоматически стреляет в ответ из оружия один раз за ход с % штрафом урона, но гарантированным попаданием." +LocLongDescription="Автоматически стреляет в ответ из оружия один раз за ход с % штрафом урона, но гарантированным попаданием." +LocPromotionPopupText=" Срабатывает один раз за ход.
Ответная агрессия работает в том числе и на атаки ближнего боя и на атаки по области.
Не срабатывает при выстрелах наблюдения.
" + +[TriggerBotShot X2AbilityTemplate] +LocFriendlyName="Ответная агрессия" +LocHelpText="Автоматически стреляет в ответ из оружия один раз за ход с % штрафом урона, но гарантированным попаданием." +LocLongDescription="Автоматически стреляет в ответ из оружия один раз за ход с % штрафом урона, но гарантированным попаданием." +LocPromotionPopupText=" Срабатывает один раз за ход.
Ответная агрессия работает в том числе и на атаки ближнего боя и на атаки по области.
Не срабатывает при выстрелах наблюдения.
" +;End translated + [DeadeyeSnapShot X2AbilityTemplate] LocFriendlyName="Меткий глаз" LocLongDescription="Выстрел с небольшим штрафом к меткости и с приличным бонусом к урону." @@ -3442,7 +3491,7 @@ LocFlyOverText="Святой воин" [XcomGame.X2StrategyGameRulesetDataStructures] [X2StrategyGameRulesetDataStructures] ComIntLabels[eComInt_Standard]="Обычный" -ComIntLabels[eComInt_AboveAverage]="Выше среднего," +ComIntLabels[eComInt_AboveAverage]="Выше среднего" ComIntLabels[eComInt_Gifted]="Одаренный" ComIntLabels[eComInt_Genius]="Гений" ComIntLabels[eComInt_Savant]="Светлая голова" @@ -5305,8 +5354,8 @@ TimerDefendTitle="Подкрепления" TimerDefendSubtitle="Ходов до прибытия вражеских подкреплений" [Fuse X2AbilityTemplate] -LocLongDescription="Если враг несет взрывчатку, псионик может взорвать ее удаленно. Свободное действие." -LocHelpText="Если враг несет взрывчатку, псионик может взорвать ее удаленно. Свободное действие." +LocLongDescription="Если враг несет взрывчатку, псионик может взорвать ее удаленно. Стоит 1 действие." +LocHelpText="Если враг несет взрывчатку, псионик может взорвать ее удаленно. Стоит 1 действие." LocPromotionPopupText=" Перезарядка ходов.
" [BulletShred X2AbilityTemplate] @@ -5531,7 +5580,8 @@ LocPromotionPopupText=" Уровень концентрации 4: ур LocPromotionPopupText=" Храмовники начинают миссию более слабыми по сравнению с прочими бойцами, но могут радикально усилить себя за счет накопления концентрации.
Концентрация накапливается за счет рукопашных атак врага с помощью перчаток(засчитываются даже промахи).
" ; LWOTC Needs Translation (3) -[Rend X2AbilityTemplate] +[Rend_LW X2AbilityTemplate] +LocFriendlyName="Разрыв" LocLongDescription="Рукопашные атаки, могут оглушить или дезориентировать врага. Активируют способность \"Инерция\" и дают концентрацию." LocHelpText="Рукопашные атаки, могут оглушить или дезориентировать врага. Активируют способность \"Инерция\" и дают концентрацию." LocPromotionPopupText=" Эта способность - основной метод Храмовников для набора концентрации.
После рукопашного удара Храмовник получает \"Инерцию\", дающую действие движения. Используйте, чтобы вернуться в укрытие.
Способность имеет %-ный шанс на оглушение за единицу концентрации. Оглушенные цели отбрасываются.
Способность имеет %-ный шанс дезориентировать цель за единицу концентрации.
" @@ -5829,28 +5879,28 @@ LocLongDescription="Делает оружие небоеспособным, об LocFlyOverText="Повреждение оружия" [ShieldAllyM1 X2AbilityTemplate] -LocFriendlyName="Любимчик Чародея" +LocFriendlyName="Чемпион Чародея" LocHelpText="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." LocLongDescription="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." -LocFlyOverText="Любимчик Чародея" +LocFlyOverText="Чемпион Чародея" [ShieldAllyM2 X2AbilityTemplate] -LocFriendlyName="Любимчик Чародея" +LocFriendlyName="Чемпион Чародея" LocHelpText="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." LocLongDescription="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." -LocFlyOverText="Любимчик Чародея" +LocFlyOverText="Чемпион Чародея" [ShieldAllyM3 X2AbilityTemplate] -LocFriendlyName="Любимчик Чародея" +LocFriendlyName="Чемпион Чародея" LocHelpText="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." LocLongDescription="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." -LocFlyOverText="Любимчик Чародея" +LocFlyOverText="Чемпион Чародея" [ShieldAllyM4 X2AbilityTemplate] -LocFriendlyName="Любимчик Чародея" +LocFriendlyName="Чемпион Чародея" LocHelpText="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." LocLongDescription="Дает союзнику щит с бонусом к меткости, шансу крита, воле и псионике. Пока этот союзник жив, Чародей получает % сопротивления урону." -LocFlyOverText="Любимчик Чародея" +LocFlyOverText="Чемпион Чародея" [ChosenImmuneMelee X2AbilityTemplate] LocFriendlyName="Предугадывание" @@ -5967,7 +6017,11 @@ Description="Противник будет гораздо сильнее, пот [InfilSitRep_UltraHard X2SitRepTemplate] FriendlyName="Без подготовки (сверхтяжело)" Description="Противник будет неимоверно силен, потому что вы забыли про подготовку." -; End Translated + +[LargeDepot_LW X2SitRepTemplate] +FriendlyName="Большая партия" +Description="Адвент отправляет больше груза чем обычно. Обнаружены дополнительные ящики." +; End Translated 2 ; LWOTC Translated [IncreaseTimer1Effect_LW X2SitRepEffect_ModifyTacticalStartState] @@ -6102,12 +6156,49 @@ ActionName="Поиск рекрутов сопротивления" ActionPreNarrative="Нам стало известно о небольшой группировке, которая желает нам помочь в борьбе с \"Адвентом\"." ActionPostNarrative="После недолгих переговоров, они направятся к ближайшему убежищу." +[CovertActionNarrative_FindBigDepot_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Поиск маршрута снабжения Адвента" +ActionPreNarrative="Мы обнаружили потенциальное хранилище припасов Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + +[CovertActionNarrative_FindBigDepot_Reapers X2CovertActionNarrativeTemplate] +ActionName="Поиск маршрута снабжения Адвента" +ActionPreNarrative="Мы обнаружили потенциальное хранилище припасов Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + +[CovertActionNarrative_FindBigDepot_Templars X2CovertActionNarrativeTemplate] +ActionName="Поиск маршрута снабжения Адвента" +ActionPreNarrative="Мы обнаружили потенциальное хранилище припасов Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + +[CovertActionNarrative_FindAdventDetachment_Skirmishers X2CovertActionNarrativeTemplate] +ActionName="Поиск патруля Адвент" +ActionPreNarrative="Обнаружено вероятное место патруля Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + +[CovertActionNarrative_FindAdventDetachment_Reapers X2CovertActionNarrativeTemplate] +ActionName="Поиск патруля Адвент" +ActionPreNarrative="Обнаружено вероятное место патруля Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + +[CovertActionNarrative_FindAdventDetachment_Templars X2CovertActionNarrativeTemplate] +ActionName="Поиск патруля Адвент" +ActionPreNarrative="Обнаружено вероятное место патруля Адвента. Следует расследовать" +ActionPostNarrative="Отличная работа. Теперь мы можем отправить команду." + [AbilityPoints X2ItemTemplate] FriendlyName="Очки способностей" FriendlyNamePlural="Очки способностей" BriefSummary="Резерв очков способностей, которые могут открыть новые способности или улучшить характеристики оперативников" ; End Translated +;LWOTC translated +[CovertAction_BigSupplyDepot X2CovertActionTemplate] +ActionObjective="Поиск снабжения Адвента" + +[CovertAction_FindAdventDetachment X2CovertActionTemplate] +ActionObjective="Поиск Патруля Адвента" +; End Translated ;LWOTC translated m_strRetributionAlertTitle="ВМЕШАТЕЛЬСТВО ИЗБРАННОГО" @@ -6214,6 +6305,30 @@ LocLongDescription="Каждая атака рукопашным оружием LocHelpText="Каждая атака рукопашным оружием дает складывающийся бонус к его урону. Дополнительный урон зависит от уровня Избранного, +/// к урону на каждом из 4 уровней Избранного. После похищения врага, Жажда крови сбрасывается" LocFlyOverText="Жажда крови" +; LWOTC Translated (2) +[UnholyAscension_LW X2AbilityTemplate] +LocFriendlyName="Нечестивое возвышение" +LocLongDescription="Чемпион чародея имеет удвоенные бонусы щита, точности, крита, воли, пси-атаки и иммунитет к критам" +LocHelpText="Чемпион чародея имеет удвоенные бонусы щита, точности, крита, воли, пси-атаки и иммунитет к критам" +LocFlyOverText="Нечестивое возвышение" + +[RuptureImmunity X2AbilityTemplate] +LocFriendlyName="Укрепление" +LocLongDescription="Все наложенные эффекты разрыва немедленно удалены." +LocHelpText="Все наложенные эффекты разрыва немедленно удалены." +LocFlyOverText="Укрепление" + +[TrackingShotMark X2AbilityTemplate] +LocFriendlyName="Метка сопровождающего выстрела" +LocHelpText="Вначале вашего хода метка противника с фланга бесплатным действием. Выстрел по этой цели имеет гарантированое попадание и возвращает действие, потраченное на выстрел." +LocLongDescription="Вначале вашего хода метка противника с фланга бесплатным действием. Выстрел по этой цели имеет гарантированое попадание и возвращает действие, потраченное на выстрел." + +[TrackingShot X2AbilityTemplate] +LocFriendlyName="Сопровождающий выстрел" +LocHelpText="Вначале вашего хода метка противника с фланга бесплатным действием. Выстрел по этой цели имеет гарантированое попадание и возвращает действие, потраченное на выстрел." +LocLongDescription="Вначале вашего хода метка противника с фланга бесплатным действием. Выстрел по этой цели имеет гарантированое попадание и возвращает действие, потраченное на выстрел." +;end translated(2) + [PreciseStrike_LW X2AbilityTemplate] LocFriendlyName="Аккуратный надрез" @@ -6229,8 +6344,8 @@ LocFlyOverText="Ярость крови" [YouCannotHide_LW X2AbilityTemplate] LocFriendlyName="Тебе не скрыться" -LocHelpText="Бонус +100% к меткости основного оружия." -LocLongDescription="Бонус +100% к меткости основного оружия." +LocHelpText="Бонус +30% к меткости основного оружия." +LocLongDescription="Бонус +30% к меткости основного оружия." LocFlyOverText="Беги." [RebelHPUpgrade_T1 X2AbilityTemplate] @@ -6312,8 +6427,8 @@ LocFlyOverText="Метка смерти" [Fatality_LW X2AbilityTemplate] LocFriendlyName="Фаталити" -LocLongDescription="Бонус +100% точности и критического попадания против целей со здоровьем меньше 35% (оружие: )" -LocHelpText="Бонус +100% точности и критического попадания против целей со здоровьем меньше 35% (оружие: )" +LocLongDescription="Бонус +100% точности и критического попадания против целей со здоровьем меньше % (оружие: )" +LocHelpText="Бонус +100% точности и критического попадания против целей со здоровьем меньше % (оружие: )" LocFlyOverText="Фаталити" [Vampirism_LW X2AbilityTemplate] @@ -6367,7 +6482,7 @@ LocFlyOverText="Реакция Избранного" ; End Translated ; LWOTC Translated (2) -[ChosenImmunitiesPassive X2AbilityTemplate] +[ChosenImmunities X2AbilityTemplate] LocFriendlyName="Неуязвимость Избранного" LocLongDescription="Избранный неуязвим к оглушению, дезориентации, заморозке и имеет 50% штраф от увечья вместо 100%." LocHelpText="Избранный неуязвим к оглушению, дезориентации, заморозке и имеет 50% штраф от увечья вместо 100%." @@ -6414,9 +6529,9 @@ LocHelpText="Уменьшает бонус к защите от укрытий ; LWOTC Translated [XComGameState_AdventChosen] KnowledgeGainFirstBullet[eChosenKnowledge_Start]="" -KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]="Избранный обнаруживает деятельность Сопротивления!" +KnowledgeGainFirstBullet[eChosenKnowledge_Saboteur]="Избранный может устроить диверсию!" KnowledgeGainFirstBullet[eChosenKnowledge_Sentinel]="Избранный усложняет секретные задания!" -KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="Избранный может устроить диверсию!" +KnowledgeGainFirstBullet[eChosenKnowledge_Collector]="Избранный обнаруживает деятельность Сопротивления!" KnowledgeGainFirstBullet[eChosenKnowledge_Raider]="Избранный может начать штурмовать Мститель!" KnowledgeGainSecondBullet[eChosenKnowledge_Sentinel]="Избранный может инициировать Событие!" ; End Translated @@ -6466,8 +6581,8 @@ AbilityDescName="Огнемет Чистильщика" ;LWOTC translated [TotalCombat X2AbilityTemplate] LocFriendlyName="Все средства" -LocLongDescription="Дает +5 меткости и +1 мобильности. Бросок гранаты или использование предмета больше не заканчивает ход, использование гранаты лишается перезарядки. К тому же, гранаты летят на 3 клетки дальше, а радиус взрыва увеличивается на 1. Добавляет дополнительный слот под гранату." -LocHelpText="Дает +5 меткости и +1 мобильности. Бросок гранаты или использование предмета больше не заканчивает ход, использование гранаты лишается перезарядки. К тому же, гранаты летят на 3 клетки дальше, а радиус взрыва увеличивается на 1. Добавляет дополнительный слот под гранату." +LocLongDescription="Дает +5 меткости и +1 мобильности. Бросок гранаты или использование предмета больше не заканчивает ход, использование гранаты лишается перезарядки. К тому же, гранаты летят на 2 клетки дальше, а радиус взрыва увеличивается на 1. Добавляет дополнительный слот под гранату." +LocHelpText="Дает +5 меткости и +1 мобильности. Бросок гранаты или использование предмета больше не заканчивает ход, использование гранаты лишается перезарядки. К тому же, гранаты летят на 2 клетки дальше, а радиус взрыва увеличивается на 1. Добавляет дополнительный слот под гранату." LocPromotionPopupText=" Позволяет разнообразить боевые возможности солдата.
Удаляет перезарядку использования гранат.
Не суммируется с \"Гремучей смесью\"." ;lwotc Translated(2) @@ -6484,7 +6599,13 @@ LocLongDescription="Особая форма наблюдения. Вместо LocHelpText="Особая форма наблюдения. Вместо ответного огня предоставляет 1 действие. Свободное использование." LocPromotionPopupText=" Свободное действие.
Некоторые способности недоступны во время \"Прерывания\", например, \"Наблюдение\".
Ходов до перезарядки: ." -[ArcWavePassive X2AbilityTemplate] +[ArcWave_LW X2AbilityTemplate] +LocFriendlyName="Разрыв" +LocLongDescription="Рукопашные атаки, могут оглушить или дезориентировать врага. Активируют способность \"Инерция\" и дают концентрацию." +LocHelpText="Рукопашные атаки, могут оглушить или дезориентировать врага. Активируют способность \"Инерция\" и дают концентрацию." +LocPromotionPopupText=" Эта способность - основной метод Храмовников для набора концентрации.
После рукопашного удара Храмовник получает \"Инерцию\", дающую действие движения. Используйте, чтобы вернуться в укрытие.
Способность имеет %-ный шанс на оглушение за единицу концентрации. Оглушенные цели отбрасываются.
Способность имеет %-ный шанс дезориентировать цель за единицу концентрации.
" + +[ArcWavePassive_LW X2AbilityTemplate] LocFriendlyName="Волна" LocLongDescription="\"Разрыв\" создает волну из пси-энергии по направлению атаки. Урон повышается с улучшением перчаток." LocHelpText="\"Разрыв\" создает волну из пси-энергии по направлению атаки." @@ -6500,8 +6621,8 @@ LocPromotionPopupText=" Радиус Ионного шторма пов ; LWOTC Translated [Sabotage_LongRangeComms X2SabotageTemplate] -SummaryText="После диверсии Избранного у нас сильные помехи связи со штабами фракций. Секретные операции отложены на 2 недели." -ShortSummaryText="Секретные операции нельзя проводить в течении двух недель" +SummaryText="После диверсии Избранного у нас сильные помехи связи со штабами фракций. Секретные операции отложены на 5 дней." +ShortSummaryText="Секретные операции нельзя проводить в течении 5 дней" ; lwotc Translated end [AssassinBladestorm X2AbilityTemplate] @@ -6596,6 +6717,18 @@ LLocLongDescription="Снижает время восстановления от LocHelpText="Уменьшает время лечения после ранения." LocPromotionPopupText=" Уменьшает на количество ОЗ, которое необходимо восстановить на базе после ранения.
Солдаты, получившие в бою смертельные ранения и истекавшие кровью, не могут использовать этот бонус." +[IRI_SoulShot X2AbilityTemplate] +LocFriendlyName="Пси-стрела" +LocLongDescription="Мощная дальнобойная атака, не заканчивает ход. Стоит 1 ед. концентрации." +LocHelpText="Мощная дальнобойная атака, не заканчивает ход. Стоит 1 ед. концентрации." +LocPromotionPopupText="Пси-стрела имеет +20 к точности.
Не имеет перезарядки.
Урон увеличивается с улучшением перчаток." + +[IRI_TemplarShield X2AbilityTemplate] +LocFriendlyName="Щит" +LocLongDescription="Использование перчаток для создания пси-щита с ОЗ до начала следующего хода. Можно использовать после Разрыва." +LocHelpText="Использование перчаток для создания пси-щита с ОЗ до начала следующего хода. Можно использовать после Разрыва." +LocPromotionPopupText=" Заканчивает ход.
Сила щита увеличивается с улучшением перчаток." + [Indomitable X2AbilityTemplate] LocFriendlyName="Неукротимый" LocHelpText="В течение хода получите 1 концентрацию, если вас атаковали. Срабатывает 1 раз за ход." @@ -6681,12 +6814,14 @@ LocFriendlyName="Стабилизация парамедика" LocLongDescription="Рывок к тяжело раненому союзнику без сознания и использование на нем аптечки." LocHelpText="Рывок к тяжело раненому союзнику и использование на нем аптечки." +; LWOTC Translated + [SoulReaper X2AbilityTemplate] LocFriendlyName="Разгром" LocLongDescription="Стреляйте по цели, пока не кончатся патроны или враг не погибнет. Каждый выстрел имеет штраф - на меньше к меткости, чем предыдущий. Демаскирует Жнеца. " LocHelpText="Стреляйте по цели, пока не кончатся патроны или враг не погибнет. Каждый выстрел имеет штраф - на меньше к меткости, чем предыдущий. Демаскирует Жнеца." LocFlyoverText="Разгром" -LocPromotionPopupText=" Каждый выстрел имеет свой шанс на попадание.
Не может быть активировано с одним патроном в магазине.
Выстрелы могут наносить критический урон.
" +LocPromotionPopupText=" Каждый выстрел имеет свой шанс на попадание.
Не может быть активировано с одним патроном в магазине.
Выстрелы могут наносить критический урон. Ходов до перезарядки: .
" [Unstoppable_LW X2AbilityTemplate] LocFriendlyName="Неостановимый" @@ -6715,29 +6850,29 @@ LocLongDescription="Шанс критического попадания это LocLongDescription="Воля всех врагов снижена на %." ; End Translation -; LWOTC Needs Translation +; LWOTC Translated [MicroMissiles X2AbilityTemplate] LocHelpText="Накройте зону поражения атакой взрывающихся мини-ракет." -; LWOTC Needs Translation +; LWOTC Translated [FlashbangResistancePassive X2AbilityTemplate] LocFriendlyName="Устойчивость к дезориентации" LocLongDescription="Этот боец имеет %-ный шанс не получить дезориентацию от взрыва свето-шумовой гранаты." LocHelpText="Этот боец имеет %-ный шанс не получить дезориентацию от взрыва свето-шумовой гранаты." ; End translation -; LWOTC Needs Translation +; LWOTC Translated [Infiltration X2AbilityTemplate] LocLongDescription="Вышки \"Адвента\" не могут обнаружить этого бойца, пока он в скрытности или в Тени." LocHelpText="Вышки \"Адвента\" не могут обнаружить этого бойца, пока он в скрытности или в Тени." ; End Translation -; LWOTC Needs Translation +; LWOTC Translated [MindShield X2AbilityTemplate] LocLongDescription="Делает носителя невосприимчивым к негативным ментальным состояниям - панике, контролю и оглушению." [Sustain X2AbilityTemplate] -LocLongDescription="Если боец получил смертельный урон, он немедленно впадает в \"Стазис\" на 1 ход, а его здоровье снижается до 1 ОЗ. Срабатывает один раз за миссию." +LocLongDescription="Уменьшает время восстановления после ранений для этого солдата на ОЗ. Если боец получил смертельный урон, он немедленно впадает в \"Стазис\" на 1 ход, а его здоровье снижается до 1 ОЗ. Срабатывает один раз за миссию." LocHelpText="Если боец получил смертельный урон, он немедленно впадает в \"Стазис\" на 1 ход, а его здоровье снижается до 1 ОЗ. Срабатывает один раз за миссию" LocPromotionPopupText=" Имейте в виду, что спасенный солдат может сохранить повреждающие эффекты статуса (вроде огня или яда) после снятия \"Стазиса\".
" @@ -6745,3 +6880,100 @@ LocPromotionPopupText=" Имейте в виду, что спасенн LocLongDescription="Солдат получил смертельный урон, но был спасен и помещен в \"Стазис\" на 1 ход. Это одноразовая способность." LocHelpText="Солдат получил смертельный урон, но был спасен и помещен в \"Стазис\" на 1 ход. Это одноразовая способность." ; End Translation + +[Overdrive X2AbilityTemplate] +LocFriendlyName="Овердрайв" +LocLongDescription="Три действия в течение хода, ни одно из которых не завершает его. Последовательные стандартные выстрелы с небольшим штрафом от отдачи." +LocHelpText="Три действия в течение хода, ни одно из которых не завершает его. Последовательные стандартные выстрелы с небольшим штрафом от отдачи." +LocPromotionPopupText=" После каждого выстрела в режиме овердрайв добавляется штраф -% к меткости.
Овердрайв активируется без действия. Ходов до перезарядки:
" + +[Bulwark X2AbilityTemplate] +LocFriendlyName="Бастион" +LocLongDescription="Добавляет 1 ед. брони и позволяет выполнять роль высокого укрытия для всех союзников." +LocHelpText="Добавляет 1 ед. брони и позволяет выполнять роль высокого укрытия для всех союзников." +LocPromotionPopupText=" \"Бастион\" добавляет 1 единицу брони.
Союзники по соседству с \"Искрой\" получают бонус к защите, как от высокого укрытия.
" + +[Arsenal X2AbilityTemplate] +LocFriendlyName="Арсенал" +LocLongDescription="\"BIT\" способен использовать тяжелое вооружение" +LocHelpText="\"BIT\" способен использовать тяжелое вооружение." +LocPromotionPopupText=" Способность \"Арсенал\" позволяет \"Искре\" использовать тяжелое вооружение.
" + +[Rainmaker X2AbilityTemplate] +LocFriendlyName="Ливень" +LocLongDescription="Используемое тяжелое оружие наносит + ед. урона в увеличенной зоне поражения." +LocHelpText="Используемое тяжелое оружие наносит больше урона в увеличенной зоне поражения." +LocPromotionPopupText=" \"Ливень\" добавляет ед. урона всему тяжелому оружию.
Для тяжелого оружия с круглой зоной поражения радиус увеличивается на .
Для оружия с конической зоной поражения диаметр увеличивается на , а длина - на .
" + +[Intimidate X2AbilityTemplate] +LocFriendlyName="Устрашение" +LocLongDescription="Когда враг атакует, он может запаниковать." +LocHelpText="Когда враг атакует, он может запаниковать." +LocFlyOverText="Устрашение" +LocPromotionPopupText=" Вероятность \"Устрашения\" повышается при улучшении брони \"Искры\".
Способность активируется при атаках в рукопашной и по площади.
Стрельба из режима \"наблюдения\" игнорируется.
" + +[IntimidateTrigger X2AbilityTemplate] +LocFriendlyName="Устрашение" +LocLongDescription="Когда враг атакует, все видимые противники могут запаниковать." +LocHelpText="Когда враг атакует, все видимые противники могут запаниковать." +LocFlyOverText="Устрашение" +LocPromotionPopupText="" +LocMissMessage="Устрашение не удалось!" + +[Repair X2AbilityTemplate] +LocFriendlyName="Ремонт" +LocLongDescription="\"BIT\" способен подлететь к любому дружественному роботу и отремонтировать его. Улучшенные модели ремонтируют эффективнее." +LocHelpText="\"BIT\" способен подлететь к любому дружественному роботу и отремонтировать его." +LocFlyOverText="Ремонт" +LocPromotionPopupText=" \"Ремонт\" восстанавливает здоровья.
Улучшение \"BIT\" позволяет восстанавливать больше ОЗ за раз.
Использование способности \"Ремонт\" не заканчивает ход, если является первым действием.
Используется не более -х раз за задание.
" + +[AbsorptionField X2AbilityTemplate] +LocFriendlyName="Поглощающее поле" +LocLongDescription="Когда \"Искра\" попадает под обстрел, заряжается энергией, которую можно использовать при следующем выстреле." +LocHelpText=" при обстреле заряжается энергией, которую можно использовать при следующем выстреле." +LocFlyOverText="Поглощение энергии: +1" +LocPromotionPopupText=" С каждой единицей поглощенной энергии наносит на 1 ед. больше урона при следующей атаке.
Накопленная энергия расходуется даже в том случае, если выстрел не попадает в цель.
" + +[Sacrifice X2AbilityTemplate] +LocFriendlyName="Самопожертвование" +LocLongDescription="Создает защищенную область, в которой все атаки по союзникам перенаправляются \"Искре\". Дает дополнительную броню и защиту на время действия способности." +LocHelpText="Создает защищенную область, направляя на себя атаки противников." +LocFlyOverText="Самопожертвование" +LocPromotionPopupText=" Пока действует \"Самопожертвование\", \"Искра\" получает + к защите и + к броне.
Перезарядка - хода.
" + +[AdaptiveAim X2AbilityTemplate] +LocFriendlyName="Адаптивное прицеливание" +LocLongDescription="В режиме овердрайв стандартные выстрелы не получают штраф за отдачу." +LocHelpText="В режиме овердрайв стандартные выстрелы не получают штраф за отдачу." +LocPromotionPopupText=" Адаптивное прицеливание устраняет штраф в % меткости за последовательные выстрелы находясь в режиме овердрайв.
" + + +[Strike X2AbilityTemplate] +LocFriendlyName="Рывок" +LocLongDescription="Мощная рукопашная атака любой цели в пределах дистанции перемещения." +LocHelpText="Мощная рукопашная атака любой цели в пределах дистанции перемещения." +LocPromotionPopupText=" Чтобы активировать атаку, наведите курсор движения на противника.
\"Искра\" подбежит вплотную к цели, потратив оба действия, и выполнит удар.
" + +[WreckingBall X2AbilityTemplate] +LocFriendlyName="Разрушитель" +LocLongDescription="В режиме овердрайв \"Искра\" способен проходить через стены и укрытия." +LocHelpText="В режиме овердрайв \"Искра\" способен проходить через стены и укрытия." +LocPromotionPopupText=" \"Разрушитель\" позволяет подставить врагов под атаки с флага.
Задайте \"Искре\" маршрут, который максимально эффективно разрушит вражеские укрытия.
" + +[Bombard X2AbilityTemplate] +LocFriendlyName="Артобстрел" +LocLongDescription="Запуск \"BIT\" в любую видимую точку, где он устраивает мощный взрыв. Улучшенные модели наносят больше урона." +LocHelpText="Запуск \"BIT\", который атакует всех врагов в зоне действия." +LocPromotionPopupText=" Способность \"Артобстрел\" можно применить по любой точке в пределах \"общего вида\".
Улучшив \"BIT\", вы сможете наносить больше урона.
" + +[HunterProtocol X2AbilityTemplate] +LocFriendlyName="Протокол охоты" +LocLongDescription="При обнаружении противника в режиме \"наблюдения\" есть % вероятность сделать выстрел." +LocHelpText="При обнаружении противника в режиме \"наблюдения\" есть % вероятность сделать выстрел." +LocPromotionPopupText=" \"Протокол охоты\" делает \"Искру\" идеальным разведчиком, поскольку позволяет немедленно атаковать обнаруженных противников.
" + +[Nova X2AbilityTemplate] +LocFriendlyName="Нова" +LocLongDescription="Выброс энергии, наносящий урон всем бойцам вокруг. Не имеет стоимости и перезарядки, однако последовательные применения повреждают \"Искру\"." +LocHelpText="Урон всем бойцам вокруг. Каждое последующее применение повреждает \"Искру\"." +LocPromotionPopupText=" \"Нова\" не требует действий и мгновенно перезаряжается.
Первое применение в течение каждого задания наносит 0 урона \"Искре\".
Все последующие атаки после первой наносят \"Искре\" накапливающийся урон в ед.
" diff --git a/LongWarOfTheChosen/LongWarOfTheChosen-Stable.code-workspace b/LongWarOfTheChosen/LongWarOfTheChosen-Stable.code-workspace deleted file mode 100644 index 0a769ef1d..000000000 --- a/LongWarOfTheChosen/LongWarOfTheChosen-Stable.code-workspace +++ /dev/null @@ -1,13 +0,0 @@ -{ - "folders": [ - { - "name": "LWoTC Stable Source", - "path": ".." - }, - { - "name": "SrcOrig", - "path": "../../Steam/steamapps/common/XCOM 2 War of the Chosen SDK/Development/SrcOrig" - } - ], - "settings": {} -} \ No newline at end of file diff --git a/LongWarOfTheChosen/LongWarOfTheChosen.x2proj b/LongWarOfTheChosen/LongWarOfTheChosen.x2proj index b9828b011..f7ca8b51e 100644 --- a/LongWarOfTheChosen/LongWarOfTheChosen.x2proj +++ b/LongWarOfTheChosen/LongWarOfTheChosen.x2proj @@ -1,1462 +1,1487 @@ - - - - 7a03fe19-6291-4b95-ba1c-3ec505fa8c0b - Long War of the Chosen - Long War overhaul mod for War of the Chosen (based on Long War 2) - 0 - lwotc - lwotc - {c6d96315-2f7d-4066-a9c7-6b9d4264751d} - - - $(MSBuildProjectDirectory)\..\ - $(SolutionRoot).scripts\ - $(ScriptsDir)X2ModBuildCommon\ - - - $(MSBuildProjectDirectory)\..\ - $(SolutionRoot).scripts\ - $(ScriptsDir)X2ModBuildCommon\ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Content - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Content - - - Content - - - Content - - - Content - - - Content - - - - - - - - - - - - - - - - - - - - - - - - - - - Content - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + 7a03fe19-6291-4b95-ba1c-3ec505fa8c0b + Long War of the Chosen + Long War overhaul mod for War of the Chosen (based on Long War 2) + 0 + lwotc + lwotc + {c6d96315-2f7d-4066-a9c7-6b9d4264751d} + + + $(MSBuildProjectDirectory)\..\ + $(SolutionRoot).scripts\ + $(ScriptsDir)X2ModBuildCommon\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content + + + Content + + + Content + + + Content + + + Content + + + + + + + + + + + + + + + + + + + + + + + + + + + Content + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LWUtilities/Classes/Helpers_LW.uc b/LongWarOfTheChosen/Src/LWUtilities/Classes/Helpers_LW.uc index da1df6535..d7c3c2086 100644 --- a/LongWarOfTheChosen/Src/LWUtilities/Classes/Helpers_LW.uc +++ b/LongWarOfTheChosen/Src/LWUtilities/Classes/Helpers_LW.uc @@ -9,9 +9,12 @@ class Helpers_LW extends Object config(GameCore) dependson(Engine); var config bool EnableLWTrace; +var config bool EnableLWDiversityTrace; var config bool EnableLWDebug; var config bool EnableLWPMTrace; +var config bool bUseTrueDifficultyCalc; + var const string CHOSEN_SPAWN_TAG_SUFFIX; struct ProjectileSoundMapping @@ -159,6 +162,11 @@ var config bool bWOTCCostBasedAbilityColorsActive; var config bool bWorldWarLostActive; var config bool XCOM2RPGOverhaulActive; +var config bool bKirukaFactionOverhaulActive; +var config bool bNewTemplarModJamActive; + +var config bool bDABFLActive; + var config array cachedInstalledModNames; static final function bool IsModInstalled(coerce string DLCIdentifer) @@ -170,7 +178,9 @@ static final function bool IsModInstalled(coerce string DLCIdentifer) return default.cachedInstalledModNames.Find(DLCIdentifer) != INDEX_NONE; } -static function bool IsDLCInstalled(coerce string DLCIdentifer) + +static final function bool IsDLCInstalled(coerce string DLCIdentifer) + { local array DLCs; @@ -178,7 +188,7 @@ static function bool IsDLCInstalled(coerce string DLCIdentifer) return DLCs.Find(DLCIdentifer) != INDEX_NONE; } -simulated static function class LWCheckForRecursiveOverride(class ClassToCheck) +simulated final static function class LWCheckForRecursiveOverride(class ClassToCheck) { local int idx; local class CurrentBestClass, TestClass; @@ -208,7 +218,7 @@ simulated static function class LWCheckForRecursiveOverride(class= 0; } -static function bool YellowAlertEnabled() +static final function bool YellowAlertEnabled() { return default.EnableYellowAlert; } -static function bool DynamicEncounterZonesDisabled() +static final function bool DynamicEncounterZonesDisabled() { return default.DisableDynamicEncounterZones; } @@ -256,7 +266,7 @@ static function bool DynamicEncounterZonesDisabled() // Uses visibility rules to determine whether one unit is flanked by // another. This is because XCGS_Unit.IsFlanked() does not work for // squadsight attackers. -static function bool IsUnitFlankedBy(XComGameState_Unit Target, XComGameState_Unit MaybeFlanker) +static final function bool IsUnitFlankedBy(XComGameState_Unit Target, XComGameState_Unit MaybeFlanker) { local GameRulesCache_VisibilityInfo VisInfo; @@ -272,7 +282,7 @@ static function bool IsUnitFlankedBy(XComGameState_Unit Target, XComGameState_Un // Copied from XComGameState_Unit::GetEnemiesInRange, except will retrieve all units on the alien team within // the specified range. -static function GetAlienUnitsInRange(TTile kLocation, int nMeters, out array OutEnemies) +static final function GetAlienUnitsInRange(TTile kLocation, int nMeters, out array OutEnemies) { local vector vCenter, vLoc; local float fDistSq; @@ -372,7 +382,7 @@ function static SoundCue FindDeathSound(String ObjectArchetypeName, int Index, o // Returns the game state object reference for the faction whose rival // Chosen controls the given region. -static function XComGameState_ResistanceFaction GetFactionFromRegion(StateObjectReference RegionRef) +static final function XComGameState_ResistanceFaction GetFactionFromRegion(StateObjectReference RegionRef) { local XComGameStateHistory History; local XComGameState_AdventChosen ChosenState; @@ -400,7 +410,7 @@ static function XComGameState_ResistanceFaction GetFactionFromRegion(StateObject return FactionState; } -static function name GetChosenActiveMissionTag(XComGameState_AdventChosen ChosenState) +static final function name GetChosenActiveMissionTag(XComGameState_AdventChosen ChosenState) { local name ChosenSpawningTag; @@ -416,7 +426,7 @@ static function name GetChosenActiveMissionTag(XComGameState_AdventChosen Chosen // // Note that the HackDefenseChangeAmount should be negative for an actual reduction // in hack defense. -static function X2Effect_PersistentStatChange CreateHackDefenseReductionStatusEffect( +static final function X2Effect_PersistentStatChange CreateHackDefenseReductionStatusEffect( name EffectName, int HackDefenseChangeAmount, optional X2Condition Condition) @@ -433,7 +443,7 @@ static function X2Effect_PersistentStatChange CreateHackDefenseReductionStatusEf // Recursively prints all visualization actions in the tree that is rooted // at the given action. `iLayer` is the starting tree depth to start at. -static function PrintActionRecursive(X2Action Action, int iLayer) +static final function PrintActionRecursive(X2Action Action, int iLayer) { local X2Action ChildAction; @@ -452,7 +462,7 @@ static function PrintActionRecursive(X2Action Action, int iLayer) // TODO: This check for active resistance orders is only needed for the transition // when introducing the second wave option on existing campaigns. We can't hide the // Resistance Orders UI while there are active cards. -static function bool AreResistanceOrdersEnabled() +static final function bool AreResistanceOrdersEnabled() { local XComGameState_HeadquartersResistance ResistanceHQ; local array AllFactions; @@ -487,7 +497,7 @@ static function bool AreResistanceOrdersEnabled() // Resumes or pauses any Will recovery projects for the given unit when // updating their status. -static function UpdateUnitWillRecoveryProject(XComGameState_Unit UnitState) +static final function UpdateUnitWillRecoveryProject(XComGameState_Unit UnitState) { local XComGameState_HeadquartersProjectRecoverWill WillProject; local ESoldierStatus UnitStatus; @@ -509,12 +519,12 @@ static function UpdateUnitWillRecoveryProject(XComGameState_Unit UnitState) } } -static function bool IsHQProjectPaused(XComGameState_HeadquartersProject ProjectState) +static final function bool IsHQProjectPaused(XComGameState_HeadquartersProject ProjectState) { return ProjectState.CompletionDateTime.m_iYear == 9999; } -static function XComGameState_HeadquartersProjectRecoverWill GetWillRecoveryProject(StateObjectReference UnitRef) +static final function XComGameState_HeadquartersProjectRecoverWill GetWillRecoveryProject(StateObjectReference UnitRef) { local XComGameState_HeadquartersProjectRecoverWill WillProject; @@ -533,7 +543,7 @@ static function XComGameState_HeadquartersProjectRecoverWill GetWillRecoveryProj // 1 - Easy // 2 - Moderate // 3 - Hard -static function int GetCovertActionDifficulty(XComGameState_CovertAction ActionState) +static final function int GetCovertActionDifficulty(XComGameState_CovertAction ActionState) { local CovertActionRisk Risk; @@ -558,7 +568,7 @@ static function int GetCovertActionDifficulty(XComGameState_CovertAction ActionS // Use this to determine whether a unit is interrupting another team's turn, // for example via Skirmisher's Battlelord or Skirmisher Interrupt. -static function bool IsUnitInterruptingEnemyTurn(XComGameState_Unit UnitState) +static final function bool IsUnitInterruptingEnemyTurn(XComGameState_Unit UnitState) { local XComGameState_BattleData BattleState; @@ -568,7 +578,7 @@ static function bool IsUnitInterruptingEnemyTurn(XComGameState_Unit UnitState) // Adds the given unit to the XCom (primary) initiative group, ensuring that the unit // is controllable by the player. -function static AddUnitToXComGroup(XComGameState NewGameState, XComGameState_Unit Unit, XComGameState_Player Player, optional XComGameStateHistory History = None) +static final function AddUnitToXComGroup(XComGameState NewGameState, XComGameState_Unit Unit, XComGameState_Player Player, optional XComGameStateHistory History = None) { local XComGameState_Unit CurrentUnit; local XComGameState_AIGroup Group; @@ -595,7 +605,7 @@ function static AddUnitToXComGroup(XComGameState NewGameState, XComGameState_Uni // Copied from LW2's highlander. Since `XComGameState_Unit.HasSoldierAbility()` // does not take into account any mod additions to `XCGS_Unit.GetEarnedSoldierAbilities()`, // we need this custom implementation to check for officer abilities. -static function bool HasSoldierAbility(XComGameState_Unit Unit, name Ability, optional bool bSearchAllAbilities = true) +static final function bool HasSoldierAbility(XComGameState_Unit Unit, name Ability, optional bool bSearchAllAbilities = true) { local array EarnedAbilities; local SoldierClassAbilityType EarnedAbility; @@ -626,7 +636,7 @@ static function bool HasSoldierAbility(XComGameState_Unit Unit, name Ability, op // // If no such soldier can be found, this returns an empty reference, i.e. the `ObjectID` // is zero. -static function array FindAvailableCapturedSoldiers(optional XComGameState NewGameState = none) +static final function array FindAvailableCapturedSoldiers(optional XComGameState NewGameState = none) { local XComGameState_HeadquartersAlien AlienHQ; local XComGameState_AdventChosen ChosenState; @@ -668,7 +678,7 @@ static function array FindAvailableCapturedSoldiers(option // Determines whether a mission or covert action has spawned that has the // given (captured) soldier as a reward. If there is such a mission or covert // action, even one that is in progress, this returns `true`. -static function bool IsRescueMissionAvailableForSoldier(StateObjectReference CapturedSoldierRef, optional XComGameState NewGameState = none) +static final function bool IsRescueMissionAvailableForSoldier(StateObjectReference CapturedSoldierRef, optional XComGameState NewGameState = none) { local XComGameStateHistory History; local XComGameState_ResistanceFaction FactionState; @@ -739,7 +749,7 @@ static function bool IsRescueMissionAvailableForSoldier(StateObjectReference Cap // Determines whether the given covert action has the given reward // attached. Returns true if the covert action does have that reward. -static function bool CovertActionHasReward(XComGameState_CovertAction ActionState, StateObjectReference RewardRef) +static final function bool CovertActionHasReward(XComGameState_CovertAction ActionState, StateObjectReference RewardRef) { local XComGameStateHistory History; local XComGameState_Reward RewardState; @@ -758,7 +768,7 @@ static function bool CovertActionHasReward(XComGameState_CovertAction ActionStat // be careful calling it on an ability that is already a free action, // since the behaviour may subtly change. For example if the original // ability point cost is zero and free, that will change to 1 and free. -static function MakeFreeAction(X2AbilityTemplate Template) +static final function MakeFreeAction(X2AbilityTemplate Template) { local X2AbilityCost Cost; @@ -773,7 +783,7 @@ static function MakeFreeAction(X2AbilityTemplate Template) } } -static function RemoveAbilityTargetEffects(X2AbilityTemplate Template, name EffectClass) +static final function RemoveAbilityTargetEffects(X2AbilityTemplate Template, name EffectClass) { local int i; for (i = Template.AbilityTargetEffects.Length - 1; i >= 0; i--) @@ -785,7 +795,7 @@ static function RemoveAbilityTargetEffects(X2AbilityTemplate Template, name Effe } } -static function RemoveAbilityShooterEffects(X2AbilityTemplate Template, name EffectClass) +static final function RemoveAbilityShooterEffects(X2AbilityTemplate Template, name EffectClass) { local int i; for (i = Template.AbilityShooterEffects.Length - 1; i >= 0; i--) @@ -797,7 +807,7 @@ static function RemoveAbilityShooterEffects(X2AbilityTemplate Template, name Eff } } -static function RemoveAbilityShooterConditions(X2AbilityTemplate Template, name EffectClass) +static final function RemoveAbilityShooterConditions(X2AbilityTemplate Template, name EffectClass) { local int i; for (i = Template.AbilityShooterConditions.Length - 1; i >= 0; i--) @@ -809,7 +819,7 @@ static function RemoveAbilityShooterConditions(X2AbilityTemplate Template, name } } -static function RemoveAbilityTargetConditions(X2AbilityTemplate Template, name EffectClass) +static final function RemoveAbilityTargetConditions(X2AbilityTemplate Template, name EffectClass) { local int i; for (i = Template.AbilityTargetConditions.Length - 1; i >= 0; i--) @@ -821,7 +831,7 @@ static function RemoveAbilityTargetConditions(X2AbilityTemplate Template, name E } } -static function RemoveAbilityMultiTargetEffects(X2AbilityTemplate Template, name EffectClass) +static final function RemoveAbilityMultiTargetEffects(X2AbilityTemplate Template, name EffectClass) { local int i; for (i = Template.AbilityMultiTargetEffects.Length - 1; i >= 0; i--) @@ -833,7 +843,7 @@ static function RemoveAbilityMultiTargetEffects(X2AbilityTemplate Template, name } } -static function bool AlwaysFail() +static final function bool AlwaysFail() { return false; } diff --git a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Ability_LWAlienAbilities.uc b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Ability_LWAlienAbilities.uc index ea89f3b79..1bb6c389f 100644 --- a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Ability_LWAlienAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Ability_LWAlienAbilities.uc @@ -1013,6 +1013,8 @@ static function X2DataTemplate ReadyForAnythingFlyover() { local X2AbilityTemplate Template; local X2AbilityTrigger_EventListener EventListener; + local X2Effect_CoveringFire CoveringFireEffect; + local X2Condition_AbilityProperty CoveringFireCondition; `CREATE_X2ABILITY_TEMPLATE (Template, 'ReadyForAnythingFlyover'); @@ -1031,6 +1033,15 @@ static function X2DataTemplate ReadyForAnythingFlyover() EventListener.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; Template.AbilityTriggers.AddItem(EventListener); + // Tedster - apply Covering Fire effect here since this is fired by RFA. + CoveringFireEffect = new class'X2Effect_CoveringFire'; + CoveringFireEffect.AbilityToActivate = 'OverwatchShot'; + CoveringFireEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); + CoveringFireCondition = new class'X2Condition_AbilityProperty'; + CoveringFireCondition.OwnerHasSoldierAbilities.AddItem('CoveringFire'); + CoveringFireEffect.TargetConditions.AddItem(CoveringFireCondition); + Template.AddTargetEffect(CoveringFireEffect); + Template.CinescriptCameraType = "Overwatch"; Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; @@ -1125,7 +1136,7 @@ static function X2AbilityTemplate AddFireOnDeathAbility() local X2AbilityTrigger_EventListener Trigger; `CREATE_X2ABILITY_TEMPLATE(Template, 'FireOnDeath'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityIgnition"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityIgnition"; Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; diff --git a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2EventListener_AlienCustomization.uc b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2EventListener_AlienCustomization.uc index f6e0ea80e..bdcbb33a5 100644 --- a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2EventListener_AlienCustomization.uc +++ b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2EventListener_AlienCustomization.uc @@ -241,7 +241,6 @@ static function CustomizeAliens_BuildVisualization(XComGameState VisualizeGameSt static function EventListenerReturn OnUnitShownInBestiary( Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData) { local XComGameState NewGameState; - local XComGameStateContext_ChangeContainer ChangeContainer; local XComGameState_Unit_AlienCustomization AlienCustomization; local XComGameState_Unit UnitState, UpdatedUnitState; local LWUnitVariation UnitVariation; diff --git a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Item_LWAlienWeapons.uc b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Item_LWAlienWeapons.uc index 5696df3ec..693043e9f 100644 --- a/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Item_LWAlienWeapons.uc +++ b/LongWarOfTheChosen/Src/LW_AlienPack_Integrated/Classes/X2Item_LWAlienWeapons.uc @@ -470,7 +470,7 @@ static function X2DataTemplate CreateTemplate_Sidewinder_WPN(name TemplateName) Template.ItemCat = 'weapon'; Template.WeaponCat = 'smg'; Template.WeaponTech = 'beam'; - Template.strImage = "img:///LWSidewinderSMG.Textures.LWBeamSMG_Common"; + Template.strImage = "img:///LWSidewinderSMG.LWBeamSMG_Common"; Template.RemoveTemplateAvailablility(Template.BITFIELD_GAMEAREA_Multiplayer); //invalidates multiplayer availability Template.RangeAccuracy = class'X2Item_SMGWeapon'.default.MIDSHORT_CONVENTIONAL_RANGE; diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCooldown_Banish.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCooldown_Banish.uc new file mode 100644 index 000000000..1cb33d9b0 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCooldown_Banish.uc @@ -0,0 +1,28 @@ +class X2AbilityCooldown_Banish extends X2AbilityCooldown; + +var bool bUseCharges; + +simulated function int GetNumTurns(XComGameState_Ability kAbility, XComGameState_BaseObject AffectState, XComGameState_Item AffectWeapon, XComGameState NewGameState) +{ + + if(kAbility.iCharges > 0 && bUseCharges) + { + return 1; + } + + if(bUseCharges) + { + kAbility = XComGameState_Ability(NewGameState.ModifyStateObject(class'XComGameState_Ability', kAbility.ObjectID)); + kAbility.iCharges = 1; + } + + if (XComGameState_Unit(AffectState).HasAbilityFromAnySource('TheBanisher_LW')) + return iNumTurns - 1; + + return iNumTurns; +} + +DefaultProperties +{ + iNumTurns = 2; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCost_BanishCharges.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCost_BanishCharges.uc new file mode 100644 index 000000000..f81851078 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2AbilityCost_BanishCharges.uc @@ -0,0 +1,69 @@ +class X2AbilityCost_BanishCharges extends X2AbilityCost_Charges; + +simulated function name CanAfford(XComGameState_Ability kAbility, XComGameState_Unit ActivatingUnit) +{ + return 'AA_Success'; +} + +simulated function ApplyCost(XComGameStateContext_Ability AbilityContext, XComGameState_Ability kAbility, XComGameState_BaseObject AffectState, XComGameState_Item AffectWeapon, XComGameState NewGameState) +{ + local name SharedAbilityName; + local StateObjectReference SharedAbilityRef; + local XComGameState_Unit UnitState; + local XComGameStateHistory History; + local XComGameState_Ability SharedAbilityState; + local StateObjectReference BondmateRef; + + if (bOnlyOnHit && AbilityContext.IsResultContextMiss()) + { + return; + } + kAbility.iCharges -= NumCharges; + + kAbility.iCharges = max(kAbility.iCharges, 0); + + if( SharedAbilityCharges.Length > 0 || bAlsoExpendChargesOnSharedBondmateAbility ) + { + History = `XCOMHISTORY; + UnitState = XComGameState_Unit(NewGameState.GetGameStateForObjectID(kAbility.OwnerStateObject.ObjectID)); + if (UnitState == None) + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(kAbility.OwnerStateObject.ObjectID)); + + foreach SharedAbilityCharges(SharedAbilityName) + { + if (SharedAbilityName != kAbility.GetMyTemplateName()) + { + SharedAbilityRef = UnitState.FindAbility(SharedAbilityName); + if (SharedAbilityRef.ObjectID > 0) + { + SharedAbilityState = XComGameState_Ability(NewGameState.ModifyStateObject(class'XComGameState_Ability', SharedAbilityRef.ObjectID)); + SharedAbilityState.iCharges -= NumCharges; + } + } + } + + if( bAlsoExpendChargesOnSharedBondmateAbility && UnitState.HasSoldierBond(BondmateRef) ) + { + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(BondmateRef.ObjectID)); + SharedAbilityRef = UnitState.FindAbility(kAbility.GetMyTemplateName()); + if( SharedAbilityRef.ObjectID > 0 ) + { + SharedAbilityState = XComGameState_Ability(NewGameState.ModifyStateObject(class'XComGameState_Ability', SharedAbilityRef.ObjectID)); + SharedAbilityState.iCharges -= NumCharges; + } + + foreach SharedAbilityCharges(SharedAbilityName) + { + if( SharedAbilityName != kAbility.GetMyTemplateName() ) + { + SharedAbilityRef = UnitState.FindAbility(SharedAbilityName); + if( SharedAbilityRef.ObjectID > 0 ) + { + SharedAbilityState = XComGameState_Ability(NewGameState.ModifyStateObject(class'XComGameState_Ability', SharedAbilityRef.ObjectID)); + SharedAbilityState.iCharges -= NumCharges; + } + } + } + } + } +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_ReaperAbilitySet_LW.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_ReaperAbilitySet_LW.uc index 83a055dc7..c77703a18 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_ReaperAbilitySet_LW.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_ReaperAbilitySet_LW.uc @@ -47,7 +47,9 @@ static function array CreateTemplates() Templates.AddItem(AddClaymoreDisorient()); Templates.AddItem(AddBloodTrailBleedingAbility()); Templates.AddItem(AddDisablingShot()); + Templates.AddItem(AddDisablingShotSnapShot()); Templates.AddItem(AddDisablingShotCritRemoval()); + Templates.AddItem(AddDisablingShotSnapShotCritRemoval()); Templates.AddItem(AddDemolitionist()); Templates.AddItem(AddSilentKillerCooldownReduction()); Templates.AddItem(AddSilentKillerDurationExtension()); @@ -57,6 +59,7 @@ static function array CreateTemplates() Templates.AddItem(AddChargeBattery()); Templates.AddItem(AddParamedic()); Templates.AddItem(AddCheapShotAbility()); + Templates.AddItem(AddTheBanisherAbility()); Templates.AddItem(ParaMedikitHeal()); Templates.AddItem(ParaMedikitStabilize()); @@ -67,7 +70,7 @@ static function X2AbilityTemplate AddLingeringShadow() { local X2AbilityTemplate Template; - Template = PurePassive('LingeringShadow', "img:///UILibrary_LW_Overhaul.PerkIcons.UIPerk_LingeringShadow", false); + Template = PurePassive('LingeringShadow', "img:///UILibrary_LWOTC.PerkIcons.UIPerk_LingeringShadow", false); Template.AdditionalAbilities.AddItem('LingeringShadowTrigger'); return Template; @@ -82,7 +85,7 @@ static function X2AbilityTemplate AddLingeringShadowTrigger() `CREATE_X2ABILITY_TEMPLATE(Template, 'LingeringShadowTrigger'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.PerkIcons.UIPerk_LingeringShadow"; + Template.IconImage = "img:///UILibrary_LWOTC.PerkIcons.UIPerk_LingeringShadow"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -126,7 +129,7 @@ static function X2AbilityTemplate AddRemoveShadowOnConcealmentLostTrigger() `CREATE_X2ABILITY_TEMPLATE(Template, 'RemoveShadowOnConcealmentLostTrigger'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.PerkIcons.UIPerk_LingeringShadow"; + Template.IconImage = "img:///UILibrary_LWOTC.PerkIcons.UIPerk_LingeringShadow"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -458,7 +461,7 @@ static function X2AbilityTemplate AddDisablingShot() local X2AbilityTemplate Template; local X2AbilityCost_Ammo AmmoCost; local X2AbilityCost_ActionPoints ActionPointCost; - local X2AbilityCooldown Cooldown; + local X2AbilityCooldown_Shared Cooldown; local X2AbilityToHitCalc_StandardAim ToHitCalc; local X2Condition_Visibility VisibilityCondition; local X2Effect_DisablingShotStunned StunEffect; @@ -467,10 +470,11 @@ static function X2AbilityTemplate AddDisablingShot() local X2Condition_UnitType ImmuneUnitCondition; `CREATE_X2ABILITY_TEMPLATE (Template, 'DisablingShot'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityElectroshock"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityElectroshock"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; - Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideIfOtherAvailable; + Template.HideIfAvailable.AddItem('DisablingShotSnapShot'); Template.DisplayTargetHitChance = true; Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; Template.CinescriptCameraType = "StandardGunFiring"; @@ -532,9 +536,112 @@ static function X2AbilityTemplate AddDisablingShot() Template.AbilityToHitCalc = ToHitCalc; Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; - Cooldown = new class'X2AbilityCooldown'; - Cooldown.iNumTurns = default.DisablingShotCooldown; - Template.AbilityCooldown = Cooldown; + Cooldown = new class'X2AbilityCooldown_Shared'; + Cooldown.iNumTurns = default.DisablingShotCooldown; + Cooldown.SharingCooldownsWith.AddItem('DisablingShotSnapShot'); + Template.AbilityCooldown = Cooldown; + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = default.DisablingShotAmmoCost; + Template.AbilityCosts.AddItem(AmmoCost); + + Template.AdditionalAbilities.AddItem('DisablingShotSnapShot'); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + + return Template; +} + +static function X2AbilityTemplate AddDisablingShotSnapShot() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2AbilityCooldown_Shared Cooldown; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2Condition_Visibility VisibilityCondition; + local X2Effect_DisablingShotStunned StunEffect; + local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_UnitProperty UnitPropertyCondition; + local X2Condition_UnitType ImmuneUnitCondition; + local X2Condition_AbilityProperty AbilityCondition; + local X2Condition_UnitActionPoints ActionPointCondition; + + `CREATE_X2ABILITY_TEMPLATE (Template, 'DisablingShotSnapShot'); + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityElectroshock"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.DisplayTargetHitChance = true; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + Template.CinescriptCameraType = "StandardGunFiring"; + Template.TargetingMethod = class'X2TargetingMethod_OverTheShoulder'; + Template.bCrossClassEligible = false; + Template.bUsesFiringCamera = true; + Template.bPreventsTargetTeleport = false; + Template.Hostility = eHostility_Offensive; + + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + Template.AbilityTargetStyle = default.SimpleSingleTarget; + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty); + Template.AddShooterEffectExclusions(); + Template.ActivationSpeech = 'Reaper'; + Template.AdditionalAbilities.AddItem('DisablingShotSnapShotCritRemoval'); + + VisibilityCondition = new class'X2Condition_Visibility'; + VisibilityCondition.bRequireGameplayVisible = true; + VisibilityCondition.bAllowSquadsight = true; + Template.AbilityTargetConditions.AddItem(VisibilityCondition); + + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); + Template.AssociatedPassives.AddItem('HoloTargeting'); + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect()); + Template.bAllowAmmoEffects = true; + + StunEffect = CreateDisablingShotStunnedEffect(default.DisablingShotBaseStunActions); + StunEffect.BonusStunActionsOnCrit = default.DisablingShotCritStunActions; + Template.AddTargetEffect(StunEffect); + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + // Can't target dead; Can't target friendlies + UnitPropertyCondition = new class'X2Condition_UnitProperty'; + UnitPropertyCondition.ExcludeRobotic = false; + UnitPropertyCondition.ExcludeOrganic = false; + UnitPropertyCondition.ExcludeDead = true; + UnitPropertyCondition.ExcludeFriendlyToSource = true; + UnitPropertyCondition.RequireWithinRange = true; + Template.AbilityTargetConditions.AddItem(UnitPropertyCondition); + + ImmuneUnitCondition = new class'X2Condition_UnitType'; + ImmuneUnitCondition.ExcludeTypes.AddItem('PsiZombie'); + ImmuneUnitCondition.ExcludeTypes.AddItem('AdvPsiWitchM2'); + ImmuneUnitCondition.ExcludeTypes.AddItem('AdvPsiWitchM3'); + Template.AbilityTargetConditions.AddItem(ImmuneUnitCondition); + + SuppressedCondition = new class'X2Condition_UnitEffects'; + SuppressedCondition.AddExcludeEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsSuppressed'); + SuppressedCondition.AddExcludeEffect(class'X2Effect_AreaSuppression'.default.EffectName, 'AA_UnitIsSuppressed'); + Template.AbilityShooterConditions.AddItem(SuppressedCondition); + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + Cooldown = new class'X2AbilityCooldown_Shared'; + Cooldown.iNumTurns = default.DisablingShotCooldown; + Cooldown.SharingCooldownsWith.AddItem('DisablingShot'); + Template.AbilityCooldown = Cooldown; AmmoCost = new class'X2AbilityCost_Ammo'; AmmoCost.iAmmo = default.DisablingShotAmmoCost; @@ -543,6 +650,18 @@ static function X2AbilityTemplate AddDisablingShot() Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + AbilityCondition = new class'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('SnapShot'); + Template.AbilityShooterConditions.Additem(AbilityCondition); + + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.StandardActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.RunAndGunActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; @@ -557,7 +676,7 @@ static function X2Effect_DisablingShotStunned CreateDisablingShotStunnedEffect(i local X2Condition_UnitProperty UnitPropCondition; StunnedEffect = new class'X2Effect_DisablingShotStunned'; - StunnedEffect.BuildPersistentEffect(1, true, true, false, eGameRule_UnitGroupTurnBegin); + StunnedEffect.BuildPersistentEffect(1, true, false, false, eGameRule_UnitGroupTurnBegin); StunnedEffect.ApplyChance = 100; StunnedEffect.StunLevel = StunLevel; StunnedEffect.bIsImpairing = true; @@ -626,11 +745,50 @@ static function X2AbilityTemplate AddDisablingShotCritRemoval() return Template; } +static function X2AbilityTemplate AddDisablingShotSnapShotCritRemoval() +{ + local X2AbilityTemplate Template; + local X2Effect_CritRemoval CritRemovalEffect; + local X2Effect_AbilityDamageMult DamageReductionEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'DisablingShotSnapShotCritRemoval'); + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_standard"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.Hostility = eHostility_Neutral; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + Template.bShowActivation = false; + Template.bSkipFireAction = true; + Template.bDontDisplayInAbilitySummary = true; + Template.bDisplayInUITooltip = false; + Template.bDisplayInUITacticalText = false; + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + + CritRemovalEffect = new class'X2Effect_CritRemoval'; + CritRemovalEffect.AbilityToActOn = 'DisablingShotSnapShot'; + Template.AddShooterEffect(CritRemovalEffect); + + // Also add damage reduction, similar to Kubikiri on a non-crit, but + // applies to all damage types. + DamageReductionEffect = new class'X2Effect_AbilityDamageMult'; + DamageReductionEffect.Mult = true; + DamageReductionEffect.Penalty = true; + DamageReductionEffect.DamageMod = default.DisablingShotDamagePenalty; + DamageReductionEffect.ActiveAbility = 'DisablingShotSnapShot'; + Template.AddShooterEffect(DamageReductionEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} + static function X2AbilityTemplate AddDemolitionist() { local X2AbilityTemplate Template; - Template = PurePassive('Demolitionist', "img:///UILibrary_LW_Overhaul.PerkIcons.UIPerk_Demolitionist", true); + Template = PurePassive('Demolitionist', "img:///UILibrary_LWOTC.PerkIcons.UIPerk_Demolitionist", true); Template.PrerequisiteAbilities.AddItem('RemoteStart'); return Template; @@ -983,6 +1141,7 @@ static function X2AbilityTemplate ParaMedikitHeal() UnitPropertyCondition.ExcludeFullHealth = true; UnitPropertyCondition.ExcludeRobotic = true; UnitPropertyCondition.ExcludeTurret = true; + UnitPropertyCondition.FailOnNonUnits = true; Template.AbilityTargetConditions.AddItem(UnitPropertyCondition); //Hack: Do this instead of ExcludeDead, to only exclude properly-dead or bleeding-out units. @@ -1071,6 +1230,7 @@ static function X2AbilityTemplate ParaMedikitStabilize() UnitPropertyCondition.ExcludeHostileToSource = true; UnitPropertyCondition.ExcludeFriendlyToSource = false; UnitPropertyCondition.IsBleedingOut = true; + UnitPropertyCondition.FailOnNonUnits = true; Template.AbilityTargetConditions.AddItem(UnitPropertyCondition); RemoveEffects = new class'X2Effect_RemoveEffects'; @@ -1192,3 +1352,13 @@ static function ChargeBattery_BuildVisualization(XComGameState VisualizeGameStat Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; return Template; } + +static function X2AbilityTemplate AddTheBanisherAbility() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('TheBanisher_LW', "img:///UILibrary_PerkIcons.UIPerk_reaper", false); + //Template.AdditionalAbilities.AddItem('KnifeEncountersExtendedRange'); + + return Template; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_TemplarAbilitySet_LW.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_TemplarAbilitySet_LW.uc index 0377b1ae4..0bf5ddbb9 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_TemplarAbilitySet_LW.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Ability_TemplarAbilitySet_LW.uc @@ -50,6 +50,12 @@ static function array CreateTemplates() Templates.AddItem(DoubleRendFocus()); Templates.AddItem(DoubleRendFocusPassive()); Templates.AddItem(SingleRendFocus()); + Templates.AddItem(TemplarShield()); + Templates.AddItem(SoulShot()); + Templates.AddItem(class'XComGame.X2Ability_TemplarAbilitySet'.static.Rend('Rend_LW')); + Templates.AddItem(ArcWave_LW()); + Templates.AddItem(ArcWavePassive_LW()); + return Templates; } @@ -174,7 +180,7 @@ static function X2AbilityTemplate AddTemplarFleche() FlecheBonusDamageEffect = new class 'X2Effect_FlecheBonusDamage'; FlecheBonusDamageEffect.BonusDmgPerTile = default.BONUS_REND_DAMAGE_PER_TILE; FlecheBonusDamageEffect.MaxBonusDamage = default.MAX_REND_FLECHE_DAMAGE; - FlecheBonusDamageEffect.AbilityNames.AddItem('Rend'); + FlecheBonusDamageEffect.AbilityNames.AddItem('Rend_LW'); FlecheBonusDamageEffect.AbilityNames.AddItem('ArcWave'); FlecheBonusDamageEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); FlecheBonusDamageEffect.BuildPersistentEffect (1, true, false); @@ -422,7 +428,7 @@ static function X2AbilityTemplate AddTemplarTerror() { local X2AbilityTemplate Template; - Template = PurePassive('TemplarTerror', "img:///UILibrary_LW_Overhaul.LW_AbilityNapalmX", false, 'eAbilitySource_Perk'); + Template = PurePassive('TemplarTerror', "img:///UILibrary_LWOTC.LW_AbilityNapalmX", false, 'eAbilitySource_Perk'); Template.bCrossClassEligible = false; Template.PrerequisiteAbilities.AddItem('Volt'); return Template; @@ -492,7 +498,7 @@ static function X2AbilityTemplate AddApotheosis() Template.AbilitySourceName = 'eAbilitySource_Psionic'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_andromedon_robotbattlesuit"; + Template.IconImage = "img:///IRIPerkPack_UILibrary_LW.UIPerk_Apotheosis"; Template.ActivationSpeech = 'IonicStorm'; Template.Hostility = eHostility_Neutral; @@ -526,40 +532,192 @@ static function X2AbilityTemplate AddApotheosis() Effect.arrFocusModifiers.AddItem(CreateFocusLevelModifiers(2 * default.APOTHEOSIS_DODGE_BONUS, 2 * default.APOTHEOSIS_MOBILITY_BONUS)); Template.AddTargetEffect(Effect); + // State and Viz + Template.Hostility = eHostility_Neutral; + Template.bFrameEvenWhenUnitIsHidden = true; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + //Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + Template.bShowActivation = false; // Don't show flyover, it obscures the fancy animation. + Template.CustomSelfFireAnim = 'HL_Apotheosis'; + Template.CustomFireAnim = 'HL_Apotheosis'; + Template.CinescriptCameraType = "Templar_Ghost"; + Template.bSkipExitCoverWhenFiring = true; Template.bSkipFireAction = false; - Template.CustomFireAnim = 'HL_IonicStorm'; + + return Template; +} + +static function X2AbilityTemplate TemplarShield() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2Effect_TemplarShieldAnimations AnimSetEffect; + local X2Effect_TemplarShield ShieldedEffect; + local X2Effect_TemplarShieldCritDefense AntiFlankEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'IRI_TemplarShield'); + + // Icon Setup + Template.IconImage = "img:///IRIPerkPack_UILibrary_LW.UIPerk_TemplarShield"; + Template.AbilitySourceName = 'eAbilitySource_Psionic'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY; + + // Shooter Conditions + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AddShooterEffectExclusions(); + + // Triggering and Targeting + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + // Costs + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + //ActionPointCost.AllowedTypes.Length = 0; + ActionPointCost.AllowedTypes.AddItem('Momentum'); + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + // Effects + AnimSetEffect = new class'X2Effect_TemplarShieldAnimations'; + AnimSetEffect.BuildPersistentEffect(1, false, true,, eGameRule_PlayerTurnBegin); + AnimSetEffect.AddAnimSetWithPath("IRIParryReworkAnims.Anims.AS_BallisticShield"); + AnimSetEffect.AddAnimSetWithPath("IRIParryReworkAnims.Anims.AS_TemplarShield"); + Template.AddTargetEffect(AnimSetEffect); + + ShieldedEffect = new class'X2Effect_TemplarShield'; + ShieldedEffect.BuildPersistentEffect(1, false, true,, eGameRule_PlayerTurnBegin); + ShieldedEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage, true, , Template.AbilitySourceName); + ShieldedEffect.EffectName = class'X2Effect_TemplarShield'.default.EffectName; + Template.AddTargetEffect(ShieldedEffect); + + AntiFlankEffect = new class'X2Effect_TemplarShieldCritDefense'; + AntiFlankEffect.BuildPersistentEffect(1, false, true,, eGameRule_PlayerTurnBegin); + AntiFlankEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage, true, , Template.AbilitySourceName); + Template.AddShooterEffect(AntiFlankEffect); + + // State and Viz + Template.Hostility = eHostility_Defensive; + Template.bFrameEvenWhenUnitIsHidden = true; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; - Template.BuildVisualizationFn = Apotheosis_BuildVisualization; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + Template.bShowActivation = false; // Don't show flyover, it obscures the fancy animation. + Template.CustomSelfFireAnim = 'HL_Shield_Extend'; + Template.CustomFireAnim = 'HL_Shield_Extend'; + Template.bSkipExitCoverWhenFiring = true; + Template.bSkipFireAction = false; + Template.OverrideAbilityAvailabilityFn = TemplarShield_OverrideAbilityAvailability; - // Template.AdditionalAbilities.AddItem('MeditationPreparationPassive'); + Template.OverrideAbilities.AddItem('ParryActivate'); + Template.OverrideAbilities.AddItem('Parry'); + Template.DefaultSourceItemSlot = eInvSlot_PrimaryWeapon; return Template; } -static function Apotheosis_BuildVisualization(XComGameState VisualizeGameState) +private static function TemplarShield_OverrideAbilityAvailability(out AvailableAction Action, XComGameState_Ability AbilityState, XComGameState_Unit OwnerState) { - local XComGameStateHistory History; - local XComGameStateContext_Ability Context; - local StateObjectReference InteractingUnitRef; - local VisualizationActionMetadata EmptyTrack, BuildTrack; - local X2Action_PlaySoundAndFlyOver SoundAndFlyover; - local XComGameState_Ability Ability; + if (Action.AvailableCode == 'AA_Success') + { + if (OwnerState.ActionPoints.Length == 1 && OwnerState.ActionPoints[0] == 'Momentum') + Action.ShotHUDPriority = class'UIUtilities_Tactical'.const.PARRY_PRIORITY; + } +} - class'X2Ability'.static.TypicalAbility_BuildVisualization(VisualizeGameState); +static function X2AbilityTemplate SoulShot() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2Condition_UnitProperty TargetProperty; + local X2Effect_ApplyWeaponDamage WeaponDamageEffect; + local X2Condition_Visibility TargetVisibilityCondition; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityCost_Focus FocusCost; + `CREATE_X2ABILITY_TEMPLATE(Template, 'IRI_SoulShot'); + + // Icon Setup + Template.IconImage = "img:///IRIPerkPack_UILibrary_LW.UIPerk_SoulShot"; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; + Template.AbilitySourceName = 'eAbilitySource_Psionic'; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_SQUADDIE_PRIORITY; - History = `XCOMHISTORY; - Context = XComGameStateContext_Ability(VisualizeGameState.GetContext()); - Ability = XComGameState_Ability(History.GetGameStateForObjectID(Context.InputContext.AbilityRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1)); - InteractingUnitRef = Context.InputContext.SourceObject; - BuildTrack = EmptyTrack; - BuildTrack.StateObject_OldState = History.GetGameStateForObjectID(InteractingUnitRef.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1); - BuildTrack.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(InteractingUnitRef.ObjectID); - BuildTrack.VisualizeActor = History.GetVisualizer(InteractingUnitRef.ObjectID); - - SoundAndFlyover = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(BuildTrack, Context, false, BuildTrack.LastActionAdded)); - SoundAndFlyover.SetSoundAndFlyOverParameters(none, Ability.GetMyTemplate().LocFlyOverText, 'None', eColor_Good); + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + Template.AbilityTargetStyle = default.SimpleSingleTarget; + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + // Shooter Conditions + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AddShooterEffectExclusions(); + + // Target Conditions + TargetProperty = new class'X2Condition_UnitProperty'; + //TargetProperty.ExcludeRobotic = true; + TargetProperty.FailOnNonUnits = true; + TargetProperty.TreatMindControlledSquadmateAsHostile = true; + Template.AbilityTargetConditions.AddItem(TargetProperty); + + TargetVisibilityCondition = new class'X2Condition_Visibility'; + TargetVisibilityCondition.bRequireGameplayVisible = true; + TargetVisibilityCondition.bAllowSquadsight = true; + Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition); + + // Costs + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.bConsumeAllPoints = false; + ActionPointCost.iNumPoints = 1; + Template.AbilityCosts.AddItem(ActionPointCost); + + FocusCost = new class'X2AbilityCost_Focus'; + FocusCost.FocusAmount = 1; + Template.AbilityCosts.AddItem(FocusCost); + + // Effects + WeaponDamageEffect = new class'X2Effect_ApplyWeaponDamage'; + WeaponDamageEffect.bIgnoreBaseDamage = true; + WeaponDamageEffect.DamageTag = 'IRI_SoulShot'; + //WeaponDamageEffect.bBypassShields = true; + //WeaponDamageEffect.bIgnoreArmor = true; + Template.AddTargetEffect(WeaponDamageEffect); + Template.AddTargetEffect(new class'X2Effect_SoulShot_ArrowHit'); + + // State and Viz + Template.bShowActivation = false; + Template.CustomFireAnim = 'HL_SoulShot'; + Template.CustomFireKillAnim = 'HL_SoulShot'; + Template.CustomMovingFireAnim = 'HL_SoulShot'; + Template.CustomMovingFireKillAnim = 'HL_SoulShot'; + Template.CustomMovingTurnLeftFireAnim = 'HL_SoulShot'; + Template.CustomMovingTurnLeftFireKillAnim = 'HL_SoulShot'; + Template.CustomMovingTurnRightFireAnim = 'HL_SoulShot'; + Template.CustomMovingTurnRightFireKillAnim = 'HL_SoulShot'; + + + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + Template.ActivationSpeech = 'IonicStorm'; + Template.CinescriptCameraType = "IRI_SoulShot"; + + Template.bFrameEvenWhenUnitIsHidden = true; + Template.Hostility = eHostility_Offensive; + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + + return Template; } + static function FocusLevelModifiers CreateFocusLevelModifiers(int DodgeBonus, int MobilityBonus) { local FocusLevelModifiers FocusLevelModifiers; @@ -598,6 +756,8 @@ static function X2AbilityTemplate Indomitable() IndomitableEffect = new class'X2Effect_Indomitable'; + IndomitableEffect.BuildPersistentEffect(1, true, true); + IndomitableEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.LocLongDescription, Template.IconImage, true,, Template.AbilitySourceName); Template.AddShooterEffect(IndomitableEffect); Template.bSkipFireAction = true; @@ -784,6 +944,64 @@ static function X2AbilityTemplate DoubleRendFocusPassive() return Template; } +static function X2AbilityTemplate ArcWave_LW() +{ + local X2AbilityTemplate Template; + local X2AbilityMultiTarget_Cone ConeMultiTarget; + + Template = Rend('ArcWave_LW'); + Template.OverrideAbilities.AddItem('Rend_LW'); + Template.TargetingMethod = class'X2TargetingMethod_ArcWave'; + Template.ActionFireClass = class'X2Action_Fire_Wave'; + + // These are all handled in the editor if you want to change them! +//BEGIN AUTOGENERATED CODE: Template Overrides 'ArcWave' + Template.bSkipMoveStop = false; + Template.bFrameEvenWhenUnitIsHidden = true; + Template.AbilitySourceName = 'eAbilitySource_Psionic'; + Template.CustomFireAnim = 'FF_ArcWave_MeleeA'; + Template.CustomFireKillAnim = 'FF_ArcWave_MeleeKillA'; + Template.CustomMovingFireAnim = 'MV_ArcWave_MeleeA'; + Template.CustomMovingFireKillAnim = 'MV_ArcWave_MeleeKillA'; + Template.CustomMovingTurnLeftFireAnim = 'MV_ArcWave_RunTurn90LeftMeleeA'; + Template.CustomMovingTurnLeftFireKillAnim = 'MV_ArcWave_RunTurn90LeftMeleeKillA'; + Template.CustomMovingTurnRightFireAnim = 'MV_ArcWave_RunTurn90RightMeleeA'; + Template.CustomMovingTurnRightFireKillAnim = 'MV_ArcWave_RunTurn90RightMeleeKillA'; + Template.ActivationSpeech = 'Rend'; + Template.CinescriptCameraType = "Templar_Rend"; + Template.bSkipExitCoverWhenFiring = false; +//END AUTOGENERATED CODE: Template Overrides 'ArcWave' + //Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + //Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_Arcwave"; + + ConeMultiTarget = new class'X2AbilityMultiTarget_Cone'; + ConeMultiTarget.ConeEndDiameter = default.ArcWaveConeEndDiameterTiles * class'XComWorldData'.const.WORLD_StepSize; + ConeMultiTarget.ConeLength = default.ArcWaveConeLengthTiles * class'XComWorldData'.const.WORLD_StepSize; + ConeMultiTarget.fTargetRadius = Sqrt(Square(ConeMultiTarget.ConeEndDiameter / 2) + Square(ConeMultiTarget.ConeLength)) * class'XComWorldData'.const.WORLD_UNITS_TO_METERS_MULTIPLIER; + ConeMultiTarget.bExcludeSelfAsTargetIfWithinRadius = true; + ConeMultiTarget.bLockShooterZ = true; + Template.AbilityMultiTargetStyle = ConeMultiTarget; + + Template.AbilityMultiTargetConditions.AddItem(default.LivingHostileUnitOnlyProperty); + + Template.AddMultiTargetEffect(new class'X2Effect_ArcWaveMultiDamage'); + + return Template; +} + +static function X2AbilityTemplate ArcWavePassive_LW() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('ArcWavePassive_LW', "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_Arcwave", , 'eAbilitySource_Psionic'); + + Template.AdditionalAbilities.AddItem('ArcWave_LW'); + Template.PrerequisiteAbilities.AddItem('Rend_LW'); + + return Template; +} + + defaultproperties { PanicImpairingAbilityName = "TemplarTerrorPanic" diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Action_TemplarShield_ApplyWeaponDamageToUnit.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Action_TemplarShield_ApplyWeaponDamageToUnit.uc new file mode 100644 index 000000000..8ca88edb2 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Action_TemplarShield_ApplyWeaponDamageToUnit.uc @@ -0,0 +1,661 @@ +class X2Action_TemplarShield_ApplyWeaponDamageToUnit extends X2Action_ApplyWeaponDamageToUnit; + +// A version of Damage Unit action does not play any animations and plays a different voiceover if the attack didn't cause HP damage. + +simulated function bool ShouldPlayAnimation() +{ + return false; +} + +// Same as original, just using different speech when not taking health damage. +simulated state Executing +{ + simulated event BeginState(name nmPrevState) + { + super.BeginState(nmPrevState); + + //Rumbles controller + Unit.CheckForLowHealthEffects(); + } + + //Returns the string we should use to call out damage - potentially using "Burning", "Poison", etc. instead of the default + simulated function string GetDamageMessage() + { + if (X2Effect_Persistent(DamageEffect) != none) + return X2Effect_Persistent(DamageEffect).FriendlyName; + + if (X2Effect_Persistent(OriginatingEffect) != None) + return X2Effect_Persistent(OriginatingEffect).FriendlyName; + + if (X2Effect_Persistent(AncestorEffect) != None) + return X2Effect_Persistent(AncestorEffect).FriendlyName; + + return ""; + } + + simulated function ShowDamageMessage(EWidgetColor SuccessfulAttackColor, EWidgetColor UnsuccessfulAttackColor) + { + local string UIMessage; + + UIMessage = GetDamageMessage(); + if (UIMessage == "") + UIMessage = class'XGLocalizedData'.default.HealthDamaged; + + if( m_iShredded > 0 ) + { + ShowShreddedMessage(SuccessfulAttackColor); + } + if( m_iMitigated > 0 ) + { + ShowMitigationMessage(UnsuccessfulAttackColor); + } + if(m_iShielded > 0) + { + ShowShieldedMessage(UnsuccessfulAttackColor); + } + if(m_iDamage > 0) + { + ShowHPDamageMessage(UIMessage, , SuccessfulAttackColor); + } + + // ADDED + if (m_iDamage == 0) + { + Unit.UnitSpeak('TakingFire'); + } + else // END OF ADDED + if( m_iMitigated > 0 && ShouldPlayArmorHitVO()) + { + Unit.UnitSpeak('ArmorHit'); + } + else if(m_iShielded > 0 || m_iDamage > 0) + { + Unit.UnitSpeak('TakingDamage'); + } + } + + simulated function ShowCritMessage(EWidgetColor SuccessfulAttackColor, EWidgetColor UnsuccessfulAttackColor) + { + Unit.UnitSpeak('CriticallyWounded'); + + if( m_iShredded > 0 ) + { + ShowShreddedMessage(SuccessfulAttackColor); + } + if( m_iMitigated > 0 ) + { + ShowMitigationMessage(UnsuccessfulAttackColor); + } + if(m_iShielded > 0) + { + ShowShieldedMessage(UnsuccessfulAttackColor); + } + if(m_iDamage > 0) + { + ShowHPDamageMessage(GetDamageMessage(), class'XGLocalizedData'.default.CriticalHit, SuccessfulAttackColor); + } + } + + simulated function ShowGrazeMessage(EWidgetColor SuccessfulAttackColor, EWidgetColor UnsuccessfulAttackColor) + { + if( m_iShredded > 0 ) + { + ShowShreddedMessage(SuccessfulAttackColor); + } + if( m_iMitigated > 0 ) + { + ShowMitigationMessage(UnsuccessfulAttackColor); + } + if(m_iShielded > 0) + { + ShowShieldedMessage(UnsuccessfulAttackColor); + } + if(m_iDamage > 0) + { + ShowHPDamageMessage(class'XGLocalizedData'.default.GrazeHit, , SuccessfulAttackColor); + } + + // ADDED + if (m_iDamage == 0) + { + Unit.UnitSpeak('TakingFire'); + } + else // END OF ADDED + if( m_iMitigated > 0 && ShouldPlayArmorHitVO()) + { + Unit.UnitSpeak('ArmorHit'); + } + else if(m_iShielded > 0 || m_iDamage > 0) + { + Unit.UnitSpeak('TakingDamage'); + } + } + + simulated function ShowHPDamageMessage(string UIMessage, optional string CritMessage, optional EWidgetColor DisplayColor = eColor_Bad) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), UIMessage, UnitPawn.m_eTeamVisibilityFlags, , m_iDamage, 0, CritMessage, DamageTypeName == 'Psi'? eWDT_Psi : -1, DisplayColor); + } + + simulated function ShowMitigationMessage(EWidgetColor DisplayColor) + { + local int CurrentArmor; + CurrentArmor = UnitState.GetArmorMitigationForUnitFlag(); + //The flyover shows the armor amount that exists after shred has been applied. + if (CurrentArmor > 0) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XGLocalizedData'.default.ArmorMitigation, UnitPawn.m_eTeamVisibilityFlags, , CurrentArmor, /*modifier*/, /*crit*/, eWDT_Armor, DisplayColor); + } + } + + simulated function ShowShieldedMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XGLocalizedData'.default.ShieldedMessage, UnitPawn.m_eTeamVisibilityFlags, , m_iShielded,,,, DisplayColor); + } + + simulated function ShowShreddedMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XGLocalizedData'.default.ShreddedMessage, UnitPawn.m_eTeamVisibilityFlags, , m_iShredded, , , eWDT_Shred, DisplayColor); + } + + simulated function ShowImmuneMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.UnitIsImmuneMsg, UnitPawn.m_eTeamVisibilityFlags, , , , , , DisplayColor); + } + + simulated function ShowMissMessage(EWidgetColor DisplayColor) + { + local String MissedMessage; + + MissedMessage = OriginatingEffect.OverrideMissMessage; + if( MissedMessage == "" ) + { + MissedMessage = class'XLocalizedData'.default.MissedMessage; + } + + if (m_iDamage > 0) + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), MissedMessage, UnitPawn.m_eTeamVisibilityFlags, , m_iDamage,,,, DisplayColor); + else if (!OriginatingEffect.IsA('X2Effect_Persistent')) //Persistent effects that are failing to cause damage are not noteworthy. + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), MissedMessage,,,,,,, DisplayColor); + } + + simulated function ShowCounterattackMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.CounterattackMessage,,,,,,, DisplayColor); + } + + simulated function ShowLightningReflexesMessage(EWidgetColor DisplayColor) + { + local XComGameState_HeadquartersXCom XComHQ; + local XComGameStateHistory History; + local string DisplayMessageString; + + History = `XCOMHISTORY; + XComHQ = XComGameState_HeadquartersXCom(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom')); + if( XComHQ.TacticalGameplayTags.Find('DarkEvent_LightningReflexes') != INDEX_NONE ) + { + DisplayMessageString = class'XLocalizedData'.default.DarkEvent_LightningReflexesMessage; + } + else + { + DisplayMessageString = class'XLocalizedData'.default.LightningReflexesMessage; + } + + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), DisplayMessageString, , , , , , , DisplayColor); + } + + simulated function ShowUntouchableMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.UntouchableMessage,,,,,,, DisplayColor); + } + + simulated function ShowParryMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.ParryMessage,,,,,,, DisplayColor); + } + + simulated function ShowDeflectMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.DeflectMessage,,,,,,, DisplayColor); + } + + simulated function ShowReflectMessage(EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'XLocalizedData'.default.ReflectMessage,,,,,,, DisplayColor); + } + + simulated function ShowFreeKillMessage(name AbilityName, EWidgetColor DisplayColor) + { + local X2AbilityTemplate Template; + local string KillMessage; + + KillMessage = class'XLocalizedData'.default.FreeKillMessage; + + if (AbilityName != '') + { + Template = class'XComGameState_Ability'.static.GetMyTemplateManager( ).FindAbilityTemplate( AbilityName ); + if ((Template != none) && (Template.LocFlyOverText != "")) + { + KillMessage = Template.LocFlyOverText; + } + } + + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), KillMessage, , , , , , eWDT_Repeater, DisplayColor); + } + + simulated function ShowSpecialDamageMessage(DamageModifierInfo SpecialMessage, EWidgetColor DisplayColor) + { + class'UIWorldMessageMgr'.static.DamageDisplay(m_vHitLocation, Unit.GetVisualizedStateReference(), class'Helpers'.static.GetMessageFromDamageModifierInfo(SpecialMessage),,,,,, (SpecialMessage.Value > 0) ? eWDT_Shred : eWDT_Armor, DisplayColor); + } + + + simulated function ShowAttackMessages() + { + local int i, SpecialDamageIndex; + local ETeam TargetUnitTeam; + local EWidgetColor SuccessfulAttackColor, UnsuccessfulAttackColor; + + if(!class'X2TacticalVisibilityHelpers'.static.IsUnitVisibleToLocalPlayer(UnitState.ObjectId, CurrentHistoryIndex)) + return; + + TargetUnitTeam = UnitState.GetTeam(); + if( TargetUnitTeam == eTeam_XCom || TargetUnitTeam == eTeam_Resistance ) + { + SuccessfulAttackColor = eColor_Bad; + UnsuccessfulAttackColor = eColor_Good; + } + else + { + SuccessfulAttackColor = eColor_Good; + UnsuccessfulAttackColor = eColor_Bad; + } + + if (HitResults.Length == 0 && DamageResults.Length == 0 && bWasHit) + { + // Must be damage from World Effects (Fire, Poison, Acid) + ShowDamageMessage(SuccessfulAttackColor, UnsuccessfulAttackColor); + } + else + { + //It seems that misses contain a hit result but no damage results. So fill in some zero / null damage result entries if there is a mismatch. + if(HitResults.Length > DamageResults.Length) + { + for( i = 0; i < HitResults.Length; ++i ) + { + if( class'XComGameStateContext_Ability'.static.IsHitResultMiss(HitResults[i])) + { + DamageResults.Insert(i, 1); + } + } + } + + if( bCombineFlyovers ) + { + m_iDamage = 0; + m_iMitigated = 0; + m_iShielded = 0; + m_iShredded = 0; + for( i = 0; i < HitResults.Length && i < DamageResults.Length; i++ ) // some abilities damage the same target multiple times + { + if( HitResults[i] == eHit_Success ) + { + m_iDamage += DamageResults[i].DamageAmount; + m_iMitigated += DamageResults[i].MitigationAmount; + m_iShielded += DamageResults[i].ShieldHP; + m_iShredded += DamageResults[i].Shred; + } + } + + ShowDamageMessage(SuccessfulAttackColor, UnsuccessfulAttackColor); + } + else + { + for( i = 0; i < HitResults.Length && i < DamageResults.Length; i++ ) // some abilities damage the same target multiple times + { + HitResult = HitResults[i]; + + m_iDamage = DamageResults[i].DamageAmount; + m_iMitigated = DamageResults[i].MitigationAmount; + m_iShielded = DamageResults[i].ShieldHP; + m_iShredded = DamageResults[i].Shred; + + if( DamageResults[i].bFreeKill ) + { + ShowFreeKillMessage( DamageResults[i].FreeKillAbilityName, SuccessfulAttackColor); + return; + } + + for( SpecialDamageIndex = 0; SpecialDamageIndex < DamageResults[i].SpecialDamageFactors.Length; ++SpecialDamageIndex ) + { + ShowSpecialDamageMessage(DamageResults[i].SpecialDamageFactors[SpecialDamageIndex], (DamageResults[i].SpecialDamageFactors[SpecialDamageIndex].Value > 0) ? SuccessfulAttackColor : UnsuccessfulAttackColor); + } + + if (DamageResults[i].bImmuneToAllDamage) + { + ShowImmuneMessage(UnsuccessfulAttackColor); + continue; + } + + switch( HitResult ) + { + case eHit_CounterAttack: + ShowCounterattackMessage(UnsuccessfulAttackColor); + break; + case eHit_LightningReflexes: + ShowLightningReflexesMessage(UnsuccessfulAttackColor); + break; + case eHit_Untouchable: + ShowUntouchableMessage(UnsuccessfulAttackColor); + break; + case eHit_Crit: + ShowCritMessage(SuccessfulAttackColor, UnsuccessfulAttackColor); + break; + case eHit_Graze: + ShowGrazeMessage(SuccessfulAttackColor, UnsuccessfulAttackColor); + break; + case eHit_Success: + ShowDamageMessage(SuccessfulAttackColor, UnsuccessfulAttackColor); + break; + case eHit_Parry: + ShowParryMessage(UnsuccessfulAttackColor); + break; + case eHit_Deflect: + ShowDeflectMessage(UnsuccessfulAttackColor); + break; + case eHit_Reflect: + ShowReflectMessage(UnsuccessfulAttackColor); + break; + default: + ShowMissMessage(UnsuccessfulAttackColor); + break; + } + } + } + } + } + + function bool SingleProjectileVolley() + { + local XGUnit DealerUnit; + + DealerUnit = XGUnit(DamageDealer); + + if (DealerUnit == none) // if melee is treated as a single volley, treat collateral damage as a single as well. + return true; + + // Jwats: Melee doesn't have a volley so treat no volley as a single volley + return DealerUnit.GetPawn().GetAnimTreeController().GetNumProjectileVolleys() <= 1; + } + + function bool AttackersAnimUsesWeaponVolleyNotify() + { + local array OutNotifies; + local array OutNotifyTimes; + local XGUnit DealerUnit; + + DealerUnit = XGUnit(DamageDealer); + + if (DealerUnit == none) + return false; + + DealerUnit.GetPawn().GetAnimTreeController().GetFireWeaponVolleyNotifies(OutNotifies, OutNotifyTimes); + return (OutNotifies.length > 0); + } + + function DoTargetAdditiveAnims() + { + local name TargetAdditiveAnim; + local CustomAnimParams CustomAnim; + + CustomAnim.Additive = true; + foreach TargetAdditiveAnims(TargetAdditiveAnim) + { + CustomAnim.AnimName = TargetAdditiveAnim; + UnitPawn.GetAnimTreeController().PlayAdditiveDynamicAnim(CustomAnim); + } + } + + function UnDoTargetAdditiveAnims() + { + local name TargetAdditiveAnim; + local CustomAnimParams CustomAnim; + + CustomAnim.Additive = true; + CustomAnim.TargetWeight = 0.0f; + foreach TargetAdditiveAnims(TargetAdditiveAnim) + { + CustomAnim.AnimName = TargetAdditiveAnim; + UnitPawn.GetAnimTreeController().PlayAdditiveDynamicAnim(CustomAnim); + } + } + +Begin: + if (!bHiddenAction) + { + GroupState = UnitState.GetGroupMembership(); + if( GroupState != None ) + { + for( ScanGroup = 0; ScanGroup < GroupState.m_arrMembers.Length; ++ScanGroup ) + { + ScanUnit = XGUnit(`XCOMHISTORY.GetVisualizer(GroupState.m_arrMembers[ScanGroup].ObjectID)); + if( ScanUnit != None ) + { + ScanUnit.VisualizedAlertLevel = eAL_Red; + ScanUnit.IdleStateMachine.CheckForStanceUpdateOnIdle(); + } + } + } + + if( bShowFlyovers ) + { + ShowAttackMessages(); + } + + if( bWasHit || m_iDamage > 0 || m_iMitigated > 0) // misses can deal damage + { + `PRES.m_kUnitFlagManager.RespondToNewGameState(Unit, StateChangeContext.GetLastStateInInterruptChain(), true); + + // The unit was hit but may be locked in a persistent CustomIdleOverrideAnim state + // Check to see if we need to temporarily suspend that to play a reaction + OverrideOldUnitState = XComGameState_Unit(Metadata.StateObject_OldState); + bDoOverrideAnim = class'X2StatusEffects'.static.GetHighestEffectOnUnit(OverrideOldUnitState, OverridePersistentEffectTemplate, true); + + OverrideAnimEffectString = ""; + if( bDoOverrideAnim ) + { + // Allow new animations to play + UnitPawn.GetAnimTreeController().SetAllowNewAnimations(true); + OverrideAnimEffectString = string(OverridePersistentEffectTemplate.EffectName); + } + + if (ShouldPlayAnimation()) + { + // Particle effects should only play when the animation plays. mdomowicz 2015_07_08 + // Update: if the attacker's animation uses AnimNotify_FireWeaponVolley, the hit effect will play + // via X2UnifiedProjectile, so in that case we should skip the hit effect here. mdomowicz 2015_07_29 + if (!AttackersAnimUsesWeaponVolleyNotify()) + { + if( SourceUnitState != None && SourceUnitState.IsUnitAffectedByEffectName(class'X2Effect_BloodTrail'.default.EffectName) && HitResult == eHit_Success ) + { + EffectHitEffectsOverride = eHit_Crit; + } + else + { + EffectHitEffectsOverride = HitResult; + } + UnitPawn.PlayHitEffects(m_iDamage, DamageDealer, m_vHitLocation, DamageTypeName, m_vMomentum, bIsUnitRuptured, HitResult); + } + + Unit.ResetWeaponsToDefaultSockets(); + AnimParams.AnimName = ComputeAnimationToPlay(OverrideAnimEffectString); + + if( AnimParams.AnimName != '' ) + { + AnimParams.PlayRate = GetMoveAnimationSpeed(); + PlayingSequence = UnitPawn.GetAnimTreeController().PlayFullBodyDynamicAnim(AnimParams); + } + + kPerkContent = XGUnit(DamageDealer) != none ? XGUnit(DamageDealer).GetPawn().GetPerkContent(string(AbilityTemplate.Name)) : none; + if( kPerkContent != none && kPerkContent.m_PerkData.TargetActivationAnim.PlayAnimation && kPerkContent.m_PerkData.TargetActivationAnim.AdditiveAnim ) + { + AnimParams.AnimName = class'XComPerkContent'.static.ChooseAnimationForCover(Unit, kPerkContent.m_PerkData.TargetActivationAnim); + UnitPawn.GetAnimTreeController().PlayAdditiveDynamicAnim(AnimParams); + } + DoTargetAdditiveAnims(); + } + else if( bMoving && RunningAction != None ) + { + RunningAction.TriggerRunFlinch(); + } + else + { + //`LOG("HurtAnim not playing", , 'XCom_Visualization'); + } + + if( !bGoingToDeathOrKnockback && !bSkipWaitForAnim && (PlayingSequence != none)) + { + if( Metadata.VisualizeActor.CustomTimeDilation < 1.0 ) + { + Sleep(PlayingSequence.AnimSeq.SequenceLength * PlayingSequence.Rate * Metadata.VisualizeActor.CustomTimeDilation); + } + else + { + FinishAnim(PlayingSequence); + } + bShouldContinueAnim = false; + } + + if( bDoOverrideAnim ) + { + // Turn off new animation playing + UnitPawn.GetAnimTreeController().SetAllowNewAnimations(false); + } + } + else + { + if (ShouldPlayAnimation()) + { + if(bCounterAttackAnim) + { + AnimParams.AnimName = 'HL_Counterattack'; + } + else + { + Unit.ResetWeaponsToDefaultSockets(); + + if( Unit.IsTurret() ) //@TODO - rmcfall/jbouscher - this selection may need to eventually be based on other factors, such as the current state of the unit + { + if( Unit.GetTeam() == eTeam_Alien ) + { + AnimParams.AnimName = 'NO_Flinch_Advent'; + } + else + { + AnimParams.AnimName = 'NO_Flinch_Xcom'; + } + } + else if( HitResult == eHit_Deflect || HitResult == eHit_Parry ) + { + AnimParams.AnimName = 'HL_Deflect'; + if( AbilityTemplate != None && AbilityTemplate.IsMelee() ) + { + AnimParams.AnimName = 'HL_DeflectMelee'; + } + // Jwats: No matter what we were doing, we should now just idle (don't peek stop) + Unit.IdleStateMachine.OverwriteReturnState('Idle'); + } + else if( HitResult == eHit_Reflect ) + { + AnimParams.AnimName = 'HL_ReflectStart'; + } + else + { + switch( Unit.m_eCoverState ) + { + case eCS_LowLeft: + case eCS_HighLeft: + AnimParams.AnimName = 'HL_Flinch'; + break; + case eCS_LowRight: + case eCS_HighRight: + AnimParams.AnimName = 'HR_Flinch'; + break; + case eCS_None: + // Jwats: No cover randomizes between the 2 animations + if( Rand(2) == 0 ) + { + AnimParams.AnimName = 'HL_Flinch'; + } + else + { + AnimParams.AnimName = 'HR_Flinch'; + } + break; + } + } + } + + PlayingSequence = UnitPawn.GetAnimTreeController().PlayFullBodyDynamicAnim(AnimParams); + DoTargetAdditiveAnims(); + } + else if( bMoving && RunningAction != None ) + { + RunningAction.TriggerRunFlinch(); + } + else + { + //`LOG("DodgeAnim not playing"); + } + + if( !bGoingToDeathOrKnockback && (PlayingSequence != none)) + { + if( Metadata.VisualizeActor.CustomTimeDilation < 1.0 ) + { + Sleep(PlayingSequence.AnimSeq.SequenceLength * PlayingSequence.Rate * Metadata.VisualizeActor.CustomTimeDilation); + } + else + { + FinishAnim(PlayingSequence); + } + bShouldContinueAnim = false; + } + + if (!bWasCounterAttack) + { + Unit.UnitSpeak('TakingFire'); + } + } + + if( !bMoving ) + { + if( PlayingSequence != None && !bGoingToDeathOrKnockback ) + { + Sleep(0.0f); + while( bShouldContinueAnim ) + { + PlayingSequence.ReplayAnim(); + FinishAnim(PlayingSequence); + bShouldContinueAnim = false; + Sleep(0.0f); // Wait to see if another projectile comes + } + } + else if( PlayingSequence != None && bGoingToDeathOrKnockback ) + { + //Only play the hit react if there is more than one projectile volley + if( !SingleProjectileVolley() ) + { + Sleep(HitReactDelayTimeToDeath * GetDelayModifier()); // Let the hit react play for a little bit before we CompleteAction to go to death + } + } + } + } + + kPerkContent = XGUnit(DamageDealer) != none ? XGUnit(DamageDealer).GetPawn().GetPerkContent(string(AbilityTemplate.Name)) : none; + if( kPerkContent != none && kPerkContent.m_PerkData.TargetActivationAnim.PlayAnimation && kPerkContent.m_PerkData.TargetActivationAnim.AdditiveAnim ) + { + AnimParams.AnimName = class'XComPerkContent'.static.ChooseAnimationForCover(Unit, kPerkContent.m_PerkData.TargetActivationAnim); + UnitPawn.GetAnimTreeController().RemoveAdditiveDynamicAnim(AnimParams); + } + UnDoTargetAdditiveAnims(); + + CompleteAction(); +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2DownloadableContentInfo_LW_FactionBalance.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2DownloadableContentInfo_LW_FactionBalance.uc index 2c262a369..365517450 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2DownloadableContentInfo_LW_FactionBalance.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2DownloadableContentInfo_LW_FactionBalance.uc @@ -1,250 +1,313 @@ -//credit to AngelRane, NotSoLoneWolf, Udaya, and Grobobobo -class X2DownloadableContentInfo_LW_FactionBalance extends X2DownloadableContentInfo config (LW_FactionBalance); - -var config float REAPER_DETECTION_RANGE_REDUCTION; - -static event OnPostTemplatesCreated() -{ - IgnoreSuperConcealmentOnAllMissions(); - AllowTwoSoldiersFromEachFaction(); -} - -static function IgnoreSuperConcealmentOnAllMissions() -{ - local int i; - - for (i = 0; i < `TACTICALMISSIONMGR.arrMissions.length; i++) - { - `TACTICALMISSIONMGR.arrMissions[i].IgnoreSuperConcealmentDetection = true; - } -} - -//Copy pasted Realitymachina's code -static function AllowTwoSoldiersFromEachFaction() -{ - local X2RewardTemplate RewardTemplate; - local X2StrategyElementTemplateManager StratMgr; - StratMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); - - RewardTemplate = X2RewardTemplate(StratMgr.FindStrategyElementTemplate('Reward_ExtraFactionSoldier')); - - if(RewardTemplate != none) - RewardTemplate.IsRewardAvailableFn = IsExtraSoldierAvailable; -} - -static function bool IsExtraSoldierAvailable(optional XComGameState NewGameState, optional StateObjectReference AuxRef) -{ - local int NumFactionSoldiers; - local XComGameState_ResistanceFaction FactionState; - - FactionState = class'X2StrategyElement_DefaultRewards'.static.GetFactionState(NewGameState, AuxRef); - - if (FactionState != none) - NumFactionSoldiers = FactionState.GetNumFactionSoldiers(NewGameState); - else - return false; - - return (FactionState.bMetXCom && NumFactionSoldiers > 0 && NumFactionSoldiers < FactionState.default.MaxHeroesPerFaction); -} - -/// -/// This method is run if the player loads a saved game that was created prior to this DLC / Mod being installed, and allows the -/// DLC / Mod to perform custom processing in response. This will only be called once the first time a player loads a save that was -/// create without the content installed. Subsequent saves will record that the content was installed. -/// -static event OnLoadedSavedGame() -{} - -/// -/// Called when the player starts a new campaign while this DLC / Mod is installed -/// -static event InstallNewCampaign(XComGameState StartState) -{} - -static function bool AbilityTagExpandHandler(string InString, out string OutString) -{ - local name Type; - local float TempFloat; - local int TempInt; - - Type = name(InString); - switch(Type) - { - case 'FOCUS4MOBILITY': - OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4MOBILITY); - return true; - case 'FOCUS4DODGE': - OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4DODGE); - return true; - case 'FOCUS4RENDDAMAGE': - OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4RENDDAMAGE); - return true; - case 'STUNSTRIKE_STUN_CHANCE': - OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.STUNSTRIKE_STUN_CHANCE); - return true; - case 'LingeringShadowDefenseBonus': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.LINGERING_DEFENSE); - return true; - case 'LingeringShadowDodgeBonus': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.LINGERING_DODGE); - return true; - case 'BLOOD_TRAIL_ANTIDODGE_BONUS': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.BLOOD_TRAIL_ANTIDODGE_BONUS); - return true; - case 'PALE_HORSE_BASE_CRIT': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_BASE_CRIT); - return true; - case 'PALE_HORSE_PER_KILL_CRIT': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_PER_KILL_CRIT); - return true; - case 'PALE_HORSE_MAX_CRIT': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_MAX_CRIT); - return true; - case 'STING_RUPTURE': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.STING_RUPTURE); - return true; - case 'StingCharges': - OutString = string(class'X2Ability_ReaperAbilitySet'.default.StingCharges); - return true; - case 'CHARGE_BATTERY_CHARGES': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.CHARGE_BATTERY_CHARGES); - return true; - case 'RemoteStartCharges': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.REMOTE_START_CHARGES); - return true; - case 'DemolitionistExtraChargeCount': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.REMOTE_START_DEMOLITIONIST_CHARGES); - return true; - case 'DisablingShotStunActions': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.DisablingShotBaseStunActions); - return true; - case 'PARAMEDIC_BONUS_CHARGES': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.PARAMEDIC_BONUS_CHARGES); - return true; - case 'REND_THE_MARKED_CRIT': - OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.REND_THE_MARKED_CRIT); - return true; - case 'IMPERSONAL_EDGE_AIM': - OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.IMPERSONAL_EDGE_AIM); - return true; - case 'BLUESCREEN_KNIVES_PIERCE': - OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.BLUESCREEN_KNIVES_PIERCE); - return true; - case 'DisablingShotCritStunActions': - OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.DisablingShotCritStunActions); - return true; - case 'FULL_THROTTLE_DURATION': - OutString = string(class'X2LWModTemplate_SkirmisherAbilities'.default.FULL_THROTTLE_DURATION); - return true; - case 'RECKONING_LW_COOLDOWN': - OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.RECKONING_LW_COOLDOWN); - return true; - case 'RECKONING_LW_SLASH_COOLDOWN': - OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.RECKONING_LW_SLASH_COOLDOWN); - return true; - case 'REND_FLECHE_BONUS_DAMAGE_PER_TILES': - TempFloat = 1 / class'X2Ability_TemplarAbilitySet_LW'.default.BONUS_REND_DAMAGE_PER_TILE; - TempFloat = Round(TempFloat * 10.0) / 10.0; - TempInt = int(TempFloat); - if ( float(TempInt) ~= TempFloat) - { - OutString = string(TempInt); - } - else - { - OutString = Repl(string(TempFloat), "0", ""); - } - return true; - case 'MeditationFocusRecovery': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.MEDITATION_FOCUS_RECOVERY); - return true; - case 'OverchargeAimBonus': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.OVERCHARGE_AIM_BONUS); - return true; - case 'OverchargeCritBonus': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.OVERCHARGE_CRIT_BONUS); - return true; - case 'VoltDangerZoneBonus': - OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.VOLT_DANGER_ZONE_BONUS_RADIUS); - return true; - case 'ApotheosisMobilityBonus': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_MOBILITY_BONUS); - return true; - case 'ApotheosisDodgeBonus': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_DODGE_BONUS); - return true; - case 'ApotheosisDamageMultiplier': - OutString = string(int(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_DAMAGE_MULTIPLIER * 100)); - return true; - case 'DEATH_DEALER_CRIT': - OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.DEATH_DEALER_CRIT); - return true; - case 'BANISH_HIT_MOD': - OutString = string(class'X2Effect_BanishHitMod'.default.BANISH_HIT_MOD * -1); - return true; - case 'GREATER_PADDING_CV': - OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_CV); - return true; - case 'GREATER_PADDING_MG': - OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_MG); - return true; - case 'GREATER_PADDING_BM': - OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_BM); - return true; - case 'OVERRIDE_REDUCTION': - OutString = string(class'X2Effect_ManualOverride_LW'.default.OVERRIDE_REDUCTION); - return true; - case 'REFLEX_CRIT_DEF': - OutString = string(class'X2LWModTemplate_SkirmisherAbilities'.default.REFLEX_CRIT_DEF); - return true; - case 'BATTLEFIELD_AWARENESS_COOLDOWN': - OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.BATTLEFIELD_AWARENESS_COOLDOWN); - return true; - case 'JUDGEMENT_LW_APPLYCHANCE': - OutString = string(class'X2Ability_SkirmisherAbilitySet'.default.JUDGMENT_APPLYCHANCEATTACKVAL + class'X2AbilityToHitCalc_PanicCheck'.default.BaseValue); - return true; - case 'TERROR_STAT_CHECK_BASE_VALUE': - OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.TERROR_STAT_CHECK_BASE_VALUE); - return true; - } - - return false; -} - -static function bool AbilityTagExpandHandler_CH(string InString, out string OutString, Object ParseObj, Object StrategyParseOb, XComGameState GameState) -{ - local name Type; - local XComGameState_Ability AbilityState; - local X2AbilityTemplate AbilityTemplate; - local X2Effect_CloseEncounters CEEffect; - local int i; - - Type = name(InString); - switch(Type) - { - case 'CLOSE_ENCOUNTERS_RANGE': - AbilityTemplate = X2AbilityTemplate(ParseObj); - if (AbilityTemplate == none) - { - AbilityState = XComGameState_Ability(ParseObj); - if (AbilityState != none) - AbilityTemplate = AbilityState.GetMyTemplate(); - } - if (AbilityTemplate != none) - { - for (i = 0; i < AbilityTemplate.AbilityTargetEffects.Length; i++) - { - CEEffect = X2Effect_CloseEncounters(AbilityTemplate.AbilityTargetEffects[i]); - if (CEEffect != none) - { - OutString = string(CEEffect.MaxTiles); - return true; - } - } - } - OutString = string(class'X2Effect_CloseEncounters'.default.MaxTiles); - return true; - default: - return false; - } -} +//credit to AngelRane, NotSoLoneWolf, Udaya, and Grobobobo +class X2DownloadableContentInfo_LW_FactionBalance extends X2DownloadableContentInfo config (LW_FactionBalance); + +var config float REAPER_DETECTION_RANGE_REDUCTION; + +static event OnPostTemplatesCreated() +{ + IgnoreSuperConcealmentOnAllMissions(); + AllowTwoSoldiersFromEachFaction(); +} + +static function IgnoreSuperConcealmentOnAllMissions() +{ + local int i; + + for (i = 0; i < `TACTICALMISSIONMGR.arrMissions.length; i++) + { + `TACTICALMISSIONMGR.arrMissions[i].IgnoreSuperConcealmentDetection = true; + } +} + +//Copy pasted Realitymachina's code +static function AllowTwoSoldiersFromEachFaction() +{ + local X2RewardTemplate RewardTemplate; + local X2StrategyElementTemplateManager StratMgr; + StratMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + + RewardTemplate = X2RewardTemplate(StratMgr.FindStrategyElementTemplate('Reward_ExtraFactionSoldier')); + + if(RewardTemplate != none) + RewardTemplate.IsRewardAvailableFn = IsExtraSoldierAvailable; +} + +static function bool IsExtraSoldierAvailable(optional XComGameState NewGameState, optional StateObjectReference AuxRef) +{ + local int NumFactionSoldiers; + local XComGameState_ResistanceFaction FactionState; + + FactionState = class'X2StrategyElement_DefaultRewards'.static.GetFactionState(NewGameState, AuxRef); + + if (FactionState != none) + NumFactionSoldiers = FactionState.GetNumFactionSoldiers(NewGameState); + else + return false; + + return (FactionState.bMetXCom && NumFactionSoldiers > 0 && NumFactionSoldiers < FactionState.default.MaxHeroesPerFaction); +} + +/// +/// This method is run if the player loads a saved game that was created prior to this DLC / Mod being installed, and allows the +/// DLC / Mod to perform custom processing in response. This will only be called once the first time a player loads a save that was +/// create without the content installed. Subsequent saves will record that the content was installed. +/// +static event OnLoadedSavedGame() +{} + +/// +/// Called when the player starts a new campaign while this DLC / Mod is installed +/// +static event InstallNewCampaign(XComGameState StartState) +{} + +static function bool AbilityTagExpandHandler(string InString, out string OutString) +{ + local name Type; + local float TempFloat; + local int TempInt; + + Type = name(InString); + switch(Type) + { + case 'FOCUS4MOBILITY': + OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4MOBILITY); + return true; + case 'FOCUS4DODGE': + OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4DODGE); + return true; + case 'FOCUS4RENDDAMAGE': + OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.FOCUS4RENDDAMAGE); + return true; + case 'STUNSTRIKE_STUN_CHANCE': + OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.STUNSTRIKE_STUN_CHANCE); + return true; + case 'LingeringShadowDefenseBonus': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.LINGERING_DEFENSE); + return true; + case 'LingeringShadowDodgeBonus': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.LINGERING_DODGE); + return true; + case 'BLOOD_TRAIL_ANTIDODGE_BONUS': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.BLOOD_TRAIL_ANTIDODGE_BONUS); + return true; + case 'PALE_HORSE_BASE_CRIT': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_BASE_CRIT); + return true; + case 'PALE_HORSE_PER_KILL_CRIT': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_PER_KILL_CRIT); + return true; + case 'PALE_HORSE_MAX_CRIT': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.PALE_HORSE_MAX_CRIT); + return true; + case 'STING_RUPTURE': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.STING_RUPTURE); + return true; + case 'StingCharges': + OutString = string(class'X2Ability_ReaperAbilitySet'.default.StingCharges); + return true; + case 'CHARGE_BATTERY_CHARGES': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.CHARGE_BATTERY_CHARGES); + return true; + case 'RemoteStartCharges': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.REMOTE_START_CHARGES); + return true; + case 'DemolitionistExtraChargeCount': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.REMOTE_START_DEMOLITIONIST_CHARGES); + return true; + case 'DisablingShotStunActions': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.DisablingShotBaseStunActions); + return true; + case 'PARAMEDIC_BONUS_CHARGES': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.PARAMEDIC_BONUS_CHARGES); + return true; + case 'REND_THE_MARKED_CRIT': + OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.REND_THE_MARKED_CRIT); + return true; + case 'IMPERSONAL_EDGE_AIM': + OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.IMPERSONAL_EDGE_AIM); + return true; + case 'BLUESCREEN_KNIVES_PIERCE': + OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.BLUESCREEN_KNIVES_PIERCE); + return true; + case 'DisablingShotCritStunActions': + OutString = string(class'X2Ability_ReaperAbilitySet_LW'.default.DisablingShotCritStunActions); + return true; + case 'FULL_THROTTLE_DURATION': + OutString = string(class'X2LWModTemplate_SkirmisherAbilities'.default.FULL_THROTTLE_DURATION); + return true; + case 'RECKONING_LW_COOLDOWN': + OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.RECKONING_LW_COOLDOWN); + return true; + case 'RECKONING_LW_SLASH_COOLDOWN': + OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.RECKONING_LW_SLASH_COOLDOWN); + return true; + case 'REND_FLECHE_BONUS_DAMAGE_PER_TILES': + TempFloat = 1 / class'X2Ability_TemplarAbilitySet_LW'.default.BONUS_REND_DAMAGE_PER_TILE; + TempFloat = Round(TempFloat * 10.0) / 10.0; + TempInt = int(TempFloat); + if ( float(TempInt) ~= TempFloat) + { + OutString = string(TempInt); + } + else + { + OutString = Repl(string(TempFloat), "0", ""); + } + return true; + case 'MeditationFocusRecovery': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.MEDITATION_FOCUS_RECOVERY); + return true; + case 'OverchargeAimBonus': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.OVERCHARGE_AIM_BONUS); + return true; + case 'OverchargeCritBonus': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.OVERCHARGE_CRIT_BONUS); + return true; + case 'VoltDangerZoneBonus': + OutString = string(class'X2LWModTemplate_TemplarAbilities'.default.VOLT_DANGER_ZONE_BONUS_RADIUS); + return true; + case 'ApotheosisMobilityBonus': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_MOBILITY_BONUS); + return true; + case 'ApotheosisDodgeBonus': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_DODGE_BONUS); + return true; + case 'ApotheosisDamageMultiplier': + OutString = string(int(class'X2Ability_TemplarAbilitySet_LW'.default.APOTHEOSIS_DAMAGE_MULTIPLIER * 100)); + return true; + case 'DEATH_DEALER_CRIT': + OutString = string(class'X2LWModTemplate_ReaperAbilities'.default.DEATH_DEALER_CRIT); + return true; + case 'BANISH_HIT_MOD': + OutString = string(abs(class'X2Effect_BanishHitMod'.default.BANISH_HIT_MOD)); + return true; + case 'THEBANISHER_HIT_BUFF': + OutString = string(class'X2Effect_BanishHitMod'.default.THEBANISHER_HIT_BUFF); + return true; + case 'GREATER_PADDING_CV': + OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_CV); + return true; + case 'GREATER_PADDING_MG': + OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_MG); + return true; + case 'GREATER_PADDING_BM': + OutString = string(class'X2Ability_ShieldAbilitySet'.default.GREATER_PADDING_BM); + return true; + case 'OVERRIDE_REDUCTION': + OutString = string(class'X2Effect_ManualOverride_LW'.default.OVERRIDE_REDUCTION); + return true; + case 'REFLEX_CRIT_DEF': + OutString = string(class'X2LWModTemplate_SkirmisherAbilities'.default.REFLEX_CRIT_DEF); + return true; + case 'BATTLEFIELD_AWARENESS_COOLDOWN': + OutString = string(class'X2Ability_SkirmisherAbilitySet_LW'.default.BATTLEFIELD_AWARENESS_COOLDOWN); + return true; + case 'JUDGEMENT_LW_APPLYCHANCE': + OutString = string(class'X2Ability_SkirmisherAbilitySet'.default.JUDGMENT_APPLYCHANCEATTACKVAL + class'X2AbilityToHitCalc_PanicCheck'.default.BaseValue); + return true; + case 'TERROR_STAT_CHECK_BASE_VALUE': + OutString = string(class'X2Ability_TemplarAbilitySet_LW'.default.TERROR_STAT_CHECK_BASE_VALUE); + return true; + } + + return false; +} + +static function bool AbilityTagExpandHandler_CH(string InString, out string OutString, Object ParseObj, Object StrategyParseObj, XComGameState GameState) +{ + local name Type; + local XComGameState_Ability AbilityState; + local X2AbilityTemplate AbilityTemplate; + local X2Effect_CloseEncounters CEEffect; + local int i; + local XComGameStateHistory History; + local XComGameState_Effect EffectState; + local XComGameState_Unit UnitState; + + Type = name(InString); + switch(Type) + { + case 'CLOSE_ENCOUNTERS_RANGE': + AbilityTemplate = X2AbilityTemplate(ParseObj); + if (AbilityTemplate == none) + { + AbilityState = XComGameState_Ability(ParseObj); + if (AbilityState != none) + AbilityTemplate = AbilityState.GetMyTemplate(); + } + if (AbilityTemplate != none) + { + for (i = 0; i < AbilityTemplate.AbilityTargetEffects.Length; i++) + { + CEEffect = X2Effect_CloseEncounters(AbilityTemplate.AbilityTargetEffects[i]); + if (CEEffect != none) + { + OutString = string(CEEffect.MaxTiles); + return true; + } + } + } + OutString = string(class'X2Effect_CloseEncounters'.default.MaxTiles); + return true; + case 'TEMPLAR_SHIELD_TAG': + + UnitState = XComGameState_Unit(StrategyParseObj); + if (UnitState == none) + { + History = `XCOMHISTORY; + EffectState = XComGameState_Effect(ParseObj); + if (EffectState != none) + { + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(EffectState.ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + } + else + { + AbilityState = XComGameState_Ability(ParseObj); + if (AbilityState != none) + { + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(AbilityState.OwnerStateObject.ObjectID)); + } + } + } + if (UnitState == none) + return false; + + OutString = "" $ class'X2Effect_TemplarShield'.static.GetShieldStrength(UnitState, GameState) $ ""; + return true; + + default: + return false; + } +} + +static function string DLCAppendSockets(XComUnitPawn Pawn) +{ + local array NewSockets; + local SkeletalMeshSocket NewSocket; + + // ****************************************************************** + // SOUL SHOT + + // For playing the arrow particle effect when firing the soul bow + NewSocket = new class'SkeletalMeshSocket'; + NewSocket.SocketName = 'IRI_SoulBow_Arrow'; + NewSocket.BoneName = 'RHand'; + NewSocket.RelativeRotation.Pitch = -1183; + NewSocket.RelativeRotation.Yaw = -364; + NewSockets.AddItem(NewSocket); + + // For playing the "arrow stuck in body" particle effect when hit by the soul bow + NewSocket = new class'SkeletalMeshSocket'; + NewSocket.SocketName = 'IRI_SoulBow_Arrow_Hit'; + NewSocket.BoneName = 'Ribcage'; + NewSocket.RelativeRotation.Yaw = 16384; + NewSocket.RelativeRotation.Roll = -16384; + NewSockets.AddItem(NewSocket); + + // ****************************************************************** + + Pawn.Mesh.AppendSockets(NewSockets, true); + + return ""; +} diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BanishHitMod.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BanishHitMod.uc index da0c4a00f..1d3e40cfe 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BanishHitMod.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BanishHitMod.uc @@ -6,7 +6,10 @@ class X2Effect_BanishHitMod extends X2Effect_Persistent config (LW_FactionBalance); +var config int BANISH_INITIAL_HIT_MOD; var config int BANISH_HIT_MOD; +var config int BANISH_DMG_MOD; +var config int THEBANISHER_HIT_BUFF; function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit Target, XComGameState_Ability AbilityState, class ToHitType, bool bMelee, bool bFlanking, bool bIndirectFire, out array ShotModifiers) { @@ -15,14 +18,37 @@ function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit //if (Attacker.IsImpaired(false) || Attacker.IsBurning()) // return; - if (AbilityState.GetMyTemplateName() == 'SoulReaperContinue') + if (AbilityState.GetMyTemplateName() == 'SoulReaperContinue' || AbilityState.GetMyTemplateName() == 'SoulReaper') { Attacker.GetUnitValue(class'X2LWModTemplate_ReaperAbilities'.default.BanishFiredTimes, UnitValue); ShotInfo.ModType = eHit_Success; ShotInfo.Reason = FriendlyName; - ShotInfo.Value = default.BANISH_HIT_MOD * UnitValue.fValue; + ShotInfo.Value = default.BANISH_HIT_MOD * UnitValue.fValue + default.BANISH_INITIAL_HIT_MOD; + + if(Attacker.HasAbilityFromAnySource('TheBanisher_LW')) + { + ShotInfo.Value = (default.BANISH_HIT_MOD + THEBANISHER_HIT_BUFF) * UnitValue.fValue + default.BANISH_INITIAL_HIT_MOD; + } ShotModifiers.AddItem(ShotInfo); } } + +function int GetAttackingDamageModifier(XComGameState_Effect EffectState, XComGameState_Unit Attacker, Damageable TargetDamageable, XComGameState_Ability AbilityState, const out EffectAppliedData AppliedData, const int CurrentDamage, optional XComGameState NewGameState) +{ + local int DamageModifier; + local UnitValue UnitValue; + + if(AbilityState.GetMyTemplateName() != 'SoulReaperContinue' && AbilityState.GetMyTemplateName() != 'SoulReaper') + return 0; + + if(!class'XComGameStateContext_Ability'.static.IsHitResultHit(AppliedData.AbilityResultContext.HitResult)) + return 0; + + Attacker.GetUnitValue(class'X2LWModTemplate_ReaperAbilities'.default.BanishFiredTimes, UnitValue); + + DamageModifier = UnitValue.fValue * default.BANISH_DMG_MOD; + + return max(DamageModifier, (-CurrentDamage + 1)); // cap at 1 dmg +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BattlefieldAwareness.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BattlefieldAwareness.uc index 5ef45fd3f..acb419038 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BattlefieldAwareness.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_BattlefieldAwareness.uc @@ -7,6 +7,15 @@ class X2Effect_BattlefieldAwareness extends X2Effect_Persistent; function bool ChangeHitResultForTarget(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit TargetUnit, XComGameState_Ability AbilityState, bool bIsPrimaryTarget, const EAbilityHitResult CurrentResult, out EAbilityHitResult NewHitResult) { + local bool DamagingAttack; + + DamagingAttack = (X2WeaponTemplate(AbilityState.GetSourceWeapon().GetMyTemplate()).BaseDamage.Damage > 0 || X2WeaponTemplate(AbilityState.GetSourceWeapon().GetMyTemplate()).BaseDamage.PlusOne > 0); // attacking weapon + + if(Attacker.GetTeam() == eTeam_XCom && !DamagingAttack) + { + return false; + } + if (TargetUnit.IsAbleToAct()) { diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeathDealer_LW.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeathDealer_LW.uc index 3fce65e84..451bfcfb4 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeathDealer_LW.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeathDealer_LW.uc @@ -24,7 +24,7 @@ function int GetAttackingDamageModifier(XComGameState_Effect EffectState, XComGa // only add bonus damage on a crit, flanking, while in shadow if (AppliedData.AbilityResultContext.HitResult == eHit_Crit && Attacker.IsSuperConcealed() && - TargetUnit != none && class'Helpers_LW'.static.IsUnitFlankedBy(TargetUnit, Attacker)) + TargetUnit != none && (class'Helpers_LW'.static.IsUnitFlankedBy(TargetUnit, Attacker) || (!TargetUnit.CanTakeCover() && Attacker.HasAbilityFromAnySource('TheBanisher_LW')))) { SourceWeapon = AbilityState.GetSourceWeapon(); SourceWeapon.GetBaseWeaponDamageValue(none, DamageValue); diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeflectNew.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeflectNew.uc index c47cd8d53..2a0a77cc3 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeflectNew.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_DeflectNew.uc @@ -1,87 +1,87 @@ -//from AngelRane -class X2Effect_DeflectNew extends X2Effect_Persistent - config(LW_FactionBalance); - -var config int DeflectMinFocus, DeflectBaseChance, DeflectPerFocusChance; -var config int ReflectMinFocus, ReflectBaseChance; - -var config bool bCanDeflectMelee, bCanDeflectArea; - -function bool ChangeHitResultForTarget(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit TargetUnit, XComGameState_Ability AbilityState, bool bIsPrimaryTarget, const EAbilityHitResult CurrentResult, out EAbilityHitResult NewHitResult) -{ - local UnitValue ParryUnitValue; - local int FocusLevel, Chance, RandRoll; - local X2AbilityToHitCalc_StandardAim AttackToHit; - - // don't respond to reaction fire - AttackToHit = X2AbilityToHitCalc_StandardAim(AbilityState.GetMyTemplate().AbilityToHitCalc); - if (AttackToHit != none && AttackToHit.bReactionFire) - return false; - - // don't change a natural miss - if (!class'XComGameStateContext_Ability'.static.IsHitResultHit(CurrentResult)) - return false; - - if (!TargetUnit.IsAbleToAct()) - return false; - - `log("X2Effect_Deflect::ChangeHitResultForTarget", , 'XCom_HitRolls'); - // check for parry first - if the unit value is set, then a parry is guaranteed, so do not check for deflect or reflect - if (TargetUnit.HasSoldierAbility('Parry') && TargetUnit.GetUnitValue('Parry', ParryUnitValue)) - { - if (ParryUnitValue.fValue > 0) - { - // if Parry is available we will be resolving reflect there - `log("Parry is available - not triggering deflect or reflect here!", , 'XCom_HitRolls'); - return false; - } - } - - // only parry can block melee abilities, so only check non-melee abilities - if ((!AbilityState.IsMeleeAbility() || default.bCanDeflectMelee) && (bIsPrimaryTarget || default.bCanDeflectArea)) - { - FocusLevel = TargetUnit.GetTemplarFocusLevel(); - - if (FocusLevel >= default.DeflectMinFocus) - { - Chance = default.DeflectBaseChance + ((FocusLevel - 1) * default.DeflectPerFocusChance); - RandRoll = `SYNC_RAND(100); - if (RandRoll <= Chance) - { - `log("Deflect chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); - if (TargetUnit.HasSoldierAbility('Reflect') && FocusLevel >= default.ReflectMinFocus && !AbilityState.IsMeleeAbility() && bIsPrimaryTarget) - { - Chance = default.ReflectBaseChance + ((FocusLevel - 1) * default.DeflectPerFocusChance); - RandRoll = `SYNC_RAND(100); - if (RandRoll <= Chance) - { - `log("Reflect chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); - NewHitResult = eHit_Reflect; - return true; - } - `log("Reflect chance was" @ Chance @ "rolled" @ RandRoll @ "- failed. Cannot Reflect.", , 'XCom_HitRolls'); - } - `log("Unit does not have Reflect, or not enough Focus to trigger it.", , 'XCom_HitRolls'); - NewHitResult = eHit_Deflect; - return true; - } - `log("Deflect chance was" @ Chance @ "rolled" @ RandRoll @ "- failed.", , 'XCom_HitRolls'); - } - else - { - `log("Unit does not have enough focus for Deflect.", , 'XCom_HitRolls'); - } - } - else - { - `log("Ability is a melee attack or an AOE attack - cannot be Reflected or Deflected.", , 'XCom_HitRolls'); - } - - return false; -} - -DefaultProperties -{ - DuplicateResponse = eDupe_Ignore - EffectName = "Deflect" +//from AngelRane +class X2Effect_DeflectNew extends X2Effect_Persistent + config(LW_FactionBalance); + +var config int DeflectMinFocus, DeflectBaseChance, DeflectPerFocusChance; +var config int ReflectMinFocus, ReflectBaseChance; + +var config bool bCanDeflectMelee, bCanDeflectArea; + +function bool ChangeHitResultForTarget(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit TargetUnit, XComGameState_Ability AbilityState, bool bIsPrimaryTarget, const EAbilityHitResult CurrentResult, out EAbilityHitResult NewHitResult) +{ + local UnitValue ParryUnitValue; + local int FocusLevel, Chance, RandRoll; + local X2AbilityToHitCalc_StandardAim AttackToHit; + + // don't respond to reaction fire + AttackToHit = X2AbilityToHitCalc_StandardAim(AbilityState.GetMyTemplate().AbilityToHitCalc); + if (AttackToHit != none && AttackToHit.bReactionFire) + return false; + + // don't change a natural miss + if (!class'XComGameStateContext_Ability'.static.IsHitResultHit(CurrentResult)) + return false; + + if (!TargetUnit.IsAbleToAct()) + return false; + + `log("X2Effect_Deflect::ChangeHitResultForTarget", , 'XCom_HitRolls'); + // check for parry first - if the unit value is set, then a parry is guaranteed, so do not check for deflect or reflect + if (TargetUnit.HasSoldierAbility('Parry') && TargetUnit.GetUnitValue('Parry', ParryUnitValue)) + { + if (ParryUnitValue.fValue > 0) + { + // if Parry is available we will be resolving reflect there + `log("Parry is available - not triggering deflect or reflect here!", , 'XCom_HitRolls'); + return false; + } + } + + // only parry can block melee abilities, so only check non-melee abilities + if ((!AbilityState.IsMeleeAbility() || default.bCanDeflectMelee) && (bIsPrimaryTarget || default.bCanDeflectArea)) + { + FocusLevel = TargetUnit.GetTemplarFocusLevel(); + + if (FocusLevel >= default.DeflectMinFocus) + { + Chance = default.DeflectBaseChance + ((FocusLevel - 1) * default.DeflectPerFocusChance); + RandRoll = `SYNC_RAND(100); + if (RandRoll <= Chance) + { + `log("Deflect chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); + if (TargetUnit.HasSoldierAbility('Reflect') && FocusLevel >= default.ReflectMinFocus && !AbilityState.IsMeleeAbility() && bIsPrimaryTarget) + { + Chance = default.ReflectBaseChance + ((FocusLevel - 1) * default.DeflectPerFocusChance); + RandRoll = `SYNC_RAND(100); + if (RandRoll <= Chance) + { + `log("Reflect chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); + NewHitResult = eHit_Reflect; + return true; + } + `log("Reflect chance was" @ Chance @ "rolled" @ RandRoll @ "- failed. Cannot Reflect.", , 'XCom_HitRolls'); + } + `log("Unit does not have Reflect, or not enough Focus to trigger it.", , 'XCom_HitRolls'); + NewHitResult = eHit_Deflect; + return true; + } + `log("Deflect chance was" @ Chance @ "rolled" @ RandRoll @ "- failed.", , 'XCom_HitRolls'); + } + else + { + `log("Unit does not have enough focus for Deflect.", , 'XCom_HitRolls'); + } + } + else + { + `log("Ability is a melee attack or an AOE attack - cannot be Reflected or Deflected.", , 'XCom_HitRolls'); + } + + return false; +} + +DefaultProperties +{ + DuplicateResponse = eDupe_Ignore + EffectName = "Deflect" } \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_Overcharge_LW.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_Overcharge_LW.uc index 2d38bae38..3a90a61a7 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_Overcharge_LW.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_Overcharge_LW.uc @@ -15,6 +15,8 @@ function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit local ShotModifierInfo ShotInfo; local int CurrentFocus; + if(AbilityState.IsMeleeAbility()) + { CurrentFocus = Attacker.GetTemplarFocusLevel(); if (CurrentFocus > 0) @@ -28,5 +30,6 @@ function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit ShotInfo.Reason = FriendlyName; ShotInfo.Value = CritBonusPerFocus * CurrentFocus; ShotModifiers.AddItem(ShotInfo); + } } } diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_ParryNew.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_ParryNew.uc index 31e283bfb..2e662796c 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_ParryNew.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_ParryNew.uc @@ -1,50 +1,50 @@ -//from AngelRane -class X2Effect_ParryNew extends X2Effect_Persistent - config(LW_FactionBalance); - -var config int ParryReflectPerFocusChance, ParryReflectMinFocus, ParryReflectBaseChance; - -function bool ChangeHitResultForTarget(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit TargetUnit, XComGameState_Ability AbilityState, bool bIsPrimaryTarget, const EAbilityHitResult CurrentResult, out EAbilityHitResult NewHitResult) -{ - local UnitValue ParryUnitValue; - local int FocusLevel, Chance, RandRoll; - - `log("X2Effect_Parry::ChangeHitResultForTarget", , 'XCom_HitRolls'); - // check for parry - if the unit value is set, then a parry is guaranteed - if (TargetUnit.GetUnitValue('Parry', ParryUnitValue) && TargetUnit.IsAbleToAct()) - { - if (ParryUnitValue.fValue > 0) - { - if (!AbilityState.IsMeleeAbility() && bIsPrimaryTarget) - { - FocusLevel = TargetUnit.GetTemplarFocusLevel(); - - if (TargetUnit.HasSoldierAbility('Reflect') && FocusLevel >= default.ParryReflectMinFocus) - { - Chance = default.ParryReflectBaseChance + ((FocusLevel - 1) * default.ParryReflectPerFocusChance); - RandRoll = `SYNC_RAND(100); - if (RandRoll <= Chance) - { - `log("Reflect on Parry chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); - NewHitResult = eHit_Reflect; - TargetUnit.SetUnitFloatValue('Parry', ParryUnitValue.fValue - 1); - return true; - } - } - } - `log("Parry available - using!", , 'XCom_HitRolls'); - NewHitResult = eHit_Parry; - TargetUnit.SetUnitFloatValue('Parry', ParryUnitValue.fValue - 1); - return true; - } - } - - `log("Parry not available.", , 'XCom_HitRolls'); - return false; -} - -DefaultProperties -{ - DuplicateResponse = eDupe_Ignore - EffectName = "Parry" +//from AngelRane +class X2Effect_ParryNew extends X2Effect_Persistent + config(LW_FactionBalance); + +var config int ParryReflectPerFocusChance, ParryReflectMinFocus, ParryReflectBaseChance; + +function bool ChangeHitResultForTarget(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit TargetUnit, XComGameState_Ability AbilityState, bool bIsPrimaryTarget, const EAbilityHitResult CurrentResult, out EAbilityHitResult NewHitResult) +{ + local UnitValue ParryUnitValue; + local int FocusLevel, Chance, RandRoll; + + `log("X2Effect_Parry::ChangeHitResultForTarget", , 'XCom_HitRolls'); + // check for parry - if the unit value is set, then a parry is guaranteed + if (TargetUnit.GetUnitValue('Parry', ParryUnitValue) && TargetUnit.IsAbleToAct()) + { + if (ParryUnitValue.fValue > 0) + { + if (!AbilityState.IsMeleeAbility() && bIsPrimaryTarget) + { + FocusLevel = TargetUnit.GetTemplarFocusLevel(); + + if (TargetUnit.HasSoldierAbility('Reflect') && FocusLevel >= default.ParryReflectMinFocus) + { + Chance = default.ParryReflectBaseChance + ((FocusLevel - 1) * default.ParryReflectPerFocusChance); + RandRoll = `SYNC_RAND(100); + if (RandRoll <= Chance) + { + `log("Reflect on Parry chance was" @ Chance @ "rolled" @ RandRoll @ "- success!", , 'XCom_HitRolls'); + NewHitResult = eHit_Reflect; + TargetUnit.SetUnitFloatValue('Parry', ParryUnitValue.fValue - 1); + return true; + } + } + } + `log("Parry available - using!", , 'XCom_HitRolls'); + NewHitResult = eHit_Parry; + TargetUnit.SetUnitFloatValue('Parry', ParryUnitValue.fValue - 1); + return true; + } + } + + `log("Parry not available.", , 'XCom_HitRolls'); + return false; +} + +DefaultProperties +{ + DuplicateResponse = eDupe_Ignore + EffectName = "Parry" } \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_SoulShot_ArrowHit.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_SoulShot_ArrowHit.uc new file mode 100644 index 000000000..548e26180 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_SoulShot_ArrowHit.uc @@ -0,0 +1,20 @@ +class X2Effect_SoulShot_ArrowHit extends X2Effect; + +// If target is killed by the attack that applied this effect, play a particle effect on the target that will spawn an arrow stuck in its chest. + +simulated function AddX2ActionsForVisualization(XComGameState VisualizeGameState, out VisualizationActionMetadata ActionMetadata, const name EffectApplyResult) +{ + local X2Action_PlayEffect EffectAction; + local XComGameState_Unit UnitState; + + UnitState = XComGameState_Unit(ActionMetadata.StateObject_NewState); + + if (EffectApplyResult == 'AA_Success' && UnitState != none && UnitState.IsDead()) + { + EffectAction = X2Action_PlayEffect(class'X2Action_PlayEffect'.static.AddToVisualizationTree(ActionMetadata, VisualizeGameState.GetContext())); + EffectAction.EffectName = "IRISoulShotPerk.PS_Arrow_Persistent"; + EffectAction.AttachToUnit = true; + EffectAction.AttachToSocketName = 'IRI_SoulBow_Arrow_Hit'; + EffectAction.AttachToSocketsArrayName = 'BoneSocketActor'; + } +} diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShield.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShield.uc new file mode 100644 index 000000000..24f23a65a --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShield.uc @@ -0,0 +1,542 @@ +class X2Effect_TemplarShield extends X2Effect_EnergyShield; + +simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) +{ + local XComGameState_Unit UnitState; + local int ShieldStrength; + + UnitState = XComGameState_Unit(kNewTargetState); + ShieldStrength = GetShieldStrength(UnitState, NewGameState); + if (UnitState != none) + { + m_aStatChanges.Length = 0; + AddPersistentStatChange(eStat_ShieldHP, ShieldStrength); + } + + UnitState.SetUnitFloatValue('TemplarShieldHP', ShieldStrength, eCleanup_BeginTactical); + UnitState.SetUnitFloatValue('PreTemplarShieldHP', UnitState.GetCurrentStat(eStat_ShieldHP), eCleanup_BeginTactical); + + super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); +} + +simulated function OnEffectRemoved(const out EffectAppliedData ApplyEffectParameters, XComGameState NewGameState, bool bCleansed, XComGameState_Effect RemovedEffectState) +{ + local int TemplarGrantedShieldHP, PreTemplarShieldHP, PreRemovalShieldHP, FullyShieldedHP, ShieldHPDamage, NewShieldHP; + local XComGameState_Unit UnitState; + local UnitValue TemplarShieldShieldHP, OtherShieldHP; + + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + PreRemovalShieldHP = UnitState.GetCurrentStat(eStat_ShieldHP); + + super.OnEffectRemoved(ApplyEffectParameters, NewGameState, bCleansed, RemovedEffectState); + + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + UnitState.GetUnitValue('TemplarShieldHP', TemplarShieldShieldHP); + UnitState.GetUnitValue('PreTemplarShieldHP', OtherShieldHP); + TemplarGrantedShieldHP = int(TemplarShieldShieldHP.fValue); // How many you got + PreTemplarShieldHP = int(OtherShieldHP.fValue); // how many you had + FullyShieldedHP = PreTemplarShieldHP + TemplarGrantedShieldHP; + //ShieldHP = UnitState.GetCurrentStat(eStat_ShieldHP); // how many you have now + + ShieldHPDamage = FullyShieldedHP - PreRemovalShieldHP; + if (ShieldHPDamage > 0 && PreTemplarShieldHP > 0 && ShieldHPDamage < FullyShieldedHP) + { + NewShieldHP = Clamp(PreTemplarShieldHP + TemplarGrantedShieldHP - ShieldHPDamage, 0, PreTemplarShieldHP); + UnitState = XComGameState_Unit(NewGameState.CreateStateObject(UnitState.Class, UnitState.ObjectID)); + UnitState.SetCurrentStat(estat_ShieldHP, NewShieldHP); + NewGameState.AddStateObject(UnitState); + } +} + +private function OnShieldRemoved_BuildVisualization(XComGameState VisualizeGameState, out VisualizationActionMetadata ActionMetadata, const name EffectApplyResult) +{ + local X2Action_PlayAnimation PlayAnimation; + local XGUnit Unit; + local XComUnitPawn UnitPawn; + + // Exit if the effect did not expire naturally. + // We don't want the animation to play here if the effect was removed by damage, visualization for that is handled elsewhere. + if (XComGameStateContext_TickEffect(VisualizeGameState.GetContext()) == none) + return; + + Unit = XGUnit(ActionMetadata.VisualizeActor); + if (Unit != none && Unit.IsAlive()) + { + UnitPawn = Unit.GetPawn(); + if (UnitPawn != none && UnitPawn.GetAnimTreeController().CanPlayAnimation('HL_Shield_Fold')) + { + PlayAnimation = X2Action_PlayAnimation(class'X2Action_PlayAnimation'.static.AddToVisualizationTree(ActionMetadata, VisualizeGameState.GetContext(), false, ActionMetadata.LastActionAdded)); + PlayAnimation.Params.AnimName = 'HL_Shield_Fold'; + PlayAnimation.Params.BlendTime = 0.3f; + } + } +} + +static final function bool WasUnitFullyProtected(const XComGameState_Unit OldUnitState, const XComGameState_Unit NewUnitState) +{ + local UnitValue PreAblativeValue; + + NewUnitState.GetUnitValue('PreTemplarShieldHP',PreAblativeValue); + + //`LOG(GetFuncName() @ OldUnitState.GetFullName(),, 'TemplarParryRework'); + //`LOG("Old HP:" @ OldUnitState.GetCurrentStat(eStat_HP),, 'TemplarParryRework'); + //`LOG("New HP:" @ NewUnitState.GetCurrentStat(eStat_HP),, 'TemplarParryRework'); + //`LOG("Unit fully protected:" @ NewUnitState.GetCurrentStat(eStat_HP) >= OldUnitState.GetCurrentStat(eStat_HP),, 'TemplarParryRework'); + + // Bleeding out check is required, because if the unit had 1 HP before the attack that made them start bleeding out, they will still have 1 HP while bleeding out. + return NewUnitState.GetCurrentStat(eStat_HP) >= OldUnitState.GetCurrentStat(eStat_HP) && !NewUnitState.IsBleedingOut() && NewUnitState.GetCurrentStat(eStat_ShieldHP) >= PreAblativeValue.fvalue; +} + +static final function bool WasShieldFullyConsumed(const XComGameState_Unit OldUnitState, const XComGameState_Unit NewUnitState) +{ + local UnitValue PreAblativeValue; + + NewUnitState.GetUnitValue('PreTemplarShieldHP',PreAblativeValue); + + return NewUnitState.GetCurrentStat(eStat_ShieldHP) <= PreAblativeValue.fvalue; +} + +static final function int GetShieldStrength(const XComGameState_Unit UnitState, XComGameState CheckGameState) +{ + local XComGameState_Item ItemState; + local X2WeaponTemplate WeaponTemplate; + local int Index; + + ItemState = UnitState.GetItemInSlot(eInvSlot_PrimaryWeapon, CheckGameState); + if (ItemState == none) + return 0; + + WeaponTemplate = X2WeaponTemplate(ItemState.GetMyTemplate()); + if (WeaponTemplate == none) + return 0; + + Index = WeaponTemplate.ExtraDamage.Find('Tag', 'IRI_TemplarShield'); + if (Index == INDEX_NONE) + return 0; + + return WeaponTemplate.ExtraDamage[Index].Damage; +} + + +function RegisterForEvents(XComGameState_Effect EffectGameState) +{ + local X2EventManager EventMgr; + local Object EffectObj; + + super.RegisterForEvents(EffectGameState); + + EventMgr = `XEVENTMGR; + EffectObj = EffectGameState; + + EventMgr.RegisterForEvent(EffectObj, 'OverrideHitEffects', TemplarShield_OnOverrideHitEffects, ELD_Immediate, 40); + EventMgr.RegisterForEvent(EffectObj, 'OverrideMetaHitEffect', TemplarShield_OnOverrideMetaHitEffect, ELD_Immediate, 40); + + // Has to be ELD_Immediate so that we can get the target Unit State from History before the ability has gone through and see if it had the Templar Shield effect. + EventMgr.RegisterForEvent(EffectObj, 'AbilityActivated', TemplarShield_OnAbilityActivated, ELD_Immediate, 50, /*pre filter object*/,, /* callback data*/); +} + + +// Requires CHL Issue #1114 - create psionic flashes when projectiles hit the shield. +private static function EventListenerReturn TemplarShield_OnOverrideHitEffects(Object EventData, Object EventSource, XComGameState NullGameState, Name Event, Object CallbackData) +{ + local XComUnitPawn Pawn; + local XComLWTuple Tuple; + local XComAnimTreeController AnimTreeController; + + Pawn = XComUnitPawn(EventSource); + if (Pawn == none) + return ELR_NoInterrupt; + + AnimTreeController = Pawn.GetAnimTreeController(); + if (AnimTreeController == none) + return ELR_NoInterrupt; + + // If the pawn is currently playing one of these animations, it means the psionic shield is absorbing projectiles, + // and the unit is not being wounded. + if (AnimTreeController.IsPlayingCurrentAnimation('HL_Shield_Absorb') || + AnimTreeController.IsPlayingCurrentAnimation('HL_Shield_AbsorbAndFold')) + { + Tuple = XComLWTuple(EventData); + if (Tuple == none) + return ELR_NoInterrupt; + + Tuple.Data[0].b = false; // Setting to *not* override the Hit Effect, cuz we want it to play. + // Just in case some other listener disabled it. + Tuple.Data[7].i = eHit_Reflect; // HitResult - Using eHit_Reflect to make hit effects spawn on the left hand. Purely visual change and only for this Hit Effect. + } + + return ELR_NoInterrupt; +} + +// Requires CHL Issue #1116 - remove blood gushing out of the target unit when projectiles hit the shield. +private static function EventListenerReturn TemplarShield_OnOverrideMetaHitEffect(Object EventData, Object EventSource, XComGameState NullGameState, Name Event, Object CallbackData) +{ + local XComUnitPawn Pawn; + local XComLWTuple Tuple; + local XComAnimTreeController AnimTreeController; + + Pawn = XComUnitPawn(EventSource); + if (Pawn == none) + return ELR_NoInterrupt; + + AnimTreeController = Pawn.GetAnimTreeController(); + if (AnimTreeController == none) + return ELR_NoInterrupt; + + if (AnimTreeController.IsPlayingCurrentAnimation('HL_Shield_Absorb') || + AnimTreeController.IsPlayingCurrentAnimation('HL_Shield_AbsorbAndFold')) + { + Tuple = XComLWTuple(EventData); + if (Tuple == none) + return ELR_NoInterrupt; + + Tuple.Data[0].b = false; + Tuple.Data[5].i = eHit_Reflect; + } + + return ELR_NoInterrupt; +} + +private static function EventListenerReturn TemplarShield_OnAbilityActivated(Object EventData, Object EventSource, XComGameState NewGameState, Name Event, Object CallbackData) +{ + local XComGameStateContext_Ability AbilityContext; + local XComGameState_Unit TargetUnit; + local StateObjectReference UnitRef; + local XComGameStateHistory History; + + AbilityContext = XComGameStateContext_Ability(NewGameState.GetContext()); + if (AbilityContext == none || AbilityContext.InterruptionStatus == eInterruptionStatus_Interrupt) + return ELR_NoInterrupt; + + // Insert a Post Build Vis delegate whenever an ability targets a unit affected by Templar Shield + + History = `XCOMHISTORY; + + TargetUnit = XComGameState_Unit(History.GetGameStateForObjectID(AbilityContext.InputContext.PrimaryTarget.ObjectID)); + if (TargetUnit != none && TargetUnit.IsUnitAffectedByEffectName(class'X2Effect_TemplarShield'.default.EffectName)) + { + if (AbilityContext.PostBuildVisualizationFn.Find(ReplaceHitAnimation_PostBuildVis) == INDEX_NONE) + { + AbilityContext.PostBuildVisualizationFn.AddItem(ReplaceHitAnimation_PostBuildVis); + } + } + else + { + foreach AbilityContext.InputContext.MultiTargets(UnitRef) + { + TargetUnit = XComGameState_Unit(History.GetGameStateForObjectID(UnitRef.ObjectID)); + if (TargetUnit != none && TargetUnit.IsUnitAffectedByEffectName(class'X2Effect_TemplarShield'.default.EffectName)) + { + if (AbilityContext.PostBuildVisualizationFn.Find(ReplaceHitAnimation_PostBuildVis) == INDEX_NONE) + { + AbilityContext.PostBuildVisualizationFn.AddItem(ReplaceHitAnimation_PostBuildVis); + } + break; + } + } + } + + return ELR_NoInterrupt; +} + +// This function alters the visualization tree for units affected by the Templar Shield effect when they are attacked. +private static function ReplaceHitAnimation_PostBuildVis(XComGameState VisualizeGameState) +{ + local XComGameStateContext_Ability AbilityContext; + local XComGameStateVisualizationMgr VisMgr; + local array FindActions; + local X2Action FindAction; + local X2Action ChildAction; + local VisualizationActionMetadata ActionMetadata; + local XComGameState_Unit OldUnitState; + local XComGameState_Unit NewUnitState; + local X2Action_ApplyWeaponDamageToUnit DamageAction; + local X2Action_PlayAnimation AdditionalAnimationAction; + local X2Action_TemplarShield_ApplyWeaponDamageToUnit ReplaceAction; + local X2Action_MarkerNamed EmptyAction; + local X2Action ParentAction; + local array ExitCoverActions; + local array ExitCoverParentActions; + local array FireActions; + local X2Action_PlayAnimation PlayAnimation; + local name InputEvent; + local X2Action_MoveTurn MoveTurnAction; + local XComGameState_Unit SourceUnit; + local XComGameState_Ability AbilityState; + local array HandledUnits; + local X2AbilityTemplate AbilityTemplate; + local XComGameStateHistory History; + local X2Action CycleAction; + local X2Action_TimedWait TimedWait; + local bool bGrenadeLikeAbility; + local bool bAreaTargetedAbility; + local X2Action_WaitForAnotherAction WaitForAction; + local array WaitForActions; + local array DamageUnitActions; + + AbilityContext = XComGameStateContext_Ability(VisualizeGameState.GetContext()); + if (AbilityContext == none) + return; + + History = `XCOMHISTORY; + AbilityState = XComGameState_Ability(History.GetGameStateForObjectID(AbilityContext.InputContext.AbilityRef.ObjectID)); + if (AbilityState == none) + return; + + AbilityTemplate = AbilityState.GetMyTemplate(); + if (AbilityTemplate == none) + return; + + SourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(AbilityContext.InputContext.SourceObject.ObjectID)); + if (SourceUnit == none) + return; + + if (AbilityContext.InputContext.TargetLocations.Length > 0 && ClassIsChildOf(AbilityTemplate.TargetingMethod, class'X2TargetingMethod_Grenade')) + { + bAreaTargetedAbility = true; + bGrenadeLikeAbility = AbilityTemplate.TargetingMethod.static.UseGrenadePath(); + } + + // Cycle through all Damage Unit actions created by the ability. If the ability affected multiple units, all of them will be covered. + // This is a bit noodly. Rather than cycling through units present in this game state, or getting them from the game state by their ObjectID recorded in Context, + // we iterate over Damage Unit actions directly, since ultimately this is what we need to interact with. + VisMgr = `XCOMVISUALIZATIONMGR; + VisMgr.GetNodesOfType(VisMgr.BuildVisTree, class'X2Action_ApplyWeaponDamageToUnit', FindActions); + foreach FindActions(FindAction) + { + ActionMetadata = FindAction.Metadata; + OldUnitState = XComGameState_Unit(ActionMetadata.StateObject_OldState); // Unit State as it was before they were hit by the attack. + NewUnitState = XComGameState_Unit(ActionMetadata.StateObject_NewState); + + if (OldUnitState == none || NewUnitState == none || HandledUnits.Find(OldUnitState.ObjectID) != INDEX_NONE) + continue; + + HandledUnits.AddItem(OldUnitState.ObjectID); // Use a tracking array to make sure each unit's visualization is adjusted only once. + + if (!OldUnitState.IsUnitAffectedByEffectName(class'X2Effect_TemplarShield'.default.EffectName)) // Check the old unit state specifically, as the attack could have removed the effect from the target. + continue; + + // Gather various action arrays we will need. + DamageAction = X2Action_ApplyWeaponDamageToUnit(FindAction); + + // We might need all Damage Unit actions relevant to this unit later. + DamageUnitActions.Length = 0; + VisMgr.GetNodesOfType(VisMgr.BuildVisTree, class'X2Action_ApplyWeaponDamageToUnit', DamageUnitActions,, OldUnitState.ObjectID); + + // Parents of the Damage Unit action are Fire Actions (normally should be only one) + FireActions = DamageAction.ParentActions; + + // Parents of the Fire Action are Exit Cover Actions (normally should be only one) + ExitCoverActions.Length = 0; + foreach FireActions(CycleAction) + { + foreach CycleAction.ParentActions(ParentAction) + { + ExitCoverActions.AddItem(ParentAction); + } + } + ExitCoverParentActions.Length = 0; + foreach ExitCoverActions(CycleAction) + { + foreach CycleAction.ParentActions(ParentAction) + { + ExitCoverParentActions.AddItem(ParentAction); + } + } + + // #1. START. Insert a Move Turn action to force the target unit to face the danger. + if (bAreaTargetedAbility) // If the ability is area-targeted, like a grenade throw, then face the target location (the epicenter of the explosion) + { + MoveTurnAction = X2Action_MoveTurn(class'X2Action_MoveTurn'.static.AddToVisualizationTree(ActionMetadata, AbilityContext, false,, ExitCoverParentActions)); + MoveTurnAction.m_vFacePoint = AbilityContext.InputContext.TargetLocations[0]; + } + else // Otherwise face the attacker. + { // In this case Move Turn action is specifically inserted between Exit Cover's parents and Exit Cover itself, + // so Exit Cover won't begin playing until Move Turn action finishes. + // This is necessary because some Fire Actions take very little time between the Fire Action starting and damage hitting the target, + // so we have to make sure the target unit is already facing the source when the Fire Action begins. + MoveTurnAction = X2Action_MoveTurn(class'X2Action_MoveTurn'.static.AddToVisualizationTree(ActionMetadata, AbilityContext, true,, ExitCoverParentActions)); + MoveTurnAction.m_vFacePoint = `XWORLD.GetPositionFromTileCoordinates(SourceUnit.TileLocation); + } + + // Keep the target unit's visualizer occupied after turning is finished and until Exit Cover begins. This is done to prevent Idle State Machine from turning the unit away. + WaitForActions.Length = 0; + foreach ExitCoverActions(CycleAction) + { + WaitForAction = X2Action_WaitForAnotherAction(class'X2Action_WaitForAnotherAction'.static.AddToVisualizationTree(ActionMetadata, AbilityContext, false, MoveTurnAction)); + WaitForAction.ActionToWaitFor = CycleAction; + WaitForActions.AddItem(WaitForAction); + } + // #1. END. + + // #2. START. Insert a Play Animation action for "unit shields themselves from the attack" animation. + // If this ability uses a grenade path, it may take a while for the projectile to arrive to the target, so delay the animation action by amount of time that scales with distance between them. + // For the animation to look smooth, at least 0.25 seconds must pass between Additional Animation starting playing and projectiles hitting the target, + // but no more than 2 seconds, as shield is put away at that point. + // Grenade takes 1.5 seconds to fly 10 tiles and explode after being thrown, though this doesn't take throw animation time into account. + // This delay is added on top of the variable amount of time required for the Move Turn action. + if (bGrenadeLikeAbility) + { + //`LOG("Ability uses grenade path, inserting delay action for:" @ 0.05f * SourceUnit.TileDistanceBetween(NewUnitState) @ "seconds.",, 'TemplarParryRework'); + TimedWait = X2Action_TimedWait(class'X2Action_TimedWait'.static.AddToVisualizationTree(ActionMetadata, AbilityContext, false,, WaitForActions)); + TimedWait.DelayTimeSec = 0.075f * SourceUnit.TileDistanceBetween(NewUnitState); // So 0.75 second delay at 10 tile distance. + + AdditionalAnimationAction = X2Action_PlayAnimation(class'X2Action_PlayAnimation'.static.AddToVisualizationTree(ActionMetadata, AbilityContext,, TimedWait)); + } + else + { + AdditionalAnimationAction = X2Action_PlayAnimation(class'X2Action_PlayAnimation'.static.AddToVisualizationTree(ActionMetadata, AbilityContext,,, WaitForActions)); + } + AdditionalAnimationAction.Params.AnimName = 'HL_Shield_Absorb'; + + // Make child actions of the original Damage Unit action become children of the animation action. + foreach DamageAction.ChildActions(ChildAction) + { + VisMgr.ConnectAction(ChildAction, VisMgr.BuildVisTree, false, AdditionalAnimationAction); + } + // #2. END + + // If the attack missed, we stop here. + // Note: this may need to be adjusted, because grazes count as a hit. + if (!WasUnitHit(AbilityContext, OldUnitState.ObjectID)) + { + continue; + } + + // #3. START. + // If the unit did not receive health damage during this attack (i.e. shield took all the damage), then we don't need this unit to play any "unit was hit" animations. + // So we replace all original Damage Unit actions for this unit with a custom version that does not play any animations, + // and it also plays a different voiceover, since the attack, even if it damages shield HP, doesn't have a negative effect on the soldier. + // Otherwise it functions identically and can do stuff like showing flyover. + if (class'X2Effect_TemplarShield'.static.WasUnitFullyProtected(OldUnitState, NewUnitState)) + { + foreach DamageUnitActions(CycleAction) + { + DamageAction = X2Action_ApplyWeaponDamageToUnit(CycleAction); + ReplaceAction = X2Action_TemplarShield_ApplyWeaponDamageToUnit(class'X2Action_TemplarShield_ApplyWeaponDamageToUnit'.static.AddToVisualizationTree(ActionMetadata, AbilityContext,,, DamageAction.ParentActions)); + CopyActionProperties(ReplaceAction, DamageAction); + + foreach DamageAction.ChildActions(ChildAction) + { + VisMgr.ConnectAction(ChildAction, VisMgr.BuildVisTree, false, ReplaceAction); + } + + // Nuke the original action out of the tree. + EmptyAction = X2Action_MarkerNamed(class'X2Action'.static.CreateVisualizationActionClass(class'X2Action_MarkerNamed', DamageAction.StateChangeContext)); + EmptyAction.SetName("ReplaceDamageUnitAction"); + VisMgr.ReplaceNode(EmptyAction, DamageAction); + } + + // If unit didn't take any damage, but the shield was fully depleted by the attack, then play a different "absorb damage" animation that puts the shield away at the end. + if (class'X2Effect_TemplarShield'.static.WasShieldFullyConsumed(OldUnitState, NewUnitState)) + { + AdditionalAnimationAction.Params.AnimName = 'HL_Shield_AbsorbAndFold'; + } + } + else if (class'X2Effect_TemplarShield'.static.WasShieldFullyConsumed(OldUnitState, NewUnitState)) + { + // If the unit did in fact take some health damage despite being shielded (i.e. damage broke through the shield), + // Then we keep the original Damage Unit action in the tree. Its "unit hit" animation will interrupt the "absorb damage" animation from the additional action + // whenever the attack connects with the unit. + // We check the shield is actually gone, because the additive animation will stop the particle effect, hiding the shield from the unit. + // In theory the unit can take health damage without the shield being broken. + + // Play an additive animation with particle effects of the shield blowing up at the same time as the unit being hit. + PlayAnimation = X2Action_PlayAnimation(class'X2Action_PlayAnimation'.static.AddToVisualizationTree(ActionMetadata, AbilityContext,,, FireActions)); + PlayAnimation.Params.AnimName = 'ADD_Shield_Explode'; + PlayAnimation.Params.Additive = true; + + // Make this additive animation respond to the same input events as the damage action, so it plays when projectiles hit the unit. + PlayAnimation.ClearInputEvents(); + foreach DamageAction.InputEventIDs(InputEvent) + { + PlayAnimation.AddInputEvent(InputEvent); + } + + foreach DamageAction.ChildActions(ChildAction) + { + VisMgr.ConnectAction(ChildAction, VisMgr.BuildVisTree, false, PlayAnimation); + } + } + // #3. END + } +} + +// X2Action::Init() runs right before action starts playing, so we can't get this info from the action itself. +private static function bool WasUnitHit(const XComGameStateContext_Ability AbilityContext, const int ObjectID) +{ + local int Index; + + if (AbilityContext.InputContext.PrimaryTarget.ObjectID == ObjectID) + { + return AbilityContext.IsResultContextHit(); + } + + Index = AbilityContext.InputContext.MultiTargets.Find('ObjectID', ObjectID); + if (Index != INDEX_NONE) + { + return AbilityContext.IsResultContextMultiHit(Index); + } + return false; +} + +private static function CopyActionProperties(out X2Action_TemplarShield_ApplyWeaponDamageToUnit ReplaceAction, out X2Action_ApplyWeaponDamageToUnit DamageAction) +{ + ReplaceAction.AbilityTemplate = DamageAction.AbilityTemplate; + ReplaceAction.DamageDealer = DamageAction.DamageDealer; + ReplaceAction.SourceUnitState = DamageAction.SourceUnitState; + ReplaceAction.m_iDamage = DamageAction.m_iDamage; + ReplaceAction.m_iMitigated = DamageAction.m_iMitigated; + ReplaceAction.m_iShielded = DamageAction.m_iShielded; + ReplaceAction.m_iShredded = DamageAction.m_iShredded; + ReplaceAction.DamageResults = DamageAction.DamageResults; + ReplaceAction.HitResults = DamageAction.HitResults; + ReplaceAction.DamageTypeName = DamageAction.DamageTypeName; + ReplaceAction.m_vHitLocation = DamageAction.m_vHitLocation; + ReplaceAction.m_vMomentum = DamageAction.m_vMomentum; + ReplaceAction.bGoingToDeathOrKnockback = DamageAction.bGoingToDeathOrKnockback; + ReplaceAction.bWasHit = DamageAction.bWasHit; + ReplaceAction.bWasCounterAttack = DamageAction.bWasCounterAttack; + ReplaceAction.bCounterAttackAnim = DamageAction.bCounterAttackAnim; + ReplaceAction.AbilityContext = DamageAction.AbilityContext; + ReplaceAction.AnimParams = DamageAction.AnimParams; + ReplaceAction.HitResult = DamageAction.HitResult; + ReplaceAction.TickContext = DamageAction.TickContext; + ReplaceAction.AreaDamageContext = DamageAction.AreaDamageContext; + ReplaceAction.FallingContext = DamageAction.FallingContext; + ReplaceAction.WorldEffectsContext = DamageAction.WorldEffectsContext; + ReplaceAction.TickIndex = DamageAction.TickIndex; + ReplaceAction.PlayingSequence = DamageAction.PlayingSequence; + ReplaceAction.OriginatingEffect = DamageAction.OriginatingEffect; + ReplaceAction.AncestorEffect = DamageAction.AncestorEffect; + ReplaceAction.bHiddenAction = DamageAction.bHiddenAction; + ReplaceAction.CounterAttackTargetRef = DamageAction.CounterAttackTargetRef; + ReplaceAction.bDoOverrideAnim = DamageAction.bDoOverrideAnim; + ReplaceAction.OverrideOldUnitState = DamageAction.OverrideOldUnitState; + ReplaceAction.OverridePersistentEffectTemplate = DamageAction.OverridePersistentEffectTemplate; + ReplaceAction.OverrideAnimEffectString = DamageAction.OverrideAnimEffectString; + ReplaceAction.bPlayDamageAnim = DamageAction.bPlayDamageAnim; + ReplaceAction.bIsUnitRuptured = DamageAction.bIsUnitRuptured; + ReplaceAction.bShouldContinueAnim = DamageAction.bShouldContinueAnim; + ReplaceAction.bMoving = DamageAction.bMoving; + ReplaceAction.bSkipWaitForAnim = DamageAction.bSkipWaitForAnim; + ReplaceAction.RunningAction = DamageAction.RunningAction; + ReplaceAction.HitReactDelayTimeToDeath = DamageAction.HitReactDelayTimeToDeath; + ReplaceAction.UnitState = DamageAction.UnitState; + ReplaceAction.GroupState = DamageAction.GroupState; + ReplaceAction.ScanGroup = DamageAction.ScanGroup; + ReplaceAction.ScanUnit = DamageAction.ScanUnit; + ReplaceAction.kPerkContent = DamageAction.kPerkContent; + ReplaceAction.TargetAdditiveAnims = DamageAction.TargetAdditiveAnims; + ReplaceAction.bShowFlyovers = DamageAction.bShowFlyovers; + ReplaceAction.bCombineFlyovers = DamageAction.bCombineFlyovers; + ReplaceAction.EffectHitEffectsOverride = DamageAction.EffectHitEffectsOverride; + ReplaceAction.CounterattackedAction = DamageAction.CounterattackedAction; +} + + +defaultproperties +{ + EffectName = "IRI_TemplarShield_Effect" + EffectRemovedVisualizationFn = OnShieldRemoved_BuildVisualization +} diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldAnimations.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldAnimations.uc new file mode 100644 index 000000000..7cc094c74 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldAnimations.uc @@ -0,0 +1,23 @@ +class X2Effect_TemplarShieldAnimations extends X2Effect_AdditionalAnimSets; + +// A version of Additional AnimSet effects that is set up to remove itself whenever the unit's Shield HP is exhausted. + +function RegisterForEvents(XComGameState_Effect EffectGameState) +{ + local X2EventManager EventMgr; + local XComGameState_Unit UnitState; + local Object EffectObj; + + EventMgr = `XEVENTMGR; + + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(EffectGameState.ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + EffectObj = EffectGameState; + + EventMgr.RegisterForEvent(EffectObj, 'ShieldsExpended', EffectGameState.OnShieldsExpended, ELD_OnStateSubmitted, , UnitState); +} + +defaultproperties +{ + EffectName = "IRI_X2Effect_TemplarShieldAnimations" + DuplicateResponse = eDupe_Ignore +} diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldCritDefense.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldCritDefense.uc new file mode 100644 index 000000000..2884adfc8 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2Effect_TemplarShieldCritDefense.uc @@ -0,0 +1,32 @@ +//--------------------------------------------------------------------------------------- +// FILE: X2Effect_TemplarShieldCritDefense +// AUTHOR: Tedster - modified from Iago/bg +// PURPOSE: Gives the unit some crit mitigation even when flanked. +//--------------------------------------------------------------------------------------- +class X2Effect_TemplarShieldCritDefense extends X2Effect_Persistent config(LW_FactionBalance); + +var config int CritReduction; + +function GetToHitAsTargetModifiers(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit Target, XComGameState_Ability AbilityState, class ToHitType, bool bMelee, bool bFlanking, bool bIndirectFire, out array ShotModifiers) +{ + local ShotModifierInfo ModInfo; + + if (bFlanking) //if flanked + { + + ModInfo.ModType = eHit_Crit; + ModInfo.Reason = FriendlyName; + ModInfo.Value = 0 - default.CritReduction; + + ShotModifiers.AddItem(ModInfo); + + } +} + +DefaultProperties +{ + EffectName = "TemplarCritReduction" + DuplicateResponse = eDupe_Refresh; + bApplyOnHit = true; + bApplyOnMiss = true; +} diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_ReaperAbilities.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_ReaperAbilities.uc index 8ed7a6700..5dea3856e 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_ReaperAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_ReaperAbilities.uc @@ -23,8 +23,11 @@ var config int STING_RUPTURE; var config int BANISH_COOLDOWN; var const name BanishFiredTimes; +var config bool USE_BANISH_CHARGES; var config int DEATH_DEALER_CRIT; +var config int THEBANISHER_DEATH_DEALER_CRIT; + var config int SHADOW_FLAT_MOB_BONUS; var localized string ShadowExpiredFlyover; @@ -409,6 +412,7 @@ static function ReplaceDeathDealerEffect(X2AbilityTemplate Template) local X2Effect_Executioner ExecutionerEffect; local int i; local X2Effect_ToHitModifier ToHitModifier; + //local X2Condition_AbilityProperty AbilityProperty; ToHitModifier = new class'X2Effect_ToHitModifier'; ToHitModifier.BuildPersistentEffect(1, true, true, true); @@ -416,6 +420,19 @@ static function ReplaceDeathDealerEffect(X2AbilityTemplate Template) ToHitModifier.AddEffectHitModifier(eHit_Crit, default.DEATH_DEALER_CRIT, Template.LocFriendlyName); Template.AddTargetEffect(ToHitModifier); + /* + //TheBanisher section: + AbilityProperty = new class'X2Condition_AbilityProperty'; + AbilityProperty.OwnerHasSoldierAbilities.AddItem('TheBanisher_LW'); + + ToHitModifier = new class'X2Effect_ToHitModifier'; + ToHitModifier.BuildPersistentEffect(1, true, true, true); + ToHitModifier.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); + ToHitModifier.AddEffectHitModifier(eHit_Crit, default.THEBANISHER_DEATH_DEALER_CRIT, Template.LocFriendlyName); + ToHitModifier.ToHitConditions.AddItem(AbilityProperty); // Requires TheBanisher + Template.AddTargetEffect(ToHitModifier); + */ + // Remove the previous Pale Horse effect for (i = Template.AbilityTargetEffects.Length - 1; i >= 0 ; i--) { @@ -430,13 +447,15 @@ static function ReplaceDeathDealerEffect(X2AbilityTemplate Template) static function UpdateBanish(X2AbilityTemplate Template) { - local X2AbilityCost Cost; - local X2AbilityCooldown Cooldown; + local X2AbilityCooldown_Banish Cooldown; local X2Effect_BanishHitMod HitMod; + local X2AbilityCharges_BonusCharges Charges; + local X2AbilityCost Cost; + local X2AbilityCost_BanishCharges BanishCost; ChangeBanishHitCalc(Template); - + foreach Template.AbilityCosts(Cost) { if (Cost.isA('X2AbilityCost_Charges')) @@ -447,9 +466,24 @@ static function UpdateBanish(X2AbilityTemplate Template) } Template.AbilityCharges = none; - - Cooldown = new class'X2AbilityCooldown'; + + if(default.USE_BANISH_CHARGES) + { + BanishCost = new class'X2AbilityCost_BanishCharges'; + BanishCost.NumCharges = 1; + Template.AbilityCosts.AddItem(BanishCost); + + Charges = new class'X2AbilityCharges_BonusCharges'; + Charges.InitialCharges = 2; + Charges.BonusAbility = 'TheBanisher_LW'; + Charges.BonusChargesCount = 1; + Template.AbilityCharges = Charges; + } + + + Cooldown = new class'X2AbilityCooldown_Banish'; Cooldown.iNumTurns = default.BANISH_COOLDOWN; + Cooldown.bUseCharges = default.USE_BANISH_CHARGES; Template.AbilityCooldown = Cooldown; HitMod = new class'X2Effect_BanishHitMod'; @@ -460,7 +494,7 @@ static function UpdateBanish(X2AbilityTemplate Template) static function UpdateBanish2(X2AbilityTemplate Template) { - ChangeBanishHitCalc(Template); + ChangeBanish2HitCalc(Template); } @@ -470,6 +504,30 @@ static function ChangeBanishHitCalc(X2AbilityTemplate Template) local X2Condition_Visibility VisibilityCondition; X2AbilityToHitCalc_StandardAim(Template.AbilityToHitCalc).bAllowCrit = true; + BanishCount = new class'X2Effect_SetUnitValue'; + BanishCount.UnitName = default.BanishFiredTimes; + BanishCount.NewValueToSet = 1; + BanishCount.CleanupType = eCleanup_BeginTurn; + BanishCount.bApplyOnHit = true; + BanishCount.bApplyOnMiss = true; + Template.AddShooterEffect(BanishCount); + + //make it work with squadsight + class 'Helpers_LW'.static.RemoveAbilityTargetConditions(Template,'X2Condition_Visibility'); + + VisibilityCondition = new class'X2Condition_Visibility'; + VisibilityCondition.bRequireGameplayVisible = true; + VisibilityCondition.bAllowSquadsight = true; + Template.AbilityTargetConditions.AddItem(VisibilityCondition); + +} + +static function ChangeBanish2HitCalc(X2AbilityTemplate Template) +{ + local X2Effect_SetUnitValue BanishCount; + local X2Condition_Visibility VisibilityCondition; + X2AbilityToHitCalc_StandardAim(Template.AbilityToHitCalc).bAllowCrit = true; + BanishCount = new class'X2Effect_IncrementUnitValue'; BanishCount.UnitName = default.BanishFiredTimes; BanishCount.NewValueToSet = 1; diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_TemplarAbilities.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_TemplarAbilities.uc index cf0ac143b..766028f38 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_TemplarAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2LWModTemplate_TemplarAbilities.uc @@ -13,6 +13,7 @@ var config int STUNSTRIKE_STUN_DURATION; var config int STUNSTRIKE_STUN_CHANCE; var config int VOLT_TILE_RADIUS; var config int VOLT_DANGER_ZONE_BONUS_RADIUS; +var config int VOLT_TERRORIZE_BONUS; var config int ARCWAVE_T1_DAMAGE; var config int ARCWAVE_T2_DAMAGE; @@ -25,6 +26,7 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) { //refactor the start here so SingleRendFocus is only given to Rend and not Volt case 'ArcWave': + case 'ArcWave_LW': UpdateArcWave(Template); MakeRendNotWorkWhenBurning(Template); case 'TemplarBladestormAttack': @@ -32,6 +34,8 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) X2AbilityToHitCalc_StandardMelee(Template.AbilityToHitCalc).bGuaranteedHit = false; break; case 'Rend': + case 'Rend_LW': + MakeRendNotWorkWhenBurning(Template); // Allow Rend to miss and graze. X2AbilityToHitCalc_StandardMelee(Template.AbilityToHitCalc).bGuaranteedHit = false; @@ -89,6 +93,7 @@ static function ModifyVoltTargeting(X2AbilityTemplate Template) local X2Condition_UnitProperty ShooterCondition; local X2AbilityMultiTarget_Radius RadiusMultiTarget; local AbilityGrantedBonusRadius DangerZoneBonus; + local AbilityGrantedBonusRadius TerrorizeBonus; ShooterCondition = new class'X2Condition_UnitProperty'; ShooterCondition.ExcludeConcealed = true; @@ -105,6 +110,10 @@ static function ModifyVoltTargeting(X2AbilityTemplate Template) DangerZoneBonus.fBonusRadius = `TILESTOMETERS(default.VOLT_DANGER_ZONE_BONUS_RADIUS) + 0.01; RadiusMultiTarget.AbilityBonusRadii.AddItem(DangerZoneBonus); + TerrorizeBonus.RequiredAbility = 'TemplarTerror'; + TerrorizeBonus.fBonusRadius = `TILESTOMETERS(default.VOLT_TERRORIZE_BONUS) + 0.01; + RadiusMultiTarget.AbilityBonusRadii.AddItem(TerrorizeBonus); + Template.AbilityMultiTargetStyle = RadiusMultiTarget; Template.bFriendlyFireWarning = false; //disable the friendly fire popup @@ -207,6 +216,7 @@ static function ModifyStunStrikeToStun(X2AbilityTemplate Template) class'Helpers_LW'.static.RemoveAbilityTargetEffects(Template,'X2Effect_KnockBack'); StunnedEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(default.STUNSTRIKE_STUN_DURATION, default.STUNSTRIKE_STUN_CHANCE, false); + StunnedEffect.bRemoveWhenSourceDies = false; Template.AddTargetEffect(StunnedEffect); } diff --git a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2StrategyElement_AcademyUnlocks_GrappleParkour.uc b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2StrategyElement_AcademyUnlocks_GrappleParkour.uc index 3848185d6..4e1058673 100644 --- a/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2StrategyElement_AcademyUnlocks_GrappleParkour.uc +++ b/LongWarOfTheChosen/Src/LW_FactionBalance/Classes/X2StrategyElement_AcademyUnlocks_GrappleParkour.uc @@ -1,38 +1,38 @@ -//from NotSoLoneWolf -class X2StrategyElement_AcademyUnlocks_GrappleParkour extends X2StrategyElement_AcademyUnlocks config(AcademyUnlocks); - -var config int PARKOUR_RANK; -var config int PARKOUR_COST; - -static function array CreateTemplates() -{ - local array Templates; - - Templates.AddItem(ParkourUnlock()); - - return Templates; -} - -// Making a template with the same name as a template from base XCOM 2 overwrites that template -// I've included this here so users can change the cost of the perk easily if they think its new ability is worth more or less -static function X2SoldierUnlockTemplate ParkourUnlock() -{ - local X2SoldierAbilityUnlockTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2SoldierAbilityUnlockTemplate', Template, 'ParkourUnlock'); - Template.AllowedClasses.AddItem('Skirmisher'); - Template.AbilityName = 'Parkour'; - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.GTS_Skirmisher"; - - Template.Requirements.RequiredHighestSoldierRank = default.PARKOUR_RANK; - Template.Requirements.RequiredSoldierClass = 'Skirmisher'; - Template.Requirements.RequiredSoldierRankClassCombo = true; - Template.Requirements.bVisibleIfSoldierRankGatesNotMet = true; - - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = default.PARKOUR_COST; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} +//from NotSoLoneWolf +class X2StrategyElement_AcademyUnlocks_GrappleParkour extends X2StrategyElement_AcademyUnlocks config(AcademyUnlocks); + +var config int PARKOUR_RANK; +var config int PARKOUR_COST; + +static function array CreateTemplates() +{ + local array Templates; + + Templates.AddItem(ParkourUnlock()); + + return Templates; +} + +// Making a template with the same name as a template from base XCOM 2 overwrites that template +// I've included this here so users can change the cost of the perk easily if they think its new ability is worth more or less +static function X2SoldierUnlockTemplate ParkourUnlock() +{ + local X2SoldierAbilityUnlockTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2SoldierAbilityUnlockTemplate', Template, 'ParkourUnlock'); + Template.AllowedClasses.AddItem('Skirmisher'); + Template.AbilityName = 'Parkour'; + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.GTS_Skirmisher"; + + Template.Requirements.RequiredHighestSoldierRank = default.PARKOUR_RANK; + Template.Requirements.RequiredSoldierClass = 'Skirmisher'; + Template.Requirements.RequiredSoldierRankClassCombo = true; + Template.Requirements.bVisibleIfSoldierRankGatesNotMet = true; + + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = default.PARKOUR_COST; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_ChooseUpgrade_LWOfficerPack.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_ChooseUpgrade_LWOfficerPack.uc index c91347018..c95cdf207 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_ChooseUpgrade_LWOfficerPack.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_ChooseUpgrade_LWOfficerPack.uc @@ -7,11 +7,13 @@ class UIScreenListener_ChooseUpgrade_LWOfficerPack extends UIScreenListener; -var UIChooseUpgrade ParentScreen; +var private string PathToParentScreen; +//var UIChooseUpgrade ParentScreen; // This event is triggered after a screen is initialized event OnInit(UIScreen Screen) { + local UIChooseUpgrade ParentScreen; local XComGameState_FacilityXCom Facility; `Log("LW OfficerPack (ChooseUpgrade): Starting OnInit"); @@ -19,6 +21,8 @@ event OnInit(UIScreen Screen) ParentScreen = UIChooseUpgrade(Screen); Facility = XComGameState_FacilityXCom(`XCOMHISTORY.GetGameStateForObjectID(ParentScreen.m_FacilityRef.ObjectID)); + PathToParentScreen = PathName(ParentScreen); + // only update OTS if (Facility.GetMyTemplateName() == 'OfficerTrainingSchool') { @@ -35,7 +39,8 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { //clear reference to UIScreen so it can be garbage collected - ParentScreen = none; + //ParentScreen = none; + PathToParentScreen = ""; } // Copied from UIChooseUpgrade.uc @@ -44,9 +49,12 @@ simulated function UpdateSelection(UIList list, int itemIndex) local int power; local string Summary, Requirements, StratReqs, InsufficientResourcesWarning, DividerHTML, UpkeepCostStr; local bool HasPower, AlreadyUpgraded; + local UIChooseUpgrade ParentScreen; DividerHTML = " | "; + ParentScreen = UIChooseUpgrade(FindObject(PathToParentScreen, class'UIChooseUpgrade')); + ParentScreen.SelectedIndex = itemIndex; ParentScreen.m_selectedUpgrade = ParentScreen.m_arrUpgrades[ParentScreen.SelectedIndex]; HasPower = ParentScreen.HasEnoughPower(ParentScreen.m_selectedUpgrade); diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_FacilityUpgrade_LWOfficerPack.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_FacilityUpgrade_LWOfficerPack.uc index 8bf1474d5..18bc9d9f9 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_FacilityUpgrade_LWOfficerPack.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_FacilityUpgrade_LWOfficerPack.uc @@ -7,7 +7,8 @@ class UIScreenListener_FacilityUpgrade_LWOfficerPack extends UIScreenListener; -var UIFacilityUpgrade ParentScreen; +var string PathToParentScreen; +//var UIFacilityUpgrade ParentScreen; // This event is triggered after a screen is initialized event OnInit(UIScreen Screen) @@ -15,9 +16,12 @@ event OnInit(UIScreen Screen) local string strTitle; local UIText TextComponent; local UIFacilityUpgrade_ListItem ListItem; + local UIFacilityUpgrade ParentScreen; ParentScreen = UIFacilityUpgrade(Screen); + PathToParentScreen = PathName(ParentScreen); + // only update OTS if (ParentScreen.GetFacility().GetMyTemplateName() == 'OfficerTrainingSchool') { @@ -35,6 +39,23 @@ event OnInit(UIScreen Screen) } +private function UIFacilityUpgrade GetParentScreen() +{ + local UIFacilityUpgrade ParentScreen; + + if (PathToParentScreen != "") + { + ParentScreen = UIFacilityUpgrade(FindObject(PathToParentScreen, class'UIFacilityUpgrade')); + if (ParentScreen != none) + { + return ParentScreen; + } + } + ParentScreen = UIFacilityUpgrade(FindObject(PathToParentScreen, class'UIFacilityUpgrade')); + return ParentScreen; +} + + // This event is triggered after a screen receives focus event OnReceiveFocus(UIScreen Screen) { @@ -42,7 +63,8 @@ event OnReceiveFocus(UIScreen Screen) local UIText TextComponent; local UIFacilityUpgrade_ListItem ListItem; - ParentScreen = UIFacilityUpgrade(Screen); + local UIFacilityUpgrade ParentScreen; + ParentScreen = GetParentScreen(); // only update OTS if (ParentScreen.GetFacility().GetMyTemplateName() == 'OfficerTrainingSchool') @@ -67,12 +89,15 @@ event OnReceiveFocus(UIScreen Screen) event OnRemoved(UIScreen Screen) { //clear reference to UIScreen so it can be garbage collected - ParentScreen = none; + PathToParentScreen = ""; } function UIText GetTextChild() { local array TextChildren; + local UIFacilityUpgrade ParentScreen; + + ParentScreen = GetParentScreen(); ParentScreen.m_kContainer.GetChildrenOfType(class'UIText', TextChildren); return UIText(TextChildren[0]); @@ -127,7 +152,7 @@ simulated function UpdateListItemData(UIFacilityUpgrade_ListItem ListItem) simulated function RefreshInfoPanel(UIList ContainerList, int ItemIndex) { - PopulateUpgradeCard(UIFacilityUpgrade_ListItem(ContainerList.GetItem(ItemIndex)).UpgradeTemplate, ParentScreen.FacilityRef); + PopulateUpgradeCard(UIFacilityUpgrade_ListItem(ContainerList.GetItem(ItemIndex)).UpgradeTemplate, UIFacilityUpgrade(FindObject(PathToParentScreen, class'UIFacilityUpgrade')).FacilityRef); } simulated function PopulateUpgradeCard(X2FacilityUpgradeTemplate UpgradeTemplate, StateObjectReference FacilityRef) @@ -135,6 +160,10 @@ simulated function PopulateUpgradeCard(X2FacilityUpgradeTemplate UpgradeTemplate local XComGameState_FacilityXCom Facility; local string strDesc, strTitle, strRequirements, strImage, strUpkeep; + local UIFacilityUpgrade ParentScreen; + + ParentScreen = GetParentScreen(); + if( UpgradeTemplate == None ) { ParentScreen.ItemCard.Hide(); diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_Facility_Academy_LWOfficerPack.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_Facility_Academy_LWOfficerPack.uc index 10d781710..028f1d7be 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_Facility_Academy_LWOfficerPack.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_Facility_Academy_LWOfficerPack.uc @@ -6,11 +6,13 @@ class UIScreenListener_Facility_Academy_LWOfficerPack extends UIScreenListener dependsOn(UIScreenListener_Facility); -var UIButton OfficerButton; -var UIFacility_LWOfficerSlot Slot; +//Tedster - none of these are actually used, yay + +//var UIButton OfficerButton; +//var UIFacility_LWOfficerSlot Slot; var localized string strOfficerTrainButton; -var UIPersonnel PersonnelSelection; -var XComGameState_StaffSlot StaffSlot; +//var UIPersonnel PersonnelSelection; +//var XComGameState_StaffSlot StaffSlot; event OnInit(UIScreen Screen) { diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_LWOfficerPack.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_LWOfficerPack.uc index 96e31638f..99edb7d19 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_LWOfficerPack.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/UIScreenListener_LWOfficerPack.uc @@ -16,8 +16,12 @@ var bool bRegisteredForEvents; // Has this registered since a tactical/strategy switch ? var bool bLastUpdateStrategy; -var UIArmory_MainMenu ArmoryMainMenu; -var UIListItemString LeaderAbilityButton; +var private string PathToArmoryMainMenu; +var private string PathToLeaderAbilityButton; + +//var UIArmory_MainMenu ArmoryMainMenu; +//var UIListItemString LeaderAbilityButton; + var delegate NextOnSelectionChanged; delegate OnItemSelectedCallback(UIList _list, int itemIndex); @@ -27,6 +31,8 @@ private function bool IsInStrategy() return ((`HQGAME != none) && (`HQPC != None) && (`HQPRES != none)); } + + event OnInit(UIScreen Screen) { // Reset switch in tactical so we re-register back in strategy @@ -316,6 +322,8 @@ function EventListenerReturn AddArmoryMainMenuItem(Object EventData, Object Even { local UIList List; local XComGameState_Unit Unit; + local UIArmory_MainMenu ArmoryMainMenu; + local UIListItemString LeaderAbilityButton; // `LOG("AddArmoryMainMenuItem: Starting."); @@ -331,6 +339,7 @@ function EventListenerReturn AddArmoryMainMenuItem(Object EventData, Object Even `REDSCREEN("Add Armory MainMenu event triggered with invalid event source."); return ELR_NoInterrupt; } + PathToArmoryMainMenu = PathName(ArmoryMainMenu); Unit = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ArmoryMainMenu.UnitReference.ObjectID)); @@ -340,6 +349,9 @@ function EventListenerReturn AddArmoryMainMenuItem(Object EventData, Object Even { LeaderAbilityButton = ArmoryMainMenu.Spawn(class'UIListItemString', List.ItemContainer).InitListItem(CAPS(class'UIScreenListener_Armory_MainMenu_LWOfficerPack'.default.strOfficerMenuOption)); LeaderAbilityButton.ButtonBG.OnClickedDelegate = OnOfficerButtonCallback; + + PathToLeaderAbilityButton = PathName(LeaderAbilityButton); + if (NextOnSelectionChanged == none) { NextOnSelectionChanged = List.OnSelectionChanged; @@ -356,8 +368,11 @@ simulated function OnOfficerButtonCallback(UIButton kButton) { local UIArmory_LWOfficerPromotion OfficerScreen; local XComHQPresentationLayer HQPres; + local UIArmory_MainMenu ArmoryMainMenu; HQPres = `HQPRES; + ArmoryMainMenu = UIArmory_MainMenu(FindObject(PathToArmoryMainMenu, class'UIArmory_MainMenu')); + OfficerScreen = UIArmory_LWOfficerPromotion(HQPres.ScreenStack.Push(HQPres.Spawn(class'UIArmory_LWOfficerPromotion', HQPres), HQPres.Get3DMovie())); OfficerScreen.InitPromotion(ArmoryMainMenu.GetUnitRef(), false); // KDM : Previously, the officer pawn could be rotated when accessing the officer screen through the officer slot, but not when @@ -369,6 +384,12 @@ simulated function OnOfficerButtonCallback(UIButton kButton) // Callback handler for list button info at bottom of screen simulated function OnSelectionChanged(UIList ContainerList, int ItemIndex) { + local UIArmory_MainMenu ArmoryMainMenu; + local UIListItemString LeaderAbilityButton; + + LeaderAbilityButton = UIListItemString(FindObject(PathToLeaderAbilityButton, class'UIListItemString')); + ArmoryMainMenu = UIArmory_MainMenu(FindObject(PathToArmoryMainMenu, class'UIArmory_MainMenu')); + if (ContainerList.GetItem(ItemIndex) == LeaderAbilityButton) { ArmoryMainMenu.MC.ChildSetString("descriptionText", "htmlText", class'UIUtilities_Text'.static.AddFontInfo(class'UIScreenListener_Armory_MainMenu_LWOfficerPack'.default.OfficerListItemDescription, true)); @@ -382,6 +403,9 @@ simulated function UIListItemString FindDismissListItem(UIList List) { local int Idx; local UIListItemString Current; + local UIArmory_MainMenu ArmoryMainMenu; + + ArmoryMainMenu = UIArmory_MainMenu(FindObject(PathToArmoryMainMenu, class'UIArmory_MainMenu')); for (Idx = 0; Idx < List.ItemCount ; Idx++) { @@ -625,7 +649,7 @@ event OnRemoved(UIScreen Screen) { if (UIArmory_MainMenu(Screen) != none) { - ArmoryMainMenu = none; + PathToArmoryMainMenu = ""; NextOnSelectionChanged = none; } } diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2Ability_OfficerAbilitySet.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2Ability_OfficerAbilitySet.uc index 3c17bcb60..f23844e1f 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2Ability_OfficerAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2Ability_OfficerAbilitySet.uc @@ -50,6 +50,8 @@ var config array COMMANDRANGE_DIFFICULTY_MULTIPLER; var const name OfficerSourceName; // change this once UI work is done +var config array KismetTimerVariableNames; + static function array CreateTemplates() { local array Templates; @@ -77,7 +79,7 @@ static function array CreateTemplates() Templates.AddItem(AddLeadershipAbility()); Templates.AddItem(AddEspritdeCorpsAbility()); - Templates.AddItem(PurePassive('TrialByFire', "img:///UILibrary_LW_Overhaul.UIPerk_TrialByFire", true)); + Templates.AddItem(PurePassive('TrialByFire', "img:///UILibrary_LWOTC.UIPerk_TrialByFire", true)); // Add the command bonus range ability templates, one for each officer rank. // i == 1 is 2nd Lieutenant. @@ -738,6 +740,7 @@ static function X2AbilityTemplate AddCommandAbility() ActionPointEffect = new class'X2Effect_GrantActionPoints'; ActionPointEffect.NumActionPoints = 1; ActionPointEffect.PointType = class'X2CharacterTemplateManager'.default.StandardActionPoint; + ActionPointEffect.bSelectUnit = true; Template.AddTargetEffect(ActionPointEffect); ActionPointPersistEffect = new class'X2Effect_Persistent'; @@ -772,7 +775,7 @@ static function X2AbilityTemplate AddInterventionAbility() local X2Condition_HasEnoughIntel IntelCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Intervention'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityIntervention"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityIntervention"; Template.AbilitySourceName = default.OfficerSourceName; Template.Hostility = eHostility_Neutral; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; @@ -890,7 +893,10 @@ function XComGameState InterventionAbility_BuildGameState( XComGameStateContext { UpdatedUiTimer.UiState = Normal_Blue; } + + AdjustKismetMissionTimerVariable(default.INTERVENTION_EXTRA_TURNS, NewGameState); } + //apply the intel cost CostScalars.length = 0; @@ -905,6 +911,78 @@ function XComGameState InterventionAbility_BuildGameState( XComGameStateContext return NewGameState; } +//method that bypasses the Fxs KismetVariable Manager - modified from Rusty's code +private function AdjustKismetMissionTimerVariable(int Adjustment, XComGameState NewGameState) +{ + local X2SitRepEffect_ModifyKismetVariable SitRep; + + //PrintKismetVariables(default.KismetTimerVariableNames); + + // !! NOTE !! -- Requires the ModifyKismetVariablesInternal to be UNPRIVITISED in srcOrig for compiling + // /*private*/ native function ModifyKismetVariablesInternal(XComGameState NewGameState); + + SitRep = New class'X2SitRepEffect_ModifyKismetVariable'; + SitRep.VariableNames = default.KismetTimerVariableNames; + SitRep.ValueAdjustment = Adjustment; + //SitRep.ModifyKismetVariables(); // Doesn't work due to the foreach looking for BattleData.ActiveSitReps + SitRep.ModifyKismetVariablesInternal(NewGameState); + +} + +function PrintKismetVariables(array VariableNames, optional bool bAllVars) +{ + //local array OutVariables; + local array OutObjects; + local SequenceObject SeqObj; + local SequenceVariable SeqVar; + local SeqVar_Int SeqVarTimer; + local Sequence CurrentSequence; + + /*`XWORLDINFO.MyKismetVariableMgr.RebuildVariableMap(); + `XWORLDINFO.MyKismetVariableMgr.GetVariable(name("Timer.TurnsRemaining"), OutVariables); + + foreach OutVariables(SeqVar) + { + SeqVarTimer = SeqVar_Int(SeqVar); + if(SeqVarTimer != none) + { + if(SeqVarTimer.VarName == name("Timer.TurnsRemaining")) + { + class'Helpers'.static.OutputMsg("Found KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + SeqVarTimer.IntValue = SeqVarTimer.IntValue + Adjustment; + class'Helpers'.static.OutputMsg("-NEW- KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + } + } + }*/ + + CurrentSequence = `XWORLDINFO.GetGameSequence(); + if(CurrentSequence == none) + { + return; + } + + CurrentSequence.FindSeqObjectsByClass(class'SequenceVariable', true, OutObjects); + + foreach OutObjects(SeqObj) + { + SeqVar = SequenceVariable(SeqObj); + if(SeqVar != none) + { + SeqVarTimer = SeqVar_Int(SeqVar); + if(SeqVarTimer != none) + { + if(VariableNames.Find(string(SeqVarTimer.VarName)) != INDEX_NONE) + { + //class'Helpers'.static.OutputMsg("KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + //class'Helpers'.static.OutputMsg("Found KismetVariable To Adjust: " $ Adjustment); + //SeqVarTimer.IntValue = SeqVarTimer.IntValue + Adjustment; + class'Helpers'.static.OutputMsg("Named KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + } + } + } + } +} + //code that attempts to increment the kismet timer int value //doesn't work for that (but does for Timer.DefaultTurns), so not currently used static function AddToMissionTimerVariable(int AddedValue, optional string VariableName) @@ -1024,7 +1102,7 @@ static function X2AbilityTemplate AddIncomingAbility() local X2Condition_UnitActionPoints ValidTargetCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Incoming'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityIncoming"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityIncoming"; Template.AbilitySourceName = default.OfficerSourceName; Template.Hostility = eHostility_Neutral; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; @@ -1095,7 +1173,7 @@ static function X2AbilityTemplate AddJammerAbility() `CREATE_X2ABILITY_TEMPLATE(Template, 'Jammer'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityJammer"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityJammer"; Template.AbilitySourceName = default.OfficerSourceName; Template.Hostility = eHostility_Neutral; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; @@ -1200,7 +1278,7 @@ static function X2AbilityTemplate AddAirControllerAbility() local X2Effect_AirController AirControllerEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'AirController'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityAirController"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityAirController"; Template.AbilitySourceName = default.OfficerSourceName; Template.Hostility = eHostility_Neutral; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; @@ -1226,7 +1304,7 @@ static function X2AbilityTemplate AddInfiltratorAbility() { local X2AbilityTemplate Template; - Template = PurePassive('Infiltrator', "img:///UILibrary_LW_Overhaul.LW_AbilityInfiltrator", false, 'eAbilitySource_Perk'); + Template = PurePassive('Infiltrator', "img:///UILibrary_LWOTC.LW_AbilityInfiltrator", false, 'eAbilitySource_Perk'); return Template; } @@ -1433,7 +1511,7 @@ static function X2AbilityTemplate AddLeadershipAbility() local x2Effect_Persistent PersistentEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'Leadership'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityLeadership"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityLeadership"; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.AbilityToHitCalc = default.DeadEye; @@ -1468,7 +1546,7 @@ static function X2AbilityTemplate AddEspritdeCorpsAbility() Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityLeadership"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityLeadership"; Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SimpleSingleTarget; @@ -1558,6 +1636,18 @@ static function ConfigureCommandRangeMultiTargetStyle(X2AbilityTemplate Template Template.TargetingMethod = class'X2TargetingMethod_CommandRange'; } +//helper function to submit new game states +protected static function SubmitNewGameState(out XComGameState NewGameState) +{ + if (NewGameState.GetNumGameStateObjects() > 0) + { + `GAMERULES.SubmitGameState(NewGameState); + } + else + { + `XCOMHISTORY.CleanupPendingGameState(NewGameState); + } +} DefaultProperties { diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2DownloadableContentInfo_LWOfficerPack.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2DownloadableContentInfo_LWOfficerPack.uc index 9e2d22fa5..18fa79791 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2DownloadableContentInfo_LWOfficerPack.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2DownloadableContentInfo_LWOfficerPack.uc @@ -13,8 +13,8 @@ class X2DownloadableContentInfo_LWOfficerPack extends X2DownloadableContentInfo; /// static event OnLoadedSavedGame() { - `Log("LW OfficerPack : Starting OnLoadedSavedGame"); - UpdateOTSFacility(); + //`Log("LW OfficerPack : Starting OnLoadedSavedGame"); + //UpdateOTSFacility(); } static event OnPostTemplatesCreated() @@ -30,12 +30,12 @@ static event OnPostTemplatesCreated() { StaffSlotDef.StaffSlotTemplateName = 'OTSStaffSlot'; StaffSlotDef.bStartsLocked = false; - FacilityTemplate.StaffSlotDefs.AddItem(StaffSlotDef); + FacilityTemplate.StaffSlotDefs.InsertItem(1, StaffSlotDef); StaffSlotDef.StaffSlotTemplateName = 'OTSOfficerSlot'; StaffSlotDef.bStartsLocked = true; - FacilityTemplate.StaffSlotDefs.AddItem(StaffSlotDef); - FacilityTemplate.StaffSlotDefs.AddItem(StaffSlotDef); + FacilityTemplate.StaffSlotDefs.InsertItem(2, StaffSlotDef); + FacilityTemplate.StaffSlotDefs.InsertItem(3, StaffSlotDef); `log("LW OfficerPack: Added OTSOfficerSlot to facility template OfficerTrainingSchool"); FacilityTemplate.Upgrades.AddItem('OTS_LWOfficerTrainingUpgrade'); @@ -76,7 +76,7 @@ static function FindFacilityTemplateAllDifficulties(name DataName, out array static event OnLoadedSavedGameToStrategy() { - UpdateOTSFacility(); + //UpdateOTSFacility(); TransferLegacyOfficerAbilities(); } @@ -129,7 +129,7 @@ static function TransferLegacyOfficerAbilities() // update OTS Facility data static event OnPostMission() { - UpdateOTSFacility(); + //UpdateOTSFacility(); UpdateScavengerRewards(); TransferLegacyOfficerAbilities(); } @@ -350,6 +350,8 @@ static function UpdateOTSFacility() local XComGameStateHistory History; local name TemplateName; local XComGameState_FacilityXCom FacilityState, OTSState; + ///local StateObjectReference StaffSlotReference; + //local XComGameState_StaffSLot StaffSlotState; `Log("LW OfficerPack : Searching for existing OTS Facility"); TemplateName = 'OfficerTrainingSchool'; @@ -370,7 +372,15 @@ static function UpdateOTSFacility() } `Log("LW OfficerPack: Found existing OTS, Attempting to update StaffSlots"); - if(OTSState.StaffSlots.Length == 1) +/* + foreach OTSState.StaffSLots(StaffSlotReference) + { + StaffSlotState = XComGameState_StaffSlot(`XCOMHISTORY.GetGameStateForObjectID(StaffSlotReference.ObjectID)); + + //loop here + } */ + + if(OTSState.StaffSlots.length == 1) { `log("LW OfficerPack: OTS had only single staff slot, attempting to update facility"); NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Updating OTS Facility for LW_OfficerPack"); diff --git a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2StrategyElement_LW_OTS_OfficerStaffSlot.uc b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2StrategyElement_LW_OTS_OfficerStaffSlot.uc index 7e88d9801..93e55f103 100644 --- a/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2StrategyElement_LW_OTS_OfficerStaffSlot.uc +++ b/LongWarOfTheChosen/Src/LW_OfficerPack_Integrated/Classes/X2StrategyElement_LW_OTS_OfficerStaffSlot.uc @@ -109,8 +109,20 @@ static function X2DataTemplate CreateOTS_OfficerTrainingSecondSlotUpgradeTemplat static function OTS_LWOfficerTrainingUpgradeAdded(XComGameState NewGameState, XComGameState_FacilityUpgrade Upgrade, XComGameState_FacilityXCom Facility) { - Facility.UpkeepCost += Upgrade.GetMyTemplate().UpkeepCost; - Facility.UnlockStaffSlot(NewGameState); + local XComGameState_StaffSlot StaffSlotState; + local int i; + + for (i = 0; i < Facility.StaffSlots.Length; i++) + { + StaffSlotState = XComGameState_StaffSlot(`XCOMHISTORY.GetGameStateForObjectID(Facility.StaffSlots[i].ObjectID)); + + if (StaffSlotState.IsLocked() && StaffslotState.GetMyTemplate().DataName == 'OTSOfficerSlot' ) + { + StaffSlotState = XComGameState_StaffSlot(NewGameState.ModifyStateObject(class'XComGameState_StaffSlot', Facility.StaffSlots[i].ObjectID)); + StaffSlotState.UnlockSlot(); + return; + } + } } static function bool IsGTSProjectActive(StateObjectReference FacilityRef) diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/CHItemSlot_PistolSlot_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/CHItemSlot_PistolSlot_LW.uc index f5ee772f7..d7b995221 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/CHItemSlot_PistolSlot_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/CHItemSlot_PistolSlot_LW.uc @@ -50,10 +50,45 @@ static function X2DataTemplate CreatePistolSlotTemplate() Template.GetPriorityFn = PistolGetPriority; Template.ShowItemInLockerListFn = ShowPistolItemInLockerList; Template.GetSlotUnequipBehaviorFn = PistolGetUnequipBehavior; + Template.ValidateLoadoutFn = SlotValidateLoadout; return Template; } +//Code borrowed from Iridar to remove items from slots. +static function SlotValidateLoadout(CHItemSlot Slot, XComGameState_Unit Unit, XComGameState_HeadquartersXCom XComHQ, XComGameState NewGameState) +{ + local XComGameState_Item ItemState; + local string strDummy; + local bool HasSlot; + local bool bShouldUnequip; + + ItemState = Unit.GetItemInSlot(Slot.InvSlot, NewGameState); + HasSlot = Slot.UnitHasSlot(Unit, strDummy, NewGameState); + if (!HasSlot) + { + bShouldUnequip = true; + } + else if (ItemState != none) + { + if (!IsWeaponAllowedInPistolSlot(X2WeaponTemplate(ItemState.GetMyTemplate()))) + { + bShouldUnequip = true; + } + } + + // If there's an item equipped in the slot, but the unit is not supposed to have the slot, or the item is not supposed to be in the slot, then unequip it and put it into HQ Inventory. + if (bShouldUnequip && ItemState != none) + { + ItemState = XComGameState_Item(NewGameState.ModifyStateObject(class'XComGameState_Item', ItemState.ObjectID)); + Unit = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit', Unit.ObjectID)); + if (Unit.RemoveItemFromInventory(ItemState, NewGameState)) + { + XComHQ.PutItemInInventory(NewGameState, ItemState); + } + } +} + static function bool CanAddItemToPistolSlot( CHItemSlot Slot, XComGameState_Unit UnitState, diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWDLCHelpers.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWDLCHelpers.uc index 6aeb76874..ce1069509 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWDLCHelpers.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWDLCHelpers.uc @@ -342,7 +342,7 @@ static function bool IsUnitOnMission(XComGameState_Unit UnitState) static function SetOnMissionStatus(XComGameState_Unit UnitState, XComGameState NewGameState, optional bool bClearSlot = true) { local XComGameState_StaffSlot StaffSlotState; - local XComGameState_HeadquartersProjectHealSoldier HealSparkProject; + local XComGameState_HeadquartersProjectHealSoldier HealProject; if(bClearSlot) {//If we're here, I'm going to assume you're allowed to be on the mission already, meaning that if you're in a slot you should be removed from it. @@ -356,11 +356,11 @@ static function SetOnMissionStatus(XComGameState_Unit UnitState, XComGameState N if (UnitState.GetStatus() == eStatus_Healing) { //and pause any healing project - HealSparkProject = GetHealSparkProject(UnitState.GetReference()); - if (HealSparkProject != none) + HealProject = GetHealProject(UnitState.GetReference()); + if (HealProject != none) { - HealSparkProject = XComGameState_HeadquartersProjectHealSoldier(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersProjectHealSoldier', HealSparkProject.ObjectID)); - HealSparkProject.PauseProject(); + HealProject = XComGameState_HeadquartersProjectHealSoldier(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersProjectHealSoldier', HealProject.ObjectID)); + HealProject.PauseProject(); } } @@ -370,23 +370,23 @@ static function SetOnMissionStatus(XComGameState_Unit UnitState, XComGameState N //helper to retrieve spark heal project -- note that we can't retrieve the proper project, since it is in the DLC3.u // so instead we retrieve the parent heal project class and check using IsA -static function XComGameState_HeadquartersProjectHealSoldier GetHealSparkProject(StateObjectReference UnitRef) +static function XComGameState_HeadquartersProjectHealSoldier GetHealProject(StateObjectReference UnitRef) { local XComGameStateHistory History; local XComGameState_HeadquartersXCom XCOMHQ; - local XComGameState_HeadquartersProjectHealSoldier HealSparkProject; + local XComGameState_HeadquartersProjectHealSoldier HealProject; local int Idx; History = `XCOMHISTORY; XCOMHQ = `XCOMHQ; for(Idx = 0; Idx < XCOMHQ.Projects.Length; ++ Idx) { - HealSparkProject = XComGameState_HeadquartersProjectHealSoldier(History.GetGameStateForObjectID(XCOMHQ.Projects[Idx].ObjectID)); - if(HealSparkProject != none && HealSparkProject.IsA('XComGameState_HeadquartersProjectHealSpark')) + HealProject = XComGameState_HeadquartersProjectHealSoldier(History.GetGameStateForObjectID(XCOMHQ.Projects[Idx].ObjectID)); + if(HealProject != none && HealProject.IsA('XComGameState_HeadquartersProjectHealSoldier')) { - if(UnitRef == HealSparkProject.ProjectFocus) + if(UnitRef == HealProject.ProjectFocus) { - return HealSparkProject; + return HealProject; } } } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTacticalMissionUnitSpawner.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTacticalMissionUnitSpawner.uc index 4ef5748d7..3e80d23ab 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTacticalMissionUnitSpawner.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTacticalMissionUnitSpawner.uc @@ -461,6 +461,7 @@ static function LoadLiaisonFromOutpost(XComGameState_LWOutpost Outpost, local StateObjectReference ItemReference; local XComGameState_Item ItemState; local XComGameState_BattleData BattleData; + //local XComGameState_HeadquartersXCom XComHQ; local bool FoundTile; if (!Outpost.HasLiaison()) @@ -521,7 +522,11 @@ static function LoadLiaisonFromOutpost(XComGameState_LWOutpost Outpost, // captures, shaken effects, etc. if (Unit.IsSoldier()) { + // needed? + //XComHQ = XComGameState_HeadquartersXCom(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersXCom', `XCOMHQ.ObjectID)); + //XComHQ.Squad.AddItem(Unit.GetReference()); Unit.bSpawnedFromAvenger = true; + } Unit.SetVisibilityLocation(UnitTile); @@ -539,14 +544,16 @@ static function LoadLiaisonFromOutpost(XComGameState_LWOutpost Outpost, XComGameStateContext_TacticalGameRule(NewGameState.GetContext()).UnitRef = Unit.GetReference(); `TACTICALRULES.SubmitGameState(NewGameState); + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Initialize Unit Abilities"); + // make sure the visualizer has been created so self-applied abilities have a target in the world Unit.FindOrCreateVisualizer(NewGameState); // add abilities // Must happen after unit is submitted, or it gets confused about when the unit is in play or not NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Adding Liaison Unit Abilities"); - Unit = XComGameState_Unit(NewGameState.CreateStateObject(class'XComGameState_Unit', Unit.ObjectID)); - NewGameState.AddStateObject(Unit); + + Unit = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit', Unit.ObjectID)); // add the items to the gamestate for ammo merging foreach Unit.InventoryItems(ItemReference) { @@ -565,7 +572,8 @@ static function LoadLiaisonFromOutpost(XComGameState_LWOutpost Outpost, } `TACTICALRULES.SubmitGameState(NewGameState); - Unit.OnBeginTacticalPlay(NewGameState); + // Pavonis plz why is this here. + //Unit.OnBeginTacticalPlay(NewGameState); } } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc index c0987015f..a13ad0662 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc @@ -219,6 +219,8 @@ var config int FUSION_SWORD_FIRE_CHANCE; var config int KILLZONE_CONE_LENGTH; var config int KILLZONE_CONE_WIDTH; +var config int WORKSHOP_ENG_BONUS; + var config array ItemTable; var config array TechTable; var config array GTSTable; @@ -296,6 +298,9 @@ var config WeaponDamageValue WARLOCKPSIM1_BASEDAMAGE; var config WeaponDamageValue WARLOCKPSIM2_BASEDAMAGE; var config WeaponDamageValue WARLOCKPSIM3_BASEDAMAGE; var config WeaponDamageValue WARLOCKPSIM4_BASEDAMAGE; +var config WeaponDamageValue WARLOCKPSIM5_BASEDAMAGE; + +var config array AbilitiesToFixStun; static function array CreateTemplates() { @@ -1079,6 +1084,7 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) if (Template.AbilityTargetEffects[k].IsA ('X2Effect_Panicked')) { + X2Effect_Panicked(Template.AbilityTargetEffects[k]).bRemoveWhenSourceDies = false; X2Effect_Panicked(Template.AbilityTargetEffects[k]).MinStatContestResult = 4; X2Effect_Panicked(Template.AbilityTargetEffects[k]).MaxStatContestResult = 24; } @@ -1091,6 +1097,11 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) } } + if (X2Effect_PersistentStatChange(Template.AbilityTargetEffects[k]).EffectName == class'X2AbilityTemplateManager'.default.DisorientedName) + { + X2Effect_PersistentStatChange(Template.AbilityTargetEffects[k]).bRemoveWhenSourceDies = false; + } + // Compensate for the stat contest dilution. It's still less than it used to be. if (Template.AbilityTargetEffects[k].IsA ('X2Effect_PersistentStatChange') && Template.AbilityTargetEffects[k].MinStatContestResult == 1) { @@ -1154,11 +1165,11 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) Template.PrerequisiteAbilities.RemoveItem('Soulfire'); } - if (Template.DataName == 'Soulfire') - { - Cooldown = new class 'X2AbilityCooldown_Soulfire'; - Template.AbilityCooldown = Cooldown; - } + // if (Template.DataName == 'Soulfire') + // { + // Cooldown = new class 'X2AbilityCooldown_Soulfire'; + // Template.AbilityCooldown = Cooldown; + // } if (Template.DataName == 'PoisonSpit' || Template.DataName == 'MicroMissiles') { @@ -1327,7 +1338,8 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) } if (Template.DataName == 'Deadeye') { - Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideIfOtherAvailable; + Template.HideIfAvailable.AddItem('DeadeyeSnapShot'); CooldownShared = new class'X2AbilityCooldown_Shared'; CooldownShared.iNumTurns = class'X2Ability_SharpshooterAbilitySet'.default.DEADEYE_COOLDOWN; CooldownShared.SharingCooldownsWith.AddItem('DeadeyeSnapShot'); @@ -1346,12 +1358,51 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) } } + if (Template.DataName == 'ChainShot') + { + for (k = 0; k < Template.AbilityCosts.length; k++) + { + ActionPointCost = X2AbilityCost_ActionPoints(Template.AbilityCosts[k]); + if (ActionPointCost != none) + { + Template.AbilityCosts.RemoveItem(ActionPointCost); + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + + ActionPointCost.iNumPoints = 0; + ActionPointCost.bAddWeaponTypicalCost = true; + ActionPointCost.bConsumeAllPoints = true; + + Template.AbilityCosts.AddItem(ActionPointCost); + } + } + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideIfOtherAvailable; + Template.HideIfAvailable.AddItem('ChainShotSnapShot'); + CooldownShared = new class'X2AbilityCooldown_Shared'; + CooldownShared.iNumTurns = class'X2Ability_GrenadierAbilitySet'.default.CHAINSHOT_COOLDOWN; + CooldownShared.SharingCooldownsWith.AddItem('ChainShotSnapShot'); + Template.AbilityCooldown = CooldownShared; + + Template.AdditionalAbilities.AddItem('ChainShotSnapShot'); + } + if (Template.DataName == 'RapidFire') { - Cooldown = new class'X2AbilityCooldown'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideIfOtherAvailable; + Template.HideIfAvailable.AddItem('RapidFireSnapShot'); + Cooldown = new class'X2AbilityCooldown_Shared'; Cooldown.iNumTurns = default.RAPIDFIRE_COOLDOWN; + CooldownShared.SharingCooldownsWith.AddItem('RapidFireSnapShot'); Template.AbilityCooldown = Cooldown; + + Template.AdditionalAbilities.AddItem('RapidFireSnapShot'); + } + + if(Template.DataName == 'RapidFire2' || Template.DataName == 'ChainShot2') + { + FixRapidFire2(Template); } + + // Steady Hands // Stasis Vest // Air Controller @@ -1405,6 +1456,11 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) Template.ConcealmentRule = eConceal_Never; } + if(Template.Dataname == 'StandardMove') + { + FixStandardMove(Template); + } + // can't shoot when on FIRE if (class'X2Ability_PerkPackAbilitySet'.default.NO_STANDARD_ATTACKS_WHEN_ON_FIRE) { @@ -1678,6 +1734,20 @@ function ModifyAbilitiesGeneral(X2AbilityTemplate Template, int Difficulty) NotHaywiredCondition = new class 'X2Condition_UnitEffects'; NotHaywiredCondition.AddExcludeEffect ('Haywired', 'AA_NoTargets'); Template.AbilityTargetConditions.AddItem(NotHaywiredCondition); + + + } + + if (default.AbilitiesToFixStun.Find(Template.DataName) != INDEX_NONE) + { + for (k = Template.AbilityTargetEffects.length - 1; k >= 0; k--) + { + if (Template.AbilityTargetEffects[k].IsA ('X2Effect_Stunned')) + { + X2Effect_Stunned(Template.AbilityTargetEffects[k]).bRemoveWhenSourceDies = false; + `LWTrace("Fixing Stun Effect on" @Template.DataName); + } + } } if (Template.DataName == 'Evac') @@ -2066,6 +2136,8 @@ function ReplacePlaceEvacAbility(X2CharacterTemplate Template, int Difficulty) if (Template.Abilities.Find('PlaceEvacZone') != -1) { Template.Abilities.RemoveItem('PlaceEvacZone'); + // Give them the flare instead; this ability gives PlaceDelayedEvacZone + Template.Abilities.AddItem('GrantEvacFlare'); } } @@ -2124,6 +2196,10 @@ function GeneralCharacterMod(X2CharacterTemplate Template, int Difficulty) Template.ImmuneTypes.AddItem('Poison'); Template.ImmuneTypes.AddItem(class'X2Item_DefaultDamageTypes'.default.ParthenogenicPoisonType); Template.ImmuneTypes.AddItem('Fire'); + Template.Abilities.AddItem('NoWallBreakOnGreenAlert'); + break; + case 'Sectopod': + Template.Abilities.AddItem('NoWallBreakOnGreenAlert'); break; case 'AdvStunLancerM2': Template.Abilities.AddItem('HunkerDown'); @@ -2226,6 +2302,17 @@ function GeneralCharacterMod(X2CharacterTemplate Template, int Difficulty) case 'TheLostDasherHP12': Template.DefaultLoadout='TheLostDasherTier4_Loadout'; break; + case 'SpectralStunLancerM1': + case 'SpectralStunLancerM2': + case 'SpectralStunLancerM3': + case 'SpectralStunLancerM4': + Template.Abilities.AddItem('StunImpairingAbility'); + // make them move before chosen + Template.InitiativePriority = -101; + break; + case 'HostileVIPCivilian': + Template.Abilities.AddItem('Shadowstep'); + break; default: break; } @@ -2250,12 +2337,18 @@ function GeneralCharacterMod(X2CharacterTemplate Template, int Difficulty) Template.Abilities.AddItem('WarlockReaction'); //Template.Abilities.AddItem('AmmoDump_LW'); Template.Abilities.AddItem('ChosenCritImmune'); - Template.Abilities.AddItem('ChosenImmunitiesPassive'); + Template.Abilities.AddItem('ChosenLootAbility'); Template.Abilities.AddItem('TriggerDamagedTeleport_LW'); + Template.Abilities.AddItem('MovingTarget_LW'); + + Template.strScamperBT = "ScamperRoot_ChosenWarlock"; + Template.ScamperActionPoints = 3; Template.InitiativePriority = -100; + Template.Abilities.AddItem('WarlockReactionMobility_LW'); + //Since they no longer have the ability by default Template.Abilities.AddItem('ChosenSummonFollowers'); @@ -2277,13 +2370,17 @@ function GeneralCharacterMod(X2CharacterTemplate Template, int Difficulty) Template.Abilities.AddItem('LongWatch'); Template.Abilities.AddItem('quickdraw'); Template.Abilities.AddItem('ChosenImmuneMelee'); - Template.Abilities.AddItem('ReadyForAnything'); - Template.Abilities.AddItem('ChosenImmunitiesPassive'); + Template.Abilities.AddItem('Squadsight'); + Template.Abilities.AddItem('FreeGrenades'); Template.Abilities.AddItem('Infighter'); Template.Abilities.AddItem('Disabler'); Template.Abilities.AddItem('ChosenLootAbility'); Template.Abilities.AddItem('TriggerDamagedTeleport_LW'); + Template.Abilities.AddItem('MovingTarget_LW'); + + Template.Abilities.AddItem('HunterReactionMobility_LW'); + Template.Abilities.AddItem('HunterReactionMobBoost_LW'); Template.ImmuneTypes.AddItem('Frost'); Template.InitiativePriority = -100; @@ -2303,13 +2400,14 @@ function GeneralCharacterMod(X2CharacterTemplate Template, int Difficulty) Template.Abilities.AddItem('BloodThirst_LW'); Template.Abilities.AddItem('Hitandrun'); Template.Abilities.AddItem('FreeGrenades'); - Template.Abilities.AddItem('ChosenImmunitiesPassive'); + Template.Abilities.AddItem('AssassinSlash_LW'); Template.Abilities.AddItem('ImpactCompensation_LW'); Template.Abilities.AddItem('Infighter'); Template.Abilities.AddItem('ChosenLootAbility'); Template.Abilities.AddItem('Unstoppable_LW'); Template.Abilities.AddItem('TriggerDamagedTeleport_LW'); + Template.Abilities.AddItem('MovingTarget_LW'); Template.ImmuneTypes.AddItem('Frost'); Template.InitiativePriority = -100; @@ -2425,8 +2523,11 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) if (WeaponTemplate.DataName == 'Medikit') { WeaponTemplate.HideIfResearched = ''; + WeaponTemplate.Abilities.AddItem('Sedate'); + WeaponTemplate.Abilities.AddItem('ParaMedikitHeal'); + WeaponTemplate.Abilities.AddItem('ParaMedikitStabilize'); } - if (WeaponTemplate.DataName == 'Medikit' || WeaponTemplate.DataName == 'NanoMedikit') + if (class'X2Ability_ReaperAbilitySet_LW'.default.AlternativeMedikitNames.Find((WeaponTemplate.DataName)) != INDEX_NONE) { WeaponTemplate.Abilities.AddItem('Sedate'); WeaponTemplate.Abilities.AddItem('ParaMedikitHeal'); @@ -2452,6 +2553,7 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) break; case 'AdvPriestM3_PsiAmp': WeaponTemplate.Abilities.AddItem('Solace'); + // intentional fall-through so M3 gets both perks. case 'AdvPriestM2_PsiAmp': WeaponTemplate.Abilities.AddItem('MindShield'); break; @@ -2472,39 +2574,52 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) case 'ChosenSniperPistol_T4': WeaponTemplate.Abilities.RemoveItem('LethalDose'); break; + case 'ChosenSniperRifle_CV': + case 'ChosenSniperRifle_MG': + case 'ChosenSniperRifle_BM': + case 'ChosenSniperRifle_T4': + //WeaponTemplate.Abilities.RemoveItem('TrackingShot'); + WeaponTemplate.Abilities.RemoveItem('HunterKillzone'); + break; case 'Warlock_PsiWeapon': WeaponTemplate.Abilities.AddItem('ShieldAllyM1'); WeaponTemplate.BaseDamage = default.WARLOCKPSIM1_BASEDAMAGE; - WeaponTemplate.Abilities.RemoveItem('SpectralArmy'); - WeaponTemplate.Abilities.RemoveItem('Corress'); + //WeaponTemplate.Abilities.RemoveItem('SpectralArmy'); + //WeaponTemplate.Abilities.RemoveItem('Corress'); break; case 'WarlockM2_PsiWeapon': WeaponTemplate.Abilities.AddItem('ShieldAllyM2'); WeaponTemplate.BaseDamage = default.WARLOCKPSIM2_BASEDAMAGE; - WeaponTemplate.Abilities.RemoveItem('SpectralArmyM2'); - WeaponTemplate.Abilities.RemoveItem('CorressM2'); + //WeaponTemplate.Abilities.RemoveItem('SpectralArmyM2'); + //WeaponTemplate.Abilities.RemoveItem('CorressM2'); break; case 'WarlockM3_PsiWeapon': WeaponTemplate.Abilities.AddItem('ShieldAllyM3'); WeaponTemplate.BaseDamage = default.WARLOCKPSIM3_BASEDAMAGE; - WeaponTemplate.Abilities.RemoveItem('SpectralArmyM3'); - WeaponTemplate.Abilities.RemoveItem('CorressM3'); + //WeaponTemplate.Abilities.RemoveItem('SpectralArmyM3'); + //WeaponTemplate.Abilities.RemoveItem('CorressM3'); break; case 'WarlockM4_PsiWeapon': WeaponTemplate.Abilities.AddItem('ShieldAllyM4'); WeaponTemplate.BaseDamage = default.WARLOCKPSIM4_BASEDAMAGE; - WeaponTemplate.Abilities.RemoveItem('SpectralArmyM4'); - WeaponTemplate.Abilities.RemoveItem('CorressM4'); + //WeaponTemplate.Abilities.RemoveItem('SpectralArmyM4'); + //WeaponTemplate.Abilities.RemoveItem('CorressM4'); + break; + case 'WarlockM5_PsiWeapon': + WeaponTemplate.Abilities.AddItem('ShieldAllyM5'); + WeaponTemplate.BaseDamage = default.WARLOCKPSIM5_BASEDAMAGE; + WeaponTemplate.Abilities.AddItem('CorressM4'); + WeaponTemplate.Abilities.AddItem('SpectralArmyM4'); break; case 'ChosenRifle_XCOM': WeaponTemplate.Abilities.AddItem('OverbearingSuperiority_LW'); WeaponTemplate.OnAcquiredFn = none; - WeaponTemplate.SetUIStatMarkup(class'XLocalizedData'.default.AimLabel, eStat_Offense, class'X2Item_XpackWeapons'.default.CHOSENRIFLE_XCOM_AIM); + //WeaponTemplate.SetUIStatMarkup(class'XLocalizedData'.default.AimLabel, eStat_Offense, class'X2Item_XpackWeapons'.default.CHOSENRIFLE_XCOM_AIM); break; case 'ChosenSniperRifle_XCOM': WeaponTemplate.iTypicalActionCost = 2; @@ -2526,7 +2641,7 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) WeaponTemplate.OnAcquiredFn = none; break; case 'ChosenShotgun_XCOM': - WeaponTemplate.Abilities.AddItem('Brawler'); + //WeaponTemplate.Abilities.AddItem('Brawler'); WeaponTemplate.Abilities.AddItem('Vampirism_LW'); WeaponTemplate.Abilities.AddItem('ImpactCompensation_LW'); WeaponTemplate.OnAcquiredFn = none; @@ -2542,6 +2657,12 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) } } break; + case 'AlienHunterRifle_CV': + case 'AlienHunterRifle_MG': + case 'AlienHunterRifle_BM': + WeaponTemplate.Abilities.AddItem('LockNLoad_LW'); + WeaponTemplate.Abilities.AddItem('Concentration_LW'); + break; default: break; } @@ -2620,12 +2741,14 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) GremlinTemplate.RevivalChargesBonus = 1; GremlinTemplate.ScanningChargesBonus = 1; GremlinTemplate.AidProtocolBonus = 5; + GremlinTemplate.BaseDamage.Damage = 5; } if (GremlinTemplate.DataName == 'Gremlin_BM') { GremlinTemplate.RevivalChargesBonus = 2; GremlinTemplate.ScanningChargesBonus = 2; GremlinTemplate.AidProtocolBonus = 10; + GremlinTemplate.BaseDamage.Damage = 8; } if (GremlinTemplate.DataName == 'SparkBit_MG') { @@ -2894,8 +3017,8 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) case 'MutonGrenade' : case 'MutonM2_LWGrenade' : case 'MutonM3_LWGrenade' : - GrenadeTemplate.AddAbilityIconOverride('ThrowGrenade', "img:///UILibrary_LW_Overhaul.UIPerk_grenade_aliengrenade"); - GrenadeTemplate.AddAbilityIconOverride('LaunchGrenade', "img:///UILibrary_LW_Overhaul.UIPerk_grenade_aliengrenade"); + GrenadeTemplate.AddAbilityIconOverride('ThrowGrenade', "img:///UILibrary_LWOTC.UIPerk_grenade_aliengrenade"); + GrenadeTemplate.AddAbilityIconOverride('LaunchGrenade', "img:///UILibrary_LWOTC.UIPerk_grenade_aliengrenade"); `LWTRACE("Added Ability Icon Override for Alien Grenade"); break; default : @@ -3615,6 +3738,10 @@ function ReconfigFacilities(X2StrategyElementTemplate Template, int Difficulty) // No longer mark it as being a priority/requiring attention FacilityTemplate.bPriority = false; } + if (FacilityTemplate.DataName == 'Workshop') + { + FacilityTemplate.EngineeringBonus = default.WORKSHOP_ENG_BONUS; + } //if (FacilityTemplate.DataName == 'Storage') Didn't work //{ //FacilityTemplate.StaffSlots.AddItem('SparkStaffSlot'); @@ -3985,3 +4112,36 @@ function ModifyFacilityUpgrades(X2StrategyElementTemplate Template, int Difficul } } } + +static function FixRapidFire2(X2AbilityTemplate Template) +{ + local X2AbilityTrigger Trigger; + local X2AbilityTrigger_EventListener EventTrigger; + + foreach Template.AbilityTriggers (Trigger) + { + EventTrigger = X2AbilityTrigger_EventListener(Trigger); + if(EventTrigger != none) + { + EventTrigger.ListenerData.Priority = 80; + } + } +} + +static function FixStandardMove(X2AbilityTemplate Template) +{ + local int i; + + + for(i = Template.AbilityCosts.Length-1; i >=0; i--) + { + if(Template.AbilityCosts[i].IsA('X2AbilityCost_ActionPoints')) + { + // Remove and re-add move-only AP type so it's at the end of the array and used before Momentum AP type. + X2AbilityCost_ActionPoints(Template.AbilityCosts[0]).AllowedTypes.RemoveItem(class'X2CharacterTemplateManager'.default.MoveActionPoint); + X2AbilityCost_ActionPoints(Template.AbilityCosts[0]).AllowedTypes.AddItem(class'X2CharacterTemplateManager'.default.MoveActionPoint); + // there should only be one of these on StandardMove + break; + } + } +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWVersion.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWVersion.uc index e5c56ff16..0ad52fa22 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWVersion.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWVersion.uc @@ -47,7 +47,8 @@ function static int GetVersionNumber(optional out int Major, optional out int Mi defaultproperties { MajorVersion = 1; - MinorVersion = 0; - PatchVersion = 5; + MinorVersion = 1; + PatchVersion = 0; Classifier = "Steam" + } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesChestsBig.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesChestsBig.uc new file mode 100644 index 000000000..0a0caa4f2 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesChestsBig.uc @@ -0,0 +1,165 @@ +// Author - Tedster +// Version of SeqAct_GetGatherSuppliesChests to use a different config array for the chests + +class SeqAct_GetGatherSuppliesChestsBig extends SequenceAction + config(GameData); + + + +// Defines a "rare chest". Rare chests are rolled on before pulling +// the rest of the chests from the shuffle bag in the ChestDistribution +struct RareChestEntry +{ + var name Type; + var float Chance; +}; + +// Defines a complete "Chest Distribution". +struct ChestDistribution +{ + var int MinForceLevel; + var int MaxForceLevel; + + var array ChestTypeShuffleBag; + var array RareChests; +}; + +// Associates a type of chest with it's loot table and archetype +struct ChestDefinition +{ + var name Type; + var string ArchetypePath; + var name LootTable; +}; + + + +// Number of chests the user wants to generate +var protected int ChestCount; + +// ini defined data +var const config array BigChestDistributions; +var const config array BigChestDefinitions; + +event Activated() +{ + local XComGameStateHistory History; + local XComGameState_BattleData BattleData; + local SeqVar_StringList List; + local int ForceLevel; + + //`LWTrace("Big Supply Extract SeqAct activated."); + + History = `XCOMHISTORY; + + BattleData = XComGameState_BattleData(History.GetSingleGameStateObjectForClass(class'XComGameState_BattleData')); + ForceLevel = BattleData.GetForceLevel(); + + foreach LinkedVariables(class'SeqVar_StringList', List, "Out Chest Types") + { + List.arrStrings.Length = 0; + SelectChests(ForceLevel, ChestCount, List.arrStrings); + } +} + +// Most of the logic lives here so that it can be tested from the cheat console without any kismet needed +static function SelectChests(int ForceLevel, int InChestCount, out array OutChestTypes) +{ + local RareChestEntry RareChestChance; + local array ShuffledChests; + local int Index; + + `LWTrace("SelectChests called with Force level" @ForceLevel); + // find the correct bucket for our supplies + for (Index = 0; Index < default.BigChestDistributions.Length; Index++) + { + if (ForceLevel >= default.BigChestDistributions[Index].MinForceLevel && ForceLevel <= default.BigChestDistributions[Index].MaxForceLevel) + { + break; + } + } + + //`LWTrace("Passed FL check"); + // validate that we found a distribution + if (Index > default.BigChestDistributions.Length) + { + // no distribution matches this force level! + `Redscreen("No valid Chest Distribution found for Force Level " $ ForceLevel); + + if(default.BigChestDistributions.Length == 0) + { + return; // no distributions at all, so we need to bail + } + + Index = 0; // use the first definition as a fallback + } + + // validate that our distribution has chests in it + if (default.BigChestDistributions[Index].ChestTypeShuffleBag.Length == 0) + { + `Redscreen("ChestDistributionsBig[" $ Index $ "] contains no chests!"); + return; + } + + // first roll on "rare crates". These come up very infrequently, and are meant to be + // exciting for the player when they do. We select them first, and then fill out the rest of the + // list from the normal crate shuffle bag + foreach default.BigChestDistributions[Index].RareChests(RareChestChance) + { + if(OutChestTypes.Length < InChestCount && class'Engine'.static.SyncFRand("SeqAct_GetGatherSuppliesChests") < RareChestChance.Chance) + { + OutChestTypes.AddItem(string(RareChestChance.Type)); + } + } + + // select crates from the shuffle bag until we have enough of them + ShuffledChests = default.BigChestDistributions[Index].ChestTypeShuffleBag; + while (OutChestTypes.Length < InChestCount) + { + ShuffledChests.RandomizeOrder(); + + for (Index = 0; Index < ShuffledChests.Length && OutChestTypes.Length < InChestCount; Index++) + { + OutChestTypes.AddItem(ShuffledChests[Index]); + } + } + + // and do one final shuffle so that the rare chests are also randomly located + OutChestTypes.RandomizeOrder(); +} + +static function bool GetChestDefinition(name ChestType, out ChestDefinition ChestDef) +{ + local int Index; + + //`LWTrace("Big Supply Extract GetChestDefinition Called"); + + for (Index = 0; Index < default.BigChestDefinitions.Length; Index++) + { + if(default.BigChestDefinitions[Index].Type == ChestType) + { + ChestDef = default.BigChestDefinitions[Index]; + return true; + } + } + + return false; +} + +static event int GetObjClassVersion() +{ + return super.GetObjClassVersion() + 1; +} + +defaultproperties +{ + ObjCategory="Procedural Missions" + ObjName="Get Gather Supplies Chests Big Version" + + bConvertedForReplaySystem=true + bCanBeUsedForGameplaySequence=true + bAutoActivateOutputLinks=true + + VariableLinks(0)=(ExpectedType=class'SeqVar_Int',LinkDesc="Count",PropertyName=ChestCount) + VariableLinks(1)=(ExpectedType=class'SeqVar_StringList',LinkDesc="Out Chest Types",bWriteable=true) +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesCrateInfoBig.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesCrateInfoBig.uc new file mode 100644 index 000000000..9ced2947b --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_GetGatherSuppliesCrateInfoBig.uc @@ -0,0 +1,40 @@ +// Tedster: version of base game SeqAct_GetGatherSuppliesCrateInfo that points at updated config for + +class SeqAct_GetGatherSuppliesCrateInfoBig extends SequenceAction + config(GameData); + +var protected string ChestType; +var protected string ChestArchetype; +var protected string ChestLootTable; + +event Activated() +{ + local ChestDefinition ChestDef; + + if(class'SeqAct_GetGatherSuppliesChestsBig'.static.GetChestDefinition(name(ChestType), ChestDef)) + { + ChestArchetype = ChestDef.ArchetypePath; + ChestLootTable = string(ChestDef.LootTable); + } + else + { + `Redscreen("SeqAct_GetGatherSuppliesCrateInfo: No chest type found for " $ ChestType); + ChestArchetype = ""; + ChestLootTable = ""; + } +} + +defaultproperties +{ + ObjCategory="Procedural Missions" + ObjName="Get Gather Supplies Chest Info Big Version" + + bConvertedForReplaySystem=true + bCanBeUsedForGameplaySequence=true + bAutoActivateOutputLinks=true + + VariableLinks(0)=(ExpectedType=class'SeqVar_String',LinkDesc="Chest Type",PropertyName=ChestType) + VariableLinks(1)=(ExpectedType=class'SeqVar_String',LinkDesc="Archetype",PropertyName=ChestArchetype,bWriteable=true) + VariableLinks(2)=(ExpectedType=class'SeqVar_String',LinkDesc="Loot Table",PropertyName=ChestLootTable,bWriteable=true) +} + diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_InitializeMissionTimer.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_InitializeMissionTimer.uc index a656b726f..8677be55b 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_InitializeMissionTimer.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/SeqAct_InitializeMissionTimer.uc @@ -39,7 +39,9 @@ var private int Turns; static function int GetInitialTimer(string MissionType, string MissionFamily) { local XComGameState_KismetVariableModifier ModifierState; + local XComGameState_MissionSite MissionState; local int TurnValue; + local name GameplayTag; TurnValue = GetBaseTimer(MissionType, MissionFamily); @@ -53,6 +55,23 @@ static function int GetInitialTimer(string MissionType, string MissionFamily) } } + // Hack to increase timer for Warlock on Full Retals. + if(MissionFamily == "Defend_LW") + { + MissionState = XComGameState_MissionSite(`XCOMHISTORY.GetGameStateForObjectID(`XCOMHQ.MissionRef.ObjectID)); + + foreach MissionState.TacticalGameplayTags (GameplayTag) + { + if(GamePlayTag =='Chosen_WarlockActive_LWOTC_ChosenTag' || + GamePlayTag =='Chosen_WarlockActiveM2_LWOTC_ChosenTag' || + GamePlayTag =='Chosen_WarlockActiveM3_LWOTC_ChosenTag' || + GamePlayTag =='Chosen_WarlockActiveM4_LWOTC_ChosenTag' + ) + + TurnValue += 1; + } + } + return TurnValue; } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIPersonnel_Liaison.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIPersonnel_Liaison.uc index 6189ea854..6fbd4b2df 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIPersonnel_Liaison.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIPersonnel_Liaison.uc @@ -58,7 +58,9 @@ function bool UnitAvailableForLiaisonDuty(StateObjectReference UnitRef) } else if (Unit.IsEngineer() || Unit.IsScientist()) { - return !Unit.IsUnitCritical(); + return (!Unit.IsUnitCritical() + && !Unit.IsInjured()) + ; } return false; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIRecruitmentListItem_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIRecruitmentListItem_LW.uc index 7ff4113ae..40eee898d 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIRecruitmentListItem_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIRecruitmentListItem_LW.uc @@ -11,6 +11,7 @@ var config int RECRUIT_FONT_SIZE_CTRL; var config int RECRUIT_Y_OFFSET_CTRL; var config int RECRUIT_FONT_SIZE_MK; var config int RECRUIT_Y_OFFSET_MK; +var config string RECRUIT_SHOW_PSI_TECH; simulated function InitRecruitItem(XComGameState_Unit Recruit) { @@ -81,8 +82,15 @@ function AddIcons(XComGameState_Unit Recruit) { local bool PsiStatIsVisible; local float XLoc, YLoc, XDelta; - - PsiStatIsVisible = `XCOMHQ.IsTechResearched('AutopsySectoid'); + + if (RECRUIT_SHOW_PSI_TECH == "") + { + PsiStatIsVisible = true; + } + else + { + PsiStatIsVisible = `XCOMHQ.IsTechResearched(name(RECRUIT_SHOW_PSI_TECH)); + } // KDM : Stat icons, and their associated stat values, have to be manually placed. XLoc = 97; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIResistanceManagement_ListItem.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIResistanceManagement_ListItem.uc index fa5975185..6257a5dee 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIResistanceManagement_ListItem.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIResistanceManagement_ListItem.uc @@ -185,7 +185,7 @@ simulated function UpdateData(bool Focused = false) { strCount $= " "; strCount $= class'UIUtilities_Text'.static.GetColoredText(string(Outpost.GetResistanceMecCount()), Focused ? -1 : eUIState_Normal, TheListItemFontSize); - strCount $= class'UIUtilities_Text'.static.InjectImage("img:///UILibrary_LW_Overhaul.Resistance_Mec_icon", TheIconSize, TheIconSize, TheIconOffset); + strCount $= class'UIUtilities_Text'.static.InjectImage("img:///UILibrary_LWOTC.Resistance_Mec_icon", TheIconSize, TheIconSize, TheIconOffset); } RebelCount.SetCenteredText(strCount); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_BetaPatchNotes.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_BetaPatchNotes.uc new file mode 100644 index 000000000..1e62a0d02 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_BetaPatchNotes.uc @@ -0,0 +1,162 @@ +//--------------------------------------------------------------------------------------- +// FILE: UISL Shell LWoTCVersion.uc +// +// ORIGINAL CREATED BY SHIREMCT +// BEGIN EDITS BY RUSTYDIOS 21/02/21 03:00 +// LAST EDITED BY RUSTYDIOS 30/04/23 21:00 +// MODIFIED FOR LWOTC BY TEDSTER 17/10/23 19:00 +// +// !! DONT FORGET TO ACTUALLY UPDATE THE CONFIG NUMBER ON UPDATES !! +// EACH MOD SHOULD HAVE UNIQUE CLASS_NAME AND CONFIG FILE +// ALSO A LOCALIZATION\MODNAME.INT WITH THE STRINGS UNDER THE HEADER [CLASS_NAME] +// +//--------------------------------------------------------------------------------------- + +class UISL_Shell_BetaPatchNotes extends UIScreenListener config(LWoTC_Version); + +var config int iVERSION; +var int iVersion_Installed; + +var localized string strMessage_Title, strMessage_Header, strMessage_Body, strDismiss_Button; + +var string PathToPanelLWoTC; + + +event OnInit(UIScreen Screen) +{ + local UIPanel Screen_BetaNotes_LWoTC; + // DO WE CREATE THIS OR NOT, YES TO FIRST WARNING = 0, YES TO TESTING = -1, YES TO EACH UPDATE = NEW > OLD + if(ShouldShowWarningMsg()) + { + Screen_BetaNotes_LWoTC = Screen.Spawn(class'UIPanel', Screen); + PathToPanelLWoTC = PathName(Screen_BetaNotes_LWoTC); + Screen_BetaNotes_LWoTC.InitPanel('BetaPatchNotesScreen_BetaNotes_LWoTC'); + Screen_BetaNotes_LWoTC.SetSize(1920, 1080); + Screen_BetaNotes_LWoTC.SetPosition(0, 0); + CreatePanel_ConfigWarning_BetaNotes_LWoTC(Screen_BetaNotes_LWoTC); + } + + return; +} + +simulated function CreatePanel_ConfigWarning_BetaNotes_LWoTC(UIPanel Screen) +{ + local int X, Y, W, H; + + local UIBGBox WarningBkgGrnd_BetaNotes_LWoTC; + local UIPanel WarningPanel_BetaNotes_LWoTC; + local UIImage WarningImage_BetaNotes_LWoTC; + local UIX2PanelHeader WarningTitle_BetaNotes_LWoTC; + local UITextContainer WarningHeader_BetaNotes_LWoTC, WarningBody_BetaNotes_LWoTC; + local UIButton DismissButton_BetaNotes_LWoTC; + + + // pos x, pos y , width, height + X = 500; Y = 300; W = 800; H = 420; + + // CREATE A PANEL WITH A BACKGROUND PANEL AND LITTLE IMAGE + WarningBkgGrnd_BetaNotes_LWoTC = Screen.Spawn(class'UIBGBox', Screen); + WarningBkgGrnd_BetaNotes_LWoTC.LibID = class'UIUtilities_Controls'.const.MC_X2Background; + WarningBkgGrnd_BetaNotes_LWoTC.InitBG('ConfigPopup_BG_BetaNotes_LWoTC', X, Y, W, H); + + WarningPanel_BetaNotes_LWoTC = Screen.Spawn(class'UIPanel', Screen); + WarningPanel_BetaNotes_LWoTC.InitPanel('ConfigPopup_BetaNotes_LWoTC'); + WarningPanel_BetaNotes_LWoTC.SetSize(WarningBkgGrnd_BetaNotes_LWoTC.Width, WarningBkgGrnd_BetaNotes_LWoTC.Height); //800, 420 + WarningPanel_BetaNotes_LWoTC.SetPosition(WarningBkgGrnd_BetaNotes_LWoTC.X, WarningBkgGrnd_BetaNotes_LWoTC.Y); //500, 300 + + WarningImage_BetaNotes_LWoTC = Screen.Spawn(class'UIImage', Screen); + WarningImage_BetaNotes_LWoTC.InitImage(, "img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon0"); + WarningImage_BetaNotes_LWoTC.SetScale(0.25); + WarningImage_BetaNotes_LWoTC.SetPosition(WarningBkgGrnd_BetaNotes_LWoTC.X + WarningBkgGrnd_BetaNotes_LWoTC.Width - 90, WarningBkgGrnd_BetaNotes_LWoTC.Y + 20); + + // CREATE A TITLE, COOL ONE WITH THE HAZARD BAR + WarningTitle_BetaNotes_LWoTC = Screen.Spawn(class'UIX2PanelHeader', WarningPanel_BetaNotes_LWoTC); + WarningTitle_BetaNotes_LWoTC.InitPanelHeader('', class'UIUtilities_Text'.static.GetColoredText(strMessage_Title @ class'LWVersion'.static.GetShortVersionString(), eUIState_Bad, 32), ""); //red + WarningTitle_BetaNotes_LWoTC.SetPosition(WarningTitle_BetaNotes_LWoTC.X + 10, WarningTitle_BetaNotes_LWoTC.Y + 10); //510, 310 + WarningTitle_BetaNotes_LWoTC.SetHeaderWidth(WarningPanel_BetaNotes_LWoTC.Width - 20); //780 + + // CREATE A ONE LINE HEADER + WarningHeader_BetaNotes_LWoTC = Screen.Spawn(class'UITextContainer', WarningPanel_BetaNotes_LWoTC); + WarningHeader_BetaNotes_LWoTC.InitTextContainer(); + WarningHeader_BetaNotes_LWoTC.bAutoScroll = true; + WarningHeader_BetaNotes_LWoTC.SetSize(WarningBkgGrnd_BetaNotes_LWoTC.Width - 40, 30); //760, 30 + WarningHeader_BetaNotes_LWoTC.SetPosition(WarningHeader_BetaNotes_LWoTC.X + 20, WarningHeader_BetaNotes_LWoTC.Y +60); //520, 360 + + WarningHeader_BetaNotes_LWoTC.Text.SetHTMLText( class'UIUtilities_Text'.static.StyleText(strMessage_Header, eUITextStyle_Tooltip_H1, eUIState_Warning2)); //orange + + // CREATE THE ACTUAL MESSAGE + WarningBody_BetaNotes_LWoTC = Screen.Spawn(class'UITextContainer', WarningPanel_BetaNotes_LWoTC); + WarningBody_BetaNotes_LWoTC.InitTextContainer(); + WarningBody_BetaNotes_LWoTC.bAutoScroll = true; + WarningBody_BetaNotes_LWoTC.SetSize(WarningBkgGrnd_BetaNotes_LWoTC.Width - 40, WarningBkgGrnd_BetaNotes_LWoTC.Height - 150); //760, 270 + WarningBody_BetaNotes_LWoTC.SetPosition(WarningBody_BetaNotes_LWoTC.X +20, WarningBody_BetaNotes_LWoTC.Y + 90); //520, 390 + + WarningBody_BetaNotes_LWoTC.Text.SetHTMLText( class'UIUtilities_Text'.static.StyleText(strMessage_Body, eUITextStyle_Tooltip_Body, eUIState_Normal)); //cyan + WarningBody_BetaNotes_LWoTC.Text.SetHeight(WarningBody_BetaNotes_LWoTC.Text.Height * 3.0f); + + // CREATE A DISMISS BUTTON + DismissButton_BetaNotes_LWoTC = Screen.Spawn(class'UIButton', WarningPanel_BetaNotes_LWoTC); + DismissButton_BetaNotes_LWoTC.InitButton('DismissButton_BetaNotes_LWoTC', strDismiss_Button, DismissButton_BetaNotes_LWoTCHandler, ); + DismissButton_BetaNotes_LWoTC.SetSize(760, 30); + DismissButton_BetaNotes_LWoTC.SetResizeToText(true); + DismissButton_BetaNotes_LWoTC.AnchorTopCenter(); //AUTO + DismissButton_BetaNotes_LWoTC.OriginTopCenter(); //AUTO + DismissButton_BetaNotes_LWoTC.SetPosition(DismissButton_BetaNotes_LWoTC.X - 60, WarningBkgGrnd_BetaNotes_LWoTC.Y +375); +} + +// CLEAR EVERYTHING ON BUTTON PRESS +simulated function DismissButton_BetaNotes_LWoTCHandler(UIButton Button) +{ + local UIPanel Panel; + Panel = UIPanel(FindObject(PathToPanelLWoTC, class'UIPanel')); + Panel.Remove(); + PathToPanelLWoTC = ""; +} + +event OnRemoved(UIScreen Screen) +{ + PathToPanelLWoTC = ""; +} + +// SHOULD WE DISPLAY THE POPUP BASED ON CONFIG NUMBER +static function bool ShouldShowWarningMsg() +{ + return false; + // Show it because the version number is set to negative (testing)... + if (default.iVersion_Installed <= -1) + { + return true; + } + + // Show it this first time because it's the first version that establishes the version numbers + if (default.iVERSION == 0 ) + { + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return true; + } + + // Older version detected - Show update warning + if (default.iVERSION < default.iVersion_Installed) + { + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return true; + } + + // Same version, backup config save - Don't display + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return false; +} + + + + +// DONT FORGET TO ACTUALLY UPDATE THE CONFIG NUMBER ON UPDATES +// DO THIS IS ONLY ON THE FINAL SHELL - MAIN MENU SCREEN IN REVIEW MODE +defaultproperties +{ + ScreenClass = UIFinalShell; + iVersion_Installed = 18; // beta is on 18 +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_LWoTCVersion.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_LWoTCVersion.uc new file mode 100644 index 000000000..e6dd02c82 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISL_Shell_LWoTCVersion.uc @@ -0,0 +1,160 @@ +//--------------------------------------------------------------------------------------- +// FILE: UISL Shell LWoTCVersion.uc +// +// ORIGINAL CREATED BY SHIREMCT +// BEGIN EDITS BY RUSTYDIOS 21/02/21 03:00 +// LAST EDITED BY RUSTYDIOS 30/04/23 21:00 +// MODIFIED FOR LWOTC BY TEDSTER 17/10/23 19:00 +// +// !! DONT FORGET TO ACTUALLY UPDATE THE CONFIG NUMBER ON UPDATES !! +// EACH MOD SHOULD HAVE UNIQUE CLASS_NAME AND CONFIG FILE +// ALSO A LOCALIZATION\MODNAME.INT WITH THE STRINGS UNDER THE HEADER [CLASS_NAME] +// +//--------------------------------------------------------------------------------------- + +class UISL_Shell_LWoTCVersion extends UIScreenListener config(LWoTC_Version); + +var config int iVERSION; +var int iVersion_Installed; + +var localized string strMessage_Title, strMessage_Header, strMessage_Body, strDismiss_Button; + +var string PathToPanelLWoTC; + +event OnInit(UIScreen Screen) +{ + local UIPanel Screen_LWoTC; + // DO WE CREATE THIS OR NOT, YES TO FIRST WARNING = 0, YES TO TESTING = -1, YES TO EACH UPDATE = NEW > OLD + if(ShouldShowWarningMsg()) + { + Screen_LWoTC = Screen.Spawn(class'UIPanel', Screen); + PathToPanelLWoTC = PathName(Screen_LWoTC); + Screen_LWoTC.InitPanel('PatchNotesScreen_LWoTC'); + Screen_LWoTC.SetSize(1920, 1080); + Screen_LWoTC.SetPosition(0, 0); + CreatePanel_ConfigWarning_LWoTC(Screen_LWoTC); + } + + return; +} + +simulated function CreatePanel_ConfigWarning_LWoTC(UIPanel Screen) +{ + local int X, Y, W, H; + + + local UIBGBox WarningBkgGrnd_LWoTC; + local UIPanel WarningPanel_LWoTC; + local UIImage WarningImage_LWoTC; + local UIX2PanelHeader WarningTitle_LWoTC; + local UITextContainer WarningHeader_LWoTC, WarningBody_LWoTC; + local UIButton DismissButton_LWoTC; + + // pos x, pos y , width, height + X = 500; Y = 300; W = 800; H = 420; + + // CREATE A PANEL WITH A BACKGROUND PANEL AND LITTLE IMAGE + WarningBkgGrnd_LWoTC = Screen.Spawn(class'UIBGBox', Screen); + WarningBkgGrnd_LWoTC.LibID = class'UIUtilities_Controls'.const.MC_X2Background; + WarningBkgGrnd_LWoTC.InitBG('ConfigPopup_BG_LWoTC', X, Y, W, H); + + WarningPanel_LWoTC = Screen.Spawn(class'UIPanel', Screen); + WarningPanel_LWoTC.InitPanel('ConfigPopup_LWoTC'); + WarningPanel_LWoTC.SetSize(WarningBkgGrnd_LWoTC.Width, WarningBkgGrnd_LWoTC.Height); //800, 420 + WarningPanel_LWoTC.SetPosition(WarningBkgGrnd_LWoTC.X, WarningBkgGrnd_LWoTC.Y); //500, 300 + + WarningImage_LWoTC = Screen.Spawn(class'UIImage', Screen); + WarningImage_LWoTC.InitImage(, "img:///UILibrary_LWOTC.SampleSquadIcons.SquadIcon0"); + WarningImage_LWoTC.SetScale(0.25); + WarningImage_LWoTC.SetPosition(WarningBkgGrnd_LWoTC.X + WarningBkgGrnd_LWoTC.Width - 90, WarningBkgGrnd_LWoTC.Y + 20); + + // CREATE A TITLE, COOL ONE WITH THE HAZARD BAR + WarningTitle_LWoTC = Screen.Spawn(class'UIX2PanelHeader', WarningPanel_LWoTC); + WarningTitle_LWoTC.InitPanelHeader('', class'UIUtilities_Text'.static.GetColoredText(strMessage_Title @ class'LWVersion'.static.GetShortVersionString(), eUIState_Bad, 32), ""); //red + WarningTitle_LWoTC.SetPosition(WarningTitle_LWoTC.X + 10, WarningTitle_LWoTC.Y + 10); //510, 310 + WarningTitle_LWoTC.SetHeaderWidth(WarningPanel_LWoTC.Width - 20); //780 + + // CREATE A ONE LINE HEADER + WarningHeader_LWoTC = Screen.Spawn(class'UITextContainer', WarningPanel_LWoTC); + WarningHeader_LWoTC.InitTextContainer(); + WarningHeader_LWoTC.bAutoScroll = true; + WarningHeader_LWoTC.SetSize(WarningBkgGrnd_LWoTC.Width - 40, 30); //760, 30 + WarningHeader_LWoTC.SetPosition(WarningHeader_LWoTC.X + 20, WarningHeader_LWoTC.Y +60); //520, 360 + + WarningHeader_LWoTC.Text.SetHTMLText( class'UIUtilities_Text'.static.StyleText(strMessage_Header, eUITextStyle_Tooltip_H1, eUIState_Warning2)); //orange + + // CREATE THE ACTUAL MESSAGE + WarningBody_LWoTC = Screen.Spawn(class'UITextContainer', WarningPanel_LWoTC); + WarningBody_LWoTC.InitTextContainer(); + WarningBody_LWoTC.bAutoScroll = true; + WarningBody_LWoTC.SetSize(WarningBkgGrnd_LWoTC.Width - 40, WarningBkgGrnd_LWoTC.Height - 150); //760, 270 + WarningBody_LWoTC.SetPosition(WarningBody_LWoTC.X +20, WarningBody_LWoTC.Y + 90); //520, 390 + + WarningBody_LWoTC.Text.SetHTMLText( class'UIUtilities_Text'.static.StyleText(strMessage_Body, eUITextStyle_Tooltip_Body, eUIState_Normal)); //cyan + WarningBody_LWoTC.Text.SetHeight(WarningBody_LWoTC.Text.Height * 3.0f); + + // CREATE A DISMISS BUTTON + DismissButton_LWoTC = Screen.Spawn(class'UIButton', WarningPanel_LWoTC); + DismissButton_LWoTC.InitButton('DismissButton_LWoTC', strDismiss_Button, DismissButton_LWoTCHandler, ); + DismissButton_LWoTC.SetSize(760, 30); + DismissButton_LWoTC.SetResizeToText(true); + DismissButton_LWoTC.AnchorTopCenter(); //AUTO + DismissButton_LWoTC.OriginTopCenter(); //AUTO + DismissButton_LWoTC.SetPosition(DismissButton_LWoTC.X - 60, WarningBkgGrnd_LWoTC.Y + 375); +} + +// CLEAR EVERYTHING ON BUTTON PRESS +simulated function DismissButton_LWoTCHandler(UIButton Button) +{ + local UIPanel Panel; + Panel = UIPanel(FindObject(PathToPanelLWoTC, class'UIPanel')); + Panel.Remove(); + PathToPanelLWoTC = ""; +} + +event OnRemoved(UIScreen Screen) +{ + PathToPanelLWoTC = ""; +} + +// SHOULD WE DISPLAY THE POPUP BASED ON CONFIG NUMBER +static function bool ShouldShowWarningMsg() +{ + // Show it because the version number is set to negative (testing)... + if (default.iVersion_Installed <= -1) + { + return true; + } + + // Show it this first time because it's the first version that establishes the version numbers + if (default.iVERSION == 0 ) + { + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return true; + } + + // Older version detected - Show update warning + if (default.iVERSION < default.iVersion_Installed) + { + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return true; + } + + // Same version, backup config save - Don't display + default.iVersion = default.iVersion_Installed; + StaticSaveConfig(); + return false; +} + + + + +// DONT FORGET TO ACTUALLY UPDATE THE CONFIG NUMBER ON UPDATES +// DO THIS IS ONLY ON THE FINAL SHELL - MAIN MENU SCREEN IN REVIEW MODE +defaultproperties +{ + ScreenClass = UIFinalShell; + iVersion_Installed = 1; // 1 +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_GetPCSImageOverride.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_GetPCSImageOverride.uc index 260fd9271..51966b74c 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_GetPCSImageOverride.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_GetPCSImageOverride.uc @@ -53,28 +53,28 @@ function EventListenerReturn GetPCSImage(Object EventData, Object EventSource, X // //switch (ItemState.GetMyTemplateName()) //{ - //case 'DepthPerceptionPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_depthperception"; break; - //case 'HyperReactivePupilsPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hyperreactivepupils"; break; - //case 'CombatAwarenessPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_threatassessment"; break; - //case 'DamageControlPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_damagecontrol"; break; - //case 'AbsorptionFieldsPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_impactfield"; break; - //case 'BodyShieldPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_bodyshield"; break; - //case 'EmergencyLifeSupportPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_emergencylifesupport"; break; - //case 'IronSkinPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_ironskin"; break; - //case 'SmartMacrophagesPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_smartmacrophages"; break; - //case 'CombatRushPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_combatrush"; break; - //case 'CommonPCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - //case 'RarePCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - //case 'EpicPCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - //case 'CommonPCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - //case 'RarePCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - //case 'EpicPCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - //case 'CommonPCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - //case 'RarePCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - //case 'EpicPCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - //case 'FireControl25PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; - //case 'FireControl50PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; - //case 'FireControl75PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; + //case 'DepthPerceptionPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_depthperception"; break; + //case 'HyperReactivePupilsPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hyperreactivepupils"; break; + //case 'CombatAwarenessPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_threatassessment"; break; + //case 'DamageControlPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_damagecontrol"; break; + //case 'AbsorptionFieldsPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_impactfield"; break; + //case 'BodyShieldPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_bodyshield"; break; + //case 'EmergencyLifeSupportPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_emergencylifesupport"; break; + //case 'IronSkinPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_ironskin"; break; + //case 'SmartMacrophagesPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_smartmacrophages"; break; + //case 'CombatRushPCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_combatrush"; break; + //case 'CommonPCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + //case 'RarePCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + //case 'EpicPCSDefense': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + //case 'CommonPCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + //case 'RarePCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + //case 'EpicPCSAgility': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + //case 'CommonPCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + //case 'RarePCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + //case 'EpicPCSHacking': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + //case 'FireControl25PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; + //case 'FireControl50PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; + //case 'FireControl75PCS': OverridePCSImageTuple.Data[0].b = true; OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; // //default: OverridePCSImageTuple.Data[0].b = false; //} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenAvengerAssault.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenAvengerAssault.uc index 9f72932c9..8df3d56e1 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenAvengerAssault.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenAvengerAssault.uc @@ -9,13 +9,23 @@ class UIScreenListener_Mission_ChosenAvengerAssault extends UIScreenListener; -var UIMission_ChosenAvengerAssault ChosenAvengerAssaultScreen; -var UIButton Button1; +var protected string PathToChosenAvengerAssaultScreen; +var protected string PathToButton1; + +//var UIMission_ChosenAvengerAssault ChosenAvengerAssaultScreen; +//var UIButton Button1; event OnInit(UIScreen Screen) { + local UIMission_ChosenAvengerAssault ChosenAvengerAssaultScreen; + local UIButton Button1; + ChosenAvengerAssaultScreen = UIMission_ChosenAvengerAssault(Screen); Button1 = ChosenAvengerAssaultScreen.Button1; + + PathToChosenAvengerAssaultScreen = PathName(ChosenAvengerAssaultScreen); + PathToButton1 = PathName(Button1); + // KDM : Display parent-panel centered hotlinks for controller users, and parent-panel centered buttons // for mouse and keyboard users. @@ -48,18 +58,18 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (Button1 != none) - { - Button1.OnSizeRealized = none; - } - - Button1 = none; - ChosenAvengerAssaultScreen = none; + PathToButton1 = ""; + PathToChosenAvengerAssaultScreen = ""; } simulated function RefreshNavigation() { local bool SelectionSet; + local UIMission_ChosenAvengerAssault ChosenAvengerAssaultScreen; + local UIButton Button1; + + ChosenAvengerAssaultScreen = UIMission_ChosenAvengerAssault(FindObject(PathToChosenAvengerAssaultScreen, class'UIMission_ChosenAvengerAssault')); + Button1 = UIButton(FindObject(PathToButton1, class'UIButton')); SelectionSet = false; @@ -81,6 +91,12 @@ simulated function RefreshNavigation() simulated function OnButtonSizeRealized() { + local UIMission_ChosenAvengerAssault ChosenAvengerAssaultScreen; + local UIButton Button1; + + ChosenAvengerAssaultScreen = UIMission_ChosenAvengerAssault(FindObject(PathToChosenAvengerAssaultScreen, class'UIMission_ChosenAvengerAssault')); + Button1 = UIButton(FindObject(PathToButton1, class'UIButton')); + if (ChosenAvengerAssaultScreen != none) { Button1.SetX(-Button1.Width / 2.0); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenStronghold.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenStronghold.uc index 2ebc61da3..af5d60912 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenStronghold.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_ChosenStronghold.uc @@ -10,18 +10,31 @@ class UIScreenListener_Mission_ChosenStronghold extends UIScreenListener; -var UIMission_ChosenStronghold ChosenStrongholdScreen; -var UIButton Button1, Button2, LockedButton; +var protected string PathToChosenStrongholdScreen; +var protected string PathToButton1, PathToButton2, PathToLockedButton; + +//var UIMission_ChosenStronghold ChosenStrongholdScreen; +//var UIButton Button1, Button2, LockedButton; event OnInit(UIScreen Screen) { + local UIMission_ChosenStronghold ChosenStrongholdScreen; + local UIButton Button1, Button2, LockedButton; + ChosenStrongholdScreen = UIMission_ChosenStronghold(Screen); + + PathToChosenStrongholdScreen = PathName(ChosenStrongholdScreen); + // KDM : If CanTakeMission is true then LockedButton will be 'none'; if CanTakeMission is false then Button1 // and Button2 will both be 'none'. Button1 = ChosenStrongholdScreen.Button1; Button2 = ChosenStrongholdScreen.Button2; LockedButton = ChosenStrongholdScreen.LockedButton; + PathToButton1 = PathName(Button1); + PathToButton2 = PathName(Button2); + PathToLockedButton = PathName(LockedButton); + // KDM : Display parent-panel centered hotlinks for controller users, and parent-panel centered buttons // for mouse and keyboard users. if (`ISCONTROLLERACTIVE) @@ -87,23 +100,10 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (Button1 != none) - { - Button1.OnSizeRealized = none; - } - if (Button2 != none) - { - Button2.OnSizeRealized = none; - } - if (LockedButton != none) - { - LockedButton.OnSizeRealized = none; - } - - Button1 = none; - Button2 = none; - LockedButton = none; - ChosenStrongholdScreen = none; + PathToButton1 = ""; + PathToButton2 = ""; + PathToLockedButton = ""; + PathToChosenStrongholdScreen = ""; `HQPRES.ScreenStack.UnsubscribeFromOnInputForScreen(Screen, OnChosenStrongholdMissionCommand); } @@ -111,6 +111,9 @@ event OnRemoved(UIScreen Screen) simulated function RefreshNavigation() { local bool SelectionSet; + local UIMission_ChosenStronghold ChosenStrongholdScreen; + + ChosenStrongholdScreen = UIMission_ChosenStronghold(FindObject(PathToChosenStrongholdScreen, class'UIMission_ChosenStronghold')); SelectionSet = false; @@ -128,41 +131,53 @@ simulated function RefreshNavigation() if (ChosenStrongholdScreen.CanTakeMission()) { // KDM : Add the 'launch mission' and 'cancel mission' buttons to the Navigator. - SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, Button1, SelectionSet); - SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, Button2, SelectionSet); + SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, ChosenStrongholdScreen.Button1, SelectionSet); + SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, ChosenStrongholdScreen.Button2, SelectionSet); } else { // KDM : Add the 'locked mission' button to the Navigator. - class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, LockedButton, SelectionSet); + class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(ChosenStrongholdScreen, ChosenStrongholdScreen.LockedButton, SelectionSet); } } } simulated function OnButtonSizeRealized() { + + local UIMission_ChosenStronghold ChosenStrongholdScreen; + + ChosenStrongholdScreen = UIMission_ChosenStronghold(FindObject(PathToChosenStrongholdScreen, class'UIMission_ChosenStronghold')); + if (ChosenStrongholdScreen != none) { - Button1.SetX(-Button1.Width / 2.0); - Button1.SetY(10.0); + ChosenStrongholdScreen.Button1.SetX(-ChosenStrongholdScreen.Button1.Width / 2.0); + ChosenStrongholdScreen.Button1.SetY(10.0); - Button2.SetX(-Button2.Width / 2.0); - Button2.SetY(40.0); + ChosenStrongholdScreen.Button2.SetX(-ChosenStrongholdScreen.Button2.Width / 2.0); + ChosenStrongholdScreen.Button2.SetY(40.0); } } simulated function OnLockedButtonSizeRealized() { + local UIMission_ChosenStronghold ChosenStrongholdScreen; + + ChosenStrongholdScreen = UIMission_ChosenStronghold(FindObject(PathToChosenStrongholdScreen, class'UIMission_ChosenStronghold')); + if (ChosenStrongholdScreen != none) { - LockedButton.SetX(200 - LockedButton.Width / 2.0); - LockedButton.SetY(125.0); + ChosenStrongholdScreen.LockedButton.SetX(200 - ChosenStrongholdScreen.LockedButton.Width / 2.0); + ChosenStrongholdScreen.LockedButton.SetY(125.0); } } simulated protected function bool OnChosenStrongholdMissionCommand(UIScreen Screen, int cmd, int arg) { local UIButton SelectedButton; + local UIMission_ChosenStronghold ChosenStrongholdScreen; + + ChosenStrongholdScreen = UIMission_ChosenStronghold(FindObject(PathToChosenStrongholdScreen, class'UIMission_ChosenStronghold')); if (!Screen.CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) { @@ -180,13 +195,13 @@ simulated protected function bool OnChosenStrongholdMissionCommand(UIScreen Scre // KDM : UIMission_ChosenStronghold.OnUnrealCommand would only 'click' on Button1 or Button2 if they were // focused; since controller users use hotlinks remove this requirement. case class'UIUtilities_Input'.const.FXS_BUTTON_A: - if (ChosenStrongholdScreen.CanTakeMission() && Button1 != none && Button1.bIsVisible) + if (ChosenStrongholdScreen.CanTakeMission() && ChosenStrongholdScreen.Button1 != none && ChosenStrongholdScreen.Button1.bIsVisible) { - Button1.Click(); + ChosenStrongholdScreen.Button1.Click(); } - else if (Button2 != none && Button2.bIsVisible) + else if (ChosenStrongholdScreen.Button2 != none && ChosenStrongholdScreen.Button2.bIsVisible) { - Button2.Click(); + ChosenStrongholdScreen.Button2.Click(); } return true; @@ -194,7 +209,7 @@ simulated protected function bool OnChosenStrongholdMissionCommand(UIScreen Scre // This allows the B button to back out of the screen when the mission is unlocked, assuming certain conditions // are met. case class'UIUtilities_Input'.const.FXS_BUTTON_B: - if(ChosenStrongholdScreen.CanBackOut() && Button2 != none && Button2.bIsVisible) + if(ChosenStrongholdScreen.CanBackOut() && ChosenStrongholdScreen.Button2 != none && ChosenStrongholdScreen.Button2.bIsVisible) { ChosenStrongholdScreen.CloseScreen(); return true; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GPIntelOptions.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GPIntelOptions.uc index c62d27d6f..612055226 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GPIntelOptions.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GPIntelOptions.uc @@ -10,12 +10,19 @@ class UIScreenListener_Mission_GPIntelOptions extends UIScreenListener; -var UIMission_GPIntelOptions GPIntelOptionsScreen; -var UIButton Button1, Button2, LockedButton; +var private string PathToGPIntelOptionsScreen; +//var UIMission_GPIntelOptions GPIntelOptionsScreen; +//var UIButton Button1, Button2, LockedButton; event OnInit(UIScreen Screen) { + local UIMission_GPIntelOptions GPIntelOptionsScreen; + local UIButton Button1, Button2, LockedButton; + GPIntelOptionsScreen = UIMission_GPIntelOptions(Screen); + + PathToGPIntelOptionsScreen = PathName(GPIntelOptionsScreen); + // KDM : If CanTakeMission is true then LockedButton will be 'none'; if CanTakeMission is false then Button1 // and Button2 will both be 'none'. Buttons which are not 'none' will have the eUIButtonStyle_HOTLINK_BUTTON style // and will resize according to their text. @@ -83,23 +90,7 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (Button1 != none) - { - Button1.OnSizeRealized = none; - } - if (Button2 != none) - { - Button2.OnSizeRealized = none; - } - if (LockedButton != none) - { - LockedButton.OnSizeRealized = none; - } - - Button1 = none; - Button2 = none; - LockedButton = none; - GPIntelOptionsScreen = none; + PathToGPIntelOptionsScreen = ""; `HQPRES.ScreenStack.UnsubscribeFromOnInputForScreen(Screen, OnGPIntelOptionsMissionCommand); } @@ -111,6 +102,9 @@ simulated function RefreshNavigation() local UIList List; local UIMechaListItem ListItem; local UIPanel IntelPanel; + local UIMission_GPIntelOptions GPIntelOptionsScreen; + + GPIntelOptionsScreen = UIMission_GPIntelOptions(FindObject(PathToGPIntelOptionsScreen, class'UIMission_GPIntelOptions')); SelectionSet = false; @@ -137,7 +131,7 @@ simulated function RefreshNavigation() if (!`ISCONTROLLERACTIVE) { // KDM : Add the 'locked mission' button to the Navigator. - class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GPIntelOptionsScreen, LockedButton, SelectionSet); + class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GPIntelOptionsScreen, GPIntelOptionsScreen.LockedButton, SelectionSet); } // KDM : If the mission is locked then disable all of the intel option buttons. @@ -154,6 +148,8 @@ simulated function RefreshNavigation() simulated function OnButtonSizeRealized() { + local UIMission_GPIntelOptions GPIntelOptionsScreen; + // KDM : When using a mouse and keyboard, this function acts as an override for // UIMission_GPIntelOptions.OnButtonSizeRealized; therefore, we can simply exit. if (!`ISCONTROLLERACTIVE) @@ -161,38 +157,46 @@ simulated function OnButtonSizeRealized() return; } + GPIntelOptionsScreen = UIMission_GPIntelOptions(FindObject(PathToGPIntelOptionsScreen, class'UIMission_GPIntelOptions')); + if (GPIntelOptionsScreen != none) { - Button1.SetX(-Button1.Width / 2.0); - Button1.SetY(10.0); + GPIntelOptionsScreen.Button1.SetX(-GPIntelOptionsScreen.Button1.Width / 2.0); + GPIntelOptionsScreen.Button1.SetY(10.0); - Button2.SetX(-Button2.Width / 2.0); - Button2.SetY(40.0); + GPIntelOptionsScreen.Button2.SetX(-GPIntelOptionsScreen.Button2.Width / 2.0); + GPIntelOptionsScreen.Button2.SetY(40.0); } } simulated function OnLockedButtonSizeRealized() { + local UIMission_GPIntelOptions GPIntelOptionsScreen; + if (!`ISCONTROLLERACTIVE) { return; } + GPIntelOptionsScreen = UIMission_GPIntelOptions(FindObject(PathToGPIntelOptionsScreen, class'UIMission_GPIntelOptions')); + if (GPIntelOptionsScreen != none) { - LockedButton.SetX(225 - LockedButton.Width / 2.0); - LockedButton.SetY(85.0); + GPIntelOptionsScreen.LockedButton.SetX(225 - GPIntelOptionsScreen.LockedButton.Width / 2.0); + GPIntelOptionsScreen.LockedButton.SetY(85.0); } } simulated protected function bool OnGPIntelOptionsMissionCommand(UIScreen Screen, int cmd, int arg) { local UIButton SelectedButton; + local UIMission_GPIntelOptions GPIntelOptionsScreen; if (!Screen.CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) { return false; } + GPIntelOptionsScreen = UIMission_GPIntelOptions(FindObject(PathToGPIntelOptionsScreen, class'UIMission_GPIntelOptions')); // KDM : Exit if the screen doesn't exist yet. if (GPIntelOptionsScreen == none) diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GoldenPath.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GoldenPath.uc index 3e94470ff..eac4c08ee 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GoldenPath.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_Mission_GoldenPath.uc @@ -10,12 +10,18 @@ class UIScreenListener_Mission_GoldenPath extends UIScreenListener; -var UIMission_GoldenPath GoldenPathScreen; -var UIButton Button1, Button2, LockedButton; +var private string PathToGoldenPathScreen; +//var UIMission_GoldenPath GoldenPathScreen; +//var UIButton Button1, Button2, LockedButton; event OnInit(UIScreen Screen) { + local UIMission_GoldenPath GoldenPathScreen; + local UIButton Button1, Button2, LockedButton; + GoldenPathScreen = UIMission_GoldenPath(Screen); + + PathToGoldenPathScreen = PathName(GoldenPathScreen); // KDM : If CanTakeMission is true then LockedButton will be 'none'; if CanTakeMission is false then Button1 // and Button2 will both be 'none'. Buttons which are not 'none' will have the eUIButtonStyle_HOTLINK_BUTTON style // and will resize according to their text. @@ -78,23 +84,7 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (Button1 != none) - { - Button1.OnSizeRealized = none; - } - if (Button2 != none) - { - Button2.OnSizeRealized = none; - } - if (LockedButton != none) - { - LockedButton.OnSizeRealized = none; - } - - Button1 = none; - Button2 = none; - LockedButton = none; - GoldenPathScreen = none; + PathToGoldenPathScreen = ""; `HQPRES.ScreenStack.UnsubscribeFromOnInputForScreen(Screen, OnGoldenPathMissionCommand); } @@ -103,6 +93,9 @@ simulated function RefreshNavigation() { local bool SelectionSet; local UIPanel DefaultPanel; + local UIMission_GoldenPath GoldenPathScreen; + + GoldenPathScreen = UIMission_GoldenPath(FindObject(PathToGoldenPathScreen, class'UIMission_GoldenPath')); SelectionSet = false; @@ -125,41 +118,52 @@ simulated function RefreshNavigation() if (GoldenPathScreen.CanTakeMission()) { // KDM : Add the 'launch mission' and 'cancel mission' buttons to the Navigator. - SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, Button1, SelectionSet); - SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, Button2, SelectionSet); + SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, GoldenPathScreen.Button1, SelectionSet); + SelectionSet = class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, GoldenPathScreen.Button2, SelectionSet); } else { // KDM : Add the 'locked mission' button to the Navigator. - class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, LockedButton, SelectionSet); + class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(GoldenPathScreen, GoldenPathScreen.LockedButton, SelectionSet); } } } simulated function OnButtonSizeRealized() { + local UIMission_GoldenPath GoldenPathScreen; + + GoldenPathScreen = UIMission_GoldenPath(FindObject(PathToGoldenPathScreen, class'UIMission_GoldenPath')); + if (GoldenPathScreen != none) { - Button1.SetX(-Button1.Width / 2.0); - Button1.SetY(10.0); + GoldenPathScreen.Button1.SetX(-GoldenPathScreen.Button1.Width / 2.0); + GoldenPathScreen.Button1.SetY(10.0); - Button2.SetX(-Button2.Width / 2.0); - Button2.SetY(40.0); + GoldenPathScreen.Button2.SetX(-GoldenPathScreen.Button2.Width / 2.0); + GoldenPathScreen.Button2.SetY(40.0); } } simulated function OnLockedButtonSizeRealized() { + local UIMission_GoldenPath GoldenPathScreen; + + GoldenPathScreen = UIMission_GoldenPath(FindObject(PathToGoldenPathScreen, class'UIMission_GoldenPath')); + if (GoldenPathScreen != none) { - LockedButton.SetX(200 - LockedButton.Width / 2.0); - LockedButton.SetY(125.0); + GoldenPathScreen.LockedButton.SetX(200 - GoldenPathScreen.LockedButton.Width / 2.0); + GoldenPathScreen.LockedButton.SetY(125.0); } } simulated protected function bool OnGoldenPathMissionCommand(UIScreen Screen, int cmd, int arg) { local UIButton SelectedButton; + local UIMission_GoldenPath GoldenPathScreen; + + GoldenPathScreen = UIMission_GoldenPath(FindObject(PathToGoldenPathScreen, class'UIMission_GoldenPath')); if (!Screen.CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) { diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ShellDifficulty.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ShellDifficulty.uc index c88b0fcc0..9b942bfff 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ShellDifficulty.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ShellDifficulty.uc @@ -117,13 +117,13 @@ function AddLogoAndCredits(UIScreen Screen) LongWar2Image = Screen.Spawn(class'UIImage', Screen); LongWar2Image.bAnimateOnInit = false; - LongWar2Image.InitImage('LongWar2ShellImage', "img:///UILibrary_LW_Overhaul.longwar_fin_white"); + LongWar2Image.InitImage('LongWar2ShellImage', "img:///UILibrary_LWOTC.longwar_fin_white"); LongWar2Image.SetPosition(-436, -103); LongWar2Image.SetScale(0.818); PavonisImage = Screen.Spawn(class'UIImage', Screen); PavonisImage.bAnimateOnInit = false; - PavonisImage.InitImage('PavonisShellImage', "img:///UILibrary_LW_Overhaul.512pxPavonisLogofinalmerged"); + PavonisImage.InitImage('PavonisShellImage', "img:///UILibrary_LWOTC.512pxPavonisLogofinalmerged"); PavonisImage.SetPosition(-461, 510); PavonisImage.SetScale(0.5); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_UFOAttack.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_UFOAttack.uc index 62e94b766..cb3e236f2 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_UFOAttack.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_UFOAttack.uc @@ -9,13 +9,19 @@ class UIScreenListener_UFOAttack extends UIScreenListener; -var UIUFOAttack UFOAttackScreen; -var UIButton Button1; +var private string PathToUFOAttackScreen; +//var UIUFOAttack UFOAttackScreen; +//var UIButton Button1; event OnInit(UIScreen Screen) { + local UIUFOAttack UFOAttackScreen; + local UIButton Button1; + UFOAttackScreen = UIUFOAttack(Screen); Button1 = UFOAttackScreen.Button1; + + PathToUFOAttackScreen = PathName(UFOAttackScreen); // KDM : Display parent-panel centered hotlinks for controller users, and parent-panel centered buttons // for mouse and keyboard users. @@ -48,13 +54,7 @@ event OnInit(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (Button1 != none) - { - Button1.OnSizeRealized = none; - } - - Button1 = none; - UFOAttackScreen = none; + PathToUFOAttackScreen = ""; `HQPRES.ScreenStack.UnsubscribeFromOnInputForScreen(Screen, OnUFOAttackCommand); } @@ -63,6 +63,9 @@ simulated function RefreshNavigation() { local bool SelectionSet; local UIPanel DefaultPanel; + local UIUFOAttack UFOAttackScreen; + + UFOAttackScreen = UIUFOAttack(FindObject(PathToUFOAttackScreen, class'UIUFOAttack')); SelectionSet = false; @@ -83,22 +86,30 @@ simulated function RefreshNavigation() if (!`ISCONTROLLERACTIVE) { // KDM : Add the 'launch mission' button to the Navigator. - class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(UFOAttackScreen, Button1, SelectionSet); + class'UIUtilities_LW'.static.AddBtnToNavigatorAndSelect(UFOAttackScreen, UFOAttackScreen.Button1, SelectionSet); } } simulated function OnButtonSizeRealized() { + local UIUFOAttack UFOAttackScreen; + + UFOAttackScreen = UIUFOAttack(FindObject(PathToUFOAttackScreen, class'UIUFOAttack')); + if (UFOAttackScreen != none) { - Button1.SetX(-Button1.Width / 2.0); - Button1.SetY(10.0); + if (UFOAttackScreen != none) + UFOAttackScreen.Button1.SetX(-UFOAttackScreen.Button1.Width / 2.0); + UFOAttackScreen.Button1.SetY(10.0); } } simulated protected function bool OnUFOAttackCommand(UIScreen Screen, int cmd, int arg) { local UIButton SelectedButton; + local UIUFOAttack UFOAttackScreen; + + UFOAttackScreen = UIUFOAttack(FindObject(PathToUFOAttackScreen, class'UIUFOAttack')); if (!Screen.CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) { @@ -117,9 +128,9 @@ simulated protected function bool OnUFOAttackCommand(UIScreen Screen, int cmd, i // KDM : UIUFOAttack.OnUnrealCommand would only 'click' on a button if it was selected; since controller users // use hotlinks remove this requirement. case class'UIUtilities_Input'.const.FXS_BUTTON_A: - if (Button1 != none && Button1.bIsVisible) + if (UFOAttackScreen.Button1 != none && UFOAttackScreen.Button1.bIsVisible) { - Button1.Click(); + UFOAttackScreen.Button1.Click(); return true; } break; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ViewObjectives.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ViewObjectives.uc index 2880b94c7..f5f965ffe 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ViewObjectives.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIScreenListener_ViewObjectives.uc @@ -6,14 +6,23 @@ class UIScreenListener_ViewObjectives extends UIScreenListener config(LW_Overhaul); -var UIViewObjectives ObjectiveScreen; -var UIPanel MouseEventPanel; +var private string PathToObjectiveScreen; +var private string PathToMouseEventPanel; + +//var UIViewObjectives ObjectiveScreen; +//var UIPanel MouseEventPanel; var localized string ScrollObjectiveDescriptionStr; event OnInit(UIScreen Screen) { + local UIViewObjectives ObjectiveScreen; + local UIPanel MouseEventPanel; + ObjectiveScreen = UIViewObjectives(Screen); + + PathToObjectiveScreen = PathName(ObjectiveScreen); + if (ObjectiveScreen.List != none) { // KDM : When list selection changes a new objective is being looked at; when this happens, @@ -45,6 +54,7 @@ event OnInit(UIScreen Screen) // KDM : 'Soft' hide the UIPanel so that it can still process mouse events. MouseEventPanel.SetAlpha(0); MouseEventPanel.ProcessMouseEvents(OnItemCardMouseEvent); + PathToMouseEventPanel = PathName(MouseEventPanel); } } @@ -54,6 +64,10 @@ event OnInit(UIScreen Screen) simulated function OnObjectiveSelectionChanged(UIList List, int Index) { + local UIViewObjectives ObjectiveScreen; + + ObjectiveScreen = UIViewObjectives(FindObject(PathToObjectiveScreen, class'UIViewObjectives')); + if (ObjectiveScreen != none) { // KDM : Previously List.OnSelectionChanged was hooked up to ObjectiveScreen.SelectedItemChanged; @@ -73,6 +87,10 @@ simulated function OnObjectiveSelectionChanged(UIList List, int Index) simulated function OnItemCardMouseEvent(UIPanel Control, int cmd) { + local UIViewObjectives ObjectiveScreen; + + ObjectiveScreen = UIViewObjectives(FindObject(PathToObjectiveScreen, class'UIViewObjectives')); + switch(cmd) { case class'UIUtilities_Input'.const.FXS_MOUSE_SCROLL_DOWN: @@ -97,21 +115,9 @@ event OnReceiveFocus(UIScreen Screen) event OnRemoved(UIScreen Screen) { - if (MouseEventPanel != none) - { - MouseEventPanel.IgnoreMouseEvents(); - MouseEventPanel.Remove(); - MouseEventPanel = none; - } - if (ObjectiveScreen != none) - { - if (ObjectiveScreen.List != none) - { - ObjectiveScreen.List.OnSelectionChanged = none; - } - ObjectiveScreen = none; - } + PathToMouseEventPanel = ""; + PathToObjectiveScreen = ""; `HQPRES.ScreenStack.UnsubscribeFromOnInputForScreen(Screen, OnViewObjectivesCommand); RemoveNavHelp(); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISquadSelect_InfiltrationPanel.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISquadSelect_InfiltrationPanel.uc index 8984f3a3a..a40ecb87b 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISquadSelect_InfiltrationPanel.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UISquadSelect_InfiltrationPanel.uc @@ -201,7 +201,7 @@ simulated function Update(array Soldiers) MissionState = XComGameState_MissionSite(`XCOMHISTORY.GetGameStateForObjectID(MissionData.MissionID)); - TotalInfiltrationHours = class'XComGameState_LWPersistentSquad'.static.GetHoursToFullInfiltration_Static(Soldiers, MissionState.GetReference(), SquadSizeHours, CovertnessHours, LiberationHours); + TotalInfiltrationHours = class'XComGameState_LWPersistentSquad'.static.GetHoursToFullInfiltration_Static(Soldiers, MissionState.GetReference(), SquadSizeHours, CovertnessHours, LiberationHours) + 2.0; TotalMissionHours = 99999; if(MissionState.ExpirationDateTime.m_iYear < 2100) diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIStrategyMapItem_AlienNetworkComponent_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIStrategyMapItem_AlienNetworkComponent_LW.uc index be976eb95..f88df772c 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIStrategyMapItem_AlienNetworkComponent_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIStrategyMapItem_AlienNetworkComponent_LW.uc @@ -1,517 +1,517 @@ -//--------------------------------------------------------------------------------------- -// FILE: UIStrategyMapItem_AlienNetworkComponent_LW -// AUTHOR: Joey Martinez -- 05/06/2019 -// PURPOSE: This file represents an alien network spot on the StrategyMap for Long War of the Chosen. -// The base game class is being overridden because the infiltration label was not showing -// up when you sent a squad to infiltrate an alien facility with the base implentation of -// the parent class. -// -// This class' code is a literal copy paste of the UIStrategyMapItem_Mission_LW class so -// that the alien facility strategy item has the same infiltration mechanics as other missions -// do. All of the code in this class is unique to this class and does not override any of the -// parent class behavior. -// -// KDM : The same controller code found in UIStrategyMapItem_Mission_LW has been implemented here so -// that alien facilities are 'clickable'. -//--------------------------------------------------------------------------------------- - -class UIStrategyMapItem_AlienNetworkComponent_LW extends UIStrategyMapItem_AlienNetworkComponent; - -var UIScanButton ScanButton; // used for missions being infiltrated -var UIText InfilPct; -var UIText InfilLabel; - -var UIImage SquadImage; // for cases where there is an infiltrating squad -var string CachedImageName; - -var UIProgressBar ProgressBar; // used to show remaining time for missions not yet infiltrated - -var int InDepth; // tracks depth of mouse in and outs, since it's recording from two possibly overlapping elements (2D and 3D icons) - -var localized string strRecon; - -var transient bool bScanButtonResized; -var transient float CachedScanButtonWidth; - -simulated function UIStrategyMapItem InitMapItem(out XComGameState_GeoscapeEntity Entity) -{ - // override the super so we can always use MI_alienfacility to allow displaying of doom pips - //super.InitMapItem(Entity); - - local string PinImage; - // Initialize static data - InitPanel(Name(Entity.GetUIWidgetName()), 'MI_alienFacility'); - - PinImage = Entity.GetUIPinImagePath(); - if (PinImage != "") - { - SetImage(PinImage); - } - - InitFromGeoscapeEntity(Entity); - - ScanButton = Spawn(class'UIScanButton', self).InitScanButton(); - ScanButton.SetButtonIcon(""); - ScanButton.SetDefaultDelegate(OpenInfiltrationMissionScreen); - ScanButton.SetButtonType(eUIScanButtonType_Default); - - SquadImage = Spawn(class'UIImage', self); - SquadImage.bAnimateOnInit = false; - SquadImage.InitImage().SetSize(48, 48); - - InfilPct = Spawn(class'UIText', ScanButton).InitText('InfilPct_LW', ""); - InfilPct.SetWidth(60); - InfilPct.SetPosition(154, 3); - - InfilLabel = Spawn(class'UIText', ScanButton).InitText('InfilLabel_LW', ""); - InfilLabel.SetWidth(60); - InfilLabel.SetPosition(154 - 5, 23); - - ProgressBar = Spawn(class'UIProgressBar', self).InitProgressBar('MissionInfiltrationProgress', -32, 5, 64, 8, 0.5, eUIState_Normal); - - bScanButtonResized = false; - - InstanceMapItem3DMaterial(); - - // KDM : The mission map item's help icon gets in the way of the infiltrating squad icon; the best way to deal with it is to null it. - // For more information on a similar topic please see the comments in UIStrategyMapItem_Region_LW --> InitMapItem(). - if (`ISCONTROLLERACTIVE) - { - ScanButton.MC.SetNull("consoleHint"); - } - - return self; -} - -function InstanceMapItem3DMaterial() -{ - local int i; - local MaterialInterface Mat; - local MaterialInstanceConstant MIC, NewMIC; - - if (MapItem3D == none) - return; - - - - for (i = 0; i < MapItem3D.OverworldMeshs[MapItem3D.ROOT_TILE].GetNumElements(); ++i) - { - Mat = MapItem3D.GetMeshMaterial(i); - MIC = MaterialInstanceConstant(Mat); - - // It is possible for there to be MITVs in these slots, so check - if (MIC != none) - { - // If this is not a child MIC, make it one. This is done so that the material updates below don't stomp - // on each other between units. - if (InStr(MIC.Name, "MaterialInstanceConstant") == INDEX_NONE) - { - NewMIC = new (self) class'MaterialInstanceConstant'; - NewMIC.SetParent(MIC); - MapItem3D.SetMeshMaterial(i, NewMIC); - MIC = NewMIC; - } - } - } - -} - -function UpdateFromGeoscapeEntity(const out XComGameState_GeoscapeEntity GeoscapeEntity) -{ - local int InfiltrationPct, InfiltrationTextColour; - local float ScanWidth; - local string InfiltrationPctValue, MissionInfo, MissionTitle; - local X2MissionTemplate MissionTemplate; - local XComGameState_LWPersistentSquad InfiltratingSquad; - local XComGameState_MissionSite MissionState; - - if (!bIsInited) - { - return; - } - - super(UIStrategyMapItem).UpdateFromGeoscapeEntity(GeoscapeEntity); - - InfiltratingSquad = GetInfiltratingSquad(); - - MissionState = GetMission(); - if (InfiltratingSquad != none) - { - InfiltrationTextColour = (bIsFocused) ? -1 : eUIState_Normal; - - InfiltrationPct = int(InfiltratingSquad.CurrentInfiltration * 100.0); - InfiltrationPctValue = string(InfiltrationPct) $ "%"; - - // KDM : When using a controller, there are 2 general colour states : - // 1.] This mission map item is selected, so its background is highlighted, and its text should be black. - // 2.] This mission map item is not selected, so its background is not highlighted, and its text should be normal blue. - if (`ISCONTROLLERACTIVE) - { - // KDM : When using a controller, the infiltration label needs to be continually refreshed according to the map item's selection status. - // When using a mouse & keyboard, the infiltration label doesn't need to change, so it can be called a single time down below. - InfilLabel.SetHTMLText(CenterText(class'UIUtilities_Text_LW'.static.AddFontInfoWithColor(strRecon, false, false, , 16, InfiltrationTextColour))); - InfilPct.SetHTMLText(CenterText(class'UIUtilities_Text_LW'.static.AddFontInfoWithColor(InfiltrationPctValue, false, true, , 20, InfiltrationTextColour))); - } - else - { - InfilPct.SetHTMLText(CenterText(class'UIUtilities_Text'.static.AddFontInfo(InfiltrationPctValue, false, true, , 20))); - } - - if (!bScanButtonResized) - { - MissionTitle = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(InfiltratingSquad.sSquadName); - MissionTemplate = class'X2MissionTemplateManager'.static.GetMissionTemplateManager().FindMissionTemplate(MissionState.GeneratedMission.Mission.MissionName); - MissionInfo = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(MissionTemplate.PostMissionType); - - ScanButton.SetText(MissionTitle, MissionInfo, " ", " "); // have to leave blank spaces so that Flash will size BG big enough - SetLevel(0); // show 0 doom pips - - // KDM : Infiltration label handling for controllers is dealt with up above. - if (!`ISCONTROLLERACTIVE) - { - InfilLabel.SetHTMLText(CenterText(class'UIUtilities_Text'.static.GetSizedText(strRecon, 16))); - } - - bScanButtonResized = true; - - CachedImageName = InfiltratingSquad.GetSquadImagePath(); - SquadImage.LoadImage(CachedImageName); - } - ScanButton.DefaultState(); - ScanButton.PulseScanner(false); - ScanButton.ShowScanIcon(false); - ScanButton.Realize(); - - // but the MC queuing system means that the width isn't set here the first time it's been invoked - ScanWidth = ScanButton.MC.GetNum("bg._width"); - - if (ScanWidth != CachedScanButtonWidth) - { - InfilPct.SetX(ScanWidth - 60); - InfilLabel.SetX(ScanWidth - 65); - ScanButton.SetX(- (ScanWidth/2)); - - CachedScanButtonWidth = ScanWidth; - - SquadImage.SetPosition(-(ScanWidth/2 + 48), 0); - } - if (CachedImageName != InfiltratingSquad.GetSquadImagePath()) - { - CachedImageName = InfiltratingSquad.GetSquadImagePath(); - SquadImage.LoadImage(CachedImageName); - } - - ProgressBar.Hide(); - } - else if (MissionState.MakesDoom()) - { - SetLevel(MissionState.Doom); - ProgressBar.Hide(); - ScanButton.Hide(); - bScanButtonResized = false; - } - else - { - ProgressBar.Show(); - UpdateProgressBar(MissionState); - - ScanButton.Hide(); - SquadImage.Hide(); - bScanButtonResized = false; - } - - // KDM : Our custom, mission map item, tooltip contains information, like mission expiration and infiltration percentage, which changes over - // time; therefore, we need to continously update it. However, there are a few caveats : - // - // 1.] Tooltips are not created under normal circumstances for mission map items; therefore, we only need to worry about updating when - // a controller is being used, and SHOW_MISSION_TOOLTIPS_CTRL is true. - // 2.] UIStrategyMap stores a single active tooltip, ActiveTooltip, which it associates with the currently selected map item; unfortunately, - // UpdateFromGeoscapeEntity() is called regardless of whether this map item is selected or not. Consequently, we don't want this mission - // map item polluting the tool tip when it is not selected. - if (GetStrategyMap().SelectedMapItem == self && `ISCONTROLLERACTIVE && class'UIStrategyMapItem_Mission_LW'.default.SHOW_MISSION_TOOLTIPS_CTRL) - { - UpdateTooltip(); - } -} - -simulated function string CenterText(string Text) -{ - return class'UIUtilities_Text'.static.AlignCenter(Text); -} - -simulated function XComGameState_LWPersistentSquad GetInfiltratingSquad() -{ - return `LWSQUADMGR.GetSquadOnMission(GeoscapeEntityRef); -} - -simulated function XComGameState_MissionSite GetMission() -{ - return XComGameState_MissionSite(`XCOMHISTORY.GetGameStateForObjectID(GeoscapeEntityRef.ObjectID)); -} - -function OpenInfiltrationMissionScreen() -{ - local UIMission_LWLaunchDelayedMission MissionScreen; - local XComHQPresentationLayer HQPres; - - HQPres = `HQPRES; - MissionScreen = HQPres.Spawn(class'UIMission_LWLaunchDelayedMission', HQPres); - MissionScreen.MissionRef = GeoscapeEntityRef; - MissionScreen.bInstantInterp = false; - MissionScreen = UIMission_LWLaunchDelayedMission(HQPres.ScreenStack.Push(MissionScreen)); -} - -simulated function OnMouseEvent(int cmd, array args) -{ - if (GetStrategyMap().m_eUIState == eSMS_Flight) - { - return; - } - - switch(cmd) - { - case class'UIUtilities_Input'.const.FXS_L_MOUSE_IN: - OnMouseIn(); - break; - case class'UIUtilities_Input'.const.FXS_L_MOUSE_OUT: - OnMouseOut(); - break; - // KDM : A mouse click opens a mission's infiltration screen if it is currently being infiltrated. - case class'UIUtilities_Input'.const.FXS_L_MOUSE_UP: - MapItemMissionClicked(); - break; - } -} - -// KDM : This code was stripped out of OnMouseEvent() --> FXS_L_MOUSE_UP and placed within a function so that it could be called from both -// 1.] OnMouseEvent() for mouse & keyboard users 2.] OnUnrealCommand() for controller users. -simulated function MapItemMissionClicked() -{ - local XComGameState_GeoscapeEntity GeoscapeEntity; - local XComGameState_LWPersistentSquad InfiltratingSquad; - local XComGameStateHistory History; - - History = `XCOMHISTORY; - InfiltratingSquad = GetInfiltratingSquad(); - - if (InfiltratingSquad == none) - { - GeoscapeEntity = XComGameState_GeoscapeEntity(History.GetGameStateForObjectID(GeoscapeEntityRef.ObjectID)); - GeoscapeEntity.AttemptSelectionCheckInterruption(); - } - else - { - OpenInfiltrationMissionScreen(); - } -} - -simulated function UpdateProgressBar(XComGameState_MissionSite MissionState) -{ - local int RemainingSeconds; - - if(ProgressBar == none) - return; - - if(MissionState.ExpirationDateTime.m_iYear < 2100) - { - RemainingSeconds = class'X2StrategyGameRulesetDataStructures'.static.DifferenceInSeconds(MissionState.ExpirationDateTime, class'XComGameState_GeoscapeEntity'.static.GetCurrentTime()); - ProgressBar.SetPercent(1.0); - SetProgressBarColor(RemainingSeconds); - ProgressBar.Show(); - } - else - { - ProgressBar.SetPercent(0.0); - ProgressBar.Hide(); - } -} - -simulated function SetProgressBarColor(float RemainingSeconds) -{ - local float PercentIdealInfiltration; - - PercentIdealInfiltration = (RemainingSeconds / 3600.0) / class'XComGameState_LWPersistentSquad'.static.GetBaselineHoursToInfiltration(GeoscapeEntityRef); - - if (PercentIdealInfiltration >= 1.0) - { - ProgressBar.SetColor(class'UIUtilities_Colors'.const.GOOD_HTML_COLOR); - } - else if(PercentIdealInfiltration >= 0.5) - { - ProgressBar.SetColor(class'UIUtilities_Colors'.const.WARNING_HTML_COLOR); - } - else if(RemainingSeconds >= 86400.0) - { - ProgressBar.SetColor(class'UIUtilities_Colors'.const.WARNING2_HTML_COLOR); - } - else - { - ProgressBar.SetColor(class'UIUtilities_Colors'.const.BAD_HTML_COLOR); - } - -} - -//---------------- 3D Map Icon Handling ------------------- -simulated function OnMouseIn() -{ - if (InDepth == 0) - { - super(UIStrategyMapItem).OnMouseIn(); - - if(MapItem3D != none) - MapItem3D.SetHoverMaterialValue(1); - if(AnimMapItem3D != none) - AnimMapItem3D.SetHoverMaterialValue(1); - } - InDepth++; -} - -// Clear mouse hover special behavior -simulated function OnMouseOut() -{ - InDepth--; - - if (InDepth <= 0) - { - super(UIStrategyMapItem).OnMouseOut(); - - if(MapItem3D != none) - MapItem3D.SetHoverMaterialValue(0); - if(AnimMapItem3D != none) - AnimMapItem3D.SetHoverMaterialValue(0); - } -} - -simulated function Show() -{ - // override to always allow showing items - super(UIPanel).Show(); -} - -simulated function OnLoseFocus() -{ - super.OnLoseFocus(); -} - -function string GetToolTipText() -{ - local int InfiltrationPct; - local string BodyStr, TitleStr, InfiltrationPctStr, TooltipHTML; - local XComGameState_LWPersistentSquad InfiltratingSquad; - local XComGameState_MissionSite Mission; - - InfiltratingSquad = GetInfiltratingSquad(); - Mission = GetMission(); - - TooltipHTML = ""; - - if (Mission != none) - { - class'X2EventListener_StrategyMap'.static.GetMissionSiteUIButtonToolTip(TitleStr, BodyStr, none, Mission); - TitleStr = class'UIUtilities_Text'.static.GetColoredText(TitleStr, eUIState_Header); - - // KDM : The title includes the amount of time left before the mission expires; this is very useful information. - TooltipHTML $= TitleStr; - TooltipHTML $= "\n"; - TooltipHTML $= "--------------------------------"; - // KDM : If a squad is infiltrating, show the infiltration percentage. - if (InfiltratingSquad != none) - { - TooltipHTML $= "\n"; - TooltipHTML $= class'UIStrategyMapItem_Mission_LW'.default.InfiltrationTooltipString $ " : "; - - InfiltrationPct = int(InfiltratingSquad.CurrentInfiltration * 100.0); - InfiltrationPctStr = class'UIUtilities_Text'.static.GetColoredText(string(InfiltrationPct), eUIState_Good); - - TooltipHTML $= InfiltrationPctStr @ "%"; - TooltipHTML $= "\n"; - TooltipHTML $= "--------------------------------"; - } - TooltipHTML $= "\n"; - TooltipHTML $= BodyStr; - } - return TooltipHTML; -} - -function UpdateTooltip() -{ - local string TooltipHTML; - local UIStrategyMap StrategyMap; - - StrategyMap = GetStrategyMap(); - - // KDM : If the strategy map has no active tooltip, then there is nothing to update. - if (StrategyMap.ActiveTooltip != none) - { - // KDM : Get the new tooltip text and update the active tooltip. - TooltipHTML = GetToolTipText(); - StrategyMap.ActiveTooltip.SetText(TooltipHTML); - StrategyMap.ActiveTooltip.UpdateData(); - - // KDM : The tooltip data has been updated; however, this information is not pushed to the flash UI element, so we don't see - // any changes. There are 2 ways around this : - // - // 1.] The flash element, TooltipBox, has a function, Show(), which updates the tooltip's : Style, Text, Size, BG, and Location. - // Furthermore, it animates the tooltip in. This is a nice 'complete' method, but it involves us having to constantly hide and show the - // tooltip within UnrealScript. Additionally, it requires us to kill the tooltip's animation since we can't have it contantly fading in - // and fading out. - // 2.] Update the flash element's : Style, Text, Size, and BG, via Actionscript calls. This is a better solution because it updates - // the tooltip text and size, without having to resort to hiding and showing the tooltip; furthermore, it doesn't mess with any - // tooltip animations. - StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeStyle"); - StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeText"); - StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeSize"); - StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeBG"); - } -} - -// KDM : Long War provides useful mission tooltips; however, they only appear over the mission icons on the bottom icon bar, and are only -// accessible to mouse & keyboard users. Consequently, we want to give controller users the opportunity to display this information as a normal tooltip -// next to the mission map item. -function GenerateTooltip(string tooltipHTML) -{ - // KDM : Normally, for mission map items, tooltipHTML will be an empty string; consequently, no tooltip will be created. - // Only show mission tooltips if the controller is active, and SHOW_MISSION_TOOLTIPS_CTRL is true. - if (`ISCONTROLLERACTIVE && class'UIStrategyMapItem_Mission_LW'.default.SHOW_MISSION_TOOLTIPS_CTRL) - { - tooltipHTML = GetToolTipText(); - } - - super.GenerateTooltip(tooltipHTML); -} - -simulated function bool OnUnrealCommand(int cmd, int arg) -{ - local bool bHandled; - - if (!CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) - { - return true; - } - - bHandled = true; - - switch(cmd) - { - // KDM : The A button opens a mission's infiltration screen if it is currently being infiltrated. - // OnMouseEvent() checks if the Avenger is in flight before executing any of its code; consequently, the same is done here for consistency. - case class'UIUtilities_Input'.static.GetAdvanceButtonInputCode(): - if (GetStrategyMap().m_eUIState != eSMS_Flight) - { - MapItemMissionClicked(); - } - break; - - default : - bHandled = false; - break; - } - - return bHandled || super.OnUnrealCommand(cmd, arg); -} - -DefaultProperties -{ - bDisableHitTestWhenZoomedOut = false; - bFadeWhenZoomedOut = false; -} +//--------------------------------------------------------------------------------------- +// FILE: UIStrategyMapItem_AlienNetworkComponent_LW +// AUTHOR: Joey Martinez -- 05/06/2019 +// PURPOSE: This file represents an alien network spot on the StrategyMap for Long War of the Chosen. +// The base game class is being overridden because the infiltration label was not showing +// up when you sent a squad to infiltrate an alien facility with the base implentation of +// the parent class. +// +// This class' code is a literal copy paste of the UIStrategyMapItem_Mission_LW class so +// that the alien facility strategy item has the same infiltration mechanics as other missions +// do. All of the code in this class is unique to this class and does not override any of the +// parent class behavior. +// +// KDM : The same controller code found in UIStrategyMapItem_Mission_LW has been implemented here so +// that alien facilities are 'clickable'. +//--------------------------------------------------------------------------------------- + +class UIStrategyMapItem_AlienNetworkComponent_LW extends UIStrategyMapItem_AlienNetworkComponent; + +var UIScanButton ScanButton; // used for missions being infiltrated +var UIText InfilPct; +var UIText InfilLabel; + +var UIImage SquadImage; // for cases where there is an infiltrating squad +var string CachedImageName; + +var UIProgressBar ProgressBar; // used to show remaining time for missions not yet infiltrated + +var int InDepth; // tracks depth of mouse in and outs, since it's recording from two possibly overlapping elements (2D and 3D icons) + +var localized string strRecon; + +var transient bool bScanButtonResized; +var transient float CachedScanButtonWidth; + +simulated function UIStrategyMapItem InitMapItem(out XComGameState_GeoscapeEntity Entity) +{ + // override the super so we can always use MI_alienfacility to allow displaying of doom pips + //super.InitMapItem(Entity); + + local string PinImage; + // Initialize static data + InitPanel(Name(Entity.GetUIWidgetName()), 'MI_alienFacility'); + + PinImage = Entity.GetUIPinImagePath(); + if (PinImage != "") + { + SetImage(PinImage); + } + + InitFromGeoscapeEntity(Entity); + + ScanButton = Spawn(class'UIScanButton', self).InitScanButton(); + ScanButton.SetButtonIcon(""); + ScanButton.SetDefaultDelegate(OpenInfiltrationMissionScreen); + ScanButton.SetButtonType(eUIScanButtonType_Default); + + SquadImage = Spawn(class'UIImage', self); + SquadImage.bAnimateOnInit = false; + SquadImage.InitImage().SetSize(48, 48); + + InfilPct = Spawn(class'UIText', ScanButton).InitText('InfilPct_LW', ""); + InfilPct.SetWidth(60); + InfilPct.SetPosition(154, 3); + + InfilLabel = Spawn(class'UIText', ScanButton).InitText('InfilLabel_LW', ""); + InfilLabel.SetWidth(60); + InfilLabel.SetPosition(154 - 5, 23); + + ProgressBar = Spawn(class'UIProgressBar', self).InitProgressBar('MissionInfiltrationProgress', -32, 5, 64, 8, 0.5, eUIState_Normal); + + bScanButtonResized = false; + + InstanceMapItem3DMaterial(); + + // KDM : The mission map item's help icon gets in the way of the infiltrating squad icon; the best way to deal with it is to null it. + // For more information on a similar topic please see the comments in UIStrategyMapItem_Region_LW --> InitMapItem(). + if (`ISCONTROLLERACTIVE) + { + ScanButton.MC.SetNull("consoleHint"); + } + + return self; +} + +function InstanceMapItem3DMaterial() +{ + local int i; + local MaterialInterface Mat; + local MaterialInstanceConstant MIC, NewMIC; + + if (MapItem3D == none) + return; + + + + for (i = 0; i < MapItem3D.OverworldMeshs[MapItem3D.ROOT_TILE].GetNumElements(); ++i) + { + Mat = MapItem3D.GetMeshMaterial(i); + MIC = MaterialInstanceConstant(Mat); + + // It is possible for there to be MITVs in these slots, so check + if (MIC != none) + { + // If this is not a child MIC, make it one. This is done so that the material updates below don't stomp + // on each other between units. + if (InStr(MIC.Name, "MaterialInstanceConstant") == INDEX_NONE) + { + NewMIC = new (self) class'MaterialInstanceConstant'; + NewMIC.SetParent(MIC); + MapItem3D.SetMeshMaterial(i, NewMIC); + MIC = NewMIC; + } + } + } + +} + +function UpdateFromGeoscapeEntity(const out XComGameState_GeoscapeEntity GeoscapeEntity) +{ + local int InfiltrationPct, InfiltrationTextColour; + local float ScanWidth; + local string InfiltrationPctValue, MissionInfo, MissionTitle; + local X2MissionTemplate MissionTemplate; + local XComGameState_LWPersistentSquad InfiltratingSquad; + local XComGameState_MissionSite MissionState; + + if (!bIsInited) + { + return; + } + + super(UIStrategyMapItem).UpdateFromGeoscapeEntity(GeoscapeEntity); + + InfiltratingSquad = GetInfiltratingSquad(); + + MissionState = GetMission(); + if (InfiltratingSquad != none) + { + InfiltrationTextColour = (bIsFocused) ? -1 : eUIState_Normal; + + InfiltrationPct = int(InfiltratingSquad.CurrentInfiltration * 100.0); + InfiltrationPctValue = string(InfiltrationPct) $ "%"; + + // KDM : When using a controller, there are 2 general colour states : + // 1.] This mission map item is selected, so its background is highlighted, and its text should be black. + // 2.] This mission map item is not selected, so its background is not highlighted, and its text should be normal blue. + if (`ISCONTROLLERACTIVE) + { + // KDM : When using a controller, the infiltration label needs to be continually refreshed according to the map item's selection status. + // When using a mouse & keyboard, the infiltration label doesn't need to change, so it can be called a single time down below. + InfilLabel.SetHTMLText(CenterText(class'UIUtilities_Text_LW'.static.AddFontInfoWithColor(strRecon, false, false, , 16, InfiltrationTextColour))); + InfilPct.SetHTMLText(CenterText(class'UIUtilities_Text_LW'.static.AddFontInfoWithColor(InfiltrationPctValue, false, true, , 20, InfiltrationTextColour))); + } + else + { + InfilPct.SetHTMLText(CenterText(class'UIUtilities_Text'.static.AddFontInfo(InfiltrationPctValue, false, true, , 20))); + } + + if (!bScanButtonResized) + { + MissionTitle = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(InfiltratingSquad.sSquadName); + MissionTemplate = class'X2MissionTemplateManager'.static.GetMissionTemplateManager().FindMissionTemplate(MissionState.GeneratedMission.Mission.MissionName); + MissionInfo = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(MissionTemplate.PostMissionType); + + ScanButton.SetText(MissionTitle, MissionInfo, " ", " "); // have to leave blank spaces so that Flash will size BG big enough + SetLevel(0); // show 0 doom pips + + // KDM : Infiltration label handling for controllers is dealt with up above. + if (!`ISCONTROLLERACTIVE) + { + InfilLabel.SetHTMLText(CenterText(class'UIUtilities_Text'.static.GetSizedText(strRecon, 16))); + } + + bScanButtonResized = true; + + CachedImageName = InfiltratingSquad.GetSquadImagePath(); + SquadImage.LoadImage(CachedImageName); + } + ScanButton.DefaultState(); + ScanButton.PulseScanner(false); + ScanButton.ShowScanIcon(false); + ScanButton.Realize(); + + // but the MC queuing system means that the width isn't set here the first time it's been invoked + ScanWidth = ScanButton.MC.GetNum("bg._width"); + + if (ScanWidth != CachedScanButtonWidth) + { + InfilPct.SetX(ScanWidth - 60); + InfilLabel.SetX(ScanWidth - 65); + ScanButton.SetX(- (ScanWidth/2)); + + CachedScanButtonWidth = ScanWidth; + + SquadImage.SetPosition(-(ScanWidth/2 + 48), 0); + } + if (CachedImageName != InfiltratingSquad.GetSquadImagePath()) + { + CachedImageName = InfiltratingSquad.GetSquadImagePath(); + SquadImage.LoadImage(CachedImageName); + } + + ProgressBar.Hide(); + } + else if (MissionState.MakesDoom()) + { + SetLevel(MissionState.Doom); + ProgressBar.Hide(); + ScanButton.Hide(); + bScanButtonResized = false; + } + else + { + ProgressBar.Show(); + UpdateProgressBar(MissionState); + + ScanButton.Hide(); + SquadImage.Hide(); + bScanButtonResized = false; + } + + // KDM : Our custom, mission map item, tooltip contains information, like mission expiration and infiltration percentage, which changes over + // time; therefore, we need to continously update it. However, there are a few caveats : + // + // 1.] Tooltips are not created under normal circumstances for mission map items; therefore, we only need to worry about updating when + // a controller is being used, and SHOW_MISSION_TOOLTIPS_CTRL is true. + // 2.] UIStrategyMap stores a single active tooltip, ActiveTooltip, which it associates with the currently selected map item; unfortunately, + // UpdateFromGeoscapeEntity() is called regardless of whether this map item is selected or not. Consequently, we don't want this mission + // map item polluting the tool tip when it is not selected. + if (GetStrategyMap().SelectedMapItem == self && `ISCONTROLLERACTIVE && class'UIStrategyMapItem_Mission_LW'.default.SHOW_MISSION_TOOLTIPS_CTRL) + { + UpdateTooltip(); + } +} + +simulated function string CenterText(string Text) +{ + return class'UIUtilities_Text'.static.AlignCenter(Text); +} + +simulated function XComGameState_LWPersistentSquad GetInfiltratingSquad() +{ + return `LWSQUADMGR.GetSquadOnMission(GeoscapeEntityRef); +} + +simulated function XComGameState_MissionSite GetMission() +{ + return XComGameState_MissionSite(`XCOMHISTORY.GetGameStateForObjectID(GeoscapeEntityRef.ObjectID)); +} + +function OpenInfiltrationMissionScreen() +{ + local UIMission_LWLaunchDelayedMission MissionScreen; + local XComHQPresentationLayer HQPres; + + HQPres = `HQPRES; + MissionScreen = HQPres.Spawn(class'UIMission_LWLaunchDelayedMission', HQPres); + MissionScreen.MissionRef = GeoscapeEntityRef; + MissionScreen.bInstantInterp = false; + MissionScreen = UIMission_LWLaunchDelayedMission(HQPres.ScreenStack.Push(MissionScreen)); +} + +simulated function OnMouseEvent(int cmd, array args) +{ + if (GetStrategyMap().m_eUIState == eSMS_Flight) + { + return; + } + + switch(cmd) + { + case class'UIUtilities_Input'.const.FXS_L_MOUSE_IN: + OnMouseIn(); + break; + case class'UIUtilities_Input'.const.FXS_L_MOUSE_OUT: + OnMouseOut(); + break; + // KDM : A mouse click opens a mission's infiltration screen if it is currently being infiltrated. + case class'UIUtilities_Input'.const.FXS_L_MOUSE_UP: + MapItemMissionClicked(); + break; + } +} + +// KDM : This code was stripped out of OnMouseEvent() --> FXS_L_MOUSE_UP and placed within a function so that it could be called from both +// 1.] OnMouseEvent() for mouse & keyboard users 2.] OnUnrealCommand() for controller users. +simulated function MapItemMissionClicked() +{ + local XComGameState_GeoscapeEntity GeoscapeEntity; + local XComGameState_LWPersistentSquad InfiltratingSquad; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + InfiltratingSquad = GetInfiltratingSquad(); + + if (InfiltratingSquad == none) + { + GeoscapeEntity = XComGameState_GeoscapeEntity(History.GetGameStateForObjectID(GeoscapeEntityRef.ObjectID)); + GeoscapeEntity.AttemptSelectionCheckInterruption(); + } + else + { + OpenInfiltrationMissionScreen(); + } +} + +simulated function UpdateProgressBar(XComGameState_MissionSite MissionState) +{ + local int RemainingSeconds; + + if(ProgressBar == none) + return; + + if(MissionState.ExpirationDateTime.m_iYear < 2100) + { + RemainingSeconds = class'X2StrategyGameRulesetDataStructures'.static.DifferenceInSeconds(MissionState.ExpirationDateTime, class'XComGameState_GeoscapeEntity'.static.GetCurrentTime()); + ProgressBar.SetPercent(1.0); + SetProgressBarColor(RemainingSeconds); + ProgressBar.Show(); + } + else + { + ProgressBar.SetPercent(0.0); + ProgressBar.Hide(); + } +} + +simulated function SetProgressBarColor(float RemainingSeconds) +{ + local float PercentIdealInfiltration; + + PercentIdealInfiltration = (RemainingSeconds / 3600.0) / class'XComGameState_LWPersistentSquad'.static.GetBaselineHoursToInfiltration(GeoscapeEntityRef); + + if (PercentIdealInfiltration >= 1.0) + { + ProgressBar.SetColor(class'UIUtilities_Colors'.const.GOOD_HTML_COLOR); + } + else if(PercentIdealInfiltration >= 0.5) + { + ProgressBar.SetColor(class'UIUtilities_Colors'.const.WARNING_HTML_COLOR); + } + else if(RemainingSeconds >= 86400.0) + { + ProgressBar.SetColor(class'UIUtilities_Colors'.const.WARNING2_HTML_COLOR); + } + else + { + ProgressBar.SetColor(class'UIUtilities_Colors'.const.BAD_HTML_COLOR); + } + +} + +//---------------- 3D Map Icon Handling ------------------- +simulated function OnMouseIn() +{ + if (InDepth == 0) + { + super(UIStrategyMapItem).OnMouseIn(); + + if(MapItem3D != none) + MapItem3D.SetHoverMaterialValue(1); + if(AnimMapItem3D != none) + AnimMapItem3D.SetHoverMaterialValue(1); + } + InDepth++; +} + +// Clear mouse hover special behavior +simulated function OnMouseOut() +{ + InDepth--; + + if (InDepth <= 0) + { + super(UIStrategyMapItem).OnMouseOut(); + + if(MapItem3D != none) + MapItem3D.SetHoverMaterialValue(0); + if(AnimMapItem3D != none) + AnimMapItem3D.SetHoverMaterialValue(0); + } +} + +simulated function Show() +{ + // override to always allow showing items + super(UIPanel).Show(); +} + +simulated function OnLoseFocus() +{ + super.OnLoseFocus(); +} + +function string GetToolTipText() +{ + local int InfiltrationPct; + local string BodyStr, TitleStr, InfiltrationPctStr, TooltipHTML; + local XComGameState_LWPersistentSquad InfiltratingSquad; + local XComGameState_MissionSite Mission; + + InfiltratingSquad = GetInfiltratingSquad(); + Mission = GetMission(); + + TooltipHTML = ""; + + if (Mission != none) + { + class'X2EventListener_StrategyMap'.static.GetMissionSiteUIButtonToolTip(TitleStr, BodyStr, none, Mission); + TitleStr = class'UIUtilities_Text'.static.GetColoredText(TitleStr, eUIState_Header); + + // KDM : The title includes the amount of time left before the mission expires; this is very useful information. + TooltipHTML $= TitleStr; + TooltipHTML $= "\n"; + TooltipHTML $= "--------------------------------"; + // KDM : If a squad is infiltrating, show the infiltration percentage. + if (InfiltratingSquad != none) + { + TooltipHTML $= "\n"; + TooltipHTML $= class'UIStrategyMapItem_Mission_LW'.default.InfiltrationTooltipString $ " : "; + + InfiltrationPct = int(InfiltratingSquad.CurrentInfiltration * 100.0); + InfiltrationPctStr = class'UIUtilities_Text'.static.GetColoredText(string(InfiltrationPct), eUIState_Good); + + TooltipHTML $= InfiltrationPctStr @ "%"; + TooltipHTML $= "\n"; + TooltipHTML $= "--------------------------------"; + } + TooltipHTML $= "\n"; + TooltipHTML $= BodyStr; + } + return TooltipHTML; +} + +function UpdateTooltip() +{ + local string TooltipHTML; + local UIStrategyMap StrategyMap; + + StrategyMap = GetStrategyMap(); + + // KDM : If the strategy map has no active tooltip, then there is nothing to update. + if (StrategyMap.ActiveTooltip != none) + { + // KDM : Get the new tooltip text and update the active tooltip. + TooltipHTML = GetToolTipText(); + StrategyMap.ActiveTooltip.SetText(TooltipHTML); + StrategyMap.ActiveTooltip.UpdateData(); + + // KDM : The tooltip data has been updated; however, this information is not pushed to the flash UI element, so we don't see + // any changes. There are 2 ways around this : + // + // 1.] The flash element, TooltipBox, has a function, Show(), which updates the tooltip's : Style, Text, Size, BG, and Location. + // Furthermore, it animates the tooltip in. This is a nice 'complete' method, but it involves us having to constantly hide and show the + // tooltip within UnrealScript. Additionally, it requires us to kill the tooltip's animation since we can't have it contantly fading in + // and fading out. + // 2.] Update the flash element's : Style, Text, Size, and BG, via Actionscript calls. This is a better solution because it updates + // the tooltip text and size, without having to resort to hiding and showing the tooltip; furthermore, it doesn't mess with any + // tooltip animations. + StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeStyle"); + StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeText"); + StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeSize"); + StrategyMap.ActiveTooltip.MC.FunctionVoid("RealizeBG"); + } +} + +// KDM : Long War provides useful mission tooltips; however, they only appear over the mission icons on the bottom icon bar, and are only +// accessible to mouse & keyboard users. Consequently, we want to give controller users the opportunity to display this information as a normal tooltip +// next to the mission map item. +function GenerateTooltip(string tooltipHTML) +{ + // KDM : Normally, for mission map items, tooltipHTML will be an empty string; consequently, no tooltip will be created. + // Only show mission tooltips if the controller is active, and SHOW_MISSION_TOOLTIPS_CTRL is true. + if (`ISCONTROLLERACTIVE && class'UIStrategyMapItem_Mission_LW'.default.SHOW_MISSION_TOOLTIPS_CTRL) + { + tooltipHTML = GetToolTipText(); + } + + super.GenerateTooltip(tooltipHTML); +} + +simulated function bool OnUnrealCommand(int cmd, int arg) +{ + local bool bHandled; + + if (!CheckInputIsReleaseOrDirectionRepeat(cmd, arg)) + { + return true; + } + + bHandled = true; + + switch(cmd) + { + // KDM : The A button opens a mission's infiltration screen if it is currently being infiltrated. + // OnMouseEvent() checks if the Avenger is in flight before executing any of its code; consequently, the same is done here for consistency. + case class'UIUtilities_Input'.static.GetAdvanceButtonInputCode(): + if (GetStrategyMap().m_eUIState != eSMS_Flight) + { + MapItemMissionClicked(); + } + break; + + default : + bHandled = false; + break; + } + + return bHandled || super.OnUnrealCommand(cmd, arg); +} + +DefaultProperties +{ + bDisableHitTestWhenZoomedOut = false; + bFadeWhenZoomedOut = false; +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIUtilities_Text_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIUtilities_Text_LW.uc index 41fc704ca..66f7f9113 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIUtilities_Text_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/UIUtilities_Text_LW.uc @@ -90,9 +90,34 @@ static function String GetDifficultyString(XComGameState_MissionSite MissionStat local string Text, nums; local int Difficulty, LabelsLength, EnemyUnits; local array Dummy; + local XComGameState_MissionSite DummyMissionSite; + + if(class'Helpers_LW'.default.bUseTrueDifficultyCalc) + { + if(AlertModifier == 0) + { + MissionState.GetShadowChamberMissionInfo (EnemyUnits, Dummy); + `LWTrace("Schedule Selected for Dummy Mission:" @MissionState.SelectedMissionData.SelectedMissionScheduleName); + `LWTrace("Modified Alert check. Alert Modifier:" @AlertModifier @ ". Enemy Count: " @EnemyUnits); + } + else + { + + DummyMissionSite = new class'XComGameState_MissionSite'(MissionState); + DummyMissionSite.Source = 'LWInfilListDummyMission'; + DummyMissionSite.CacheSelectedMissionData(MissionState.SelectedMissionData.ForceLevel, max(1, MissionState.SelectedMissionData.AlertLevel + AlertModifier)); + DummyMissionSite.GetShadowChamberMissionInfo (EnemyUnits, Dummy); + `LWTrace("Schedule Selected for Dummy Mission:" @DummyMissionSite.SelectedMissionData.SelectedMissionScheduleName); + `LWTrace("Modified Alert check. Alert Modifier:" @AlertModifier @ ". Enemy Count: " @EnemyUnits); + } + Difficulty = Max (1, ((EnemyUnits-4) / 3)); + } + else + { + MissionState.GetShadowChamberMissionInfo (EnemyUnits, Dummy); + Difficulty = Max (1, ((EnemyUnits + (AlertModifier * 1.5)-4) / 3)); + } - MissionState.GetShadowChamberMissionInfo (EnemyUnits, Dummy); - Difficulty = Max (1, ((EnemyUnits-4) / 3) + AlertModifier); LabelsLength = class'X2StrategyGameRulesetDataStructures'.default.MissionDifficultyLabels.Length; if(Difficulty >= LabelsLength - 1) { diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_AssaultAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_AssaultAbilitySet.uc index bda28fa5e..7c8abc56d 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_AssaultAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_AssaultAbilitySet.uc @@ -31,9 +31,9 @@ static function array CreateTemplates() Templates.AddItem(AddArcthrowerStun()); Templates.AddItem(AddArcthrowerPassive()); Templates.AddItem(AddEMPulser()); - Templates.AddItem(PurePassive('EMPulserPassive', "img:///UILibrary_LW_Overhaul.LW_AbilityEMPulser", true)); + Templates.AddItem(PurePassive('EMPulserPassive', "img:///UILibrary_LWOTC.LW_AbilityEMPulser", true)); Templates.AddItem(StunGunner()); - Templates.AddItem(PurePassive('Electroshock', "img:///UILibrary_LW_Overhaul.LW_AbilityElectroshock", true)); + Templates.AddItem(PurePassive('Electroshock', "img:///UILibrary_LWOTC.LW_AbilityElectroshock", true)); Templates.AddItem(CreateStreetSweeper2Ability()); Templates.AddItem(CreateStreetSweeperBonusDamageAbility()); Templates.AddItem(CreateChainLightningAbility()); @@ -62,7 +62,7 @@ static function X2AbilityTemplate AddArcthrowerStun() `CREATE_X2ABILITY_TEMPLATE(Template, 'ArcthrowerStun'); // Icon Properties - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityArcthrowerStun"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityArcthrowerStun"; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.STANDARD_PISTOL_SHOT_PRIORITY; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; Template.DisplayTargetHitChance = true; @@ -168,7 +168,7 @@ static function X2AbilityTemplate AddArcthrowerPassive() local X2Effect_Arcthrower ArcthrowerEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'ArcthrowerPassive'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityStunGunner"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityStunGunner"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -216,7 +216,7 @@ static function X2Effect_ArcthrowerStunned CreateArcthrowerStunnedStatusEffect(i local X2Condition_UnitProperty UnitPropCondition; StunnedEffect = new class'X2Effect_ArcthrowerStunned'; - StunnedEffect.BuildPersistentEffect(1, true, true, false, eGameRule_UnitGroupTurnBegin); + StunnedEffect.BuildPersistentEffect(1, true, false, false, eGameRule_UnitGroupTurnBegin); StunnedEffect.ApplyChance = Chance; //StunnedEffect.StunLevel = StunLevel; StunnedEffect.bIsImpairing = true; @@ -250,7 +250,7 @@ static function X2AbilityTemplate StunGunner() local X2Effect_StunGunner StunGunnerEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'StunGunner'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityStunGunner"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityStunGunner"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -289,7 +289,7 @@ static function X2AbilityTemplate AddEMPulser() `CREATE_X2ABILITY_TEMPLATE(Template, 'EMPulser'); // Icon Properties - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityEMPulser"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityEMPulser"; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.STANDARD_PISTOL_SHOT_PRIORITY; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; Template.DisplayTargetHitChance = true; @@ -427,7 +427,7 @@ static function X2AbilityTemplate CreateStreetSweeper2Ability() Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityStreetSweeper2"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityStreetSweeper2"; Template.ActivationSpeech = 'Reaper'; Template.CinescriptCameraType = "StandardGunFiring"; Template.bCrossClassEligible = false; @@ -554,7 +554,7 @@ static function X2AbilityTemplate CreateChainLightningAbility() Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityChainLightning"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityChainLightning"; Template.bCrossClassEligible = false; Template.Hostility = eHostility_Offensive; Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ChosenAbilities.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ChosenAbilities.uc index e9f652f41..e60aa09a6 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ChosenAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ChosenAbilities.uc @@ -4,7 +4,7 @@ // PURPOSE: Defines all Long War Chosen-specific abilities, Credit to DerBK for some abilities //--------------------------------------------------------------------------------------- -class X2Ability_LW_ChosenAbilities extends X2Ability config(LW_SoldierSkills); +class X2Ability_LW_ChosenAbilities extends XMBAbility config(LW_SoldierSkills); var localized string ShieldedStatBuffsLocDescription; var localized string ImpactCompensationBuffDescription; @@ -17,6 +17,9 @@ var config int SHIELDALLYM1_SHIELD; var config int SHIELDALLYM2_SHIELD; var config int SHIELDALLYM3_SHIELD; var config int SHIELDALLYM4_SHIELD; +var config int SHIELDALLYM5_SHIELD; + + var config array KIDNAP_ELIGIBLE_CHARTYPES; var config array COMBAT_READINESS_EFFECTS_TO_REMOVE; @@ -26,10 +29,15 @@ var config int GREATEST_CHAMPION_AIM; var config int GREATEST_CHAMPION_CRIT; var config int GREATEST_CHAMPION_WILL; var config int GREATEST_CHAMPION_PSIOFFENSE; +var config float UNHOLY_ASCENSION_MOD; var config float SHIELD_ALLY_PCT_DR; var config float IMPACT_COMPENSATION_PCT_DR; var config int IMPACT_COMPENSATION_MAX_STACKS; +var config float WARLOCK_MOBILITY_DEBUFF; +var config float HUNTER_MOBILITY_DEBUFF; +var config int HUNTER_MOB_PER_ATTACK; + var config int UNSTOPPABLE_MIN_MOB; var const string ChosenSummonContextDesc; @@ -47,11 +55,15 @@ static function array CreateTemplates() Templates.AddItem(CreateShieldAlly('ShieldAllyM2',default.SHIELDALLYM2_SHIELD)); Templates.AddItem(CreateShieldAlly('ShieldAllyM3',default.SHIELDALLYM3_SHIELD)); Templates.AddItem(CreateShieldAlly('ShieldAllyM4',default.SHIELDALLYM4_SHIELD)); + Templates.AddItem(CreateShieldAlly('ShieldAllyM5',default.SHIELDALLYM5_SHIELD)); Templates.AddItem(CreateTraitResilience()); Templates.AddItem(CreateChosenKidnap()); Templates.AddItem(CreateKeen()); Templates.AddItem(CreateFollowerDefeatedEscape()); + Templates.AddItem(CreateTrackingShotMark()); + Templates.AddItem(CreateMarkForDeathHunter()); + Templates.AddItem(ChosenDragonRounds()); Templates.AddItem(ChosenDragonRoundsPassive()); @@ -67,6 +79,12 @@ static function array CreateTemplates() Templates.AddItem(CreateBloodThirst()); Templates.AddItem(BloodThirstPassive()); Templates.AddItem(AddMindScorchTerror()); + + Templates.AddItem(UnholyAscension_LW()); + Templates.AddItem(CreaterRuptureImmunity()); + Templates.AddItem(AddBloodBath()); + Templates.AddItem(AddMistyMadness()); + Templates.AddItem(AddImpenetrable()); Templates.AddItem(FreeGrenades()); Templates.AddItem(AssassinPrimeReactionPassive()); @@ -88,7 +106,9 @@ static function array CreateTemplates() Templates.AddItem(CreateUnstoppablePassive()); Templates.AddItem(CreateTriggerDamagedTeleportAbility_LW()); - + Templates.AddItem(CreateWarlockMobilityAbility()); + Templates.AddItem(CreateHunterMobilityAbility()); + Templates.AddItem(CreateHunterMobilityBoostAbility()); return Templates; } @@ -129,7 +149,7 @@ static function X2AbilityTemplate CreateWarlockReaction() Trigger.ListenerData.EventID = 'UnitTakeEffectDamage'; Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; Trigger.ListenerData.Filter = eFilter_Unit; - Trigger.ListenerData.Priority = 15; + Trigger.ListenerData.Priority = 2; Template.AbilityTriggers.AddItem(Trigger); TurnCondition =new class'X2Condition_OnlyOnXCOMTurn'; @@ -203,7 +223,7 @@ static function X2AbilityTemplate CreateAssassinReaction() Trigger.ListenerData.EventID = 'UnitTakeEffectDamage'; Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; Trigger.ListenerData.Filter = eFilter_Unit; - Trigger.ListenerData.Priority = 15; + Trigger.ListenerData.Priority = 2; Template.AbilityTriggers.AddItem(Trigger); // The unit must be alive and not stunned @@ -273,7 +293,7 @@ static function X2AbilityTemplate CreateHunterReaction() Trigger.ListenerData.EventID = 'UnitTakeEffectDamage'; Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; Trigger.ListenerData.Filter = eFilter_Unit; - Trigger.ListenerData.Priority = 15; + Trigger.ListenerData.Priority = 2; Template.AbilityTriggers.AddItem(Trigger); // The unit must be alive and not stunned @@ -428,6 +448,9 @@ static function X2AbilityTemplate CreateShieldAlly(name Templatename, int Shield local X2Effect_GreatestChampion StatBuffsEffect; local X2Effect_PCTDamageReduction ImpactEffect; local X2Condition_Visibility VisibilityCondition; + local X2Condition_AbilityProperty AbilityCondition; + local X2Effect_Resilience MyCritModifier; + local X2Condition_OwnerDoesNotHaveAbility DoesNotHaveAbilityCondition; `CREATE_X2ABILITY_TEMPLATE(Template, Templatename); Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_mindscorch"; @@ -474,7 +497,15 @@ static function X2AbilityTemplate CreateShieldAlly(name Templatename, int Shield TargetCondition.ExcludeUnrevealedAI = true; Template.AbilityTargetConditions.AddItem(TargetCondition); + DoesNotHaveAbilityCondition = new class 'X2Condition_OwnerDoesNotHaveAbility'; + DoesNotHaveAbilityCondition.AbilityName = 'UnholyAscension_LW'; + + AbilityCondition = new class 'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('UnholyAscension_LW'); + + ShieldedEffect = CreateShieldedEffect(Template.LocFriendlyName, Template.GetMyLongDescription(), ShieldAmount); + ShieldedEffect.TargetConditions.AddItem(DoesNotHaveAbilityCondition); Template.AddTargetEffect(ShieldedEffect); StatBuffsEffect = new class'X2Effect_GreatestChampion'; @@ -486,8 +517,33 @@ static function X2AbilityTemplate CreateShieldAlly(name Templatename, int Shield StatBuffsEffect.AddPersistentStatChange(eStat_CritChance, default.GREATEST_CHAMPION_CRIT); StatBuffsEffect.AddPersistentStatChange(eStat_Will, default.GREATEST_CHAMPION_WILL); StatBuffsEffect.AddPersistentStatChange(eStat_PsiOffense, default.GREATEST_CHAMPION_PSIOFFENSE); + StatBuffsEffect.TargetConditions.AddItem(DoesNotHaveAbilityCondition); + Template.AddTargetEffect(StatBuffsEffect); + + + ShieldedEffect = CreateShieldedEffect(Template.LocFriendlyName, Template.GetMyLongDescription(), int(ShieldAmount * default.UNHOLY_ASCENSION_MOD)); + ShieldedEffect.TargetConditions.AddItem(AbilityCondition); + Template.AddTargetEffect(ShieldedEffect); + + StatBuffsEffect = new class'X2Effect_GreatestChampion'; + StatBuffsEffect.BuildPersistentEffect(1, true, true); + StatBuffsEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, default.ShieldedStatBuffsLocDescription, "img:///UILibrary_PerkIcons.UIPerk_adventshieldbearer_energyshield", true); + StatBuffsEffect.bRemoveWhenTargetDies = true; + //StatBuffsEffect.bRemoveWhenTargetUnconscious = true; + StatBuffsEffect.AddPersistentStatChange(eStat_Offense, int(default.GREATEST_CHAMPION_AIM * default.UNHOLY_ASCENSION_MOD)); + StatBuffsEffect.AddPersistentStatChange(eStat_CritChance, int(default.GREATEST_CHAMPION_CRIT * default.UNHOLY_ASCENSION_MOD)); + StatBuffsEffect.AddPersistentStatChange(eStat_Will, int(default.GREATEST_CHAMPION_WILL * default.UNHOLY_ASCENSION_MOD)); + StatBuffsEffect.AddPersistentStatChange(eStat_PsiOffense, int(default.GREATEST_CHAMPION_PSIOFFENSE * default.UNHOLY_ASCENSION_MOD)); + StatBuffsEffect.TargetConditions.AddItem(AbilityCondition); Template.AddTargetEffect(StatBuffsEffect); + MyCritModifier = new class 'X2Effect_Resilience'; + MyCritModifier.CritDef_Bonus = 200; + MyCritModifier.BuildPersistentEffect (1, true, false, true); + MyCritModifier.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); + MyCritModifier.TargetConditions.AddItem(AbilityCondition); + Template.AddTargetEffect (MyCritModifier); + ImpactEffect = new class'X2Effect_PCTDamageReduction'; ImpactEffect.PCTDamage_Reduction = default.SHIELD_ALLY_PCT_DR; @@ -877,39 +933,6 @@ static function name GetReinforcementGroupName(int AlertLevel) return GroupName; } -/* -static function X2DataTemplate CreatePassiveChosenKidnap() -{ - local X2Effect_Kidnap KidnapEffect; - local X2AbilityTemplate Template; - - `CREATE_X2ABILITY_TEMPLATE(Template, 'LW_ChosenKidnap'); - Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_kidnap"; - Template.Hostility = eHostility_Offensive; - Template.AbilitySourceName = 'eAbilitySource_Standard'; -//BEGIN AUTOGENERATED CODE: Template Overrides 'ChosenKidnap' - Template.bFrameEvenWhenUnitIsHidden = true; - Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; -//END AUTOGENERATED CODE: Template Overrides 'ChosenKidnap' - - Template.AbilityToHitCalc = default.DeadEye; - Template.AbilityTargetStyle = default.SelfTarget; - Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); - - KidnapEffect = new class'X2Effect_Kidnap'; - KidnapEffect.BuildPersistentEffect(1, true, true, true); - Template.AddShooterEffect(KidnapEffect); - - Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); - - // The Target must be alive and a humanoid - Template.bSkipFireAction = true; - Template.bShowActivation = true; - Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; - - return Template; -} -*/ static function X2DataTemplate CreateKeen() { @@ -951,6 +974,162 @@ static function X2DataTemplate CreateKeen() return Template; } +static function X2DataTemplate CreateTrackingShotMark() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ActionPoints ActionPointCost; + //local X2Condition_Visibility TargetVisibilityCondition; + local X2Condition_UnitProperty TargetCondition; + local X2Condition_UnitEffects UnitEffectsCondition; + local X2Effect_Persistent TrackingShotMarkSource; + local X2Effect_TrackingShotMarkTarget TrackingShotMarkTarget; + local array SkipExclusions; + local X2AbilityCooldown Cooldown; + local X2Condition_UnitValue UnitValueCheck; + `CREATE_X2ABILITY_TEMPLATE(Template, 'TrackingShotMark'); + +//BEGIN AUTOGENERATED CODE: Template Overrides 'TrackingShotMark' + Template.bShowActivation = true; + Template.bFrameEvenWhenUnitIsHidden = true; + Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_trackingshot"; +//END AUTOGENERATED CODE: Template Overrides 'TrackingShotMark' + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.Hostility = eHostility_Neutral; + + Cooldown = new class'X2AbilityCooldown'; + Cooldown.iNumTurns = 1; + Template.AbilityCooldown = Cooldown; + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 2; + ActionPointCost.bFreeCost = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SimpleSingleTarget; + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + + UnitValueCheck = new class'X2Condition_UnitValue'; + UnitValueCheck.AddCheckValue('GrappledThisTurn', 1, eCheck_LessThan); + Template.AbilityShooterConditions.AddItem(UnitValueCheck); + + + // Shooter Conditions + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + + Template.AbilityTargetConditions.AddItem(default.FlankedCondition); + + // Source cannot already be targeting + UnitEffectsCondition = new class'X2Condition_UnitEffects'; + UnitEffectsCondition.AddExcludeEffect(class'X2Ability_ChosenSniper'.default.TrackingShotMarkSourceEffectName, 'AA_DuplicateEffectIgnored'); + Template.AbilityShooterConditions.AddItem(UnitEffectsCondition); + + // Source Effect + TrackingShotMarkSource = new class 'X2Effect_Persistent'; + TrackingShotMarkSource.EffectName = class'X2Ability_ChosenSniper'.default.TrackingShotMarkSourceEffectName; + TrackingShotMarkSource.DuplicateResponse = eDupe_Ignore; + TrackingShotMarkSource.BuildPersistentEffect(1, true, true, false, eGameRule_PlayerTurnBegin); + TrackingShotMarkSource.bRemoveWhenTargetDies = true; + Template.AddShooterEffect(TrackingShotMarkSource); + + // Target Conditions + Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitOnlyProperty); + + // Target cannot already be targeted + UnitEffectsCondition = new class'X2Condition_UnitEffects'; + UnitEffectsCondition.AddExcludeEffect(class'X2Ability_ChosenSniper'.default.TrackingShotMarkTargetEffectName, 'AA_DuplicateEffectIgnored'); + Template.AbilityTargetConditions.AddItem(UnitEffectsCondition); + + SkipExclusions.AddItem(class'X2AbilityTemplateManager'.default.DisorientedName); + SkipExclusions.AddItem(class'X2StatusEffects'.default.BurningName); + SkipExclusions.AddItem(class'X2AbilityTemplateManager'.default.ConfusedName); + Template.AddShooterEffectExclusions(SkipExclusions); + + // Target must be visible + //TargetVisibilityCondition = new class'X2Condition_Visibility'; + //TargetVisibilityCondition.bRequireLOS = true; + //Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition); + + // And not concealed + TargetCondition = new class'X2Condition_UnitProperty'; + TargetCondition.ExcludeConcealed = true; + Template.AbilityTargetConditions.AddItem(TargetCondition); + + // Target Effect + TrackingShotMarkTarget = new class 'X2Effect_TrackingShotMarkTarget'; + TrackingShotMarkTarget.EffectName = class'X2Ability_ChosenSniper'.default.TrackingShotMarkTargetEffectName; + //TrackingShotMarkTarget.ConeEndDiameter = default.TRACKINGSHOT_END_DIAMETER_TILES * class'XComWorldData'.const.WORLD_StepSize; + //TrackingShotMarkTarget.ConeLength = default.TRACKINGSHOT_LENGTH_TILES * class'XComWorldData'.const.WORLD_StepSize; + TrackingShotMarkTarget.DuplicateResponse = eDupe_Ignore; + TrackingShotMarkTarget.BuildPersistentEffect(1, true, true, false, eGameRule_PlayerTurnEnd); + TrackingShotMarkTarget.SetDisplayInfo(ePerkBuff_Penalty, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, , , Template.AbilitySourceName); + TrackingShotMarkTarget.bRemoveWhenTargetDies = true; + //TrackingShotMarkTarget.EffectTickedFn = TrackingShotMark_EffectTicked; + TrackingShotMarkTarget.VisualizationFn = class'X2Ability_ChosenSniper'.static.TrackingShotMarkTarget_VisualizationFn; + TrackingShotMarkTarget.EffectRemovedVisualizationFn = class'X2Ability_ChosenSniper'.static.TrackingShotMarkTarget_RemovedVisualizationFn; + Template.AddTargetEffect(TrackingShotMarkTarget); + + Template.bSkipFireAction = true; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = class'X2Ability_ChosenSniper'.static.TrackingShotMark_BuildVisualization; + + Template.CinescriptCameraType = "ChosenSniper_TrackingShotMark"; + + Template.AdditionalAbilities.AddItem('MarkedForDeath_Hunter'); + + return Template; +} + + +static function X2AbilityTemplate CreateMarkForDeathHunter() +{ + local X2AbilityTemplate Template; + local X2Condition_TargetHasOneOfTheEffects NeedOneOfTheEffects; + local XMBEffect_AbilityCostRefund RefundEffect; + local XMBCondition_AbilityName NameCondition; + `CREATE_X2ABILITY_TEMPLATE(Template, 'MarkedForDeath_Hunter'); + + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.bDisplayInUITooltip = false; + Template.bDisplayInUITacticalText = false; + Template.bDontDisplayInAbilitySummary = true; + Template.bHideOnClassUnlock = true; + Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_trackingshot"; + + Template.Hostility = eHostility_Neutral; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + RefundEffect = new class'XMBEffect_AbilityCostRefund'; + RefundEffect.EffectName = 'MarkedForDeath'; + RefundEffect.TriggeredEvent = 'MarkedForDeath'; + RefundEffect.bShowFlyOver=false; + NeedOneOfTheEffects=new class'X2Condition_TargetHasOneOfTheEffects'; + NeedOneOfTheEffects.EffectNames.AddItem(class'X2Ability_ChosenSniper'.default.TrackingShotMarkTargetEffectName); + + NameCondition = new class'XMBCondition_AbilityName'; + NameCondition.IncludeAbilityNames.AddItem('HunterRifleShot'); + + + RefundEffect.AbilityTargetConditions.AddItem(NeedOneOfTheEffects); + RefundEffect.AbilityTargetConditions.AddItem(NameCondition); + + Template.AddTargetEffect(RefundEffect); + + Template.AddTargetEffect(new class'X2Effect_LW_RemoveMark'); + + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} + + static function X2AbilityTemplate ChosenDragonRounds() { local X2AbilityTemplate Template; @@ -1003,7 +1182,7 @@ static function X2AbilityTemplate ChosenDragonRoundsPassive() { local X2AbilityTemplate Template; - Template = PurePassive('ChosenDragonRoundsPassive', "img:///UILibrary_LW_Overhaul.UIPerk_ammo_incendiary", false); + Template = PurePassive('ChosenDragonRoundsPassive', "img:///UILibrary_LWOTC.UIPerk_ammo_incendiary", false); return Template; } @@ -1068,7 +1247,7 @@ static function X2AbilityTemplate ChosenBleedingRoundsPassive() { local X2AbilityTemplate Template; - Template = PurePassive('ChosenBleedingRoundsPassive', "img:///UILibrary_LW_Overhaul.UIPerk_ammo_incendiary", false); + Template = PurePassive('ChosenBleedingRoundsPassive', "img:///UILibrary_LWOTC.UIPerk_ammo_incendiary", false); return Template; } @@ -1088,7 +1267,7 @@ static function X2AbilityTemplate ChosenVenomRounds() local X2AbilityTrigger_EventListener EventListener; `CREATE_X2ABILITY_TEMPLATE(Template, 'ChosenVenomRounds'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityVenomRounds"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityVenomRounds"; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -1130,7 +1309,7 @@ static function X2AbilityTemplate ChosenVenomRoundsPassive() { local X2AbilityTemplate Template; - Template = PurePassive('ChosenVenomRoundsPassive', "img:///UILibrary_LW_Overhaul.LW_AbilityVenomRounds", false); + Template = PurePassive('ChosenVenomRoundsPassive', "img:///UILibrary_LWOTC.LW_AbilityVenomRounds", false); return Template; } @@ -1318,11 +1497,40 @@ static function X2AbilityTemplate AddMindScorchTerror() { local X2AbilityTemplate Template; - Template = PurePassive('MindScorchTerror', "img:///UILibrary_LW_Overhaul.LW_AbilityNapalmX", false, 'eAbilitySource_Perk'); + Template = PurePassive('MindScorchTerror', "img:///UILibrary_LWOTC.LW_AbilityNapalmX", false, 'eAbilitySource_Perk'); Template.bCrossClassEligible = false; return Template; } + +static function X2AbilityTemplate AddBloodBath() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('BloodBath_LW', "img:///UILibrary_XPerkIconPack.UIPerk_adrenaline_x2", false, 'eAbilitySource_Perk', true); + + return Template; +} + +static function X2AbilityTemplate AddMistyMadness() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('MistyMadness_LW', "img:///UILibrary_XPerkIconPack.UIPerk_smoke_chevron_x3", false, 'eAbilitySource_Perk', true); + + return Template; +} + + +static function X2AbilityTemplate AddImpenetrable() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('Impenetrable_LW', "img:///UILibrary_XPerkIconPack.UIPerk_defense_blossom", false, 'eAbilitySource_Perk', true); + + return Template; +} + static function X2DataTemplate AddTerrorPanicAbility() { local X2AbilityTemplate Template; @@ -1439,6 +1647,12 @@ static function X2DataTemplate CreateChosenKidnap() RemoveEffects.EffectNamesToRemove.AddItem('BloodThirst'); Template.AddShooterEffect(RemoveEffects); + // Clear bleedout from the target unit? + // Being done in ChosenKidnapTarget_AddedFn anyways. + //RemoveEffects = new class'X2Effect_RemoveEffects'; + //RemoveEffects.EffectNamesToRemove.AddItem(class'X2StatusEffects'.default.BleedingOutName); + //Template.AddTargetEffect(RemoveEffects); + // Cannot target units being carried. ExcludeEffects = new class'X2Condition_UnitEffects'; ExcludeEffects.AddExcludeEffect(class'X2Ability_CarryUnit'.default.CarryUnitEffectName, 'AA_UnitIsImmune'); @@ -1481,10 +1695,19 @@ static function ChosenKidnapTarget_AddedFn(X2Effect_Persistent PersistentEffect, { local XComGameState_Unit KidnappedUnitState; local X2EventManager EventManager; + local XComGameState_Effect BleedOutEffect; EventManager = `XEVENTMGR; KidnappedUnitState = XComGameState_Unit(kNewTargetState); + + if (KidnappedUnitState.IsBleedingOut()) + { + // cleanse the effect so the unit is rendered unconscious + BleedOutEffect = KidnappedUnitState.GetUnitAffectedByEffectState(class'X2StatusEffects'.default.BleedingOutName); + BleedOutEffect.RemoveEffect(NewGameState, NewGameState, true); + } + EventManager.TriggerEvent('UnitRemovedFromPlay', KidnappedUnitState, KidnappedUnitState, NewGameState); EventManager.TriggerEvent('UnitCaptured', KidnappedUnitState, KidnappedUnitState, NewGameState); } @@ -1630,6 +1853,15 @@ static function X2AbilityTemplate BloodThirstPassive() return Template; } +static function X2AbilityTemplate UnholyAscension_LW() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('UnholyAscension_LW', "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_Corrupt", , 'eAbilitySource_Perk'); + + return Template; +} + static function X2DataTemplate FreeGrenades() { local X2AbilityTemplate Template; @@ -1836,11 +2068,16 @@ static function X2AbilityTemplate AssassinBladestormAttack() { local X2AbilityTemplate Template; local array SkipExclusions; + local X2Condition_NotItsOwnTurn Condition; + Template = class'X2Ability_RangerAbilitySet'.static.BladestormAttack('AssassinBladestormAttack'); SkipExclusions.AddItem(class'X2StatusEffects'.default.BurningName); Template.AddShooterEffectExclusions(SkipExclusions); + Condition = new class'X2Condition_NotItsOwnTurn'; + Template.AbilityShooterConditions.AddItem(Condition); + return Template; } @@ -1893,6 +2130,40 @@ static function X2AbilityTemplate CreateUnstoppablePassive() return Template; } + +static function X2AbilityTemplate CreaterRuptureImmunity() +{ + local X2AbilityTemplate Template; + local X2Effect_RuptureImmunity RuptureImmunityEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'RuptureImmunity'); + Template.IconImage = "img:///UILibrary_XPerkIconPack.UIPerk_knife_defense"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.Hostility = eHostility_Neutral; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.bShowActivation = false; + Template.bSkipFireAction = true; + //Template.bIsPassive = true; + Template.bDisplayInUITooltip = true; + Template.bDisplayInUITacticalText = true; + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + + RuptureImmunityEffect = new class'X2Effect_RuptureImmunity'; + RuptureImmunityEffect.BuildPersistentEffect(1, true, true,, eGameRule_PlayerTurnBegin); + RuptureImmunityEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,, Template.AbilitySourceName); + Template.AddTargetEffect(RuptureImmunityEffect); + + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + //Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + return Template; +} //Because the vanilla ability has a listener at the end of the move which breaks reactions against reaction fire static function X2AbilityTemplate CreateTriggerDamagedTeleportAbility_LW() { @@ -1932,6 +2203,118 @@ static function X2AbilityTemplate CreateTriggerDamagedTeleportAbility_LW() return Template; } +static function X2AbilityTemplate CreateWarlockMobilityAbility() +{ + local X2AbilityTemplate Template; + local X2AbilityTrigger_EventListener Trigger; + local X2Effect_PersistentStatChange StatChangeEffect; + + + `CREATE_X2ABILITY_TEMPLATE(Template, 'WarlockReactionMobility_LW'); + + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.bShowActivation = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + + Trigger = new class'X2AbilityTrigger_EventListener'; + Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; + Trigger.ListenerData.EventID = 'PlayerTurnEnded'; + Trigger.ListenerData.Filter = eFilter_Player; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; + Template.AbilityTriggers.AddItem(Trigger); + + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + StatChangeEffect = new class'X2Effect_PersistentStatChange'; + StatChangeEffect.BuildPersistentEffect(1,false, false, false, eGameRule_PlayerTurnBegin); + StatChangeEffect.AddPersistentStatChange(eStat_Mobility,default.WARLOCK_MOBILITY_DEBUFF, MODOP_Multiplication); + StatChangeEffect.bDisplayInUI = false; + Template.AddTargetEffect(StatChangeEffect); + + Template.bSkipFireAction = true; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + //Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; // Intentionally commented out + + return Template; +} + +static function X2AbilityTemplate CreateHunterMobilityAbility() +{ + local X2AbilityTemplate Template; + local X2AbilityTrigger_EventListener Trigger; + local X2Effect_PersistentStatChange StatChangeEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'HunterReactionMobility_LW'); + + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.bShowActivation = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + + Trigger = new class'X2AbilityTrigger_EventListener'; + Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; + Trigger.ListenerData.EventID = 'PlayerTurnEnded'; + Trigger.ListenerData.Filter = eFilter_Player; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; + Template.AbilityTriggers.AddItem(Trigger); + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + StatChangeEffect = new class'X2Effect_PersistentStatChange'; + StatChangeEffect.BuildPersistentEffect(1,false, false, false, eGameRule_PlayerTurnBegin); + StatChangeEffect.AddPersistentStatChange(eStat_Mobility,default.HUNTER_MOBILITY_DEBUFF, MODOP_Multiplication); + StatChangeEffect.bDisplayInUI = false; + Template.AddTargetEffect(StatChangeEffect); + + Template.bSkipFireAction = true; + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + //Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; // Intentionally commented out + + return Template; +} + +static function X2AbilityTemplate CreateHunterMobilityBoostAbility() +{ + local X2AbilityTemplate Template; + local X2Effect_PersistentStatChange StatChangeEffect; + local X2AbilityTrigger_EventListener Trigger; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'HunterReactionMobBoost_LW'); + + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_combatstims"; + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.bShowActivation = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + + + Trigger = new class'X2AbilityTrigger_EventListener'; + Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; + Trigger.ListenerData.EventID = 'UnitTakeEffectDamage'; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; + Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.ListenerData.Priority = 2; + Template.AbilityTriggers.AddItem(Trigger); + + StatChangeEffect = new class'X2Effect_PersistentStatChange'; + StatChangeEffect.BuildPersistentEffect(1,false, false, false, eGameRule_PlayerTurnBegin); + StatChangeEffect.AddPersistentStatChange(eStat_Mobility,default.HUNTER_MOB_PER_ATTACK, MODOP_Addition); + StatChangeEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,, Template.AbilitySourceName); + StatChangeEffect.DuplicateResponse = eDupe_Allow; + Template.AddTargetEffect(StatChangeEffect); + + Template.bSkipFireAction = true; + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + return Template; +} + defaultproperties { ExtractKnowledgeMarkSourceEffectName="ExtractKnowledgeMarkSourceEffect" diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc index f169bc77a..356824e33 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc @@ -72,19 +72,19 @@ static function array CreateTemplates() Templates.AddItem(CreateFlechetteRoundsAbility()); Templates.AddItem(PurePassive('Needle_Rounds_Ability', "img:///UILibrary_PerkIcons.UIPerk_ammo_needle", false, 'eAbilitySource_Item')); - Templates.AddItem(PurePassive('Redscreen_Rounds_Ability', "img:///UILibrary_LW_Overhaul.LW_AbilityRedscreen", false, 'eAbilitySource_Item')); + Templates.AddItem(PurePassive('Redscreen_Rounds_Ability', "img:///UILibrary_LWOTC.LW_AbilityRedscreen", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('Shredder_Rounds_Ability', "img:///UILibrary_PerkIcons.UIPerk_maximumordanance", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('Dragon_Rounds_Ability_PP', "img:///UILibrary_PerkIcons.UIPerk_ammo_incendiary", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('Bluescreen_Rounds_Ability_PP', "img:///UILibrary_PerkIcons.UIPerk_ammo_bluescreen", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('Talon_Rounds_Ability_PP', "img:///UILibrary_PerkIcons.UIPerk_ammo_talon", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('AP_Rounds_Ability_PP', "img:///UILibrary_PerkIcons.UIPerk_ammo_ap", false, 'eAbilitySource_Item')); - Templates.AddItem(PurePassive('Venom_Rounds_Ability_PP', "img:///UILibrary_LW_Overhaul.LW_AbilityVenomRounds", false, 'eAbilitySource_Item')); + Templates.AddItem(PurePassive('Venom_Rounds_Ability_PP', "img:///UILibrary_LWOTC.LW_AbilityVenomRounds", false, 'eAbilitySource_Item')); Templates.AddItem(PurePassive('Tracer_Rounds_Ability_PP', "img:///UILibrary_PerkIcons.UIPerk_ammo_tracer", false, 'eAbilitySource_Item')); - Templates.AddItem(PurePassive('FireControl25', "img:///UILibrary_LW_Overhaul.LW_AbilityFireControl", false)); - Templates.AddItem(PurePassive('FireControl50', "img:///UILibrary_LW_Overhaul.LW_AbilityFireControl", false)); - Templates.AddItem(PurePassive('FireControl75', "img:///UILibrary_LW_Overhaul.LW_AbilityFireControl", false)); + Templates.AddItem(PurePassive('FireControl25', "img:///UILibrary_LWOTC.LW_AbilityFireControl", false)); + Templates.AddItem(PurePassive('FireControl50', "img:///UILibrary_LWOTC.LW_AbilityFireControl", false)); + Templates.AddItem(PurePassive('FireControl75', "img:///UILibrary_LWOTC.LW_AbilityFireControl", false)); Templates.AddItem(CreateSmallItemWeightAbility()); Templates.AddItem(RemoveGrenadeWeightAbility()); // does not work diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GrenadierAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GrenadierAbilitySet.uc index 0886a5a49..265b532ae 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GrenadierAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GrenadierAbilitySet.uc @@ -22,12 +22,12 @@ static function array CreateTemplates() `Log("LW_GrenadierAbilitySet.CreateTemplates --------------------------------"); //Effects implemented in same code that handles damage falloff for both units and environment - Templates.AddItem(PurePassive('Sapper', "img:///UILibrary_LW_Overhaul.LW_AbilitySapper", true)); - Templates.AddItem(PurePassive('CombatEngineer', "img:///UILibrary_LW_Overhaul.LW_AbilityCombatEngineer", true)); - Templates.AddItem(PurePassive('TandemWarheads', "img:///UILibrary_LW_Overhaul.LW_AbilityTandemWarheads", true)); - //Templates.AddItem(PurePassive('NeedleGrenades', "img:///UILibrary_LW_Overhaul.LW_AbilityNeedleGrenades", true)); + Templates.AddItem(PurePassive('Sapper', "img:///UILibrary_LWOTC.LW_AbilitySapper", true)); + Templates.AddItem(PurePassive('CombatEngineer', "img:///UILibrary_LWOTC.LW_AbilityCombatEngineer", true)); + Templates.AddItem(PurePassive('TandemWarheads', "img:///UILibrary_LWOTC.LW_AbilityTandemWarheads", true)); + //Templates.AddItem(PurePassive('NeedleGrenades', "img:///UILibrary_LWOTC.LW_AbilityNeedleGrenades", true)); Templates.AddItem(NeedleGrenades()); - Templates.AddItem(PurePassive('BluescreenBombs', "img:///UILibrary_LW_Overhaul.LW_AbilityBluescreenBombs", true)); + Templates.AddItem(PurePassive('BluescreenBombs', "img:///UILibrary_LWOTC.LW_AbilityBluescreenBombs", true)); Templates.AddItem(AddHeavyOrdnance_LW()); Templates.AddItem(AddProtector()); @@ -38,7 +38,7 @@ static function array CreateTemplates() Templates.AddItem(AddBiggestBooms_LW()); //temporary common abilities so the UI will load - Templates.AddItem(PurePassive('FireInTheHole', "img:///UILibrary_LW_Overhaul.LW_AbilityFireInTheHole", true)); + Templates.AddItem(PurePassive('FireInTheHole', "img:///UILibrary_LWOTC.LW_AbilityFireInTheHole", true)); return Templates; } @@ -103,7 +103,7 @@ static function X2AbilityTemplate AddHEATWarheads() local X2Effect_HEATGrenades HEATEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'HEATWarheads'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityHEATWarheads"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityHEATWarheads"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -410,7 +410,7 @@ static function X2AbilityTemplate NeedleGrenades() `CREATE_X2ABILITY_TEMPLATE (Template, 'NeedleGrenades'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityNeedleGrenades"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityNeedleGrenades"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.Hostility = eHostility_Neutral; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GunnerAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GunnerAbilitySet.uc index 899f77249..0fd695441 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GunnerAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GunnerAbilitySet.uc @@ -41,7 +41,7 @@ static function X2AbilityTemplate AddCombatives() { local X2AbilityTemplate Template; - Template = PurePassive('Combatives', "img:///UILibrary_LW_Overhaul.LW_AbilityCombatives", false, 'eAbilitySource_Perk'); + Template = PurePassive('Combatives', "img:///UILibrary_LWOTC.LW_AbilityCombatives", false, 'eAbilitySource_Perk'); Template.SetUIStatMarkup(class'XLocalizedData'.default.DodgeLabel, eStat_Dodge, default.COMBATIVES_DODGE, true); Template.AdditionalAbilities.AddItem('CombativesAttack'); Template.AdditionalAbilities.AddiTEm('CombativesPreparation'); @@ -57,7 +57,7 @@ static function X2AbilityTemplate CombativesStats() local X2Effect_AdditionalAnimSets AnimSetEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'CombativesStats'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_Ability_Combatives"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_Ability_Combatives"; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.AbilityToHitCalc = default.DeadEye; @@ -94,7 +94,7 @@ static function X2AbilityTemplate AddCombativesAttack() local X2Effect_RemoveEffects RemoveEffects; `CREATE_X2ABILITY_TEMPLATE(Template, 'CombativesAttack'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_Ability_Combatives"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_Ability_Combatives"; Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.Hostility = eHostility_Offensive; @@ -220,7 +220,7 @@ static function X2AbilityTemplate AddCombativesCounterattackAbility() local X2AbilityTrigger_EventListener EventListener; `CREATE_X2ABILITY_TEMPLATE(Template, 'CombativesCounterattack'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_Ability_Combatives"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_Ability_Combatives"; Template.bDontDisplayInAbilitySummary = true; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; @@ -259,7 +259,7 @@ static function X2AbilityTemplate AddKnifeFighter() Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityKnifeFighter"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityKnifeFighter"; Template.bHideOnClassUnlock = false; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_SQUADDIE_PRIORITY; Template.AbilityConfirmSound = "TacticalUI_SwordConfirm"; @@ -337,7 +337,7 @@ static function X2AbilityTemplate AddFlushAbility() `CREATE_X2ABILITY_TEMPLATE(Template, 'Flush'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFlush"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFlush"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; Template.bCrossClassEligible = true; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_PsiOperativeAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_PsiOperativeAbilitySet.uc index 6157e9cc4..7520d3964 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_PsiOperativeAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_PsiOperativeAbilitySet.uc @@ -409,6 +409,9 @@ static function X2AbilityTemplate Create_SoulStorm() DamageEffect.bIgnoreBaseDamage = true; DamageEffect.DamageTag = 'SoulStorm'; DamageEffect.bIgnoreArmor = default.SOULSTORM_IGNORES_ARMOR; + //DamageEffect.EnvironmentalDamageAmount = default.SOULSTORM_ENVIRONMENAL_DAMAGE; + //DamageEffect.bApplyToWorldOnHit = true; + // DamageEffect.bApplyToWorldOnMiss = true; Template.AddMultiTargetEffect(DamageEffect); Template.AddMultiTargetEffect(new class'X2Effect_IRI_SoulStorm'); // environmental destruction diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_RangerAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_RangerAbilitySet.uc index 52f2fa017..8a0bb509a 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_RangerAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_RangerAbilitySet.uc @@ -48,7 +48,7 @@ static function X2AbilityTemplate AddPointBlank() // Icon Properties //Template.bDontDisplayInAbilitySummary = true; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityPointBlank"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityPointBlank"; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.STANDARD_PISTOL_SHOT_PRIORITY; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; Template.DisplayTargetHitChance = true; @@ -141,7 +141,7 @@ static function X2AbilityTemplate AddBothBarrels() // Icon Properties //Template.bDontDisplayInAbilitySummary = true; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityBothBarrels"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityBothBarrels"; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.STANDARD_PISTOL_SHOT_PRIORITY; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; Template.DisplayTargetHitChance = true; @@ -226,7 +226,7 @@ static function X2AbilityTemplate AddPumpAction() local X2Effect_AddAmmo AddAmmoEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'PumpAction'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityPumpAction"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityPumpAction"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -289,7 +289,7 @@ static function X2AbilityTemplate AddFortify() local X2AbilityCooldown Cooldown; `CREATE_X2ABILITY_TEMPLATE(Template, 'Fortify'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFortify"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFortify"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; Template.ShotHUDPriority = 401; @@ -333,7 +333,7 @@ static function X2AbilityTemplate AddSprinter() local X2Effect_PersistentStatChange StatEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'Sprinter'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilitySprinter"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilitySprinter"; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.AbilityToHitCalc = default.DeadEye; @@ -371,7 +371,7 @@ static function X2AbilityTemplate AddPassSidearm() local X2Condition_AbilityProperty ShooterAbilityCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'TakeThis'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityTakeThis"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityTakeThis"; //Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideSpecificErrors; Template.Hostility = eHostility_Neutral; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SharpshooterAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SharpshooterAbilitySet.uc index 20f43e327..a3dbd5c17 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SharpshooterAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SharpshooterAbilitySet.uc @@ -23,10 +23,10 @@ static function array CreateTemplates() Templates.AddItem(AddRapidTargeting()); Templates.AddItem(AddMultiTargeting()); - Templates.AddItem(PurePassive('HDHolo', "img:///UILibrary_LW_Overhaul.LW_AbilityHDHolo", true)); - Templates.AddItem(PurePassive('IndependentTracking', "img:///UILibrary_LW_Overhaul.LW_AbilityIndependentTracking", true)); - Templates.AddItem(PurePassive('VitalPointTargeting', "img:///UILibrary_LW_Overhaul.LW_AbilityVitalPointTargeting", true)); - Templates.AddItem(PurePassive('RapidTargeting_Passive', "img:///UILibrary_LW_Overhaul.LW_AbilityRapidTargeting", true)); + Templates.AddItem(PurePassive('HDHolo', "img:///UILibrary_LWOTC.LW_AbilityHDHolo", true)); + Templates.AddItem(PurePassive('IndependentTracking', "img:///UILibrary_LWOTC.LW_AbilityIndependentTracking", true)); + Templates.AddItem(PurePassive('VitalPointTargeting', "img:///UILibrary_LWOTC.LW_AbilityVitalPointTargeting", true)); + Templates.AddItem(PurePassive('RapidTargeting_Passive', "img:///UILibrary_LWOTC.LW_AbilityRapidTargeting", true)); Templates.AddItem(AddAlphaMikeFoxtrot()); Templates.AddItem(AddDoubleTap2()); @@ -42,12 +42,13 @@ static function X2AbilityTemplate AddHolotarget() local X2Effect_LWHoloTarget Effect; local X2Condition_Visibility TargetVisibilityCondition; local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_AbilityProperty IndependentTargetingCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Holotarget'); Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityHolotargeting"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityHolotargeting"; Template.bHideOnClassUnlock = false; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_SQUADDIE_PRIORITY; //Template.AbilityConfirmSound = "TacticalUI_SwordConfirm"; @@ -101,6 +102,22 @@ static function X2AbilityTemplate AddHolotarget() Effect.bApplyOnMiss = true; Template.AddTargetEffect(Effect); + //independent targeting effect + + Effect = new class'X2Effect_LWHoloTarget'; + Effect.BuildPersistentEffect(1+class'X2Effect_LWHoloTarget'.default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS, false, false, false, eGameRule_PlayerTurnBegin); + Effect.SetDisplayInfo(ePerkBuff_Penalty, class'X2Effect_LWHolotarget'.default.HoloTargetEffectName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); + Effect.bRemoveWhenTargetDies = true; + Effect.bUseSourcePlayerState = true; + Effect.bApplyOnHit = true; + Effect.bApplyOnMiss = true; + + IndependentTargetingCondition = new class'X2Condition_AbilityProperty'; + IndependentTargetingCondition.OwnerHasSoldierAbilities.AddItem('IndependentTracking'); + Effect.TargetConditions.AddItem(IndependentTargetingCondition); + + Template.AddTargetEffect(Effect); + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; @@ -115,12 +132,13 @@ static function X2AbilityTemplate AddRapidTargeting() local X2AbilityCooldown Cooldown; local X2Condition_Visibility TargetVisibilityCondition; local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_AbilityProperty IndependentTargetingCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Rapidtargeting'); Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityRapidTargeting"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityRapidTargeting"; Template.bHideOnClassUnlock = false; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CORPORAL_PRIORITY; Template.Hostility = eHostility_Neutral; @@ -176,6 +194,22 @@ static function X2AbilityTemplate AddRapidTargeting() Effect.bApplyOnMiss = true; Template.AddTargetEffect(Effect); + //independent targeting effect + + Effect = new class'X2Effect_LWHoloTarget'; + Effect.BuildPersistentEffect(1+class'X2Effect_LWHoloTarget'.default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS, false, false, false, eGameRule_PlayerTurnBegin); + Effect.SetDisplayInfo(ePerkBuff_Penalty, class'X2Effect_LWHolotarget'.default.HoloTargetEffectName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); + Effect.bRemoveWhenTargetDies = true; + Effect.bUseSourcePlayerState = true; + Effect.bApplyOnHit = true; + Effect.bApplyOnMiss = true; + + IndependentTargetingCondition = new class'X2Condition_AbilityProperty'; + IndependentTargetingCondition.OwnerHasSoldierAbilities.AddItem('IndependentTracking'); + Effect.TargetConditions.AddItem(IndependentTargetingCondition); + + Template.AddTargetEffect(Effect); + Template.AdditionalAbilities.AddItem('RapidTargeting_Passive'); Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; @@ -194,12 +228,13 @@ static function X2AbilityTemplate AddMultiTargeting() local X2Condition_Visibility TargetVisibilityCondition; local X2AbilityCooldown Cooldown; local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_AbilityProperty IndependentTargetingCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Multitargeting'); Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityMultiTargeting"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityMultiTargeting"; Template.bHideOnClassUnlock = false; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; //Template.AbilityConfirmSound = "TacticalUI_SwordConfirm"; @@ -263,6 +298,23 @@ static function X2AbilityTemplate AddMultiTargeting() Template.AddTargetEffect(Effect); Template.AddMultiTargetEffect(Effect); + //independent targeting effect + + Effect = new class'X2Effect_LWHoloTarget'; + Effect.BuildPersistentEffect(1+class'X2Effect_LWHoloTarget'.default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS, false, false, false, eGameRule_PlayerTurnBegin); + Effect.SetDisplayInfo(ePerkBuff_Penalty, class'X2Effect_LWHolotarget'.default.HoloTargetEffectName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); + Effect.bRemoveWhenTargetDies = true; + Effect.bUseSourcePlayerState = true; + Effect.bApplyOnHit = true; + Effect.bApplyOnMiss = true; + + IndependentTargetingCondition = new class'X2Condition_AbilityProperty'; + IndependentTargetingCondition.OwnerHasSoldierAbilities.AddItem('IndependentTracking'); + Effect.TargetConditions.AddItem(IndependentTargetingCondition); + + Template.AddTargetEffect(Effect); + Template.AddMultiTargetEffect(Effect); + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; @@ -278,7 +330,7 @@ static function X2AbilityTemplate AddAlphaMikeFoxtrot() local X2Effect_PrimaryHitBonusDamage DamageEffect; `CREATE_X2ABILITY_TEMPLATE (Template, 'AlphaMikeFoxtrot'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityAMF"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityAMF"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ShinobiAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ShinobiAbilitySet.uc index 68e22e558..9aa279f07 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ShinobiAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_ShinobiAbilitySet.uc @@ -28,7 +28,7 @@ static function array CreateTemplates() Templates.AddItem(AddCoupDeGraceAbility()); Templates.AddItem(AddCoupDeGracePassive()); Templates.AddItem(AddCoupDeGrace2Ability()); - Templates.AddItem(PurePassive('Tradecraft', "img:///UILibrary_LW_Overhaul.LW_AbilityTradecraft", true)); + Templates.AddItem(PurePassive('Tradecraft', "img:///UILibrary_LWOTC.LW_AbilityTradecraft", true)); return Templates; } @@ -40,7 +40,7 @@ static function X2AbilityTemplate AddCoupDeGrace2Ability() `CREATE_X2ABILITY_TEMPLATE(Template, 'CoupDeGrace2'); Template.AbilitySourceName = 'eAbilitySource_Perk'; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityCoupDeGrace"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityCoupDeGrace"; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.AbilityToHitCalc = default.DeadEye; @@ -77,7 +77,7 @@ static function X2AbilityTemplate AddCoupDeGraceAbility() Template.AbilitySourceName = 'eAbilitySource_Standard'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityCoupDeGrace"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityCoupDeGrace"; Template.bHideOnClassUnlock = false; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_SQUADDIE_PRIORITY; Template.AbilityConfirmSound = "TacticalUI_SwordConfirm"; @@ -148,7 +148,7 @@ static function X2AbilityTemplate AddCoupDeGracePassive() local X2Effect_CoupDeGrace CoupDeGraceEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'CoupDeGracePassive'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityCoupDeGrace"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityCoupDeGrace"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SpecialistAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SpecialistAbilitySet.uc index c1fde0470..d131e7f65 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SpecialistAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_SpecialistAbilitySet.uc @@ -39,7 +39,7 @@ static function X2AbilityTemplate AddFailsafe() local X2Effect_Failsafe FailsafeEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'Failsafe'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFailsafe"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFailsafe"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -69,7 +69,7 @@ static function X2AbilityTemplate AddFullOverride() Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFullOverride"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFullOverride"; Charges = new class'X2AbilityCharges'; Charges.InitialCharges = 1; @@ -271,6 +271,10 @@ static function X2AbilityTemplate AddHackRewardControlRobot_Mission() bInfiniteDuration = true; ControlEffect = class'X2StatusEffects'.static.CreateMindControlStatusEffect(99, true, bInfiniteDuration); + // Rename effect so that Stasis doesn't cancel the hack. + ControlEffect.EffectName = 'FullOverride'; + //remove the tick function so it douesn't visualize. + ControlEffect.EffectTickedVisualizationFn = none; Template.AddTargetEffect(ControlEffect); // Remove any pre-existing disorient. @@ -323,6 +327,7 @@ static function X2AbilityTemplate HackRewardShutdownRobotOrTurret( bool bTurret, Template.AbilityTargetStyle = default.SimpleSingleTarget; StunEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(6, 100, false); + StunEffect.bRemoveWhenSourceDies = false; StunEffect.SetDisplayInfo(ePerkBuff_Penalty, class'X2StatusEffects'.default.RoboticStunnedFriendlyName, class'X2StatusEffects'.default.RoboticStunnedFriendlyDesc, "img:///UILibrary_PerkIcons.UIPerk_stun"); if (bTurret) { @@ -368,6 +373,8 @@ static function X2AbilityTemplate AddHackRewardControlRobot_Permanent() bInfiniteDuration = true; ControlEffect = class'X2StatusEffects'.static.CreateMindControlStatusEffect(99, true, bInfiniteDuration); + // Rename effect so that Stasis doesn't cancel the hack. + ControlEffect.EffectName = 'FullOverride'; ControlEffect.bRemoveWhenSourceDies = false; // added for ID 1733 -- mind control effect is no longer lost when source unit dies or evacs ControlEffect.EffectRemovedVisualizationFn = none; // No visualization of this effect being removed (which happens when the unit evacs or dies) Template.AddTargetEffect(ControlEffect); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_TechnicalAbilitySet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_TechnicalAbilitySet.uc index ccb916dc7..bb55e50c2 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_TechnicalAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_TechnicalAbilitySet.uc @@ -27,6 +27,9 @@ var config int ROUST_DIRECT_APPLY_CHANCE; var config int ROUST_CHARGES; var config float ROUST_DAMAGE_PENALTY; var config int ROUST_HIGH_PRESSURE_CHARGES; +var config int ROUST_STATEFFECT_DURATION; +var config int ROUST_MOB_REDUCTION; +var config int ROUST_DEF_REDUCTION; // LW2 flamethrower targeting var config float INCINERATOR_RADIUS_MULTIPLIER; @@ -50,6 +53,9 @@ var config int FIRE_AND_STEEL_DAMAGE_BONUS; var config int CONCUSSION_ROCKET_RADIUS_TILES; var config int CONCUSSION_ROCKET_TARGET_WILL_MALUS_DISORIENT; var config int CONCUSSION_ROCKET_TARGET_WILL_MALUS_STUN; +var config int CONCUSSION_ROCKET_STUN_CHANCE; +var config bool USE_CONCUSSION_ROCKET_WILL_CALCS; +var config bool ENABLE_CONCUSSION_ROCKET_SMOKE; var config WeaponDamageValue CONCUSSION_ROCKET_DAMAGE_VALUE; var config int CONCUSSION_ROCKET_ENV_DAMAGE; var config float BURNOUT_RADIUS; @@ -72,28 +78,30 @@ static function array CreateTemplates() { local array Templates; `Log("LW_TechnicalAbilitySet.CreateTemplates --------------------------------"); - Templates.AddItem(PurePassive('HeavyArmaments', "img:///UILibrary_LW_Overhaul.LW_AbilityHeavyArmaments")); + Templates.AddItem(PurePassive('HeavyArmaments', "img:///UILibrary_LWOTC.LW_AbilityHeavyArmaments")); Templates.AddItem(CreateLWFlamethrowerAbility()); - Templates.AddItem(PurePassive('PhosphorusPassive', "img:///UILibrary_LW_Overhaul.LW_AbilityPhosphorus")); - Templates.AddItem(PurePassive('NapalmX', "img:///UILibrary_LW_Overhaul.LW_AbilityNapalmX")); - Templates.AddItem(PurePassive('Incinerator', "img:///UILibrary_LW_Overhaul.LW_AbilityHighPressure")); + Templates.AddItem(PurePassive('PhosphorusPassive', "img:///UILibrary_LWOTC.LW_AbilityPhosphorus")); + Templates.AddItem(PurePassive('NapalmX', "img:///UILibrary_LWOTC.LW_AbilityNapalmX")); + Templates.AddItem(PurePassive('Incinerator', "img:///UILibrary_LWOTC.LW_AbilityHighPressure")); Templates.AddItem(AddQuickburn()); Templates.AddItem(CreateRoustAbility()); Templates.AddItem(CreateBurnoutAbility()); Templates.AddItem(BurnoutPassive()); Templates.AddItem(RoustDamage()); Templates.AddItem(CreateFirestorm()); + Templates.AddItem(CreateFirestormActivation()); Templates.AddItem(FirestormDamage()); + Templates.AddItem(CreateFirestorm2()); Templates.AddItem(CreateHighPressureAbility()); Templates.AddItem(CreateTechnicalFireImmunityAbility()); Templates.AddItem(CreatePhosphorusBonusAbility()); Templates.AddItem(LWRocketLauncherAbility()); Templates.AddItem(LWBlasterLauncherAbility()); - Templates.AddItem(PurePassive('FireInTheHole', "img:///UILibrary_LW_Overhaul.LW_AbilityFireInTheHole")); - Templates.AddItem(PurePassive('TandemWarheads', "img:///UILibrary_LW_Overhaul.LW_AbilityTandemWarheads")); + Templates.AddItem(PurePassive('FireInTheHole', "img:///UILibrary_LWOTC.LW_AbilityFireInTheHole")); + Templates.AddItem(PurePassive('TandemWarheads', "img:///UILibrary_LWOTC.LW_AbilityTandemWarheads")); Templates.AddItem(AddShockAndAwe()); Templates.AddItem(AddJavelinRockets()); Templates.AddItem(CreateConcussionRocketAbility()); @@ -113,7 +121,7 @@ static function X2AbilityTemplate AddJavelinRockets() local X2Effect_JavelinRockets JavelinRocketsEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'JavelinRockets'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityJavelinRockets"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityJavelinRockets"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -140,7 +148,7 @@ static function X2AbilityTemplate AddShockAndAwe() local X2Effect_BonusRocketCharges RocketChargesEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'ShockAndAwe'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityShockAndAwe"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityShockAndAwe"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -301,7 +309,7 @@ static function X2AbilityTemplate CreatePhosphorusBonusAbility() Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.bCrossClassEligible = false; Template.Hostility = eHostility_Neutral; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityPhosphorus"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityPhosphorus"; Template.bDontDisplayInAbilitySummary = true; Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SelfTarget; @@ -335,10 +343,11 @@ static function X2AbilityTemplate CreateRoustAbility() local X2AbilityCost_Charges ChargeCost; local X2Effect_FallBack FallBackEffect; local X2Condition_UnitEffects SuppressedCondition; + local X2Effect_PersistentStatChange StatChangeEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'Roust'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityRoust"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityRoust"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; @@ -410,6 +419,14 @@ static function X2AbilityTemplate CreateRoustAbility() FireToWorldEffect.FireChance_Level3 = 0.00f; FireToWorldEffect.bCheckForLOSFromTargetLocation = false; //The flamethrower does its own LOS filtering + StatChangeEffect = new class'X2Effect_PersistentStatChange'; + StatChangeEffect.BuildPersistentEffect(default.ROUST_STATEFFECT_DURATION, false, false, true, eGameRule_PlayerTurnBegin); + StatChangeEffect.AddPersistentStatChange(eStat_Mobility, -float(default.ROUST_MOB_REDUCTION)); + StatChangeEffect.AddPersistentStatChange(eStat_Defense, -float(default.ROUST_DEF_REDUCTION)); + StatChangeEffect.SetDisplayInfo (ePerkBuff_Penalty, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage,,, Template.AbilitySourceName); + StatChangeEffect.DuplicateResponse = eDupe_Allow; + Template.AddMultiTargetEffect(StatChangeEffect); + BurningEffect = class'X2StatusEffects'.static.CreateBurningStatusEffect(default.FLAMETHROWER_BURNING_BASE_DAMAGE, default.FLAMETHROWER_BURNING_DAMAGE_SPREAD); BurningEffect.ApplyChance = default.ROUST_DIRECT_APPLY_CHANCE; Template.AddMultiTargetEffect(BurningEffect); @@ -449,7 +466,7 @@ static function X2AbilityTemplate RoustDamage() local X2Effect_RoustDamage DamagePenalty; `CREATE_X2ABILITY_TEMPLATE (Template, 'RoustDamage'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityRoust"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityRoust"; Template.bDontDisplayInAbilitySummary = true; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.AbilitySourceName = 'eAbilitySource_Perk'; @@ -472,6 +489,252 @@ static function X2AbilityTemplate RoustDamage() static function X2AbilityTemplate CreateFirestorm() +{ + local X2AbilityTemplate Template; + local X2AbilityCharges_BonusCharges Charges; + local X2AbilityCost_Charges ChargeCost; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2AbilityTarget_Cursor CursorTarget; + local X2AbilityMultiTarget_Radius RadiusMultiTarget; + local X2Condition_UnitProperty UnitPropertyCondition; + local X2AbilityTrigger_PlayerInput InputTrigger; + //local X2AbilityToHitCalc_StandardAim StandardAim; + local X2Condition_UnitEffects SuppressedCondition; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'Firestorm'); + + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFirestorm"; + Template.bSKipFireAction=true; + //Template.bUseAmmoAsChargesForHUD = true; + + InputTrigger = new class'X2AbilityTrigger_PlayerInput'; + Template.AbilityTriggers.AddItem(InputTrigger); + + Template.AbilityToHitCalc=default.Deadeye; + + Charges = new class 'X2AbilityCharges_BonusCharges'; + Charges.InitialCharges = default.FIRESTORM_NUM_CHARGES; + Charges.BonusAbility = 'HighPressure'; + Charges.BonusItem = 'HighPressureTanks'; + Charges.BonusChargesCount = default.FIRESTORM_HIGH_PRESSURE_CHARGES; + Template.AbilityCharges = Charges; + + ChargeCost = new class'X2AbilityCost_Charges'; + ChargeCost.NumCharges = 1; + Template.AbilityCosts.AddItem(ChargeCost); + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 2; + ActionPointCost.bConsumeAllPoints = true; + //ActionPointCost.DoNotConsumeAllSoldierAbilities.AddItem('Quickburn'); + Template.AbilityCosts.AddItem(ActionPointCost); + + CursorTarget = new class'X2AbilityTarget_Cursor'; + //CursorTarget.bRestrictToWeaponRange = false; + //CursorTarget.FixedAbilityRange = 15; + Template.AbilityTargetStyle=CursorTarget; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.ARMOR_ACTIVE_PRIORITY; + + RadiusMultiTarget = new class'X2AbilityMultiTarget_Radius'; + RadiusMultiTarget.fTargetRadius = default.FIRESTORM_RADIUS_METERS; + RadiusMultiTarget.bIgnoreBlockingCover = true; + RadiusMultiTarget.bExcludeSelfAsTargetIfWithinRadius = true; + Template.AbilityMultiTargetStyle = RadiusMultiTarget; + + UnitPropertyCondition = new class'X2Condition_UnitProperty'; + UnitPropertyCondition.ExcludeDead = true; + Template.AbilityShooterConditions.AddItem(UnitPropertyCondition); + + SuppressedCondition = new class'X2Condition_UnitEffects'; + SuppressedCondition.AddExcludeEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsSuppressed'); + SuppressedCondition.AddExcludeEffect(class'X2Effect_AreaSuppression'.default.EffectName, 'AA_UnitIsSuppressed'); + Template.AbilityShooterConditions.AddItem(SuppressedCondition); + + Template.AddShooterEffectExclusions(); + + Template.bCheckCollision = true; + Template.bAffectNeighboringTiles = true; + Template.bFragileDamageOnly = true; + + Template.TargetingMethod = class'X2TargetingMethod_PathTarget'; + + + Template.ActivationSpeech = 'Flamethrower'; + Template.CinescriptCameraType = "Soldier_HeavyWeapons"; + + Template.AdditionalAbilities.AddItem('TechnicalFireImmunity'); + Template.AdditionalAbilities.AddItem('FirestormDamage'); + Template.AdditionalAbilities.AddItem('FirestormActivation'); + + + Template.PostActivationEvents.AddItem('FirestormActivation'); + + Template.DamagePreviewFn = FirestormDamagePreview; + + Template.BuildNewGameStateFn = TypicalMoveEndAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + //Template.BuildVisualizationFn = LWFirestorm_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalMoveEndAbility_BuildInterruptGameState; + + // Interactions with the Chosen and Shadow + // NOTE: Does NOT increase rate of Lost spawns + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + + return Template; +} + +function bool FirestormDamagePreview(XComGameState_Ability AbilityState, StateObjectReference TargetRef, out WeaponDamageValue MinDamagePreview, out WeaponDamageValue MaxDamagePreview, out int AllowsShield) +{ + local XComGameState_Unit AbilityOwner; + local StateObjectReference FirestormActivationRef; + local XComGameState_Ability FirestormActivationAbility; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + AbilityOwner = XComGameState_Unit(History.GetGameStateForObjectID(AbilityState.OwnerStateObject.ObjectID)); + FirestormActivationRef = AbilityOwner.FindAbility('FirestormActivation'); + FirestormActivationAbility = XComGameState_Ability(History.GetGameStateForObjectID(FirestormActivationRef.ObjectID)); + if (FirestormActivationAbility == none) + { + `RedScreenOnce("Unit has Firestorm but is missing FirestormActivation. Not good. -Tedster @gameplay"); + } + else + { + FirestormActivationAbility.NormalDamagePreview(TargetRef, MinDamagePreview, MaxDamagePreview, AllowsShield); + } + return true; +} + +static function X2AbilityTemplate CreateFirestormActivation() +{ + local X2AbilityTemplate Template; + local X2AbilityTrigger_EventListener Trigger; + //local X2AbilityTarget_Cursor CursorTarget; + local X2AbilityMultiTarget_Radius RadiusMultiTarget; + //local X2Condition_UnitProperty UnitPropertyCondition; + //local X2AbilityTrigger_PlayerInput InputTrigger; + local X2Effect_ApplyFireToWorld_Limited FireToWorldEffect; + local X2AbilityToHitCalc_StandardAim StandardAim; + local X2Effect_Burning BurningEffect; + local X2Effect_ApplyWeaponDamage WeaponDamageEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'FirestormActivation'); + + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFirestorm"; + //Template.bUseAmmoAsChargesForHUD = true; + + Trigger = new class'X2AbilityTrigger_EventListener'; + Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; + Trigger.ListenerData.EventID = 'FirestormActivation'; + Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.Listenerdata.Priority=80; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_Self; + Template.AbilityTriggers.AddItem(Trigger); + + + StandardAim = new class'X2AbilityToHitCalc_StandardAim'; + StandardAim.bAllowCrit = false; + StandardAim.bGuaranteedHit = true; + //Template.AbilityToHitCalc = StandardAim; + Template.AbilityToHitCalc = default.DeadEye; + + + //Panic effects need to come before the damage. This is needed for proper visualization ordering. + Template.AddMultiTargetEffect(CreateNapalmXPanicEffect()); + + //0 dmg effect to add environmental damage to Firestorm. + WeaponDamageEffect = new class'X2Effect_ApplyWeaponDamage'; + WeaponDamageEffect.bIgnoreBaseDamage = true; + WeaponDamageEffect.EnvironmentalDamageAmount=default.FIRESTORM_ENV_DAMAGE; + WeaponDamageEffect.bApplyOnHit = false; + WeaponDamageEffect.bApplyOnMiss = false; + WeaponDamageEffect.bApplyToWorldOnHit = true; + WeaponDamageEffect.bApplyToWorldOnMiss = true; + Template.AddMultiTargetEffect(WeaponDamageEffect); + + FireToWorldEffect = new class'X2Effect_ApplyFireToWorld_Limited'; + FireToWorldEffect.bUseFireChanceLevel = true; + FireToWorldEffect.bDamageFragileOnly = true; + FireToWorldEffect.FireChance_Level1 = 0.10f; + FireToWorldEffect.FireChance_Level2 = 0.25f; + FireToWorldEffect.FireChance_Level3 = 0.60f; + FireToWorldEffect.bCheckForLOSFromTargetLocation = false; //The flamethrower does its own LOS filtering + + + + BurningEffect = class'X2StatusEffects'.static.CreateBurningStatusEffect(default.FLAMETHROWER_BURNING_BASE_DAMAGE, default.FLAMETHROWER_BURNING_DAMAGE_SPREAD); + BurningEffect.ApplyChance = default.FLAMETHROWER_DIRECT_APPLY_CHANCE; + Template.AddMultiTargetEffect(BurningEffect); + + Template.AddMultiTargetEffect(CreateFlamethrowerDamageAbility()); + Template.AddMultiTargetEffect(FireToWorldEffect); + + + + //CursorTarget = new class'X2AbilityTarget_Cursor'; + //CursorTarget.bRestrictToWeaponRange = false; + //CursorTarget.FixedAbilityRange = 1; + //Template.AbilityTargetStyle=CursorTarget; + Template.AbilityTargetStyle = default.SelfTarget; + //Template.AbilityTargetStyle = new class'X2AbilityTarget_MovingMelee'; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.ARMOR_ACTIVE_PRIORITY; + + RadiusMultiTarget = new class'X2AbilityMultiTarget_Radius'; + RadiusMultiTarget.fTargetRadius = default.FIRESTORM_RADIUS_METERS; + RadiusMultiTarget.bIgnoreBlockingCover = true; + RadiusMultiTarget.bExcludeSelfAsTargetIfWithinRadius=true; + Template.AbilityMultiTargetStyle = RadiusMultiTarget; + + + Template.bCheckCollision = true; + Template.bAffectNeighboringTiles = true; + Template.bFragileDamageOnly = true; + + Template.ActionFireClass = class'X2Action_Fire_Firestorm'; + + Template.ActivationSpeech = 'Flamethrower'; + Template.CinescriptCameraType = "Soldier_HeavyWeapons"; + + Template.PostActivationEvents.AddItem('FlamethrowerActivated'); + + //Template.TargetingMethod = class'X2TargetingMethod_TopDownAOE'; + + Template.ModifyNewContextFn = Firestorm_ModifyContext; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = LWFlamethrower_BuildVisualization; + //Template.BuildVisualizationFn = LWFirestorm_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + // Interactions with the Chosen and Shadow + // NOTE: Does NOT increase rate of Lost spawns + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + + return Template; +} + +static function Firestorm_ModifyContext(XComGameStateContext Context) +{ + local XComGameStateContext_Ability AbilityContext; + local XComGameState_Unit UnitState; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + AbilityContext = XComGameStateContext_Ability(Context); + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(AbilityContext.InputContext.SourceObject.ObjectID)); + + AbilityContext.InputContext.TargetLocations.length = 0; + AbilityContext.InputContext.TargetLocations.AddItem(`XWORLD.GetPositionFromTileCoordinates(UnitState.TileLocation)); + +} + +static function X2AbilityTemplate CreateFirestorm2() { local X2AbilityTemplate Template; local X2AbilityCharges_BonusCharges Charges; @@ -487,11 +750,11 @@ static function X2AbilityTemplate CreateFirestorm() local X2Condition_UnitEffects SuppressedCondition; local X2Effect_ApplyWeaponDamage WeaponDamageEffect; - `CREATE_X2ABILITY_TEMPLATE(Template, 'Firestorm'); + `CREATE_X2ABILITY_TEMPLATE(Template, 'Firestorm2'); Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFirestorm"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFirestorm"; //Template.bUseAmmoAsChargesForHUD = true; InputTrigger = new class'X2AbilityTrigger_PlayerInput'; @@ -598,6 +861,7 @@ static function X2AbilityTemplate CreateFirestorm() return Template; } + static function X2AbilityTemplate FirestormDamage() { local X2AbilityTemplate Template; @@ -605,7 +869,7 @@ static function X2AbilityTemplate FirestormDamage() `CREATE_X2ABILITY_TEMPLATE (Template, 'FirestormDamage'); Template.bDontDisplayInAbilitySummary = true; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFirestorm"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFirestorm"; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.Hostility = eHostility_Neutral; @@ -619,7 +883,7 @@ static function X2AbilityTemplate FirestormDamage() DamageBonus.Penalty = false; DamageBonus.Mult = false; DamageBonus.DamageMod = default.FIRESTORM_DAMAGE_BONUS; - DamageBonus.ActiveAbility = 'Firestorm'; + DamageBonus.ActiveAbility = 'FirestormActivation'; DamageBonus.BuildPersistentEffect(1, true, false, false); Template.AddTargetEffect(DamageBonus); @@ -635,7 +899,7 @@ static function X2AbilityTemplate CreateTechnicalFireImmunityAbility() local X2Effect_DamageImmunity DamageImmunity; `CREATE_X2ABILITY_TEMPLATE(Template, 'TechnicalFireImmunity'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFirestorm"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFirestorm"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; @@ -684,7 +948,7 @@ static function X2AbilityTemplate CreateBurnoutAbility() local X2Effect_ApplySmokeGrenadeToWorld WeaponEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'Burnout'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityIgnition"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityIgnition"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; @@ -728,7 +992,7 @@ static function X2AbilityTemplate CreateBurnoutAbility() static function X2AbilityTemplate BurnoutPassive() { - return PurePassive('BurnoutPassive', "img:///UILibrary_LW_Overhaul.LW_AbilityIgnition", false, 'eAbilitySource_Perk', true); + return PurePassive('BurnoutPassive', "img:///UILibrary_LWOTC.LW_AbilityIgnition", false, 'eAbilitySource_Perk', true); } // this is a hack to allow the flamethrower to be merged with rocket launcher, but still have custom anims at each tier @@ -767,6 +1031,192 @@ function LWFlamethrower_BuildVisualization(XComGameState VisualizeGameState) } + +function LWFirestorm_BuildVisualization(XComGameState VisualizeGameState) +{ + local X2AbilityTemplate AbilityTemplate; + local AbilityInputContext AbilityContext; + local XComGameStateContext_Ability Context; + local X2WeaponTemplate WeaponTemplate; + local XComGameState_Item SourceWeapon; + + Context = XComGameStateContext_Ability(VisualizeGameState.GetContext()); + AbilityContext = Context.InputContext; + AbilityTemplate = class'XComGameState_Ability'.static.GetMyTemplateManager().FindAbilityTemplate(Context.InputContext.AbilityTemplateName); + SourceWeapon = XComGameState_Item(`XCOMHISTORY.GetGameStateForObjectID(AbilityContext.ItemObject.ObjectID)); + if (SourceWeapon != None) + { + WeaponTemplate = X2WeaponTemplate(SourceWeapon.GetMyTemplate()); + } + AbilityTemplate.CustomFireAnim = 'FF_FireFlameThrower'; // default to something safe + + if(WeaponTemplate != none) + { + switch (WeaponTemplate.DataName) + { + case 'LWGauntlet_CG': + case 'LWGauntlet_BM': + AbilityTemplate.CustomFireAnim = 'FF_FireFlameThrower_Lv2'; // use the fancy animation + break; + default: + break; + } + } + + //Continue building the visualization as normal. + TypicalAbility_BuildVisualization(VisualizeGameState); +} +/* +function LWFirestorm_BuildVisualization(XComGameState VisualizeGameState) +{ + local XComGameStateHistory History; + local XComGameStateVisualizationMgr VisMgr; + local X2AbilityTemplate AbilityTemplate; + local AbilityInputContext AbilityContext; + local XComGameStateContext_Ability Context; + local X2Action_Fire_Firestorm FireAction; + local X2Action_ExitCover ExitCoverAction; + local X2WeaponTemplate WeaponTemplate; + local XComGameState_Item SourceWeapon; + local StateObjectReference CurrentTarget; + local VisualizationActionMetadata SourceMetadata; + local VisualizationActionMetadata ActionMetadata; + local VisualizationActionMetadata BlankMetadata; + local X2Action_ApplyWeaponDamageToUnit UnitDamageAction; + local XGUnit SourceVisualizer; + local int ScanTargets; + local Array LeafNodes; + local X2Action_MarkerNamed JoinActions; + local int EffectIndex, TargetIndex; + local int TrackIndex; + local XComGameState_EnvironmentDamage EnvironmentDamageEvent; + local XComGameState_WorldEffectTileData WorldDataUpdate; + local XComGameState_InteractiveObject InteractiveObject; + local VisualizationActionMetadata InitData; + local VisualizationActionMetadata BuildData; + local VisualizationActionMetadata SourceData, InterruptTrack; + local array MultiTargetEffects; + local X2Action_Delay Delay; + + + + Context = XComGameStateContext_Ability(VisualizeGameState.GetContext()); + AbilityContext = Context.InputContext; + AbilityTemplate = class'XComGameState_Ability'.static.GetMyTemplateManager().FindAbilityTemplate(Context.InputContext.AbilityTemplateName); + SourceWeapon = XComGameState_Item(`XCOMHISTORY.GetGameStateForObjectID(AbilityContext.ItemObject.ObjectID)); + if (SourceWeapon != None) + { + WeaponTemplate = X2WeaponTemplate(SourceWeapon.GetMyTemplate()); + } + AbilityTemplate.CustomFireAnim = 'FF_FireFlameThrower'; // default to something safe + if(WeaponTemplate != none) + { + switch (WeaponTemplate.DataName) + { + case 'LWGauntlet_CG': + case 'LWGauntlet_BM': + AbilityTemplate.CustomFireAnim = 'FF_FireFlameThrower_Lv2'; // use the fancy animation + + break; + default: + break; + } + } + + //Continue building the visualization as normal. + History = `XCOMHISTORY; + VisMgr = `XCOMVISUALIZATIONMGR; + + MultiTargetEffects = AbilityTemplate.AbilityMultiTargetEffects; + + SourceVisualizer = XGUnit(History.GetVisualizer(Context.InputContext.SourceObject.ObjectID)); + + SourceMetadata.StateObject_OldState = History.GetGameStateForObjectID(SourceVisualizer.ObjectID, eReturnType_Reference, VisualizeGameState.HistoryIndex - 1); + SourceMetadata.StateObject_NewState = VisualizeGameState.GetGameStateForObjectID(SourceVisualizer.ObjectID); + SourceMetadata.StateObjectRef = Context.InputContext.SourceObject; + SourceMetadata.VisualizeActor = SourceVisualizer; + + if(Context.InputContext.MovementPaths.Length > 0 ) + { + class'X2VisualizerHelpers'.static.ParsePath(Context, SourceMetadata); + } + + ExitCoverAction = X2Action_ExitCover(class'X2Action_ExitCover'.static.AddToVisualizationTree(SourceMetadata, Context, false, SourceMetadata.LastActionAdded)); + + Delay = X2Action_Delay(class'X2Action_Delay'.static.AddToVisualizationTree(BuildData, Context,,ExitCoverAction)); + Delay.Duration = 1.6f; + Delay.bIgnoreZipMode=true; + FireAction = X2Action_Fire_Firestorm(class'X2Action_Fire_Firestorm'.static.AddToVisualizationTree(SourceMetadata, Context, false, ExitCoverAction)); + class'X2Action_EnterCover'.static.AddToVisualizationTree(SourceMetadata, Context, false, Delay); + + for (ScanTargets = 0; ScanTargets < Context.InputContext.MultiTargets.Length; ++ScanTargets) + { + CurrentTarget = Context.InputContext.MultiTargets[ScanTargets]; + + UnitDamageAction = X2Action_ApplyWeaponDamageToUnit(class'X2Action_ApplyWeaponDamageToUnit'.static.AddToVisualizationTree(ActionMetadata, Context, false, FireAction)); + XGUnit(ActionMetadata.VisualizeActor).BuildAbilityEffectsVisualization(VisualizeGameState, ActionMetadata); + } + + + + //world damage from TypicalAbility + + foreach VisualizeGameState.IterateByClassType(class'XComGameState_EnvironmentDamage', EnvironmentDamageEvent) + { + BuildData = InitData; + BuildData.VisualizeActor = none; + BuildData.StateObject_NewState = EnvironmentDamageEvent; + BuildData.StateObject_OldState = EnvironmentDamageEvent; + + // if this is the damage associated with the exit cover action, we need to force the parenting within the tree + // otherwise LastActionAdded with be 'none' and actions will auto-parent. + + for (EffectIndex = 0; EffectIndex < AbilityTemplate.AbilityShooterEffects.Length; ++EffectIndex) + { + AbilityTemplate.AbilityShooterEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + + for (EffectIndex = 0; EffectIndex < AbilityTemplate.AbilityTargetEffects.Length; ++EffectIndex) + { + AbilityTemplate.AbilityTargetEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + + for (EffectIndex = 0; EffectIndex < MultiTargetEffects.Length; ++EffectIndex) + { + MultiTargetEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + } + + foreach VisualizeGameState.IterateByClassType(class'XComGameState_WorldEffectTileData', WorldDataUpdate) + { + BuildData = InitData; + BuildData.VisualizeActor = none; + BuildData.StateObject_NewState = WorldDataUpdate; + BuildData.StateObject_OldState = WorldDataUpdate; + + for (EffectIndex = 0; EffectIndex < AbilityTemplate.AbilityShooterEffects.Length; ++EffectIndex) + { + AbilityTemplate.AbilityShooterEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + + for (EffectIndex = 0; EffectIndex < AbilityTemplate.AbilityTargetEffects.Length; ++EffectIndex) + { + AbilityTemplate.AbilityTargetEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + + for (EffectIndex = 0; EffectIndex < MultiTargetEffects.Length; ++EffectIndex) + { + MultiTargetEffects[EffectIndex].AddX2ActionsForVisualization(VisualizeGameState, BuildData, 'AA_Success'); + } + } + + VisMgr.GetAllLeafNodes(VisMgr.BuildVisTree, LeafNodes); + JoinActions = X2Action_MarkerNamed(class'X2Action_MarkerNamed'.static.AddToVisualizationTree(SourceMetadata, Context, false, , LeafNodes)); + JoinActions.SetName("Join"); + +} +*/ + static function X2Effect_ImmediateMultiTargetAbilityActivation CreateNapalmXPanicEffect() { local X2Effect_ImmediateMultiTargetAbilityActivation NapalmXEffect; @@ -853,7 +1303,7 @@ static function X2AbilityTemplate CreateFireandSteelAbility() local X2Effect_BonusWeaponDOT DamageEffect; `CREATE_X2ABILITY_TEMPLATE(Template, 'FireandSteel'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityFireandSteel"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityFireandSteel"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; @@ -1088,7 +1538,7 @@ static function X2AbilityTemplate CreateHighPressureAbility() PostBeginPlayTrigger.Priority = 40; Template.AbilityTriggers.AddItem(PostBeginPlayTrigger); Template.AbilitySourceName = 'eAbilitySource_Perk'; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityInferno"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityInferno"; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.bIsPassive = true; @@ -1115,7 +1565,7 @@ static function X2AbilityTemplate CreateConcussionRocketAbility() local X2AbilityToHitCalc_StandardAim StandardAim; local X2Effect_PersistentStatChange DisorientedEffect; local X2Effect_ApplyWeaponDamage WeaponDamageEffect; - //local X2Effect_SmokeGrenade SmokeEffect; +// local X2Effect_SmokeGrenade SmokeEffect; local X2Effect_ApplySmokeGrenadeToWorld WeaponEffect; local X2Effect_Stunned StunnedEffect; local X2Condition_UnitEffects SuppressedCondition; @@ -1126,10 +1576,11 @@ static function X2AbilityTemplate CreateConcussionRocketAbility() Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityConcussionRocket"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityConcussionRocket"; Template.bCrossClassEligible = false; Template.Hostility = eHostility_Offensive; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; + Template.bFriendlyFireWarning = false; Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); Template.TargetingMethod = class'X2TargetingMethod_LWRocketLauncher'; @@ -1190,22 +1641,27 @@ static function X2AbilityTemplate CreateConcussionRocketAbility() //Template.AddTargetEffect(WeaponDamageEffect); Template.AddMultiTargetEffect(WeaponDamageEffect); - StunnedEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(2,100,false); + StunnedEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(2,default.CONCUSSION_ROCKET_STUN_CHANCE,false); StunnedEffect.bRemoveWhenSourceDies = false; - StunnedEffect.ApplyChanceFn = ApplyChance_Concussion_Stunned; + if(default.USE_CONCUSSION_ROCKET_WILL_CALCS) + StunnedEffect.ApplyChanceFn = ApplyChance_Concussion_Stunned; //Template.AddTargetEffect(StunnedEffect); Template.AddMultiTargetEffect(StunnedEffect); DisorientedEffect = class'X2StatusEffects'.static.CreateDisorientedStatusEffect(, , false); - DisorientedEffect.ApplyChanceFn = ApplyChance_Concussion_Disoriented; + if(default.USE_CONCUSSION_ROCKET_WILL_CALCS) + DisorientedEffect.ApplyChanceFn = ApplyChance_Concussion_Disoriented; //Template.AddTargetEffect(DisorientedEffect); Template.AddMultiTargetEffect(DisorientedEffect); - WeaponEffect = new class'X2Effect_ApplySmokeGrenadeToWorld'; - Template.AddMultiTargetEffect (WeaponEffect); - - Template.AddMultiTargetEffect (class'X2Item_DefaultGrenades'.static.SmokeGrenadeEffect()); + if(default.ENABLE_CONCUSSION_ROCKET_SMOKE) + { + WeaponEffect = new class'X2Effect_ApplySmokeGrenadeToWorld'; + Template.AddMultiTargetEffect (WeaponEffect); + Template.AddMultiTargetEffect (class'X2Item_DefaultGrenades'.static.SmokeGrenadeEffect()); + } + Template.ActivationSpeech = 'Explosion'; Template.CinescriptCameraType = "Soldier_HeavyWeapons"; @@ -1356,7 +1812,7 @@ static function X2AbilityTemplate AddQuickburn() local X2AbilityCooldown Cooldown; `CREATE_X2ABILITY_TEMPLATE(Template, 'Quickburn'); - Template.IconImage = "img:///UILibrary_LW_Overhaul.LW_AbilityQuickburn"; + Template.IconImage = "img:///UILibrary_LWOTC.LW_AbilityQuickburn"; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.STASIS_LANCE_PRIORITY; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_AlwaysShow; @@ -1524,7 +1980,23 @@ static function int TileDistanceBetween(XComGameState_Unit Unit, vector TargetLo Tiles = Dist / WorldData.WORLD_StepSize; return Tiles; } +static final function EventListenerReturn AbilityTrigger_SameLocation(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData) +{ + local XComGameState_Ability AbilityState; + local XComGameStateContext_Ability AbilityContext; + AbilityContext = XComGameStateContext_Ability(GameState.GetContext()); + if (AbilityState == none || AbilityContext.InterruptionStatus == eInterruptionStatus_Interrupt) + return ELR_NoInterrupt; + + AbilityState = XComGameState_Ability(CallbackData); + if (AbilityState == none) + return ELR_NoInterrupt; + + AbilityState.AbilityTriggerAgainstSingleTarget(AbilityState.OwnerStateObject, false, GameState.HistoryIndex); + + return ELR_NoInterrupt; +} defaultProperties { diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_PlaceDelayedEvacZone.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_PlaceDelayedEvacZone.uc index e5d120d27..4cf9f69f6 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_PlaceDelayedEvacZone.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_PlaceDelayedEvacZone.uc @@ -22,6 +22,8 @@ static function array CreateTemplates() local array Templates; Templates.AddItem(PlaceDelayedEvacZone()); + Templates.AddItem(GrantEvacFlare()); + return Templates; } @@ -50,6 +52,7 @@ static function X2AbilityTemplate PlaceDelayedEvacZone() StandardAim = new class'X2AbilityToHitCalc_StandardAim'; StandardAim.bIndirectFire = true; + StandardAim.bGuaranteedHit = true; StandardAim.bAllowCrit = false; Template.AbilityToHitCalc = StandardAim; @@ -92,6 +95,39 @@ static function X2AbilityTemplate PlaceDelayedEvacZone() return Template; } +static function X2AbilityTemplate GrantEvacFlare() +{ + local X2AbilityTemplate Template; + local X2Effect_TemporaryItem ItemEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'GrantEvacFlare'); + + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + Template.bCrossClassEligible = false; + Template.bUniqueSource = true; + + Template.bDontDisplayInAbilitySummary = true; + Template.bDisplayInUITooltip = false; + + ItemEffect = new class'X2Effect_TemporaryItem'; + ItemEffect.ItemName = 'EvacFlare'; + ItemEffect.EffectName = 'GrantEvacFlareEffect'; + ItemEffect.DuplicateResponse = eDupe_Ignore; + + ItemEffect.BuildPersistentEffect(1, true, false, false); + Template.AddTargetEffect(ItemEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; + +} + static function int GetEvacDelay() { local XComGameState_LWEvacSpawner EvacSpawner; @@ -171,6 +207,8 @@ simulated function XComGameState PlaceDelayedEvacZone_BuildGameState(XComGameSta `assert(AbilityContext.InputContext.TargetLocations.Length == 1); SpawnLocation = AbilityContext.InputContext.TargetLocations[0]; + `LWTrace("Evac Target location Array length:" @ AbilityContext.InputContext.TargetLocations.Length); + `LWTrace(`SHOWVAR(AbilityContext.InputContext.TargetLocations[0])); Delay = GetEvacDelay(); class'XComGameState_LWEvacSpawner'.static.InitiateEvacZoneDeployment(Delay, SpawnLocation, NewGameState); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_UniversalSoldierAbilities.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_UniversalSoldierAbilities.uc index 0ab50ab23..32a6e9aa7 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_UniversalSoldierAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_UniversalSoldierAbilities.uc @@ -21,6 +21,8 @@ static function array CreateTemplates() Templates.AddItem(AddRebelHPUpgrade('RebelHPUpgrade_T1', default.REBEL_HP_UPGRADE_T1_AMOUNT)); Templates.AddItem(AddRebelHPUpgrade('RebelHPUpgrade_T2', default.REBEL_HP_UPGRADE_T2_AMOUNT)); Templates.AddItem(AddRebelGrenadeUpgrade()); + + Templates.AddItem(AddCantBreakWallsAbility()); return Templates; } @@ -252,3 +254,31 @@ static function X2AbilityTemplate AddRebelGrenadeUpgrade() return Template; } + +static function X2AbilityTemplate AddCantBreakWallsAbility() +{ + local X2AbilityTemplate Template; + local X2Effect_PersistentTraversalChange TraversalChangeEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'NoWallBreakOnGreenAlert'); + + Template.bDontDisplayInAbilitySummary = true; + Template.Hostility = eHostility_Neutral; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + + + Template.Hostility = eHostility_Neutral; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + TraversalChangeEffect = new class'X2Effect_PersistentTraversalChange'; + TraversalChangeEffect.BuildPersistentEffect(1, true, true); + TraversalChangeEffect.AddTraversalChange(eTraversal_BreakWall, false); + TraversalChangeEffect.EffectName = 'NoWallBreakingInGreenAlert'; + Template.AddTargetEffect(TraversalChangeEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_Fire_Firestorm.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_Fire_Firestorm.uc index a83990686..5125b08d8 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_Fire_Firestorm.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_Fire_Firestorm.uc @@ -30,6 +30,10 @@ var private float currDuration_F; var private float CurrentFlameLength_F; var private float TargetFlameLength_F; var private bool bWaitingToFire_F; +var bool bInitUpdateAim; + +var XGUnit SourceXGUnit; +var XComUnitPawn SourceUnitPawn; var private array alreadySignaledTracks_F; @@ -52,28 +56,46 @@ function bool FindTrack(StateObjectReference find) function Init() { - local Vector TempDir; - super.Init(); + bInitUpdateAim=false; +} +function InitUpdateAim() +{ + local Vector TempDir; + AbilityState = XComGameState_Ability(`XCOMHISTORY.GetGameStateForObjectID(AbilityContext.InputContext.AbilityRef.ObjectID)); - if (ClassIsChildOf(AbilityState.GetMyTemplate().TargetingMethod, class'X2TargetingMethod_Grenade')) - { + +//Commenting out the targeting method check so I can change the targeting method on Firestorm. +// if (ClassIsChildOf(AbilityState.GetMyTemplate().TargetingMethod, class'X2TargetingMethod_Grenade')) +// { radiusTemplate = X2AbilityMultiTarget_Radius(AbilityState.GetMyTemplate().AbilityMultiTargetStyle); //ConeLength = radiusTemplate.GetConeLength(AbilityState); //ConeWidth = radiusTemplate.GetConeEndDiameter(AbilityState) * 1.35; ConeLength = radiusTemplate.GetTargetRadius(AbilityState) * 1.35; - StartLocation = UnitPawn.Location; - EndLocation = UnitPawn.Location; + //StartLocation = zeroVector; + //EndLocation = zeroVector; + + if (AbilityContext.InputContext.MovementPaths.Length > 0) + { + StartLocation = AbilityContext.InputContext.MovementPaths[0].MovementData[AbilityContext.InputContext.MovementPaths[0].MovementData.Length - 1].Position; + } + else + { + StartLocation = UnitPawn.Location; + + } + EndLocation = StartLocation; + EndLocation.x += 1.0; EndLocation.x += 1.0; //EndLocation = AbilityContext.InputContext.TargetLocations[0]; - + UnitDir = Normal(vector(UnitPawn.Rotation)); ConeDir = EndLocation - StartLocation; - UnitDir = Normal(vector(UnitPawn.Rotation)); + ConeAngle = PI; // * 2; @@ -92,7 +114,8 @@ function Init() SweepEndLocation_End = StartLocation + (TempDir * ConeLength); SecondaryTiles = AbilityContext.InputContext.VisibleNeighborTiles; - } + //`Log("SecondaryTiles Array length: " @SecondaryTiles.Length); + //} PawnStartRotation = UnitPawn.Rotation; @@ -118,6 +141,8 @@ simulated state Executing simulated function UpdateAim(float DT) { + + local ParticleSystemComponent p; local int i; local float aimAngle, unitAngle; @@ -145,6 +170,12 @@ simulated state Executing local Actor HitActor; local XComGameStateVisualizationMgr VisMgr; + if (!bInitUpdateAim) + { + InitUpdateAim(); + bInitUpdateAim = true; + } + VisMgr = `XCOMVISUALIZATIONMGR; //find endlocation of target arc @@ -157,6 +188,9 @@ simulated state Executing Facing.Yaw = unitAngle * RadToUnrRot; + //experimental: + + EndLocation = StartLocation + (TempDir * ConeLength); //Modify EndLocation based on any hits against the world @@ -167,6 +201,7 @@ simulated state Executing //`SHAPEMGR.DrawLine(StartLocation, SweepEndLocation_End, 6, MakeLinearColor(1.0f, 1.0f, 0.0f, 1.0f)); //`SHAPEMGR.DrawSphere(EndLocation, Vect(10, 10, 10), MakeLinearColor(0.0f, 1.0f, 0.0f, 1.0f)); + //`log("UnitPawn class name: " @UnitPawn.Class.Name); if (UnitPawn.AimEnabled) { if (!beginAimingAnim_F) @@ -230,7 +265,8 @@ simulated state Executing } //blend aim anim - `log("Endlocation " @ EndLocation @ " aimAngle : " @ aimAngle @ " unitAngle : " @ unitAngle @ " currDuration : " @ currDuration_F @ " DT : " @ DT ); + //`log("StartLocation" @StartLocation @ "Endlocation " @ EndLocation @ " aimAngle : " @ aimAngle @ " unitAngle : " @ unitAngle @"Facing: " @Facing @ " currDuration : " @ currDuration_F @ " DT : " @ DT ); + //`LOG("ArcDelta:" @ ArcDelta * RadToDeg @ "unitAngle:" @ unitAngle* RadToDeg @ "aimAngle:" @ aimAngle* RadToDeg @ "Facing:" @ Facing.Yaw * UnrRotToDeg); UnitPawn.SetRotation(PawnStartRotation + Facing); UnitPawn.TargetLoc = EndLocation; @@ -411,7 +447,11 @@ Begin: //// Sleep long enough for the fog to be revealed //Sleep(1.0f * GetDelayModifier()); //} - + //while(Unit.IdleStateMachine.IsEvaluatingStance()) +// { +// Sleep(0.0f); +// } + Unit.IdleStateMachine.GoDormant(); Unit.CurrentFireAction = self; UnitPawn.EnableRMA(true, true); UnitPawn.EnableRMAInteractPhysics(true); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_IRI_PsiPinion.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_IRI_PsiPinion.uc index 64e49334c..a2e1ae656 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_IRI_PsiPinion.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Action_IRI_PsiPinion.uc @@ -103,7 +103,7 @@ Begin: for (LW_TimeDelayIndex = 0; LW_TimeDelayIndex < AbilityContext.InputContext.MultiTargets.Length; LW_TimeDelayIndex++) { - Sleep(0.2f); + Sleep(0.1f); AddProjectiles(LW_TimeDelayIndex); } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_ChosenCharacters.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_ChosenCharacters.uc new file mode 100644 index 000000000..84e11c5f2 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_ChosenCharacters.uc @@ -0,0 +1,66 @@ +class X2Character_ChosenCharacters extends X2Character_DefaultCharacters; + + +static function array CreateTemplates() +{ + local array Templates; + Templates.AddItem(CreateTemplate_ChosenAssassinM5()); + Templates.AddItem(CreateTemplate_ChosenSniperM5()); + Templates.AddItem(CreateTemplate_ChosenWarlockM5()); + + return Templates; +} + + + +static function X2CharacterTemplate CreateTemplate_ChosenAssassinM5() +{ + local X2CharacterTemplate CharTemplate; + + CharTemplate = CreateChosenAssassinTemplate('ChosenAssassinM5'); + CharTemplate.DefaultLoadout = 'ChosenAssassinM5_Loadout'; + CharTemplate.RevealMatineePrefix = "CIN_ChosenAssassinM4"; + CharTemplate.strPawnArchetypes.AddItem("GameUnit_ChosenAssassin.ARC_GameUnit_ChosenAssassin_M4"); +//BEGIN AUTOGENERATED CODE: Template Overrides 'ChosenAssassinM4' + CharTemplate.bCanUse_eTraversal_ClimbLadder = false; + CharTemplate.bCanUse_eTraversal_JumpUp = true; + CharTemplate.bDisableRevealForceVisible = true; +//END AUTOGENERATED CODE: Template Overrides 'ChosenAssassinM4' + + return CharTemplate; +} + +static function X2CharacterTemplate CreateTemplate_ChosenWarlockM5() +{ + local X2CharacterTemplate CharTemplate; + + CharTemplate = CreateChosenWarlockTemplate('ChosenWarlockM5'); + CharTemplate.DefaultLoadout = 'ChosenWarlockM5_Loadout'; +//BEGIN AUTOGENERATED CODE: Template Overrides 'ChosenWarlockM4' + CharTemplate.strPawnArchetypes.AddItem("GameUnit_ChosenWarlock.ARC_GameUnit_ChosenWarlockM4"); + CharTemplate.bCanUse_eTraversal_ClimbLadder = false; + CharTemplate.bCanUse_eTraversal_JumpUp = true; + CharTemplate.bDisableRevealForceVisible = true; +//END AUTOGENERATED CODE: Template Overrides 'ChosenWarlockM4' + + CharTemplate.Abilities.AddItem('WarlockLevelM4'); + CharTemplate.Abilities.AddItem('WarlockFocusM4'); + + return CharTemplate; +} + + static function X2CharacterTemplate CreateTemplate_ChosenSniperM5() +{ + local X2CharacterTemplate CharTemplate; + + CharTemplate = CreateChosenSniperTemplate('ChosenSniperM5'); + CharTemplate.DefaultLoadout = 'ChosenSniperM5_Loadout'; +//BEGIN AUTOGENERATED CODE: Template Overrides 'ChosenSniperM4' + CharTemplate.strPawnArchetypes.AddItem("GameUnit_ChosenHunter.ARC_GameUnit_ChosenHunter_M4"); + CharTemplate.bCanUse_eTraversal_ClimbLadder = false; + CharTemplate.bCanUse_eTraversal_JumpUp = true; + CharTemplate.bDisableRevealForceVisible = true; +//END AUTOGENERATED CODE: Template Overrides 'ChosenSniperM4' + + return CharTemplate; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_TheLost_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_TheLost_LW.uc index e2c5376be..9066f4749 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_TheLost_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Character_TheLost_LW.uc @@ -9,6 +9,7 @@ static function array CreateTemplates() { local array Templates; + Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBrute', 'TheLostBruteTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBruteHP10_LW', 'TheLostBruteTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBruteHP11_LW', 'TheLostBruteTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBruteHP12_LW', 'TheLostBruteTier2_Loadout')); @@ -21,6 +22,7 @@ static function array CreateTemplates() Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBruteHP23_LW', 'TheLostBruteTier4_Loadout')); Templates.AddItem(CreateTemplate_TheLostBrute('TheLostBruteHP25_LW', 'TheLostBruteTier4_Loadout')); + Templates.AddItem(CreateTemplate_TheLostGrappler('TheLostGrappler', 'TheLostGrapplerTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostGrappler('TheLostGrapplerHP2_LW', 'TheLostGrapplerTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostGrappler('TheLostGrapplerHP3_LW', 'TheLostGrapplerTier1_Loadout')); Templates.AddItem(CreateTemplate_TheLostGrappler('TheLostGrapplerHP4_LW', 'TheLostGrapplerTier2_Loadout')); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc index 98f15330a..de2193842 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc @@ -40,6 +40,16 @@ var config array HUNTER_STRENGTHS_T1; var config array HUNTER_STRENGTHS_T2; var config array HUNTER_STRENGTHS_T3; +var config int ENCRYPTION_SERVER_CHANCE; +var config int ENCRYPTION_SERVER_MONTH; + +var config bool bNerfFrostLegion; + +var config array ReplacementMissionDefs; + + + + // An array of mission types where we should just let vanilla do its // thing with regard to the Chosen rather than try to override its // behaviour. @@ -112,6 +122,15 @@ var config float BRUTE_SIZE_MULTIPLIER; // List of sitreps to remove var config array SitrepsToDisable; +// disable patching Templars + +var config bool bDisableRespeccingTemplars; + +var config bool bSewersToSubway; +var config bool bEnableCityHQs; + +var config array MapsToDisable; + // End data and data structures //----------------------------- @@ -139,6 +158,13 @@ static event InstallNewCampaign(XComGameState StartState) local XComGameState_WorldRegion StartingRegionState; local XComGameState_ResistanceFaction StartingFactionState; + //short circuit if in shell: + //if(class'WorldInfo'.static.GetWorldInfo().GRI.GameClass.name == 'XComShell') + //{ + // `LWTrace("InstallNewCampaign called in Shell, aborting."); + // return; + //} + // WOTC TODO: Note that this method is called twice if you start a new campaign. // Make sure that's not causing issues. `Log("LWOTC: Installing a new campaign"); @@ -162,6 +188,10 @@ static event InstallNewCampaign(XComGameState StartState) LimitStartingSquadSize(StartState); // possibly limit the starting squad size to something smaller than the maximum DisableUnwantedObjectives(StartState); + `LWOVERHAULOPTIONS.StartingChosen = StartingRegionState.GetControllingChosen().GetMyTemplateName(); + + `LWOVERHAULOptions.InitChosenKnowledge(); + class'XComGameState_LWSquadManager'.static.CreateFirstMissionSquad(StartState); // Clear starting resistance modes because we don't actually start @@ -192,9 +222,114 @@ static event OnPostTemplatesCreated() UpdateChosenActivities(); UpdateChosenSabotages(); UpdateSitreps(); + UpdateEncounterLists(); + ModifyYellAbility(); + ModifyMissionSchedules(); } +// Uses OPTC to update mission schedules instead of minus config +static function ModifyMissionSchedules() +{ + local XComTacticalMissionManager MissionManager; + local int MissionIdx; + local name MissionName; + local MissionDefinition CurrentMissionDef; + + MissionManager = `TACTICALMISSIONMGR; + + foreach default.ReplacementMissionDefs (CurrentMissionDef) + { + MissionName = CurrentMissionDef.MissionName; + MissionIdx = MissionManager.arrMissions.Find('MissionName', MissionName); + if(MissionIdx != -1) + { + if(MissionManager.arrMissions[MissionIdx].sType == CurrentMissionDef.sType && MissionManager.arrMissions[MissionIdx].MissionName == MissionName) + { + MissionManager.arrMissions[MissionIdx] = CurrentMissionDef; + `LWTrace("Replacing mission def for mission " @CurrentMissionDef.MissionName @"Mission sType" @ CurrentMissionDef.sType,, 'TedLog'); + } + else + { + `LWTrace("replacement Mission sType didn't match for mission Name" @CurrentMissionDef.MissionName,, 'TedLog'); + } + } + else + { + `LWTrace("Couldn't find base missiondef to replace for mission name" @CurrentMissionDef.MissionName,, 'TedLog'); + } + } +} + +static function UpdateEncounterLists() +{ + local XComTacticalMissionManager MissionManager; + local X2CharacterTemplateManager CharacterTemplateMgr; + local X2CharacterTemplate TestTemplate; + local int i, j; + + MissionManager = `TACTICALMISSIONMGR; + CharacterTemplateMgr = class'X2CharacterTemplateManager'.static.GetCharacterTemplateManager(); + + // Loop over all encounter lists + for(i = MissionManager.SpawnDistributionLists.length-1; i >= 0; i--) + { + //CurrentList = MissionManager.SpawnDistributionLists[i]; + + // Loop over all entries in each list + for(j = MissionManager.SpawnDistributionLists[i].SpawnDistribution.Length-1; j >= 0; j--) + { + //CurrentListEntry= CurrentList.SpawnDistribution[j]; + TestTemplate = CharacterTemplateMgr.FindCharacterTemplate(MissionManager.SpawnDistributionLists[i].SpawnDistribution[j].Template); + + // remove entry if invaid + if(TestTemplate == none) + { + `LWTrace("Removing nonexistant unit" @MissionManager.SpawnDistributionLists[i].SpawnDistribution[j].Template @ "From encounter list" @MissionManager.SpawnDistributionLists[i].ListID); + MissionManager.SpawnDistributionLists[i].SpawnDistribution.Remove(j, 1); + } + } + } +} + +// Remove the red alert affect from the yell ability since it cause AI units to go into red alert +// Credit to RedDobe for this function. +static function ModifyYellAbility() +{ + local X2AbilityTemplateManager AbilityMgr; + local array arrTemplate; + local int i; + local X2Effect_YellowAlert YellowAlertStatus; + local X2Effect_PersistentStatChangeRestoreDefault SightIncrease; + + YellowAlertStatus = new class 'X2Effect_YellowAlert'; + YellowAlertStatus.BuildPersistentEffect(1,true,true /*Remove on Source Death*/,,eGameRule_PlayerTurnBegin); + + SightIncrease = new class'X2Effect_PersistentStatChangeRestoreDefault'; + SightIncrease.BuildPersistentEffect(1,true,true,,eGameRule_PlayerTurnBegin); + SightIncrease.AddPersistentStatChange(eStat_SightRadius); + SightIncrease.AddPersistentStatChange(eStat_DetectionRadius); + + // Access Ability Template Manager + AbilityMgr = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); + + // Access Template for all difficulties + AbilityMgr.FindAbilityTemplateAllDifficulties('Yell', arrTemplate); + for (i = 0; i < arrTemplate.Length; i++) + { + arrTemplate[i].AbilityMultiTargetEffects.length = 0; + `Log("Removing Yell Red Alert effects"); + + if (class'Helpers_LW'.static.YellowAlertEnabled()) + { + X2AbilityMultiTarget_Radius(arrTemplate[i].AbilityMultiTargetStyle).fTargetRadius = 18; + `LWTrace("Adding Yellow Alert effects to Yell"); + arrTemplate[i].AbilityMultiTargetEffects.AddItem(YellowAlertStatus); + arrTemplate[i].AbilityMultiTargetEffects.AddItem(SightIncrease); + } + } +} + /// /// This method is run when the player loads a saved game directly into Strategy while this DLC is installed /// @@ -203,17 +338,112 @@ static event OnLoadedSavedGameToStrategy() local XComGameState NewGameState; local XComGameStateHistory History; local XComGameState_Objective ObjectiveState; + local XComGameState_LWOutpostManager OutpostManager; + local XComGameState_WorldRegion RegionState; + local XComGameState_LWOutpost OutpostState; + local XComGameState_LWToolboxOptions ToolboxOptions; + local XComGameState_LWOverhaulOptions OverhaulOptions; + local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; + local int i; + History = `XCOMHISTORY; - NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Patching existing campaign data"); + // TODO: Remove these post 1.0 - START + + // LWOTC beta 2: Remove the 'OnMonthlyReportAlert' listener as it's no + // longer needed (Not Created Equally is handled by the 'UnitRandomizedStats' + // event now). + ToolboxOptions = class'XComGameState_LWToolboxOptions'.static.GetToolboxOptions(); + `XEVENTMGR.UnRegisterFromEvent(ToolboxOptions, 'OnMonthlyReportAlert'); + + // Make sure pistol abilities apply to the new pistol slot + LWMigratePistolAbilities(); + + // If there are rebels that have already ranked up, make sure they have some abilities + OutpostManager = `LWOUTPOSTMGR; + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Patching existing campaign data"); + foreach History.IterateByClassType(class'XComGameState_WorldRegion', RegionState) + { + if (RegionState.HaveMadeContact()) + { + OutpostState = OutpostManager.GetOutpostForRegion(RegionState); + OutpostState.UpdateRebelAbilities(NewGameState); + } + } + if (`LWOVERHAULOPTIONS == none) class'XComGameState_LWOverhaulOptions'.static.CreateModSettingsState_ExistingCampaign(class'XComGameState_LWOverhaulOptions'); - if (NewGameState.GetNumGameStateObjects() > 0) - History.AddGameStateToHistory(NewGameState); - else - History.CleanupPendingGameState(NewGameState); + `LWTrace("Chosen Knowledge array length:" @ `LWOVERHAULOPTIONS.GetChosenKnowledgeGains_Randomized().length); + OverhaulOptions = `LWOVERHAULOPTIONS; + if(OverhaulOptions.GetChosenKnowledgeGains_Randomized().length == 0) + { + OverhaulOptions = XComGameState_LWOverhaulOptions(NewGameState.ModifyStateObject(class'XComGameState_LWOverhaulOptions', OverhaulOptions.ObjectID)); + OverhaulOptions.StartingChosen = XComGameState_WorldRegion(History.GetGameStateForObjectID(`XCOMHQ.StartingRegion.ObjectID)).GetControllingChosen().GetMyTemplateName(); + OverhaulOptions.InitChosenKnowledge(); + } + + + + // Patch chosen if enabled: + if (!`SecondWaveEnabled('DisableChosen')) + { + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AllChosen = AlienHQ.GetAllChosen(, true); + + + foreach History.IterateByClassType(class'XComGameState_WorldRegion', RegionState) + { + // check we're above the minimum FL to activate chosen + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState, NewGameState, true); + if(RegionalAI.LocalForceLevel >= class'X2StrategyElement_DefaultAlienActivities'.default.CHOSEN_ACTIVATE_AT_FL) + { + // loop over each chosen + foreach AllChosen (ChosenState) + { + // Only activate chosen that aren't already active + if (!ChosenState.bMetXCom) + { + + if(!ALienHQ.bChosenActive) //mark chosen as active on HQ if they weren't active yet. + { + AlienHQ = XComGameState_HeadquartersAlien(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersAlien', AlienHQ.ObjectID)); + AlienHQ.OnChosenActivation(NewGameState); + } + + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + ChosenState.Strengths.length = 0; + ChosenState.NumEncounters++; + + // Activate this chosen if they aren't active yet + ChosenState.bMetXCom = true; + + for (i = ChosenState.Weaknesses.length - 1; i >= 0; i--) + { + if (ChosenState.Weaknesses[i] != 'ChosenSkirmisherAdversary' && + ChosenState.Weaknesses[i] != 'ChosenTemplarAdversary' && + ChosenState.Weaknesses[i] != 'ChosenReaperAdversary') + { + ChosenState.Weaknesses.Remove(i,1); + } + } + + } + //patch the chosen level if needed + class'X2StrategyElement_DefaultAlienActivities'.static.TryIncreasingChosenLevelWithGameState(RegionalAI.LocalForceLevel, NewGameState, ChosenState); + } + // only do the outer loop once since only one region is needed + break; + } + } + } + + `XCOMGAME.GameRuleset.SubmitGameState(NewGameState); //make sure that critical narrative moments are active foreach History.IterateByClassType(class'XComGameState_Objective', ObjectiveState) @@ -233,6 +463,95 @@ static event OnLoadedSavedGameToStrategy() CleanupObsoleteTacticalGamestate(); CacheInfiltration_Static(); + //PatchTemplarShieldsIfNeeded(); + RespecTemplarsIfNeeded(); +} + +static function RespecTemplarsIfNeeded() +{ + local XComGameState_HeadquartersXCom XComHQ; + local StateObjectReference CrewReference; + local XComGameState_Unit UnitState; + + XComHQ = `XCOMHQ; + + if(default.bDisableRespeccingTemplars) + { + return; + } + + `LWTrace("Respeccing Templars if needed"); + foreach XComHQ.Crew (CrewReference) + { + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(CrewReference.ObjectID)); + //`LWTrace("UnitState:" @UnitState); + if(UnitState != none) + { + //`LWTrace("Unit Class:" @UnitState.GetSoldierClassTemplate().DataName); + if(UnitState.GetSoldierClassTemplate().DataName == 'Templar') + { + `LWTrace("Templar Status: " @ UnitState.GetStatus()); + // Covert Action status used for infiltrating units. + if(UnitState.GetStatus() == eStatus_CovertAction) + { + continue; + } + + //Account for Kiruka's overhaul + //if(class'Helpers_LW'.default.bKirukaFactionOverhaulActive && !class'Helpers_LW'.default.bNewTemplarModJamActive) + //{ + // `LWTrace("Kiruka overhaul found, aborting respec"); + // return; + //} + + `LWTrace("Templar abilities at squaddie pos 0:" @UnitState.AbilityTree[0].Abilities[0].AbilityName); + `LWTrace("Templar abilities at squaddie pos 1:" @UnitState.AbilityTree[0].Abilities[1].AbilityName); + `LWTrace("Templar abilities at squaddie pos 2:" @UnitState.AbilityTree[0].Abilities[2].AbilityName); + `LWTrace("Templar abilities at squaddie pos 3:" @UnitState.AbilityTree[0].Abilities[3].AbilityName); + `LWTrace("Templar abilities at squaddie pos 4:" @UnitState.AbilityTree[0].Abilities[4].AbilityName); + if(UnitState.AbilityTree[0].Abilities.Find('AbilityName','IRI_TemplarShield') == INDEX_NONE) + { + `LWTrace("New Templar Shield not found on the unit, respeccing."); + RespecSoldier(UnitState, true); + } + } + } + } +} + + +static function PatchTemplarShieldsIfNeeded() +{ + local X2SoldierClassTemplateManager ClassMGR; + local array DifficultyVariants; + local X2DataTemplate DifficultyVariant; + local X2SoldierClassTemplate TemplarTemplate; + local SoldierClassWeaponType SoldierWeaponType; + + `LWTrace("Patching Templar Class Template if needed"); + if(class'Helpers_LW'.default.bKirukaFactionOverhaulActive && !class'Helpers_LW'.default.bNewTemplarModJamActive) + { + `LWTrace("Kiruka overhaul found, adding shields back to Templar"); + + ClassMGR = class'X2SoldierClassTemplateManager'.static.GetSoldierClassTemplateManager(); + ClassMGR.FindDataTemplateAllDifficulties('Templar', DifficultyVariants); + foreach DifficultyVariants (DifficultyVariant) + { + TemplarTemplate = X2SoldierClassTemplate(DifficultyVariant); + `LWTrace("Templar Template Found:" @TemplarTemplate); + + if(TemplarTemplate != none) + { + TemplarTemplate.bNoSecondaryWeapon=false; + + SoldierWeaponType.WeaponType = 'templarshield'; + SoldierWeaponType.SlotType = eInvSlot_SecondaryWeapon; + + TemplarTemplate.AllowedWeapons.AddItem(SoldierWeaponType); + } + } + } + return; } // Make sure we're not overriding classes already overridden by another @@ -603,6 +922,7 @@ static event OnPreMission(XComGameState StartGameState, XComGameState_MissionSit local XComGameState_PointOfInterest POIState; local XComGameState_HeadquartersAlien AlienHQ; local XComGameState_MissionCalendar CalendarState; + local name TacticalTag; History = `XCOMHISTORY; @@ -633,6 +953,16 @@ static event OnPreMission(XComGameState StartGameState, XComGameState_MissionSit `LWTRACE("PreMission : MissionPOI name = " $ POIState.GetMyTemplateName()); } + foreach MissionState.TacticalGameplayTags (TacticalTag) + { + `LWTrace("Tactical Tag on mission:" @TacticalTag); + } + + foreach `XCOMHQ.TacticalGameplayTags (TacticalTag) + { + `LWTrace("Tactical Tag on HQ:" @TacticalTag); + } + AlienHQ = XComGameState_HeadquartersAlien(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); CalendarState = XComGameState_MissionCalendar(History.GetSingleGameStateObjectForClass(class'XComGameState_MissionCalendar')); //log some info relating to the AH POI 2 replacement conditions to see what might be causing it to not spawn @@ -699,17 +1029,20 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S local XComGameStateHistory History; local XComGameState_BattleData BattleData; local name CharacterTemplateName, FirstFollowerName; - local int idx, Tries, PodSize, k; + local int idx, Tries, PodSize, k, numAttempts; local X2CharacterTemplateManager TemplateManager; local X2CharacterTemplate LeaderCharacterTemplate, FollowerCharacterTemplate, CurrentCharacterTemplate; - local bool Swap, Satisfactory; + local bool Swap, Satisfactory, bKeepTrying; local XComGameState_MissionSite MissionState; local XComGameState_AIReinforcementSpawner RNFSpawnerState; local XComGameState_HeadquartersXCom XCOMHQ; local array LeaderSpawnList; local array FollowerSpawnList; + local array GoodUnits; + local array BadUnits; - `LWTRACE("Parsing Encounter : " $ EncounterName); + + `LWDiversityTrace("Parsing Encounter : " $ EncounterName); History = `XCOMHISTORY; MissionState = XComGameState_MissionSite(SourceObject); @@ -718,7 +1051,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S BattleData = XComGameState_BattleData(History.GetSingleGameStateObjectForClass(class'XComGameState_BattleData', true)); if (BattleData == none) { - `LWTRACE("Could not detect mission type. Aborting with no mission variations applied."); + `LWDiversityTrace("Could not detect mission type. Aborting with no mission variations applied."); return; } else @@ -727,19 +1060,26 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S } } + // filter out dummy missions used by squad select infiltration calcs + if(MissionState.Source == 'LWInfilListDummyMission') + { + `LWDiversityTrace("Dummy mission for squad select detected, aborting"); + return; + } + // Ignore the final and any DLC missions - `LWTRACE("Mission type = " $ MissionState.GeneratedMission.Mission.sType $ " detected."); + `LWDiversityTrace("Mission type = " $ MissionState.GeneratedMission.Mission.sType $ " detected."); switch(MissionState.GeneratedMission.Mission.sType) { case "GP_Fortress": case "GP_Fortress_LW": - `LWTRACE("Fortress mission detected. Aborting with no mission variations applied."); + `LWDiversityTrace("Fortress mission detected. Aborting with no mission variations applied."); return; case "AlienNest": case "LastGift": case "LastGiftB": case "LastGiftC": - `LWTRACE("DLC mission detected. Aborting with no mission variations applied."); + `LWDiversityTrace("DLC mission detected. Aborting with no mission variations applied."); return; default: break; @@ -750,7 +1090,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S // checked] if (Left(string(EncounterName), 11) == "GP_Fortress") { - `LWTRACE("Fortress mission detected. Aborting with no mission variations applied."); + `LWDiversityTrace("Fortress mission detected. Aborting with no mission variations applied."); return; } @@ -770,9 +1110,17 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S return; } + if(class'Helpers_LW'.default.bDABFLActive) + { + `LWDiversityTrace("DABFL Detected, aborting."); + return; + } + // Get the corresponding spawn distribution lists for this mission. - GetLeaderSpawnDistributionList(EncounterName, MissionState, ForceLevel, LeaderSpawnList); - GetFollowerSpawnDistributionList(EncounterName, MissionState, ForceLevel, FollowerSpawnList); + `LWDiversityTrace("Getting Leader Spawn Distribution List: "); + GetLeaderSpawnDistributionList(EncounterName, MissionState, ForceLevel, LeaderSpawnList, GoodUnits, BadUnits); + `LWDiversityTrace("Getting Follower Spawn Distribution List: "); + GetFollowerSpawnDistributionList(EncounterName, MissionState, ForceLevel, FollowerSpawnList, GoodUnits, Badunits); //`LWTRACE("PE1"); RNFSpawnerState = XComGameState_AIReinforcementSpawner(SourceObject); @@ -780,24 +1128,27 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S // `LWTRACE ("PE2"); if (RNFSpawnerState != none) { - `LWTRACE("Called from AIReinforcementSpawner.OnReinforcementSpawnerCreated -- modifying reinforcement spawninfo"); + `LWDiversityTrace("Called from AIReinforcementSpawner.OnReinforcementSpawnerCreated -- modifying reinforcement spawninfo"); } else { if (MissionState != none) { - `LWTRACE("Called from MissionSite.CacheSelectedMissionData -- modifying preplaced spawninfo"); + `LWDiversityTrace("Called from MissionSite.CacheSelectedMissionData -- modifying preplaced spawninfo"); } } //`LWTRACE ("PE3"); - `LWTRACE("Encounter composition:"); + `LWDiversityTrace("Encounter composition:"); foreach SpawnInfo.SelectedCharacterTemplateNames(CharacterTemplateName, idx) { - `LWTRACE("Character[" $ idx $ "] = " $ CharacterTemplateName); + `LWDiversityTrace("Character[" $ idx $ "] = " $ CharacterTemplateName); } + XCOMHQ = XComGameState_HeadquartersXCom(`XCOMHistory.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom', true)); + + PodSize = SpawnInfo.SelectedCharacterTemplateNames.length; TemplateManager = class'X2CharacterTemplateManager'.static.GetCharacterTemplateManager(); @@ -805,15 +1156,22 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S swap = false; + // Tedster - none check leader Character template + if(LeaderCharacterTemplate == none) + { + `LWDiversityTrace("Nonexistant Pod Leader found."); + swap = true; + SpawnInfo.SelectedCharacterTemplateNames[0] = SelectNewPodLeader(SpawnInfo, ForceLevel, LeaderSpawnList); + `LWDiversityTrace("Swapping Nonexistant leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0] @ "and rerolling followers"); + } // override native insisting every mission have a codex while certain tactical options are active - XCOMHQ = XComGameState_HeadquartersXCom(`XCOMHistory.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom', true)); // Swap out forced Codices on regular encounters if (SpawnInfo.SelectedCharacterTemplateNames[0] == 'Cyberus' && InStr (EncounterName,"PROTECTED") == -1 && EncounterName != 'LoneCodex') { swap = true; SpawnInfo.SelectedCharacterTemplateNames[0] = SelectNewPodLeader(SpawnInfo, ForceLevel, LeaderSpawnList); - `LWTRACE ("Swapping Codex leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); + `LWDiversityTrace("Swapping Codex leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); } // forces special conditions for avatar to pop @@ -830,7 +1188,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S default: swap = true; SpawnInfo.SelectedCharacterTemplateNames[0] = SelectNewPodLeader(SpawnInfo, ForceLevel, LeaderSpawnList); - `LWTRACE ("Swapping Avatar leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); + `LWDiversityTrace("Swapping Avatar leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); break; } } @@ -845,7 +1203,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S XCOMHQ.GetObjectiveStatus('T1_M2_S3_SKULLJACKCaptain') == eObjectiveState_InProgress) swap = true; SpawnInfo.SelectedCharacterTemplateNames[0] = SelectNewPodLeader(SpawnInfo, ForceLevel, LeaderSpawnList); - `LWTRACE ("Swapping Reinf Captain leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); + `LWDiversityTrace("Swapping Reinf Captain leader for" @ SpawnInfo.SelectedCharacterTemplateNames[0]); } // Now deal with followers @@ -857,56 +1215,76 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S FirstFollowerName = FindMostCommonMember(SpawnInfo.SelectedCharacterTemplateNames); FollowerCharacterTemplate = TemplateManager.FindCharacterTemplate(FirstFollowerName); - `LWTRACE("Pod Leader:" @ SpawnInfo.SelectedCharacterTemplateNames[0]); - `LWTRACE("Pod Follower:" @ FirstFollowerName); + `LWDiversityTrace("Pod Leader:" @ SpawnInfo.SelectedCharacterTemplateNames[0]); + `LWDiversityTrace("Pod Follower:" @ FirstFollowerName); if (LeaderCharacterTemplate.bIsTurret) return; if (InStr(EncounterName, "LIST_BOSSx") != -1 && InStr(EncounterName, "_LW") == -1) { - `LWTRACE("Don't Edit certain vanilla Boss pods"); + `LWDiversityTrace("Don't Edit certain vanilla Boss pods"); return; } if (Instr(EncounterName, "Chryssalids") != -1) { - `LWTRACE("Don't edit Chryssypods"); + `LWDiversityTrace("Don't edit Chryssypods"); return; } // Handle vanilla pod construction of one type of alien follower; if (!swap && LeaderCharacterTemplate.bIsAlien && FollowerCharacterTemplate.bIsAlien && CountMembers(FirstFollowerName, SpawnInfo.SelectedCharacterTemplateNames) > 1) { - `LWTRACE("Mixing up alien-dominant pod"); + `LWDiversityTrace("Mixing up alien-dominant pod"); swap = true; } // Check for pod members that shouldn't appear yet for plot reaons if (CountMembers('Cyberus', SpawnInfo.SelectedCharacterTemplateNames) >= 1 && XCOMHQ.GetObjectiveStatus('T1_M2_S3_SKULLJACKCaptain') != eObjectiveState_Completed) { - `LWTRACE("Removing Codex for objective reasons"); + `LWDiversityTrace("Removing Codex for objective reasons"); swap = true; } if (CountMembers ('AdvPsiWitch', SpawnInfo.SelectedCharacterTemplateNames) >= 1 && XCOMHQ.GetObjectiveStatus('T1_M5_SKULLJACKCodex') != eObjectiveState_Completed) { - `LWTRACE("Exicising Avatar for objective reasons"); + `LWDiversityTrace("Exicising Avatar for objective reasons"); swap = true; } if (!swap) { - for (k = 0; k < SpawnInfo.SelectedCharacterTemplateNames.Length; k++) + for (k = 1; k < SpawnInfo.SelectedCharacterTemplateNames.Length; k++) { FollowerCharacterTemplate = TemplateManager.FindCharacterTemplate(SpawnInfo.SelectedCharacterTemplateNames[k]); - if (CountMembers(SpawnInfo.SelectedCharacterTemplateNames[k], SpawnInfo.SelectedCharacterTemplateNames) > FollowerCharacterTemplate.default.MaxCharactersPerGroup) + // Tedster - add none check for follower templates + if(FollowerCharacterTemplate == none) + { + `LWDiversityTrace("Detected nonexistant follower" @ SpawnInfo.SelectedCharacterTemplateNames[k]); + swap = true; + } + // Tedster - add check for plot gating here: + if(XCOMHQ.MeetsObjectiveRequirements(FollowerCharacterTemplate.SpawnRequirements.RequiredObjectives) == false) + { + // reroll the unit instead of shuffling all pods to allow codex to to be added to pods as defined followers. + SpawnInfo.SelectedCharacterTemplateNames[k] = SelectRandomPodFollower_Improved(SpawnInfo, LeaderCharacterTemplate.SupportedFollowers, ForceLevel, FollowerSpawnList); + } + if(default.bNerfFrostLegion && (InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "FROST")!= INDEX_NONE || InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "CRYO")!= INDEX_NONE) && MissionState.TacticalGameplayTags.Find('SITREP_FrostPurge') == INDEX_NONE) + { + `LWDiversityTrace("Found Frost Legion in Encounter"); + swap = true; + } + + // Tedster - fix below check to check spawn entry and not character template MCPG setting. + if (CountMembers(SpawnInfo.SelectedCharacterTemplateNames[k], SpawnInfo.SelectedCharacterTemplateNames) > GetCharacterSpawnEntry(FollowerSpawnList, FollowerCharacterTemplate, ForceLevel).MaxCharactersPerGroup) { + `LWDiversityTrace("Too many" @SpawnInfo.SelectedCharacterTemplateNames[k]); swap = true; } } if (swap) { - `LWTRACE("Mixing up pod that violates MCPG setting"); + `LWDiversityTrace("Mixing up pod that violates MCPG setting or contains nonexistant units."); } } @@ -915,7 +1293,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S { if (CountMembers(FirstFollowerName, SpawnInfo.SelectedCharacterTemplateNames) >= PodSize - 1) { - `LWTRACE ("Mixing up undiverse 4/5-enemy pod"); + `LWDiversityTrace("Mixing up undiverse 4/5-enemy pod"); swap = true; } } @@ -926,7 +1304,7 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S // if a max of one guy is different if (!swap && CountMembers(FirstFollowerName, SpawnInfo.SelectedCharacterTemplateNames) >= PodSize - 2) { - `LWTRACE ("Mixing up undiverse 5+ enemy pod"); + `LWDiversityTrace("Mixing up undiverse 5+ enemy pod"); swap = true; } } @@ -941,17 +1319,49 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S // let's look at foreach SpawnInfo.SelectedCharacterTemplateNames(CharacterTemplateName, idx) { - if (idx <= 2) + CurrentCharacterTemplate = TemplateManager.FindCharacterTemplate(SpawnInfo.SelectedCharacterTemplateNames[idx]); + //`LWTrace("Looking at" @CurrentCharacterTemplate.DataName); + //Tedster - add none check here as well: + if(CurrentCharacterTemplate == none) + { + `LWDiversityTrace("Rerolling nonexistant Character Template."); + SpawnInfo.SelectedCharacterTemplateNames[idx] = SelectRandomPodFollower_Improved(SpawnInfo, LeaderCharacterTemplate.SupportedFollowers, ForceLevel, FollowerSpawnList); + } + + if (idx <= 1) // Tedster - fix off by one error 2 -> 1 continue; if (SpawnInfo.SelectedCharacterTemplateNames[idx] != FirstFollowerName) continue; - CurrentCharacterTemplate = TemplateManager.FindCharacterTemplate(SpawnInfo.SelectedCharacterTemplateNames[idx]); if (CurrentCharacterTemplate.bIsTurret) continue; - SpawnInfo.SelectedCharacterTemplateNames[idx] = SelectRandomPodFollower(SpawnInfo, LeaderCharacterTemplate.SupportedFollowers, ForceLevel, FollowerSpawnList); + SpawnInfo.SelectedCharacterTemplateNames[idx] = SelectRandomPodFollower_Improved(SpawnInfo, LeaderCharacterTemplate.SupportedFollowers, ForceLevel, FollowerSpawnList); + + if(default.bNerfFrostLegion && (InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "FROST")!= INDEX_NONE || InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "CRYO")!= INDEX_NONE)) + { + // 75% chance to reroll frost legion + if(`SYNC_FRAND_STATIC < 0.8) + { + numAttempts = 0; + while (numAttempts < 12 && bKeepTrying) + { + SpawnInfo.SelectedCharacterTemplateNames[idx] = SelectRandomPodFollower_Improved(SpawnInfo, LeaderCharacterTemplate.SupportedFollowers, ForceLevel, FollowerSpawnList); + + if((InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "FROST")!= INDEX_NONE || InStr(caps(SpawnInfo.SelectedCharacterTemplateNames[k]), "CRYO")!= INDEX_NONE)) + { + numAttempts+= 1; + } + else + { + bKeeptrying = false; + } + } + } + + } + //`LWTrace("Changed to" @SpawnInfo.SelectedCharacterTemplateNames[idx] ); } //`LWTRACE ("Try" @ string (tries) @ CountMembers (FirstFollowerName, SpawnInfo.SelectedCharacterTemplateNames) @ string (PodSize)); // Let's look over our outcome and see if it's any better @@ -971,10 +1381,10 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S } } } - `LWTRACE("Attempted to edit Encounter to add more enemy diversity! Satisfactory:" @ string(satisfactory) @ "New encounter composition:"); + `LWDiversityTrace("Attempted to edit Encounter to add more enemy diversity! Satisfactory:" @ string(satisfactory) @ "New encounter composition:"); foreach SpawnInfo.SelectedCharacterTemplateNames (CharacterTemplateName, idx) { - `LWTRACE("Character[" $ idx $ "] = " $ CharacterTemplateName); + `LWDiversityTrace("Character[" $ idx $ "] = " $ CharacterTemplateName); } } } @@ -982,14 +1392,14 @@ static function PostEncounterCreation(out name EncounterName, out PodSpawnInfo S return; } -static function GetLeaderSpawnDistributionList(name EncounterName, XComGameState_MissionSite MissionState, int ForceLevel, out array SpawnList) +static function GetLeaderSpawnDistributionList(name EncounterName, XComGameState_MissionSite MissionState, int ForceLevel, out array SpawnList,out array GoodUnits, out array BadUnits ) { - GetSpawnDistributionList(EncounterName, MissionState, ForceLevel, SpawnList, true); + GetSpawnDistributionList(EncounterName, MissionState, ForceLevel, SpawnList, true, GoodUnits, BadUnits); } -static function GetFollowerSpawnDistributionList(name EncounterName, XComGameState_MissionSite MissionState, int ForceLevel, out array SpawnList) +static function GetFollowerSpawnDistributionList(name EncounterName, XComGameState_MissionSite MissionState, int ForceLevel, out array SpawnList, out array GoodUnits, out array BadUnits) { - GetSpawnDistributionList(EncounterName, MissionState, ForceLevel, SpawnList, false); + GetSpawnDistributionList(EncounterName, MissionState, ForceLevel, SpawnList, false, GoodUnits, BadUnits); } static function GetSpawnDistributionList( @@ -997,26 +1407,39 @@ static function GetSpawnDistributionList( XComGameState_MissionSite MissionState, int ForceLevel, out array SpawnList, - bool IsLeaderList) + bool IsLeaderList, + out array GoodUnits, + out array BadUnits) { local SpawnDistributionList CurrentList; local SpawnDistributionListEntry CurrentListEntry; + local XComTacticalMissionManager MissionManager; local name SpawnListID; local int idx; + local XComGameState_HeadquartersXCom XComHQ; + local X2CharacterTemplateManager TemplateManager; + local X2CharacterTemplate CharacterTemplate; + + + TemplateManager = class'X2CharacterTemplateManager'.static.GetCharacterTemplateManager(); + + XComHQ = XComGameState_HeadquartersXCom(`XCOMHistory.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom', true)); - idx = class'XComTacticalMissionManager'.default.ConfigurableEncounters.Find('EncounterID', EncounterName); + MissionManager = `TACTICALMISSIONMGR; + + idx = MissionManager.ConfigurableEncounters.Find('EncounterID', EncounterName); if (IsLeaderList) { - if (class'XComTacticalMissionManager'.default.ConfigurableEncounters[idx].EncounterLeaderSpawnList != '') + if (MissionManager.ConfigurableEncounters[idx].EncounterLeaderSpawnList != '') { - SpawnListID = class'XComTacticalMissionManager'.default.ConfigurableEncounters[idx].EncounterLeaderSpawnList; + SpawnListID = MissionManager.ConfigurableEncounters[idx].EncounterLeaderSpawnList; } } else { - if (class'XComTacticalMissionManager'.default.ConfigurableEncounters[idx].EncounterFollowerSpawnList != '') + if (MissionManager.ConfigurableEncounters[idx].EncounterFollowerSpawnList != '') { - SpawnListID = class'XComTacticalMissionManager'.default.ConfigurableEncounters[idx].EncounterFollowerSpawnList; + SpawnListID = MissionManager.ConfigurableEncounters[idx].EncounterFollowerSpawnList; } } @@ -1025,31 +1448,62 @@ static function GetSpawnDistributionList( // Fall back to using the schedule's default spawn distribution list if (SpawnListID == '') { - idx = class'XComTacticalMissionManager'.default.MissionSchedules.Find('ScheduleID', MissionState.SelectedMissionData.SelectedMissionScheduleName); + idx = MissionManager.MissionSchedules.Find('ScheduleID', MissionState.SelectedMissionData.SelectedMissionScheduleName); if (IsLeaderList) { - SpawnListID = class'XComTacticalMissionManager'.default.MissionSchedules[idx].DefaultEncounterLeaderSpawnList; + SpawnListID = MissionManager.default.MissionSchedules[idx].DefaultEncounterLeaderSpawnList; } else { - SpawnListID = class'XComTacticalMissionManager'.default.MissionSchedules[idx].DefaultEncounterFollowerSpawnList; + SpawnListID = MissionManager.MissionSchedules[idx].DefaultEncounterFollowerSpawnList; } } - `LWTrace("Using spawn distribution list " $ SpawnListID); + `LWDiversityTrace("Using spawn distribution list " $ SpawnListID); // Build a merged list of all spawn distribution list entries that satisfy the selected // list ID and force level. - foreach class'XComTacticalMissionManager'.default.SpawnDistributionLists(CurrentList) + foreach MissionManager.SpawnDistributionLists(CurrentList) { if (CurrentList.ListID == SpawnListID) { foreach CurrentList.SpawnDistribution(CurrentListEntry) { - if (ForceLevel >= CurrentListEntry.MinForceLevel && ForceLevel <= CurrentListEntry.MaxForceLevel) + + if (ForceLevel >= CurrentListEntry.MinForceLevel && ForceLevel <= CurrentListEntry.MaxForceLevel) { - `LWTrace("Adding " $ CurrentListEntry.Template $ " to the merged spawn distribution list with spawn weight " $ CurrentListEntry.SpawnWeight); - SpawnList.AddItem(CurrentListEntry); + + if(GoodUnits.Find(CurrentListEntry.Template) == INDEX_NONE) + { + if(BadUnits.Find(CurrentListEntry.Template) == INDEX_NONE) + { + CharacterTemplate = TemplateManager.FindCharacterTemplate(CurrentListEntry.Template); + + if(CharacterTemplate != none) + { + + if(XComHQ.MeetsObjectiveRequirements(CharacterTemplate.SpawnRequirements.RequiredObjectives) == true) + { + `LWDiversityTrace("Adding " $ CurrentListEntry.Template $ " to the merged spawn distribution list with spawn weight " $ CurrentListEntry.SpawnWeight); + SpawnList.AddItem(CurrentListEntry); + GoodUnits.AddItem(CurrentListEntry.Template); + } + else + { + BadUnits.AddItem(CurrentListEntry.Template); + } + } + else + { + BadUnits.AddItem(CurrentListEntry.Template); + } + } + } + else + { + `LWDiversityTrace("Adding " $ CurrentListEntry.Template $ " to the merged spawn distribution list with spawn weight " $ CurrentListEntry.SpawnWeight); + SpawnList.AddItem(CurrentListEntry); + } } } } @@ -1155,6 +1609,11 @@ static function name SelectNewPodLeader(PodSpawnInfo SpawnInfo, int ForceLevel, if (CharacterTemplate.DataName == 'AdvPsiWitchM3' && XCOMHQ.GetObjectiveStatus ('T1_M5_SKULLJACKCodex') != eObjectiveState_Completed) continue; + if(XCOMHQ.MeetsObjectiveRequirements(CharacterTemplate.SpawnRequirements.RequiredObjectives) == false) + { + continue; + } + TestWeight = GetCharacterSpawnWeight(SpawnList, CharacterTemplate, ForceLevel); // this is a valid character type, so store off data for later random selection if (TestWeight > 0.0) @@ -1253,57 +1712,188 @@ static function name SelectRandomPodFollower(PodSpawnInfo SpawnInfo, array return PossibleChars[PossibleChars.length - 1]; } -static function PostReinforcementCreation(out name EncounterName, out PodSpawnInfo Encounter, int ForceLevel, int AlertLevel, optional XComGameState_BaseObject SourceObject, optional XComGameState_BaseObject ReinforcementState) -{ -} - -// Increase the size of Lost Brutes (unless WWL is installed) -static function UpdateAnimations(out array CustomAnimSets, XComGameState_Unit UnitState, XComUnitPawn Pawn) +// improved version that doesn't have nested loops +static final function name SelectRandomPodFollower_Improved(PodSpawnInfo SpawnInfo, array SupportedFollowers, int ForceLevel, out array SpawnList) { - if (Left(UnitState.GetMyTemplateName(), Len("TheLostBrute")) != "TheLostBrute") - return; - - // No need to scale the Brute's pawn size if World War Lost is installed - // because we'll be using its dedicated Brute model. - if (class'Helpers_LW'.default.bWorldWarLostActive) - return; - - Pawn.Mesh.SetScale(default.BRUTE_SIZE_MULTIPLIER); -} +// local X2CharacterTemplateManager CharacterTemplateMgr; +// local X2CharacterTemplate CharacterTemplate; + local SpawnDistributionListEntry SpawnEntry; + local array PossibleChars; + local array PossibleWeights; + local float TotalWeight, TestWeight, RandomWeight; + local int k; + local XComGameState_HeadquartersXCom XCOMHQ; -// Use SLG hook to add infiltration modifiers to alien units -static function FinalizeUnitAbilitiesForInit(XComGameState_Unit UnitState, out array SetupData, optional XComGameState StartState, optional XComGameState_Player PlayerState, optional bool bMultiplayerDisplay) -{ - local X2AbilityTemplate AbilityTemplate; - local X2AbilityTemplateManager AbilityTemplateMan; - local name AbilityName; - local AbilitySetupData Data, EmptyData; - local X2CharacterTemplate CharTemplate; - local int i; + local bool bCodexObjective, bAvatarObjective; - if (`XENGINE.IsMultiplayerGame()) { return; } + `LWDiversityTrace("SelectRandomPodFollower_Improved called with the following FL" @Forcelevel); + `LWDiversityTrace("SpawnList Length:" @SpawnList.Length); + `LWDiversityTrace("Supported Followers Length:" @SupportedFollowers.Length); + // setup + PossibleChars.Length = 0; +// CharacterTemplateMgr = class'X2CharacterTemplateManager'.static.GetCharacterTemplateManager(); + XCOMHQ = XComGameState_HeadquartersXCom(`XCOMHistory.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom', true)); - CharTemplate = UnitState.GetMyTemplate(); - if (CharTemplate == none) - return; + bCodexObjective = (XCOMHQ.GetObjectiveStatus('T1_M2_S3_SKULLJACKCaptain') != eObjectiveState_Completed); + bAvatarObjective = (XCOMHQ.GetObjectiveStatus ('T1_M5_SKULLJACKCodex') != eObjectiveState_Completed); + `LWDiversityTrace("Passed Codex/Avatar Objective"); - AbilityTemplateMan = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); - if (ShouldApplyInfiltrationModifierToCharacter(CharTemplate)) + foreach SpawnList(SpawnEntry) { - AbilityName = 'InfiltrationTacticalModifier_LW'; - if (SetupData.Find('TemplateName', AbilityName) == -1) + // if entry doesn't have a unit + if(SpawnEntry.Template == '') { - AbilityTemplate = AbilityTemplateMan.FindAbilityTemplate(AbilityName); + continue; + } - if(AbilityTemplate != none) - { - Data = EmptyData; - Data.TemplateName = AbilityName; - Data.Template = AbilityTemplate; - SetupData.AddItem(Data); // return array -- we don't have to worry about additional abilities for this simple ability - } + /* + This has been moved to the code that compiles the spawn distribution list instead. + // short circuit if unit template doesn't exist. + CharacterTemplate = CharacterTemplateMgr.FindCharacterTemplate(SpawnEntry.Template); + if(CharacterTemplate == none) + { + continue; } - } + */ + + // if entry out of force level range. + if (ForceLevel < SpawnEntry.MinForceLevel && ForceLevel > SpawnEntry.MaxForceLevel) + { + continue; + } + + // if entry not in unit's supported follower list + if (SupportedFollowers.Find(SpawnEntry.Template) == -1) + { + continue; + } + + // don't let cyberuses in yet + if (SpawnEntry.Template == 'Cyberus' && bCodexObjective) + continue; + + // don't let Avatars in yet + if (SpawnEntry.Template == 'AdvPsiWitchM3' && bAvatarObjective) + continue; + + + // if too many of the unit already exist + if (CountMembers(SpawnEntry.Template, SpawnInfo.SelectedCharacterTemplateNames) >= SpawnEntry.MaxCharactersPerGroup) + { + continue; + } + + TestWeight = SpawnEntry.SpawnWeight; + if (TestWeight > 0.0) + { + // this is a valid character type, so store off data for later random selection + PossibleChars.AddItem (SpawnEntry.Template); + PossibleWeights.AddItem (TestWeight); + TotalWeight += TestWeight; + `LWDiversityTrace("Unit" @SpawnEntry.Template @"Added to follower selection list"); + } + } + + //failsafe + if (PossibleChars.length == 0) + { + `LWDiversityTrace("Select new Follower Failed, returning M1 Trooper"); + return 'AdvTrooperM1'; + } + + // roll a unit + RandomWeight = `SYNC_FRAND_STATIC() * TotalWeight; + TestWeight = 0.0; + for (k = 0; k < PossibleChars.length; k++) + { + TestWeight += PossibleWeights[k]; + if (RandomWeight < TestWeight) + { + return PossibleChars[k]; + } + } + return PossibleChars[PossibleChars.length - 1]; +} + + +static function PostReinforcementCreation(out name EncounterName, out PodSpawnInfo Encounter, int ForceLevel, int AlertLevel, optional XComGameState_BaseObject SourceObject, optional XComGameState_BaseObject ReinforcementState) +{ + // M5 chosen handling: + `LWTrace("PostReinforcementCreation called. Current Force Level:" @ ForceLevel); + + if (class'X2StrategyElement_DefaultAlienActivities'.default.CHOSEN_LEVEL_FL_THRESHOLDS.length < 4) + return; + + if (ForceLevel >= class'X2StrategyElement_DefaultAlienActivities'.default.CHOSEN_LEVEL_FL_THRESHOLDS[3]) + { + `LWTrace("Swapping M4 Chosen" @Encounter.SelectedCharacterTemplateNames[0] @"..."); //PREVIOUS CHOSEN FOR LOGGING + + switch (Encounter.SelectedCharacterTemplateNames[0]) + { + case 'ChosenWarlockM4' : Encounter.SelectedCharacterTemplateNames[0] = 'ChosenWarlockM5'; break; + case 'ChosenSniperM4' : Encounter.SelectedCharacterTemplateNames[0] = 'ChosenSniperM5'; break; + case 'ChosenAssassinM4' : Encounter.SelectedCharacterTemplateNames[0] = 'ChosenAssassinM5'; break; + default: + //selected template isn't one we care about + break; + } + + `LWTrace("... for M5 Chosen" @Encounter.SelectedCharacterTemplateNames[0]); //POST SWAP FOR LOGGING + + return; + } + + PostEncounterCreation(EncounterName, Encounter, ForceLevel, AlertLevel, SourceObject); +} + +// Increase the size of Lost Brutes (unless WWL is installed) +static function UpdateAnimations(out array CustomAnimSets, XComGameState_Unit UnitState, XComUnitPawn Pawn) +{ + if (Left(UnitState.GetMyTemplateName(), Len("TheLostBrute")) != "TheLostBrute") + return; + + // No need to scale the Brute's pawn size if World War Lost is installed + // because we'll be using its dedicated Brute model. + if (class'Helpers_LW'.default.bWorldWarLostActive) + return; + + Pawn.Mesh.SetScale(default.BRUTE_SIZE_MULTIPLIER); +} + +// Use SLG hook to add infiltration modifiers to alien units +static function FinalizeUnitAbilitiesForInit(XComGameState_Unit UnitState, out array SetupData, optional XComGameState StartState, optional XComGameState_Player PlayerState, optional bool bMultiplayerDisplay) +{ + local X2AbilityTemplate AbilityTemplate; + local X2AbilityTemplateManager AbilityTemplateMan; + local name AbilityName; + local AbilitySetupData Data, EmptyData; + local X2CharacterTemplate CharTemplate; + local int i; + local int index; + + if (`XENGINE.IsMultiplayerGame()) { return; } + + CharTemplate = UnitState.GetMyTemplate(); + if (CharTemplate == none) + return; + + AbilityTemplateMan = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); + if (ShouldApplyInfiltrationModifierToCharacter(CharTemplate)) + { + AbilityName = 'InfiltrationTacticalModifier_LW'; + if (SetupData.Find('TemplateName', AbilityName) == -1) + { + AbilityTemplate = AbilityTemplateMan.FindAbilityTemplate(AbilityName); + + if(AbilityTemplate != none) + { + Data = EmptyData; + Data.TemplateName = AbilityName; + Data.Template = AbilityTemplate; + SetupData.AddItem(Data); // return array -- we don't have to worry about additional abilities for this simple ability + } + } + } switch(CharTemplate.DataName) { @@ -1360,7 +1950,7 @@ static function FinalizeUnitAbilitiesForInit(XComGameState_Unit UnitState, out a SetupData[i].SourceWeaponRef = UnitState.GetSecondaryWeapon().GetReference(); } } - + /* // Prevent units summoned by the Chosen from dropping loot and corpses if (StartState.GetContext().IsA(class'XComGameStateContext_Ability'.Name)) { @@ -1395,6 +1985,40 @@ static function FinalizeUnitAbilitiesForInit(XComGameState_Unit UnitState, out a } } } + */ + + if(UnitState.HasItemOfTemplateType('EvacFlare') && SetupData.Find('TemplateName', 'GrantEvacFlare') == -1) + { + AbilityTemplate = AbilityTemplateMan.FindAbilityTemplate('GrantEvacFlare'); + if (AbilityTemplate != none) + { + Data = EmptyData; + Data.TemplateName = 'GrantEvacFlare'; + Data.Template = AbilityTemplate; + SetupData.AddItem(Data); // return array -- we don't have to worry about additional abilities for this simple ability + } + } + + // Swap KnifeEncounters for KnifeEncountersExtendedRange if present. + + if(UnitState.HasAbilityFromAnySource('TheBanisher_LW')) + { + index = SetupData.Find('TemplateName', 'KnifeEncounters'); + if (index != -1) + { + AbilityTemplate = AbilityTemplateMan.FindAbilityTemplate('KnifeEncountersExtendedRange'); + + if(AbilityTemplate != none) + { + Data = EmptyData; + Data.TemplateName = AbilityName; + Data.Template = AbilityTemplate; + Data.SourceWeaponRef = UnitState.GetSecondaryWeapon().GetReference(); + SetupData[index]=(Data); // swap the ability + } + } + } + } static function bool ShouldApplyInfiltrationModifierToCharacter(X2CharacterTemplate CharTemplate) @@ -1412,6 +2036,7 @@ static function bool ShouldApplyInfiltrationModifierToCharacter(X2CharacterTempl static event OnExitPostMissionSequence() { CleanupObsoleteTacticalGamestate(); + RespecTemplarsIfNeeded(); } static function CleanupObsoleteTacticalGamestate() @@ -1513,6 +2138,7 @@ static function AddObjectivesToParcels() { local XComParcelManager ParcelMgr; local PlotDefinition PlotDef; + local WeightedPlotType PlotTypeDef; local int i, j, k; // Go over the plot list and add new objectives to certain plots. @@ -1555,11 +2181,20 @@ static function AddObjectivesToParcels() for (i = 0; i < ParcelMgr.arrPlots.Length; ++i) { PlotDef = ParcelMgr.arrPlots[i]; + + if(default.MapsToDisable.Find(PlotDef.MapName) != INDEX_NONE) + { + `LWTrace("Disabling map" @PlotDef.MapName @"from strategy due to config disable list."); + ParcelMgr.arrPlots[i].ExcludeFromStrategy = true; + continue; + } + if ((InStr(PlotDef.MapName, "_LgObj_") != INDEX_NONE || InStr(PlotDef.MapName, "_vlgObj_") != INDEX_NONE) && PlotDef.ObjectiveTags.Find("LargePlot") == INDEX_NONE) { `LWTrace("Adding 'LargePlot' objective tag to " $ PlotDef.MapName); ParcelMgr.arrPlots[i].ObjectiveTags.AddItem("LargePlot"); + } else if (InStr(PlotDef.MapName, "_MdObj_") != INDEX_NONE && PlotDef.ObjectiveTags.Find("MediumPlot") == INDEX_NONE) { @@ -1576,11 +2211,54 @@ static function AddObjectivesToParcels() // Exclude Sewer maps so that Tunnels don't dominate the map pool quite so hard. if (PlotDef.strType == "Tunnels_Sewer") { - ParcelMgr.arrPlots[i].ExcludeFromStrategy = true; + //Convert them to Subway instead to group them together in one category if the player wants. + if(default.bSewersToSubway) + { + ParcelMgr.arrPlots[i].strType = "Tunnels_Subway"; + `LWTrace("Converting Map" @PlotDef.MapName @"from Sewer to Subway"); + } + else + { + ParcelMgr.arrPlots[i].ExcludeFromStrategy = true; + } + } + + if (!default.bEnableCityHQs) + { + if (PlotDef.strType == "CityCenter" && PlotDef.ObjectiveTags[0] == "AssaultAlienBase_LW") + { + ParcelMgr.arrPlots[i].ExcludeFromStrategy = true; + `LWTrace("Removing Map" @PlotDef.MapName @"from Mission Generation"); + } } } i = 0; + + if(default.bSewersToSubway) + { + PlotTypeDef.strPlotType = "Tunnels_Subway"; + + for(i = 0; i < ParcelMgr.arrAllParcelDefinitions.Length; i++) + { + if(ParcelMgr.arrAllParcelDefinitions[i].arrPlotTypes.Find('strPlotType', "Tunnels_Sewer") != INDEX_NONE && ParcelMgr.arrAllParcelDefinitions[i].arrPlotTypes.Find('strPlotType', "Tunnels_Subway") == INDEX_NONE) + { + ParcelMgr.arrAllParcelDefinitions[i].arrPlotTypes.AddItem(PlotTypeDef); + `LWTrace("Converting Parcel" @ParcelMgr.arrAllParcelDefinitions[i].MapName @"from Sewer to Subway"); + } + } + + i = 0; + + for(i = 0; i < class'XComPlotCoverParcelManager'.default.arrAllPCPDefs.Length; i++) + { + if(class'XComPlotCoverParcelManager'.default.arrAllPCPDefs[i].arrPlotTypes.Find("Tunnels_Sewer") != INDEX_NONE && class'XComPlotCoverParcelManager'.default.arrAllPCPDefs[i].arrPlotTypes.Find("Tunnels_Subway") == INDEX_NONE) + { + class'XComPlotCoverParcelManager'.default.arrAllPCPDefs[i].arrPlotTypes.AddItem("Tunnels_Subway"); + `LWTrace("Converting PCP" @class'XComPlotCoverParcelManager'.default.arrAllPCPDefs[i].MapName @ "from Sewers to Subway"); + } + } + } } } @@ -1704,6 +2382,7 @@ static function MaybeAddChosenToMission(XComGameState StartState, XComGameState_ // Avenger Defense if (default.SKIP_CHOSEN_OVERRIDE_MISSION_TYPES.Find(MissionState.GeneratedMission.Mission.sType) != INDEX_NONE) { + `LWTrace("MaybeAddChosenToMission: Using Vanilla Chosen Behavior"); return; } @@ -1722,12 +2401,12 @@ static function MaybeAddChosenToMission(XComGameState StartState, XComGameState_ if (AlienHQ.bChosenActive) { XComHQ = `XCOMHQ; - AllChosen = AlienHQ.GetAllChosen(, true); + AllChosen = ALienHQ.GetAllChosen(); - foreach AllChosen(ChosenState) + //remove all chosen tags regardless of if chosen are defeated. + forEach AllChosen(ChosenState) { ChosenSpawningTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); - ChosenSpawningTagLWOTC = class'Helpers_LW'.static.GetChosenActiveMissionTag(ChosenState); // Remove All vanilla chosen tags if they are attached to this mission. This is the only // place that should add Chosen tactical mission tags to the XCOM HQ. This @@ -1735,8 +2414,19 @@ static function MaybeAddChosenToMission(XComGameState StartState, XComGameState_ SpawningTags = ChosenState.GetMyTemplate().ChosenProgressionData.SpawningTags; foreach SpawningTags(ChosenSpawningTagRemove) { + `LWTrace("removing Chosen Spawning tag"@ChosenSpawningTagRemove); XComHQ.TacticalGameplayTags.RemoveItem(ChosenSpawningTagRemove); } + } + + // now grab the undefeated chosen + AllChosen = AlienHQ.GetAllChosen(, true); + + foreach AllChosen(ChosenState) + { + ChosenSpawningTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); + ChosenSpawningTagLWOTC = class'Helpers_LW'.static.GetChosenActiveMissionTag(ChosenState); + // Now add the appropriate tactical gameplay tag for this Chosen if the // corresponding LWOTC-specific one is in the mission's tactical tags. @@ -1744,6 +2434,7 @@ static function MaybeAddChosenToMission(XComGameState StartState, XComGameState_ MissionState.TacticalGameplayTags.Find(ChosenSpawningTagLWOTC) != INDEX_NONE) { XComHQ.TacticalGameplayTags.AddItem(ChosenSpawningTag); + `LWTrace("Adding Chosen Spawning Tag" @ChosenSpawningTag); } } } @@ -2224,19 +2915,19 @@ static function AddCritUpgrade(X2ItemTemplateManager ItemTemplateManager, Name T } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); //SMG - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Shotgun - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Shotgun_Optic', "BeamShotgun.Meshes.SM_BeamShotgun_OpticB", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Shotgun_Optic', "BeamShotgun.Meshes.SM_BeamShotgun_OpticB", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Sniper Rifle - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Sniper_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticB", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Sniper_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticB", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Cannon - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Cannon_Optic', "LWCannon_CG.Meshes.LW_CoilCannon_OpticB", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Cannon_Optic', "LWCannon_CG.Meshes.LW_CoilCannon_OpticB", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); } @@ -2252,19 +2943,19 @@ static function AddAimBonusUpgrade(X2ItemTemplateManager ItemTemplateManager, Na } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); //SMG - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Shotgun - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Shotgun_Optic', "BeamShotgun.Meshes.SM_BeamShotgun_OpticC", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Shotgun_Optic', "BeamShotgun.Meshes.SM_BeamShotgun_OpticC", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Sniper Rifle - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Sniper_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticC", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Sniper_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticC", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); // Cannon - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Cannon_Optic', "LWCannon_CG.Meshes.LW_CoilCannon_OpticC", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_Cannon_Optic', "LWCannon_CG.Meshes.LW_CoilCannon_OpticC", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); } @@ -2280,21 +2971,21 @@ static function AddClipSizeBonusUpgrade(X2ItemTemplateManager ItemTemplateManage } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); //SMG - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); // Shotgun - //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagB", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagB", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagB", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagB", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); // Sniper Rifle - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagB", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagB", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); // Cannon - //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagB", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagB", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagB", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagB", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); } @@ -2310,19 +3001,19 @@ static function AddFreeFireBonusUpgrade(X2ItemTemplateManager ItemTemplateManage } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); //SMG - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); // Shotgun - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Shotgun_Stock', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Shotgun_Stock', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); // Sniper - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); // Cannon - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_ReargripB", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_ReargripB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_ReargripB", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_ReargripB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); } @@ -2338,26 +3029,26 @@ static function AddReloadUpgrade(X2ItemTemplateManager ItemTemplateManager, Name } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); //SMG - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); // Shotgun - //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagC", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagC", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagD", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagC", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagC", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Shotgun_Mag', "LWShotgun_CG.Meshes.LW_CoilShotgun_MagD", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); // Sniper - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagC", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagD", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagC", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Sniper_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagD", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); // Cannon - //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagC", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagC", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagD", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + //Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagC", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagC", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_Cannon_Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagD", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); } @@ -2373,19 +3064,19 @@ static function AddMissDamageUpgrade(X2ItemTemplateManager ItemTemplateManager, } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_StockB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_StockB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); //SMG - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_StockB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_StockB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); // Shotgun - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Shotgun_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_StockB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Shotgun_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_StockB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); // Sniper Rifle - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Sniper_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockC", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_StockC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_StockC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Sniper_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockC", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_StockC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_StockC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); // Cannon - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Cannon_Stock', "LWCannon_CG.Meshes.LW_CoilCannon_StockB", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_StockB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_Cannon_Stock', "LWCannon_CG.Meshes.LW_CoilCannon_StockB", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_StockB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); Template.AddUpgradeAttachment('StockSupport', '', "LWCannon_CG.Meshes.LW_CoilCannon_StockSupportB", "", 'Cannon_CG'); } @@ -2402,19 +3093,19 @@ static function AddFreeKillUpgrade(X2ItemTemplateManager ItemTemplateManager, Na } //Parameters are : AttachSocket, UIArmoryCameraPointTag, MeshName, ProjectileName, MatchWeaponTemplate, AttachToPawn, IconName, InventoryIconName, InventoryCategoryIcon, ValidateAttachmentFn // Assault Rifle - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'AssaultRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'AssaultRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); //SMG - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'SMG_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'SMG_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); // Shotgun - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Shotgun_Suppressor', "LWShotgun_CG.Meshes.LW_CoilShotgun_Suppressor", "", 'Shotgun_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilShotgun_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Shotgun_Suppressor', "LWShotgun_CG.Meshes.LW_CoilShotgun_Suppressor", "", 'Shotgun_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilShotgun_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); // Sniper Rifle - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Sniper_Suppressor', "LWSniperRifle_CG.Meshes.LW_CoilSniper_Suppressor", "", 'SniperRifle_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Sniper_Suppressor', "LWSniperRifle_CG.Meshes.LW_CoilSniper_Suppressor", "", 'SniperRifle_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilSniperRifle_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); // Cannon - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Cannon_Suppressor', "LWCannon_CG.Meshes.LW_CoilCannon_Suppressor", "", 'Cannon_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilCannon_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_Cannon_Suppressor', "LWCannon_CG.Meshes.LW_CoilCannon_Suppressor", "", 'Cannon_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilCannon_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); } @@ -2549,6 +3240,7 @@ static function UpdateChosenSabotages() UpdateWeaponLockers(); UpdateLabStorage(); UpdateSecureStorage(); + UpdateEncryptionServer(); } @@ -2574,6 +3266,37 @@ static function UpdateSecureStorage() Template = X2SabotageTemplate(class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager().FindStrategyElementTemplate('Sabotage_SecureStorage')); Template.CanActivateFn = CanActivateSecureStorage; } + +static function UpdateEncryptionServer() +{ + local X2SabotageTemplate Template; + + Template = X2SabotageTemplate(class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager().FindStrategyElementTemplate('Sabotage_EncryptionServer')); + Template.CanActivateFn = CanActivateEncryptionServer; + +} + +function bool CanActivateEncryptionServer() +{ + local XComGameStateHistory History; + local XComGameState_BlackMarket MarketState; + local XComGameState_HeadquartersResistance ResistanceHQ; + + ResistanceHQ = XComGameState_HeadquartersResistance(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersResistance')); + + History = `XCOMHISTORY; + MarketState = XComGameState_BlackMarket(History.GetSingleGameStateObjectForClass(class'XComGameState_BlackMarket')); + + if (ResistanceHQ.NumMonths <= default.ENCRYPTION_SERVER_MONTH) + return false; + + if(`SYNC_RAND_STATIC(100) < default.ENCRYPTION_SERVER_CHANCE) + { + return (MarketState.bIsOpen && MarketState.ForSaleItems.Length > 0); + } + else return false; +} + function bool CanActivateWeaponLockers() { local XComGameStateHistory History; @@ -2585,7 +3308,7 @@ function bool CanActivateWeaponLockers() MinMods = `ScaleStrategyArrayInt(class'X2StrategyElement_DefaultSabotages'.default.MinWeaponLockersMods); - NumUpgrades = 10; + NumUpgrades = 0; History = `XCOMHISTORY; XComHQ = XComGameState_HeadquartersXCom(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom')); @@ -2673,18 +3396,15 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer { local X2CharacterTemplate ChosenTemplate; local array ChosenStrengths , ValidChosenStrengths; + local array BackupChosenStrengths, FurtherBackupChosenStrengths; local ChosenStrengthWeighted WStrength; - local X2AbilityTemplate TraitTemplate; - local X2AbilityTemplateManager AbilityMgr; local float finder, selection, TotalWeight; - local name Traitname, ExcludeTraitName; local int i; local XComGameState_HeadquartersAlien AlienHQ; local XComGameStateHistory History; History = `XCOMHISTORY; - AbilityMgr = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); ChosenTemplate = ChosenState.GetChosenTemplate(); AlienHQ = XComGameState_HeadquartersAlien(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); @@ -2694,10 +3414,13 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer if(AlienHQ.GetForceLevel() > 14) { ChosenStrengths = default.HUNTER_STRENGTHS_T3; + BackupChosenStrengths = default.HUNTER_STRENGTHS_T2; + FurtherBackupChosenStrengths = default.HUNTER_STRENGTHS_T1; } else if(AlienHQ.GetForceLevel() > 9) { ChosenStrengths = default.HUNTER_STRENGTHS_T2; + BackupChosenStrengths = default.HUNTER_STRENGTHS_T1; } else { @@ -2709,10 +3432,13 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer if(AlienHQ.GetForceLevel() > 14) { ChosenStrengths = default.WARLOCK_STRENGTHS_T3; + BackupChosenStrengths = default.WARLOCK_STRENGTHS_T2; + FurtherBackupChosenStrengths = default.WARLOCK_STRENGTHS_T1; } else if(AlienHQ.GetForceLevel() > 9) { ChosenStrengths = default.WARLOCK_STRENGTHS_T2; + BackupChosenStrengths = default.WARLOCK_STRENGTHS_T1; } else { @@ -2724,10 +3450,13 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer if(AlienHQ.GetForceLevel() > 14) { ChosenStrengths = default.ASSASSIN_STRENGTHS_T3; + BackupChosenStrengths = default.ASSASSIN_STRENGTHS_T2; + FurtherBackupChosenStrengths = default.ASSASSIN_STRENGTHS_T1; } else if(AlienHQ.GetForceLevel() > 9) { ChosenStrengths = default.ASSASSIN_STRENGTHS_T2; + BackupChosenStrengths = default.ASSASSIN_STRENGTHS_T1; } else { @@ -2737,6 +3466,46 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer ValidChosenStrengths = ChosenStrengths; //Remove Strengths Are already added, and those that are excluded by already added strengths + ValidateStrengthList(ValidChosenStrengths, ChosenState); + if(ValidChosenStrengths.Length == 0) + { + ValidChosenStrengths = BackupChosenStrengths; + ValidateStrengthList(ValidChosenStrengths, ChosenState); + if(ValidChosenStrengths.Length == 0) + { + ValidChosenStrengths = FurtherBackupChosenStrengths; + ValidateStrengthList(ValidChosenStrengths, ChosenState); + } + } + + TotalWeight = 0.0f; + foreach ValidChosenStrengths(WStrength) + { + TotalWeight+=WStrength.Weight; + } + for(i=0; i selection) + { + break; + } + } + ChosenState.Strengths.AddItem(WStrength.Strength); + } +} + +static function ValidateStrengthList(out array ValidChosenStrengths, XComGameState_AdventChosen ChosenState) +{ + local name Traitname, ExcludeTraitName; + local X2AbilityTemplate TraitTemplate; + local X2AbilityTemplateManager AbilityMgr; + local int i; + AbilityMgr = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); foreach ChosenState.Strengths(Traitname) { @@ -2778,29 +3547,8 @@ static function GainNewStrengths(XComGameState NewGameState, int NumStrengthsPer } } } - TotalWeight = 0.0f; - foreach ValidChosenStrengths(WStrength) - { - TotalWeight+=WStrength.Weight; - } - for(i=0; i selection) - { - break; - } - } - ChosenState.Strengths.AddItem(WStrength.Strength); - } } - - static function UpdateRetribution() { local X2ChosenActionTemplate Template; @@ -2892,8 +3640,44 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'EVACDELAY_LW': OutString = string(class'X2Ability_PlaceDelayedEvacZone'.static.GetEvacDelay()); return true; - case 'INDEPENDENT_TRACKING_BONUS_TURNS_LW': - OutString = string(class'X2Effect_LWHoloTarget'.default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS); + case 'SHREDDER_ROUNDS_SHRED': + OutString = string(class'X2Item_LWUtilityItems'.default.SHREDDER_ROUNDS_SHRED); + return true; + case 'STILETTO_DMGMOD': // Stiletto Rounds + OutString = string(class'X2Item_LWUtilityItems'.default.STILETTO_DMGMOD); + return true; + case 'STILETTO_ALIEN_DMG': // Stiletto Rounds + OutString = string(class'X2Item_LWUtilityItems'.default.STILETTO_ALIEN_DMG); + return true; + case 'NEEDLE_DMGMOD': // Needle Rounds + OutString = string(class'X2Item_LWUtilityItems'.default.NEEDLE_DMGMOD); + return true; + case 'NEEDLE_ADVENT_DMG': // Needle Rounds + OutString = string(class'X2Item_LWUtilityItems'.default.NEEDLE_ADVENT_DMG); + return true; + case 'FLECHETTE_DMGMOD': + OutString = string(class'X2Item_LWUtilityItems'.default.FLECHETTE_DMGMOD); + return true; + case 'FLECHETTE_BONUS_DMG': + OutString = string(class'X2Item_LWUtilityItems'.default.FLECHETTE_BONUS_DMG); + return true; + case 'NEUROWHIP_PSI_BONUS': + OutString = string(class'X2Item_LWUtilityItems'.default.NEUROWHIP_PSI_BONUS); + return true; + case 'NEUROWHIP_WILL_MALUS': + OutString = string(class'X2Item_LWUtilityItems'.default.NEUROWHIP_WILL_MALUS); + return true; + case 'DRAGON_ROUNDS_APPLY_CHANCE': + OutString = string(class'LWTemplateMods'.default.DRAGON_ROUNDS_APPLY_CHANCE); + return true; + case 'VENOM_ROUNDS_APPLY_CHANCE': + OutString = string(class'LWTemplateMods'.default.VENOM_ROUNDS_APPLY_CHANCE); + return true; + case 'BLUESCREEN_DMGMOD': + OutString = string(class'X2Item_DefaultAmmo'.default.BLUESCREEN_DMGMOD); + return true; + case 'INDEPENDENT_TRACKING_BONUS_TURNS_LW': + OutString = string(class'X2Effect_LWHoloTarget'.default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS); return true; case 'HOLO_CV_AIM_BONUS_LW': OutString = string(class'X2Effect_LWHoloTarget'.default.HOLO_CV_AIM_BONUS); @@ -2964,12 +3748,30 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'FIRESTORM_DAMAGE_BONUS_LW': Outstring = string(int(class'X2Ability_LW_TechnicalAbilitySet'.default.FIRESTORM_DAMAGE_BONUS)); return true; + case 'CERAMIC_PLATING_HP': + Outstring = string(class'X2Ability_LW_GearAbilities'.default.CERAMIC_PLATING_HP); + return true; + case 'ALLOY_PLATING_HP': + Outstring = string(class'X2Ability_LW_GearAbilities'.default.ALLOY_PLATING_HP); + return true; + case 'CHITIN_PLATING_HP': + Outstring = string(class'X2Ability_LW_GearAbilities'.default.CHITIN_PLATING_HP); + return true; + case 'CARAPACE_PLATING_HP': + Outstring = string(class'X2Ability_LW_GearAbilities'.default.CARAPACE_PLATING_HP); + return true; case 'NANOFIBER_HEALTH_BONUS_LW': Outstring = string(class'X2Ability_ItemGrantedAbilitySet'.default.NANOFIBER_VEST_HP_BONUS); return true; case 'NANOFIBER_CRITDEF_BONUS_LW': Outstring = string(class'X2Ability_LW_GearAbilities'.default.NANOFIBER_CRITDEF_BONUS); return true; + case 'PLATED_CRITDEF_BONUS': + Outstring = string(class'X2LWAbilitiesModTemplate'.default.PLATED_CRITDEF_BONUS); + return true; + case 'HAZMAT_VEST_HP_BONUS': + Outstring = string(class'X2Ability_ItemGrantedAbilitySet'.default.HAZMAT_VEST_HP_BONUS); + return true; case 'RESILIENCE_BONUS_LW': Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.RESILIENCE_CRITDEF_BONUS); return true; @@ -2978,7 +3780,7 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri return true; case 'ALPHA_MIKE_FOXTROT_CRIT_DAMAGE_LW': Outstring = string(class'X2Ability_LW_SharpshooterAbilitySet'.default.ALPHAMIKEFOXTROT_DAMAGE / 2); - return true; + return true; case 'ROCKETSCATTER': TacticalHUD = UITacticalHUD(`SCREENSTACK.GetScreen(class'UITacticalHUD')); if (TacticalHUD != none) @@ -3041,9 +3843,12 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'HEAT_WARHEADS_SHRED_LW': Outstring = string(class'X2Ability_LW_GrenadierAbilitySet'.default.HEAT_WARHEADS_SHRED); return true; - case 'NEEDLE_BONUS_UNARMORED_DMG_LW': + case 'NEEDLE_BONUS_UNARMORED_DMG_LW': // Needle Grenades Outstring = string(class'X2Ability_LW_GrenadierAbilitySet'.default.NEEDLE_BONUS_UNARMORED_DMG); return true; + case 'BOMBARD_BONUS_RANGE_TILES': // Needle Grenades + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.BOMBARD_BONUS_RANGE_TILES); + return true; case 'BLUESCREENBOMB_HACK_DEFENSE_CHANGE_LW': Outstring = string(-class'X2Ability_LW_GrenadierAbilitySet'.default.BLUESCREENBOMB_HACK_DEFENSE_CHANGE); return true; @@ -3146,9 +3951,15 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'FLUSH_AIM_BONUS': Outstring = string(class'X2Ability_LW_GunnerAbilitySet'.default.FLUSH_AIM_BONUS); return true; + case 'FLUSH_DAMAGE_PENALTY': + Outstring = string(int(class'X2Ability_LW_GunnerAbilitySet'.default.FLUSH_DAMAGE_PENALTY * 100)); + return true; case 'MIND_SCORCH_BURN_CHANCE': Outstring = string(class'X2LWAbilitiesModTemplate'.default.MIND_SCORCH_BURN_CHANCE); return true; + case 'SUSTAIN_WOUND_HP_REDUCTTION': + Outstring = string(class'X2LWAbilitiesModTemplate'.default.SUSTAIN_WOUND_HP_REDUCTTION); + return true; case 'NULL_WARD_BASE_SHIELD': Outstring = string(class'X2Ability_LW_PsiOperativeAbilitySet'.default.NULL_WARD_BASE_SHIELD); return true; @@ -3197,6 +4008,12 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'UNSTOPPABLE_MIN_MOB': Outstring = string(class'X2Ability_LW_ChosenAbilities'.default.UNSTOPPABLE_MIN_MOB); return true; + case 'ROUST_DIRECT_APPLY_CHANCE': + Outstring = string(class'X2Ability_LW_TechnicalAbilitySet'.default.ROUST_DIRECT_APPLY_CHANCE); + return true; + case 'ROUST_DAMAGE_PENALTY': + Outstring = string(int(class'X2Ability_LW_TechnicalAbilitySet'.default.ROUST_DAMAGE_PENALTY * 100)); + return true; case 'NAPALM_X_BASEVALUE': Outstring = string(class'X2AbilityToHitCalc_StatCheck_LWFlamethrower'.default.BaseValue); return true; @@ -3215,6 +4032,9 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'COMBATREADINESS_AIM': Outstring = string(class'X2Ability_XMBPerkAbilitySet'.default.COMBATREADINESS_AIM); return true; + case 'COMBAT_READINESS_EXPLOSIVE_DR': + Outstring = string(int(class'X2Ability_XMBPerkAbilitySet'.default.COMBAT_READINESS_EXPLOSIVE_DR * 100)); + return true; case 'BLOODTHIRST_T1_DMG': Outstring = string(class'X2Effect_BloodThirst'.default.BLOODTHIRST_T1_DMG); return true; @@ -3227,9 +4047,15 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'BLOODTHIRST_T4_DMG': Outstring = string(class'X2Effect_BloodThirst'.default.BLOODTHIRST_T4_DMG); return true; + case 'BLOODTHIRST_T5_DMG': + Outstring = string(class'X2Effect_BloodThirst'.default.BLOODTHIRST_T5_DMG); + return true; case 'DISRUPTOR_RIFLE_PSI_CRIT': Outstring = string(class'X2Ability_XPackAbilitySet'.default.DISRUPTOR_RIFLE_PSI_CRIT); return true; + case 'FATALITY_THRESHOLD': + Outstring = string(int(class'X2Ability_XMBPerkAbilitySet'.default.FATALITY_THRESHOLD * 100)); + return true; default: return false; } @@ -3663,6 +4489,9 @@ exec function LWSetForceLevel(int NewLevel, optional name RegionName) local XComGameState NewGameState; local XComGameState_WorldRegion RegionState; local XComGameState_WorldRegion_LWStrategyAI RegionalAIState, UpdatedRegionalAI; + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; History = `XCOMHISTORY; @@ -3673,12 +4502,24 @@ exec function LWSetForceLevel(int NewLevel, optional name RegionName) if(RegionName == '' || RegionState.GetMyTemplateName() == RegionName) { RegionalAIState = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); - UpdatedRegionalAI = XComGameState_WorldRegion_LWStrategyAI(NewGameState.CreateStateObject(class'XComGameState_WorldRegion_LWStrategyAI', RegionalAIState.ObjectID)); + UpdatedRegionalAI = XComGameState_WorldRegion_LWStrategyAI(NewGameState.ModifyStateObject(class'XComGameState_WorldRegion_LWStrategyAI', RegionalAIState.ObjectID)); NewGameState.AddStateObject(UpdatedRegionalAI); UpdatedRegionalAI.LocalForceLevel = NewLevel; } } + + //patch the chosen level if needed + + AlienHQ = XComGameState_HeadquartersAlien(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + //AlienHQ = XComGameState_HeadquartersAlien(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersAlien', AlienHQ.ObjectID)); + AllChosen = AlienHQ.GetAllChosen(, true); + + foreach AllChosen(ChosenState) + { + class'X2StrategyElement_DefaultAlienActivities'.static.TryIncreasingChosenLevelWithGameState(NewLevel, NewGameState, ChosenState); + } + if (NewGameState.GetNumGameStateObjects() > 0) `XCOMGAME.GameRuleset.SubmitGameState(NewGameState); else @@ -4067,6 +4908,28 @@ exec function LWPrintVersion() class'Helpers'.static.OutputMsg("Long War of the Chosen Version: " $ class'LWVersion'.static.GetVersionString()); } +exec function LWOTC_RevealAvatarProject() +{ + local XComGameStateHistory History; + local XComGameState NewGameState; + local XComGameState_HeadquartersAlien AlienHQ; + + History = `XCOMHISTORY; + AlienHQ = XComGameState_HeadquartersAlien(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + if(AlienHQ != none) + { + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Console Command Activate Avatar Project"); + AlienHQ = XComGameState_HeadquartersAlien(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersAlien', AlienHQ.ObjectID)); + NewGameState.AddStateObject(AlienHQ); + + // Complete the Avatar reveal project as soon as doom is added to the fortress so players know what they're up against. + `LWTrace("Triggering Avatar Project reveal..."); + class'XComGameState_Objective'.static.StartObjectiveByName(NewGameState, 'LW_T2_M1_N2_RevealAvatarProject'); + `XEVENTMGR.TriggerEvent('StartAvatarProjectReveal'); + + `XCOMGAME.GameRuleset.SubmitGameState(NewGameState); + } +} exec function LWAddFortressDoom(optional int DoomToAdd = 1) { local XComGameState NewGameState; @@ -4373,7 +5236,7 @@ exec function RespecAllSoldiers() } } -static function RespecSoldier(XComGameState_Unit UnitState) +static function RespecSoldier(XComGameState_Unit UnitState, optional bool bResetLoadout = false) { local XComGameStateHistory History; local XComGameState NewGameState; @@ -4417,7 +5280,10 @@ static function RespecSoldier(XComGameState_Unit UnitState) { UnitState.RankUpSoldier(NewGameState, ClassName); } - // UnitState.ApplySquaddieLoadout(NewGameState, XComHQ); + if(bResetLoadout) + { + UnitState.ApplySquaddieLoadout(NewGameState, XComHQ); + } // Reapply Stat Modifiers (Beta Strike HP, etc.) UnitState.bEverAppliedFirstTimeStatModifiers = false; @@ -4636,11 +5502,7 @@ static function UpdateSitreps() `LWTrace("Disabling Sitrep" @SitRepName @"From appearing normally on missions"); Sitrep.StrategyReqs.SpecialRequirementsFn = class'Helpers_LW'.static.AlwaysFail; } - - } - - } static function CacheInstalledMods() @@ -4652,6 +5514,19 @@ static function CacheInstalledMods() class'Helpers_LW'.default.bWOTCCostBasedAbilityColorsActive = class'Helpers_LW'.static.IsModInstalled("WOTC_CostBasedAbilityColors"); class'Helpers_LW'.default.bWorldWarLostActive = class'Helpers_LW'.static.IsModInstalled("WorldWarLost"); class'Helpers_LW'.default.XCOM2RPGOverhaulActive = class'Helpers_LW'.static.IsModInstalled("XCOM2RPGOverhaul"); + class'Helpers_LW'.default.bKirukaFactionOverhaulActive = class'Helpers_LW'.static.IsModInstalled("KirukasFactionSoldiersLWOTC"); + class'Helpers_LW'.default.bNewTemplarModJamActive = class'Helpers_LW'.static.IsModInstalled("NewTemplarModJam"); + class'Helpers_LW'.default.bDABFLActive = class'Helpers_LW'.static.IsModInstalled("DiverseAliensByForceLevelWOTC"); + + `LWTrace("cached bSmokeStopsFlanksActive: " @ class'Helpers_LW'.default.bSmokeStopsFlanksActive ); + `LWTrace("cached bImprovedSmokeDefenseActive: " @class'Helpers_LW'.default.bImprovedSmokeDefenseActive); + `LWTrace("cached bWOTCRevertOverwatchRulesActive: " @class'Helpers_LW'.default.bWOTCRevertOverwatchRulesActive); + `LWTrace("cached bWOTCCostBasedAbilityColorsActive: " @class'Helpers_LW'.default.bWOTCCostBasedAbilityColorsActive); + `LWTrace("cached bWorldWarLostActive: " @class'Helpers_LW'.default.bWorldWarLostActive); + `LWTrace("cached XCOM2RPGOverhaulActive: " @class'Helpers_LW'.default.XCOM2RPGOverhaulActive); + `LWTrace("cached bKirukaFactionOverhaulActive: " @class'Helpers_LW'.default.bKirukaFactionOverhaulActive); + `LWTrace("cached bNewTemplarModJamActive: " @class'Helpers_LW'.default.bNewTemplarModJamActive); + `LWTrace("cached bDABFLActive: " @class'Helpers_LW'.default.bDABFLActive); } @@ -4669,7 +5544,7 @@ exec function LWOTC_SetSelectedUnitActive() Armory = UIArmory(`SCREENSTACK.GetFirstInstanceOf(class'UIArmory')); if (Armory == none) { - class'Helpers'.static.OutputMsg("No Unit Selected"); + class'Helpers'.static.OutputMsg("Error: Not in Armory"); return; } @@ -4677,18 +5552,18 @@ exec function LWOTC_SetSelectedUnitActive() UnitState = XComGameState_Unit(History.GetGameStateForObjectID(UnitRef.ObjectID)); if (UnitState == none) { - class'Helpers'.static.OutputMsg("No Unit Selected"); + class'Helpers'.static.OutputMsg("Error: No Unit Selected"); return; } - NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Levelup Soldier"); + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Force unit active"); XComHQ = XComGameState_HeadquartersXCom(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom')); XComHQ = XComGameState_HeadquartersXCom(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersXCom', XComHQ.ObjectID)); UnitState = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit', UnitState.ObjectID)); UnitState.SetStatus(eStatus_Active); - class'Helpers'.static.OutputMsg("Unit marked as active"); + class'Helpers'.static.OutputMsg("Unit marked as active" @ `SHOWVAR(UnitState.GetFullName() )); if( NewGameState.GetNumGameStateObjects() > 0 ) { @@ -4775,4 +5650,447 @@ exec function LWOTC_ForceAllUnitsActive() { History.CleanupPendingGameState(NewGameState); } +} + +exec function LWOTC_ShowChosenKnowledgeRandomValues() +{ + local XComGameState_LWOverhaulOptions LWOverhaulOptions; + + local array chosenKnowledge; + + LWOverhaulOptions = `LWOVERHAULOPTIONS; + + chosenKnowledge = LWOverhaulOptions.GetChosenKnowledgeGains_Randomized(); + class'Helpers'.static.OutputMsg(`SHOWVAR(LWOverhaulOptions.StartingChosen)); + class'Helpers'.static.OutputMsg(`SHOWVAR(class'X2EventListener_ChosenEndOfMonth'.default.STARTING_CHOSEN_KNOWLEDGE_GAIN)); + class'Helpers'.static.OutputMsg(`SHOWVAR(LWOverhaulOptions.ChosenNames[0])); + class'Helpers'.static.OutputMsg(`SHOWVAR(chosenKnowledge[0])); + class'Helpers'.static.OutputMsg(`SHOWVAR(LWOverhaulOptions.ChosenNames[1])); + class'Helpers'.static.OutputMsg(`SHOWVAR(chosenKnowledge[1])); +} + +exec function LWOTC_ShowChosenLevels() +{ + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AllChosen = AlienHQ.GetAllChosen(, true); + + foreach AllChosen(ChosenState) + { + class'Helpers'.static.OutputMsg(`SHOWVAR(ChosenState.GetMyTemplateName())); + class'Helpers'.static.OutputMsg("Chosen Level:" @`SHOWVAR(ChosenState.Level)); + } +} + +exec function LWOTC_ShowChosenStrengths() +{ + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; + local name ChosenStrength; + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AllChosen = AlienHQ.GetAllChosen(, true); + + foreach AllChosen(ChosenState) + { + class'Helpers'.static.OutputMsg(`SHOWVAR(ChosenState.GetMyTemplateName())); + foreach ChosenState.Strengths (ChosenStrength) + { + class'Helpers'.static.OutputMsg("Chosen strengths:" @ ChosenStrength); + } + } +} + +exec function LWOTC_ShowChosenStrongholdMissions() +{ + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AllChosen = AlienHQ.GetAllChosen(, true); + + foreach AllChosen(ChosenState) + { + class'Helpers'.static.OutputMsg(`SHOWVAR(ChosenState.GetMyTemplateName())); + class'Helpers'.static.OutputMsg("Chosen Stronghold Mission ID:" @ ChosenState.StrongholdMission.ObjectID); + } +} + +exec function LWOTC_SpawnChosenStrongholdMission(name ChosenName) +{ + local XComGameStateHistory History; + local XComGameState NewGameState; + local XComGameState_AdventChosen ChosenState; + local XComGameState_MissionSite MissionState; + local XComGameState_WorldRegion RegionState; + local XComGameState_Reward RewardState; + local X2RewardTemplate RewardTemplate; + local X2StrategyElementTemplateManager StratMgr; + local X2MissionSourceTemplate MissionSource; + local array MissionRewards; + local bool bFound; + + History = `XCOMHISTORY; + bFound = false; + + foreach History.IterateByClassType(class'XComGameState_AdventChosen', ChosenState) + { + if(ChosenState.GetMyTemplateName() == ChosenName) + { + bFound = true; + break; + } + } + + if(!bFound) + { + return; + } + `LWTrace("Found Chosen" @ChosenState.GetMyTemplateName()); + + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("CHEAT: New Chosen Stronghold stuff"); + StratMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + RegionState = ChosenState.GetHomeRegion(); + + MissionRewards.Length = 0; + RewardTemplate = X2RewardTemplate(StratMgr.FindStrategyElementTemplate('Reward_None')); + RewardState = RewardTemplate.CreateInstanceFromTemplate(NewGameState); + MissionRewards.AddItem(RewardState); + + MissionSource = X2MissionSourceTemplate(StratMgr.FindStrategyElementTemplate('MissionSource_ChosenStronghold')); + MissionState = XComGameState_MissionSite(NewGameState.CreateNewStateObject(class'XComGameState_MissionSite')); + MissionState.BuildMission(MissionSource, RegionState.GetRandom2DLocationInRegion(), RegionState.GetReference(), MissionRewards); + `LWTrace("New Chosen Stronghold Mission Object ID:" @MissionState.GetReference().ObjectID); + MissionState.ResistanceFaction = ChosenState.RivalFaction; + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + ChosenState.StrongholdMission = MissionState.GetReference(); + + MissionState.SetMissionData(MissionRewards[0].GetMyTemplate(), false, 0); + + + `XCOMGAME.GameRuleset.SubmitGameState(NewGameState); +} + +exec function FindObjectiveSpawnInfo(name MissionName) +{ + local XComTacticalMissionManager MissionMgr; + local int idx,ObjectiveIdx; + + MissionMgr = `TACTICALMISSIONMGR; + for(idx = 0; idx < MissionMgr.arrMissions.Length; idx++) + { + `LWTrace("arr missions idx" @ string(idx) @": mission name is" @ MissionMgr.arrMissions[idx].MissionName); + } + for(idx = 0; idx < MissionMgr.arrObjectiveSpawnInfo.Length;idx++) + { + `LWTrace("arr objective spawn info idx" @ string(idx) @": mission stype is" @ MissionMgr.arrObjectiveSpawnInfo[idx].sMissionType); + } + + idx = FindMissionIndex(MissionMgr.arrMissions,MissionName); + if(idx != INDEX_NONE) + { + `LWTrace("found mission at arrmissions with index" @ string(idx)); + ObjectiveIdx = FindObjectiveSpawnInfoIndex(MissionMgr.arrObjectiveSpawnInfo,MissionMgr.arrMissions[idx].sType); + if(ObjectiveIdx != INDEX_NONE) + { + `LWTrace("found objective spawn info at index" @ string(ObjectiveIdx)); + `LWTrace("Mission stuff:"); + `LWTrace("Mission Name:"@MissionMgr.arrMissions[idx].MissionName); + `LWTrace("Mission Type:"@MissionMgr.arrMissions[idx].sType); + `LWTrace("Objective sType:"@MissionMgr.arrObjectiveSpawnInfo[ObjectiveIdx].sMissionType); + `LWTrace("iMinObjectives:"@MissionMgr.arrObjectiveSpawnInfo[ObjectiveIdx].iMinObjectives); + `LWTrace("iMaxObjectives:"@MissionMgr.arrObjectiveSpawnInfo[ObjectiveIdx].iMaxObjectives); + } + else + { + `LWTrace("error: did not find objective spawn info"); + } + } + else + { + `LWTrace("error: did not find this mission"); + } + +} + +static final function int FindMissionIndex(array MissionDefs,name MissionName) +{ + return MissionDefs.Find('MissionName',MissionName); +} + +static final function int FindObjectiveSpawnInfoIndex(array SpawnInfo,String MissionType) +{ + return SpawnInfo.Find('sMissionType',MissionType); +} + +exec function PrintKismetVariables(optional bool bAllVars) +{ + //local array OutVariables; + local array OutObjects; + local SequenceObject SeqObj; + local SequenceVariable SeqVar; + local SeqVar_Int SeqVarTimer; + local Sequence CurrentSequence; + + CurrentSequence = `XWORLDINFO.GetGameSequence(); + if(CurrentSequence == none) + { + return; + } + + CurrentSequence.FindSeqObjectsByClass(class'SequenceVariable', true, OutObjects); + + foreach OutObjects(SeqObj) + { + SeqVar = SequenceVariable(SeqObj); + if(SeqVar != none) + { + SeqVarTimer = SeqVar_Int(SeqVar); + if(SeqVarTimer != none) + { + if(bAllVars) + { + class'Helpers'.static.OutputMsg("Found KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + } + + + //class'Helpers'.static.OutputMsg("KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + //class'Helpers'.static.OutputMsg("Found KismetVariable To Adjust: " $ Adjustment); + //SeqVarTimer.IntValue = SeqVarTimer.IntValue + Adjustment; + `LWTrace("Named KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + class'Helpers'.static.OutputMsg("Named KismetVariable: " $ SeqVar.VarName $ ", Value= " $ SeqVarTimer.IntValue); + + } + } + } +} + +// borrowed from Rusty and modified for all healing project, not card +exec function LWOTC_CheckHealingProjects() +{ + local XComGameState_Unit UnitState; + + local XComGameStateHistory History; + local XComGameState_HeadquartersProjectHealSoldier HealSoldierProject; + + History = `XCOMHISTORY; + + foreach History.IterateByClassType(class'XComGameState_HeadquartersProjectHealSoldier', HealSoldierProject) + { + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(HealSoldierProject.ProjectFocus.ObjectID)); + + class'Helpers'.static.OutputMsg("=============================================="); + class'Helpers'.static.OutputMsg("HealProject found for" @UnitState.GetFullName()); + class'Helpers'.static.OutputMsg(`SHOWVAR(UnitState.GetCurrentStat(eStat_HP))); + class'Helpers'.static.OutputMsg(`SHOWVAR(UnitState.GetMaxStat(eStat_HP))); + + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.ProjectPointsRemaining)); + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.BlocksRemaining)); + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.PointsPerBlock)); + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.BlockPointsRemaining)); + //class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.bForcePaused)); + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.GetProjectedNumHoursRemaining())); + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.GetCurrentNumHoursRemaining())); + + class'Helpers'.static.OutputMsg(`SHOWVAR(HealSoldierProject.GetCurrentWorkPerHour())); + } + +} + + +exec function LWOTC_CheckCapturedSoldiers() +{ + local XComGameState_HeadquartersAlien AlienHQ; + local XComGameState_AdventChosen ChosenState; + local StateObjectReference CapturedSoldierRef; + local XComGameState_Unit UnitState; + local array AllChosen; + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AllChosen = AlienHQ.GetAllChosen(); + + // First collect any soldiers captured "normally", i.e. not by the Chosen + foreach AlienHQ.CapturedSoldiers(CapturedSoldierRef) + { + class'Helpers'.static.OutputMsg("Found captured soldier ID:" @ CapturedSoldierRef.ObjectID); + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(CapturedSoldierRef.ObjectID)); + class'Helpers'.static.OutputMsg("Captured Soldier Name " @ UnitState.GetFirstName() @ UnitState.GetLastName()); + class'Helpers'.static.OutputMsg("Captured Soldier Class:" @ UnitState.GetSoldierClassTemplateName()); + // Check whether the soldier is already attached as a mission or covert action reward + if (!class'Helpers_LW'.static.IsRescueMissionAvailableForSoldier(CapturedSoldierRef)) + { + `LWTrace("[RescueSoldier] Captured soldier (normal) available for rescue " $ CapturedSoldierRef.ObjectID); + class'Helpers'.static.OutputMsg("No current rescue mission for this soldier."); + } + else + { + class'Helpers'.static.OutputMsg("There's a mission somewhere for this unit."); + } + } + + // Now collect any soldiers captured by the Chosen + foreach AllChosen(ChosenState) + { + foreach ChosenState.CapturedSoldiers(CapturedSoldierRef) + { + class'Helpers'.static.OutputMsg("Found captured soldier ID:" @ CapturedSoldierRef.ObjectID); + UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(CapturedSoldierRef.ObjectID)); + class'Helpers'.static.OutputMsg("Captured Soldier Name " @ UnitState.GetFirstName() @ UnitState.GetLastName()); + class'Helpers'.static.OutputMsg("Captured Soldier Class:" @ UnitState.GetSoldierClassTemplateName()); + // Check whether the soldier is already attached as a mission or covert action reward + if (!class'Helpers_LW'.static.IsRescueMissionAvailableForSoldier(CapturedSoldierRef)) + { + `LWTrace("[RescueSoldier] Captured soldier (Chosen - " $ ChosenState.GetMyTemplateName() $ ") available for rescue " $ CapturedSoldierRef.ObjectID); + class'Helpers'.static.OutputMsg("No current rescue mission for this soldier."); + } + else + { + class'Helpers'.static.OutputMsg("There's a mission somewhere for this unit."); + } + } + } + +} + + +//------------ Hybrid Difficulty Stuff ------------- + +// InstallNewCampaign part called in LW_SMGPack_Integrated because it loads first + +exec function Ted_SetNewCustomDifficulty() +{ + local XComGameStateHistory History; + local XComGameState_CampaignSettings CampaignSettingsStateObject; + local XComGameState NewGameState; + + History = `XCOMHISTORY; + + CampaignSettingsStateObject = XComGameState_CampaignSettings(History.GetSingleGameStateObjectForClass(class'XComGameState_CampaignSettings', true)); + + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("set new custom difficulty"); + + CampaignSettingsStateObject = XComGameState_CampaignSettings(NewGameState.ModifyStateObject(class'XComGameState_CampaignSettings', CampaignSettingsStateObject.ObjectID)); + + CampaignSettingsStateObject.SetDifficulty(4); + + `GAMERULES.SubmitGameState(NewGameState); +} + +exec function Ted_CheckCurrentDifficulty() +{ + local XComGameStateHistory History; + local XComGameState_CampaignSettings CampaignSettingsStateObject; + + History = `XCOMHISTORY; + + CampaignSettingsStateObject = XComGameState_CampaignSettings(History.GetSingleGameStateObjectForClass(class'XComGameState_CampaignSettings', true)); + + `LWTrace("Current Tactical Difficulty:" @CampaignSettingsStateObject.GetTacticalDifficultyFromSettings()); + `LWTrace("Current Strategy Difficulty:" @CampaignSettingsStateObject.GetStrategyDifficultyFromSettings()); + +} + +exec function LWOTC_TestSetForceLevelTuple() +{ + local XComLWTuple Tuple; + local XComGameState NewGameState; + + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Test LW FL tuple"); + + Tuple = new class'XComLWTuple'; + Tuple.Id = 'SetLWRegionalForceLevel'; + Tuple.Data.Add(4); + + Tuple.Data[0].kind = XComLWTVBool; + Tuple.Data[0].b = true; + + Tuple.Data[1].kind = XComLWTVInt; + Tuple.Data[1].i = 2; + + Tuple.Data[2].kind = XComLWTVBool; + Tuple.Data[2].b = false; + + `XEVENTMGR.TriggerEvent('SetLWRegionalForceLevel', Tuple, , NewGameState); + + `GAMERULES.SubmitGameState(NewGameState); +} + +exec function LWOTC_TestSetForceLevelTupleLocal() +{ + local XComLWTuple Tuple; + local XComGameState NewGameState; + local XComGameState_WorldRegion RegionState; + + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Test LW FL tuple"); + + RegionState = XComGameState_WorldRegion(`XCOMHISTORY.GetGameStateForObjectID(`XCOMHQ.StartingRegion.ObjectID)); + + Tuple = new class'XComLWTuple'; + Tuple.Id = 'SetLWRegionalForceLevel'; + Tuple.Data.Add(4); + + Tuple.Data[0].kind = XComLWTVBool; + Tuple.Data[0].b = false; + + Tuple.Data[1].kind = XComLWTVInt; + Tuple.Data[1].i = 1; + + Tuple.Data[2].kind = XComLWTVBool; + Tuple.Data[2].b = false; + + `XEVENTMGR.TriggerEvent('SetLWRegionalForceLevel', Tuple, RegionState, NewGameState); + + `GAMERULES.SubmitGameState(NewGameState); +} + +exec function LWOTC_TestGetForceLevelTuple() +{ + local XComLWTuple Tuple; + local int i; + + Tuple = new class'XComLWTuple'; + Tuple.Id = 'GetLWRegionalForceLevel'; + Tuple.Data.Add(2); + + `XEVENTMGR.TriggerEvent('GetLWRegionalForceLevel', Tuple); + + for(i=0; i < Tuple.Data[0].ao.Length; i++) + { + class'Helpers'.Static.OutputMsg("Region" @ `SHOWVAR(Tuple.Data[0].ao[i])); + class'Helpers'.Static.OutputMsg("FL"@ `SHOWVAR(Tuple.Data[1].ai[i])); + } +} + +exec function LWOTC_AdvanceRNG(optional int numRolls = 1) +{ + local int i; + + for(i=0; i 0 ) { History = `XCOMHISTORY; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_HunkerDown_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_HunkerDown_LW.uc index e1d41fdfa..03654a67f 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_HunkerDown_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_HunkerDown_LW.uc @@ -15,6 +15,7 @@ function GetToHitAsTargetModifiers(XComGameState_Effect EffectState, XComGameSta { if(X2TacticalGameRuleset(XComGameInfo(class'Engine'.static.GetCurrentWorldInfo().Game).GameRuleset).VisibilityMgr.GetVisibilityInfo(Attacker.ObjectID, Target.ObjectID, VisInfo)) { + // && !AbilityState.IsMeleeAbility() // If we want to make dash melee not affected, add this to the below if. if (Target.CanTakeCover() && (VisInfo.TargetCover == CT_Midlevel || VisInfo.TargetCover == CT_Standing)) { ShotInfo.ModType = eHit_Success; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_ChosenEndOfMonth.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_ChosenEndOfMonth.uc new file mode 100644 index 000000000..30e26b4a9 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_ChosenEndOfMonth.uc @@ -0,0 +1,87 @@ +// Author: Tedster +// function to update chosen knowledge at month end + +class X2EventListener_ChosenEndOfMonth extends X2EventListener config(LW_Overhaul); + +var config int STARTING_CHOSEN_KNOWLEDGE_GAIN; +var config array CHOSEN_KNOWLEDGE_GAINS; + + + +static function array CreateTemplates() +{ + local array Templates; + + // You can create any number of Event Listener templates within one X2EventListener class. + Templates.AddItem(CreateListenerTemplate_LW_ChosenEOMListener()); + + return Templates; +} + +static function CHEventListenerTemplate CreateListenerTemplate_LW_ChosenEOMListener() +{ + local CHEventListenerTemplate Template; + + `CREATE_X2TEMPLATE(class'CHEventListenerTemplate', Template, 'LW_ChosenEOMListener'); + + // Whether this Listener should be active during tactical missions. + Template.RegisterInTactical = false; + // Whether this Listener should be active on the strategic layer (while on Avenger) + Template.RegisterInStrategy = true; + + Template.AddCHEvent('PreEndOfMonth', LW_ChosenEOM_Listener, ELD_Immediate, 50); + + return Template; +} + +static function EventListenerReturn LW_ChosenEOM_Listener(Object EventData, Object EventSource, XComGameState NewGameState, Name Event, Object CallbackData) +{ + local XComGameState_HeadquartersAlien AlienHQ; + local array AllChosen; + local XComGameState_AdventChosen ChosenState; + local array RandomChosenKnowledgeGains; + + + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + + AllChosen = AlienHQ.GetAllChosen(NewGameState); + + + //grab the randomized values from the array set up in the LWOverhaulOptions + RandomChosenKnowledgeGains = `LWOVERHAULOPTIONS.GetChosenKnowledgeGains_Randomized(); + + foreach AllChosen(ChosenState) + { + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + + // short circuit if chosen aren't active yet. + if(ChosenState.bMetXCom != true) + continue; + + // short circuit if chosen is defeated. + if(ChosenState.bDefeated == true) + continue; + + //actually add the chosen knowledge to the chosen. + switch (ChosenState.GetMyTemplateName()) + { + case `LWOVERHAULOPTIONS.StartingChosen: + `LWTrace("Adding" @ default.STARTING_CHOSEN_KNOWLEDGE_GAIN @ "To Chosen" @ `SHOWVAR(ChosenState.GetMyTemplateName())); + ChosenState.ModifyKnowledgeScore(NewGameState, default.STARTING_CHOSEN_KNOWLEDGE_GAIN); + break; + case `LWOVERHAULOPTIONS.ChosenNames[0]: + `LWTrace("Adding" @ RandomChosenKnowledgeGains[0] @ "To Chosen" @ `SHOWVAR(ChosenState.GetMyTemplateName())); + ChosenState.ModifyKnowledgeScore(NewGameState, RandomChosenKnowledgeGains[0]); + break; + case `LWOVERHAULOPTIONS.ChosenNames[1]: + `LWTrace("Adding" @ RandomChosenKnowledgeGains[1] @ "To Chosen" @ `SHOWVAR(ChosenState.GetMyTemplateName())); + ChosenState.ModifyKnowledgeScore(NewGameState, RandomChosenKnowledgeGains[1]); + break; + } + + + } + + return ELR_NoInterrupt; +} + diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Headquarters.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Headquarters.uc index d434ee2d5..966886222 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Headquarters.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Headquarters.uc @@ -630,6 +630,8 @@ static function EventListenerReturn CAOverrideRewardScalar( // We need to keep track of how many times units go on the Intense // Training covert action and how many covert actions have not // been ambushed (that have an ambush risk). +// Also handles respawning failed golden path covert actions +// Also handles spawning new mission for new big supply depot static function EventListenerReturn CAProcessCompletion( Object EventData, Object EventSource, @@ -646,9 +648,18 @@ static function EventListenerReturn CAProcessCompletion( local CovertActionStaffSlot StaffSlot; local UnitValue UnitValue; + local XComGameState_ResistanceFaction FactionState; + local X2CovertActionTemplate ActionTemplate; + + //local XComGameState_LWAlienActivity NewActivityState; + //local X2LWAlienActivityTemplate ActivityTemplate; + //local X2StrategyElementTemplateManager StrategyElementTemplateMgr; + CAState = XComGameState_CovertAction(EventSource); if (CAState == none) return ELR_NoInterrupt; + PrevCAState = XComGameState_CovertAction(`XCOMHISTORY.GetPreviousGameStateForObject(CAState)); + // We want to keep track of how many covert actions with an ambush // risk have not been ambushed in a row. This is so we can increase // the ambush chance the more covert actions have not been ambushed. @@ -657,7 +668,8 @@ static function EventListenerReturn CAProcessCompletion( // We need to get the last covert action state from history because // the `bAmbushed` flag is cleared just before the covert action // completion processing happens. - PrevCAState = XComGameState_CovertAction(`XCOMHISTORY.GetPreviousGameStateForObject(CAState)); + // line moved above if block so that PrevCAState can be used elsewhere. + if (PrevCAState.bAmbushed) { // Covert action was ambushed, so reset the counter @@ -682,6 +694,36 @@ static function EventListenerReturn CAProcessCompletion( `GAMERULES.SubmitGameState(NewGameState); } + // Handle respawning golden path covert action if it failed + //Grab the previous covert action template. + ActionTemplate = PrevCAState.GetMyTemplate(); + if(class'Utilities_LW'.static.DidCovertActionFail(PrevCAState) && ActionTemplate.bGoldenPath) + { + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Respawn golden path covert action"); + FactionState = PrevCAState.GetFaction(); + FactionState = XComGameState_ResistanceFaction(NewGameState.ModifyStateObject(class'XComGameState_ResistanceFaction', FactionState.ObjectID)); + FactionState.GoldenPathActions.AddItem(FactionState.CreateCovertAction(NewGameState, ActionTemplate, ActionTemplate.RequiredFactionInfluence)); + + `GAMERULES.SubmitGameState(NewGameState); + } + + // Spawn depot mission if was successful. + //`LWTrace("Current CA name:"@CAState.GetMyTemplateName()); + //if(!class'Utilities_LW'.static.DidCovertActionFail(PrevCAState) && CAState.GetMyTemplateName() == 'CovertAction_BigSupplyDepot') + //{ + // spawn mission here: + // NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Spawn Big Supply Extraction post covert"); + // `LWTrace("Trying to spawn Big Supply Extract Mission"); + // StrategyElementTemplateMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + // ActivityTemplate = X2LWAlienActivityTemplate(StrategyElementTemplateMgr.FindStrategyElementTemplate('BigSupplyExtraction_LW')); + + // NewActivityState = ActivityTemplate.CreateInstanceFromTemplate(CAState.Region, NewGameState); + // NewActivityState.bNeedsUpdateDiscovery = true; + // NewGameState.AddStateObject(NewActivityState); + + // `GAMERULES.SubmitGameState(NewGameState); + //} + // Now handle the Intense Training covert action if (CAState.GetMyTemplateName() != 'CovertAction_IntenseTraining') return ELR_NoInterrupt; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_LWModAPI.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_LWModAPI.uc index 1406cc03d..d98993e58 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_LWModAPI.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_LWModAPI.uc @@ -13,6 +13,7 @@ static function array CreateTemplates() Templates.AddItem(CreateLWUnitInfoReturn()); Templates.AddItem(CreateLWUnitSquadInfoReturn()); + Templates.AddItem(CreateLWRegionalAIListeners()); return Templates; } @@ -49,6 +50,18 @@ static function CHEventListenerTemplate CreateLWUnitSquadInfoReturn() return Template; } +static function CHEventListenerTemplate CreateLWRegionalAIListeners() +{ + local CHEventListenerTemplate Template; + + `CREATE_X2TEMPLATE(class'CHEventListenerTemplate', Template, 'Ted_LWRegionalFLReturn'); + Template.RegisterInStrategy = true; + Template.AddCHEvent('GetLWRegionalForceLevel', OnGetLWRegionalForceLevel, ELD_Immediate, 80); + Template.AddCHEvent('SetLWRegionalForceLevel', OnSetLWRegionalForceLevel, ELD_Immediate, 80); + + return Template; +} + /* Unit info API. Trigger this to receive information about a solider from the LW officer and haven systems. @@ -80,7 +93,7 @@ static protected function EventListenerReturn LWUnitInfoReturn(Object EventData, Unit = XComGameState_Unit(EventSource); //abort if inputs incorrect - if(Tuple == none || Tuple.Id != 'GetLWUnitInfo' || Unit == none) + if(Tuple == none || Unit == none || Tuple.Id != 'GetLWUnitInfo' ) { return ELR_NoInterrupt; } @@ -165,4 +178,184 @@ static protected function EventListenerReturn LWUnitSquadInfoReturn(Object Event `LWTrace("Tuple 3:" @Tuple.Data[3].b); return ELR_NoInterrupt; -} \ No newline at end of file +} + + +/* + This Tuple gets the current LW Force Level for all regions. + Tuple inputs: none + Tuple outputs: + Tuple.Data[0] - Array Objects - Array of XCGS_WorldRegion. + Tuple.Data[1] - Array ints - Force Level for the Regions. Use matched index + + local XComLWTuple Tuple; + + Tuple = new class'XComLWTuple'; + Tuple.Id = 'GetLWRegionalForceLevel'; + Tuple.Data.Add(2); + + `XEVENTMGR.TriggerEvent('GetLWRegionalForceLevel', Tuple); + + */ + +static protected function EventListenerReturn OnGetLWRegionalForceLevel(Object EventData, Object EventSource, XComGameState GameState, Name Event, Object CallbackData) +{ + local XComLWTuple Tuple; + local XCOmGameState_WorldRegion RegionState; + local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + local int i; + + Tuple = XComLWTuple(EventData); + + if(Tuple == none || Tuple.Id != 'GetLWRegionalForceLevel' ) + { + return ELR_NoInterrupt; + } + + i=0; + + Tuple.Data[0].kind = XComLWTVArrayObjects; + Tuple.Data[1].kind = XComLWTVArrayInts; + + foreach `XCOMHISTORY.IterateByClassType(class'XComGameState_WorldRegion', RegionState) + { + if(RegionState != NONE) + { + + Tuple.Data[0].ao[i] = RegionState; + + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); + + Tuple.Data[1].ai[i] = RegionalAI.LocalForceLevel; + + i += 1; + } + } + + return ELR_NoInterrupt; +} + +/* + This event adjusts the force level in a region, or in all regions, by the specified amount. + + EventData: the below Tuple + EventSource: the XComGameState_WorldRegion you want to adjust (optional if Tuple.Data[0].b is set to true) + NewGameState: your updated Game State. You must submit it afterwards. + + Tuple inputs: + Tuple.Data[0] - bool - if set to true, adjust FL in all regions. If set to false, adjust FL in just specified region. + Tuple.Data[1] - int - value for the change in Force Level; can be negative. + + Tuple outputs: + Tuple.Data[2] - bool - set to true if the change went through, set to false if it failed. + + local XComLWTuple Tuple; + + Tuple = new class'XComLWTuple'; + Tuple.Id = 'SetLWRegionalForceLevel'; + Tuple.Data.Add(4); + + Tuple.Data[0].kind = XComLWTVBool; + Tuple.Data[0].b = true; + + Tuple.Data[1].kind = XComLWTVInt; + Tuple.Data[1].i = 1; + + Tuple.Data[2].kind = XComLWTVBool; + Tuple.Data[2].b = false; + + `XEVENTMGR.TriggerEvent('SetLWRegionalForceLevel', Tuple, RegionState, NewGameState); + + */ + +static protected function EventListenerReturn OnSetLWRegionalForceLevel(Object EventData, Object EventSource, XComGameState NewGameState, Name Event, Object CallbackData) +{ + local XComLWTuple Tuple; + local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + local XCOmGameState_WorldRegion RegionState; + local bool bAllRegions; + local XComGameStateHistory History; + + Tuple = XComLWTuple(EventData); + + History = `XCOMHISTORY; + + if(Tuple == NONE || Tuple.Id != 'SetLWRegionalForceLevel') + { + return ELR_NoInterrupt; + } + + if(NewGameState == NONE) + { + `LWTrace("SetRegionalFL Event called with no Game State"); + Tuple.Data[2].b = false; + return ELR_NoInterrupt; + } + + bAllRegions = Tuple.Data[0].b; + RegionState = XCOmGameState_WorldRegion(EventSource); + + if(RegionState == NONE && !bAllRegions) + { + Tuple.Data[2].b = false; + return ELR_NoInterrupt; + } + + if(!bAllRegions) // If just one region is being updated + { + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState, NewGameState, true); + + if(RegionalAI == NONE) + { + `LWTrace("SetRegionalFL event: no RegionalAI found"); + Tuple.Data[2].b = false; + return ELR_NoInterrupt; + } + + RegionalAI.LocalForceLevel += Tuple.Data[1].i; + + // Minimum FL of 1, if it goes below this, reset and return false. + if(RegionalAI.LocalForceLevel < 1) + { + RegionalAI.LocalForceLevel=1; + Tuple.Data[2].b = false; + return ELR_NoInterrupt; + } + else if(RegionalAI.LocalForceLevel > 99) // cap at 99 too + { + RegionalAI.LocalForceLevel=99; + Tuple.Data[2].b = false; + return ELR_NoInterrupt; + } + } + else // if all regions are being updated + { + foreach History.IterateByClassType(class'XComGameState_WorldRegion', RegionState) + { + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState, NewGameState, true); + + if(RegionalAI != NONE) + { + RegionalAI.LocalForceLevel += Tuple.Data[1].i; + + // Minimum FL of 1, if it goes below this, reset and return false. + if(RegionalAI.LocalForceLevel < 1) + { + RegionalAI.LocalForceLevel=1; + Tuple.Data[2].b = false; + } + else if(RegionalAI.LocalForceLevel > 99) // cap at 99 too + { + RegionalAI.LocalForceLevel=99; + Tuple.Data[2].b = false; + } + } + } + + } + Tuple.Data[2].b = true; + + return ELR_NoInterrupt; +} + + diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Missions.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Missions.uc index c5382f111..44936974a 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Missions.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Missions.uc @@ -20,6 +20,8 @@ var config array LostSwarmIDsDiff3; var config array MISSION_PLOT_OVERRIDES; +var config int numAdditionalCrateLargeDepot; + static function array CreateTemplates() { local array Templates; @@ -149,6 +151,18 @@ static function EventListenerReturn OnOverrideObjectiveSpawnCount(Object EventDa Tuple.Data[1].i = MissionSite.Rewards.Length; } + else if(MissionSite.GeneratedMission.Mission.sType == "SmashNGrab_LW") + { + `LWTrace("Smash N Grab Objective found."); + + if(MIssionSite.TacticalGameplayTags.find('LargeDepot_LW_Sitrep') != INDEX_NONE) + { + Tuple.Data[1].i += default.numAdditionalCrateLargeDepot; + } + + + } + return ELR_NoInterrupt; } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_PCSFix_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_PCSFix_LW.uc new file mode 100644 index 000000000..b643878c1 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_PCSFix_LW.uc @@ -0,0 +1,74 @@ +//******************************************************************************************* +// FILE: Psionic. stuff by TeslaRage and RustyDios +// +// File created 30/11/21 06:15 +// LAST UPDATED 29/01/22 09:30 +// +// FIXES UP THE ANYONE CAN EQUIP ANY PCS, STOLEN FROM PEXM, ADJUSTED FOR LW MOD +// +//******************************************************************************************* +class X2EventListener_PCSfix_LW extends X2EventListener; + +static function array CreateTemplates() +{ + local array Templates; + + Templates.AddItem(CreateStrategyListener()); + + return Templates; +} + +static final function CHEventListenerTemplate CreateStrategyListener() +{ + local CHEventListenerTemplate Template; + + `CREATE_X2TEMPLATE(class'CHEventListenerTemplate', Template, 'X2EventListener_PCSFix_LW'); + + Template.RegisterInStrategy = true; + + Template.AddCHEvent('OverrideCanEquipImplant', OnOverrideCanEquipImplant, ELD_Immediate, 50); + + return Template; +} + +/* +// FOR REF CALLED FROM UIInventory_Implants, note ne GameState so ensure is ELD_Immediate + + OverrideTuple = new class'XComLWTuple'; + OverrideTuple.Id = 'OverrideCanEquipImplant'; + OverrideTuple.Data.Add(2); + OverrideTuple.Data[0].kind = XComLWTVBool; + OverrideTuple.Data[0].b = CanEquipImplant; + OverrideTuple.Data[1].kind = XComLWTVObject; + OverrideTuple.Data[1].o = Implant; + + `XEVENTMGR.TriggerEvent('OverrideCanEquipImplant', OverrideTuple, Unit); +*/ + +static function EventListenerReturn OnOverrideCanEquipImplant(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackObject) +{ + local XComLWTuple Tuple; + local XComGameState_Unit Unit; + + Tuple = XComLWTuple(EventData); + Unit = XComGameState_Unit(EventSource); + + if (Unit == none) + { + return ELR_NoInterrupt; + } + + if (Tuple != none) + { + if(Unit.HasHealingProject() && (Unit.HasItemOfTemplateType('CommonPCSConditioning') || Unit.HasItemOfTemplateType('RarePCSConditioning') || Unit.HasItemOfTemplateType('EpicPCSConditioning'))) + { + Tuple.Data[0].b = false; + } + else + { + Tuple.Data[0].b = true; + } + } + + return ELR_NoInterrupt; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc index e2ce2251e..01ece05cc 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Soldiers.uc @@ -685,7 +685,7 @@ static function EventListenerReturn OverrideRespecSoldierProjectPoints( if (default.TIERED_RESPEC_TIMES) { // Respec days = rank * difficulty setting - Tuple.Data[1].i = UnitState.GetRank() * class'XComGameState_HeadquartersXCom'.default.XComHeadquarters_DefaultRespecSoldierDays[`STRATEGYDIFFICULTYSETTING] * 24; + Tuple.Data[1].i = UnitState.GetRank() * class'XComGameState_HeadquartersXCom'.default.XComHeadquarters_DefaultRespecSoldierDays[`STRATEGYDIFFICULTYSETTING] * 12; } return ELR_NoInterrupt; @@ -1169,28 +1169,28 @@ static function EventListenerReturn GetPCSImage(Object EventData, Object EventSo switch (ItemState.GetMyTemplateName()) { - case 'DepthPerceptionPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_depthperception"; break; - case 'HyperReactivePupilsPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hyperreactivepupils"; break; - case 'CombatAwarenessPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_threatassessment"; break; - case 'DamageControlPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_damagecontrol"; break; - case 'AbsorptionFieldsPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_impactfield"; break; - case 'BodyShieldPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_bodyshield"; break; - case 'EmergencyLifeSupportPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_emergencylifesupport"; break; - case 'IronSkinPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_ironskin"; break; - case 'SmartMacrophagesPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_smartmacrophages"; break; - case 'CombatRushPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_combatrush"; break; - case 'CommonPCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - case 'RarePCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - case 'EpicPCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_defense"; break; - case 'CommonPCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - case 'RarePCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - case 'EpicPCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_dodge"; break; - case 'CommonPCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - case 'RarePCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - case 'EpicPCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_hacking"; break; - case 'FireControl25PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; - case 'FireControl50PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; - case 'FireControl75PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LW_Overhaul.implants_firecontrol"; break; + case 'DepthPerceptionPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_depthperception"; break; + case 'HyperReactivePupilsPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hyperreactivepupils"; break; + case 'CombatAwarenessPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_threatassessment"; break; + case 'DamageControlPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_damagecontrol"; break; + case 'AbsorptionFieldsPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_impactfield"; break; + case 'BodyShieldPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_bodyshield"; break; + case 'EmergencyLifeSupportPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_emergencylifesupport"; break; + case 'IronSkinPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_ironskin"; break; + case 'SmartMacrophagesPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_smartmacrophages"; break; + case 'CombatRushPCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_combatrush"; break; + case 'CommonPCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + case 'RarePCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + case 'EpicPCSDefense': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_defense"; break; + case 'CommonPCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + case 'RarePCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + case 'EpicPCSAgility': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_dodge"; break; + case 'CommonPCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + case 'RarePCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + case 'EpicPCSHacking': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_hacking"; break; + case 'FireControl25PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; + case 'FireControl50PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; + case 'FireControl75PCS': OverridePCSImageTuple.Data[1].s = "img:///UILibrary_LWOTC.implants_firecontrol"; break; default: break; } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_StrategyMap.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_StrategyMap.uc index 773d09f68..4238bf507 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_StrategyMap.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_StrategyMap.uc @@ -222,12 +222,25 @@ static function EventListenerReturn OnOverrideMissionSiteTooltip( `REDSCREEN("OnOverrideMissionSiteTooltip event triggered with invalid event source."); return ELR_NoInterrupt; } + Title = Tuple.Data[0].s; + Body = Tuple.Data[1].s; + + GetMissionSiteUIButtonToolTip(Title, Body, MissionIcon); - GetMissionSiteUIButtonToolTip(Title, Body, MissionIcon); - Tuple.Data[0].Kind = XComLWTVString; Tuple.Data[0].s = Title; - Tuple.Data[1].Kind = XComLWTVString; Tuple.Data[1].s = Body; +/* + if(Title != Tuple.Data[0].s) + { + Tuple.Data[0].Kind = XComLWTVString; + Tuple.Data[0].s = Title; + } + + if(Body != Tuple.Data[1].s) + { + Tuple.Data[1].Kind = XComLWTVString; + Tuple.Data[1].s = Body; + } */ return ELR_NoInterrupt; } @@ -243,6 +256,7 @@ static function EventListenerReturn CustomizeMissionSiteIconImage( local XComLWTuple Tuple; local XComGameState_MissionSite MissionSite; local XComGameState_LWAlienActivity AlienActivity; + local string IconStr; Tuple = XComLWTuple(EventData); if (Tuple == none) @@ -258,7 +272,11 @@ static function EventListenerReturn CustomizeMissionSiteIconImage( AlienActivity = class'XComGameState_LWAlienActivityManager'.static.FindAlienActivityByMission(MissionSite); if (AlienActivity != none ) { - Tuple.Data[0].s = AlienActivity.GetMissionIconImage(MissionSite); + IconStr = AlienActivity.GetMissionIconImage(MissionSite); + if(IconStr != "") + { + Tuple.Data[0].s = IconStr; + } } return ELR_NoInterrupt; @@ -337,7 +355,7 @@ static function GetMissionSiteUIButtonToolTip(out string Title, out string Body, { Title = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(InfiltratingSquad.sSquadName); } - else + else if (MissionSite.GetMissionSource().DataName == 'MissionSource_LWSGenericMissionSource') { MissionTemplate = class'X2MissionTemplateManager'.static.GetMissionTemplateManager().FindMissionTemplate(MissionSite.GeneratedMission.Mission.MissionName); Title = class'UIUtilities_Text'.static.CapsCheckForGermanScharfesS(MissionTemplate.PostMissionType); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Tactical.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Tactical.uc index 026b62231..6395a55ae 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Tactical.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_Tactical.uc @@ -72,7 +72,7 @@ static function CHEventListenerTemplate CreateMiscellaneousListeners() Template.AddCHEvent('UnitChangedTeam', ClearUnitStateValues, ELD_Immediate, GetListenerPriority()); Template.AddCHEvent('PlayerTurnEnded', RollForPerTurnWillLoss, ELD_OnStateSubmitted, GetListenerPriority()); Template.AddCHEvent('OverrideR3Button', BindR3ToPlaceDelayedEvacZone, ELD_Immediate, GetListenerPriority()); - + Template.AddCHEvent('OverrideDamageRemovesReserveActionPoints', OnOverrideDamageRemovesReserveActionPoints, ELD_Immediate, GetListenerPriority()); // This seems to be causing stutter in the game, so commenting out for now. // if (XCom_Perfect_Information_UIScreenListener.default.ENABLE_PERFECT_INFORMATION) // { @@ -234,7 +234,7 @@ static function EventListenerReturn OnScamperBegin( { local array AlivePodMembers; local XComGameState_Unit PodLeaderUnit; - local XComGameState_Unit PodMember; + local XComGameState_Unit PodMember, CurrentMember; local XComGameStateHistory History; local XComGameState_AIGroup Group; local bool IsYellow; @@ -243,7 +243,7 @@ static function EventListenerReturn OnScamperBegin( local XComGameState_MissionSite MissionSite; local XComGameState_LWPersistentSquad SquadState; local XComGameState_BattleData BattleData; - local int i, NumSuccessfulReflexActions; + local int i, NumSuccessfulReflexActions, currentPodMember; History = `XCOMHISTORY; Group = XComGameState_AIGroup(EventSource); @@ -257,6 +257,19 @@ static function EventListenerReturn OnScamperBegin( Group.GetLivingMembers(AlivePodMembers); PodLeaderUnit = XComGameState_Unit(History.GetGameStateForObjectID(AlivePodMembers[0])); + foreach AlivePodMembers (currentPodMember) + { + CurrentMember = XComGameState_Unit(History.GetGameStateForObjectID(currentPodMember)); + //`LWTrace("Remove wall 1"); + //`LWTrace("Current member" @CurrentMember); + //`LWTrace("Current unit template:" @ CurrentMember.GetMyTemplateName()); + if(CurrentMember != NONE) + { + CurrentMember = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit', currentPodMember)); + RemovePreventWallBreakEffect(CurrentMember, NewGameState); + } + } + `LWTrace(GetFuncName() $ ": Processing reflex move for pod leader " $ PodLeaderUnit.GetMyTemplateName()); // LWOTC: This note is from original LW2. I don't know if the assumptions and reasoning @@ -954,6 +967,29 @@ private static function RemoveSightRadiusRestorationEffect(XComGameState_Unit Un } } +private static function RemovePreventWallBreakEffect(XComGameState_Unit UnitState, XComGameState NewGameState) +{ + local X2Effect_PersistentTraversalChange CurrentEffect; + local XComGameStateHistory History; + local XComGameState_Effect EffectState; + local StateObjectReference EffectRef; + + History = `XCOMHISTORY; + foreach UnitState.AffectedByEffects(EffectRef) + { + EffectState = XComGameState_Effect(History.GetGameStateForObjectID(EffectRef.ObjectID)); + CurrentEffect = X2Effect_PersistentTraversalChange(EffectState.GetX2Effect()); + //`LWTrace("Current Effect:" @CurrentEffect); + //`LWTrace("CurrentEffect Name:" @CurrentEffect.EffectName); + if (CurrentEffect != none && CurrentEffect.EffectName == 'NoWallBreakingInGreenAlert') + { + `LWTrace("Removing Effect" @CurrentEffect); + EffectState.RemoveEffect(NewGameState, NewGameState, true); + break; + } + } +} + // This listener clears the `eCleanup_BeginTurn` unit values on units that // swap teams. This fixes a problem where those unit values don't get cleared // when team swapping happens after the turn begins. @@ -1162,3 +1198,36 @@ static protected function EventListenerReturn HideFocusOnAssaults( return ELR_NoInterrupt; } + +static function EventListenerReturn OnOverrideDamageRemovesReserveActionPoints(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackObject) +{ + local XComGameState_Unit UnitState; + local XComLWTuple Tuple; + local bool bDamageRemovesReserveActionPoints; + local name ActionPointName; + local bool IsSuppression; + + UnitState = XComGameState_Unit(EventSource); + Tuple = XComLWTuple(EventData); + + `LWTrace("Override Reserve AP listener"); + bDamageRemovesReserveActionPoints = Tuple.Data[0].b; + + foreach UnitState.ReserveActionPoints(ActionPointName) + { + if(ActionPointName == 'Suppression') + { + IsSuppression = true; + break; + } + } + + if(IsSuppression && UnitState.HasAbilityFromAnySource('DedicatedSuppression_LW')) + { + bDamageRemovesReserveActionPoints = false; + } + + Tuple.Data[0].b = bDamageRemovesReserveActionPoints; + + return ELR_NoInterrupt; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_XP.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_XP.uc index 4cdab1149..5a90c62be 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_XP.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2EventListener_XP.uc @@ -223,7 +223,8 @@ static function EventListenerReturn OnAddMissionEncountersToUnits(Object EventDa continue; } } - + + // Tedster - for future reference - add thing that modifies max rank of Trial by Fire here. if (UnitState.GetRank() < class'LW_OfficerPack_Integrated.X2Ability_OfficerAbilitySet'.default.TRIAL_BY_FIRE_RANK_CAP) { idx = default.CLASS_MISSION_EXPERIENCE_WEIGHTS.Find('SoldierClass', UnitState.GetSoldierClassTemplateName()); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ArcthrowerWeapon.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ArcthrowerWeapon.uc index f73c048a7..d1050fa2d 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ArcthrowerWeapon.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ArcthrowerWeapon.uc @@ -6,17 +6,17 @@ //--------------------------------------------------------------------------------------- class X2Item_ArcthrowerWeapon extends X2Item config(GameData_WeaponData); -//*****UI Image definitions***** +//�*****�UI Image definitions��***** var config string Arcthrower_CV_UIImage; var config string Arcthrower_MG_UIImage; var config string Arcthrower_BM_UIImage; -//*****Damagearraysforattackactions***** +//�*****�Damage�arrays�for�attack�actions��***** var config WeaponDamageValue Arcthrower_CONVENTIONAL_BASEDAMAGE; var config WeaponDamageValue Arcthrower_MAGNETIC_BASEDAMAGE; var config WeaponDamageValue Arcthrower_BEAM_BASEDAMAGE; -//*****Core properties and variablesforweapons***** +//�*****�Core properties and variables�for�weapons�***** var config int Arcthrower_CONVENTIONAL_AIM; var config int Arcthrower_CONVENTIONAL_CRITCHANCE; var config int Arcthrower_CONVENTIONAL_ICLIPSIZE; @@ -44,7 +44,7 @@ var config int Arcthrower_BEAM_ISUPPLIES; var config int Arcthrower_BEAM_TRADINGPOSTVALUE; var config int Arcthrower_BEAM_IPOINTS; -//*****Schematic properties***** +//�*****�Schematic properties�***** var config int Arcthrower_MAGNETIC_SCHEMATIC_SUPPLYCOST; var config int Arcthrower_BEAM_SCHEMATIC_SUPPLYCOST; @@ -79,7 +79,7 @@ static function X2DataTemplate CreateTemplate_Arcthrower_Conventional() local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'Arcthrower_CV'); - Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LW_Overhaul.LW_AbilityArcthrowerStun"); + Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LWOTC.LW_AbilityArcthrowerStun"); Template.EquipSound = "Conventional_Weapon_Equip"; Template.ItemCat = 'weapon'; @@ -122,7 +122,7 @@ static function X2DataTemplate CreateTemplate_Arcthrower_Magnetic() local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'Arcthrower_MG'); - Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LW_Overhaul.LW_AbilityArcthrowerStun"); + Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LWOTC.LW_AbilityArcthrowerStun"); Template.WeaponCat = 'arcthrower'; Template.WeaponTech = 'magnetic'; Template.ItemCat = 'weapon'; @@ -165,7 +165,7 @@ static function X2DataTemplate CreateTemplate_Arcthrower_Beam() local X2WeaponTemplate Template; `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'Arcthrower_BM'); - Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LW_Overhaul.LW_AbilityArcthrowerStun"); + Template.AddAbilityIconOverride('EMPulser', "img:///UILibrary_LWOTC.LW_AbilityArcthrowerStun"); Template.WeaponCat = 'arcthrower'; Template.WeaponTech = 'beam'; Template.ItemCat = 'weapon'; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_BeamGrenadeLauncher.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_BeamGrenadeLauncher.uc index 582b0668f..4c75e11fb 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_BeamGrenadeLauncher.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_BeamGrenadeLauncher.uc @@ -52,6 +52,7 @@ static function X2GrenadeLauncherTemplate CreateTemplate_BeamGrenadeLauncher() Template.IncreaseGrenadeRange = default.BEAMGRENADELAUNCHER_RANGEBONUS; Template.GameArchetype = "WP_BeamGrenadeLauncher.WP_BeamGrenadeLauncher"; + // Template.GameArchetype = "WP_BeamGrenadeLauncher_LW.WP_BeamGrenadeLauncher_LW"; Template.CreatorTemplateName = 'GrenadeLauncher_BM_Schematic'; // The schematic which creates this item Template.BaseItem = 'GrenadeLauncher_MG'; // Which item this will be upgraded from diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ChosenWeapons.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ChosenWeapons.uc new file mode 100644 index 000000000..2916f7682 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_ChosenWeapons.uc @@ -0,0 +1,281 @@ +class X2Item_ChosenWeapons extends X2Item_XpackWeapons config (GameData_WeaponData); + + +var config WeaponDamageValue CHOSENRIFLE_T5_BASEDAMAGE; + +var config int CHOSENRIFLE_T5_AIM; +var config int CHOSENRIFLE_T5_CRITCHANCE; +var config int CHOSENRIFLE_T5_ICLIPSIZE; +var config int CHOSENRIFLE_T5_ISOUNDRANGE; +var config int CHOSENRIFLE_T5_IENVIRONMENTDAMAGE; + +var config WeaponDamageValue CHOSENSWORD_T5_BASEDAMAGE; +var config array CHOSENSWORD_T5_EXTRADAMAGE; + +var config int CHOSENSWORD_T5_AIM; +var config int CHOSENSWORD_T5_CRITCHANCE; +var config int CHOSENSWORD_T5_ISOUNDRANGE; +var config int CHOSENSWORD_T5_IENVIRONMENTDAMAGE; + +var config WeaponDamageValue CHOSENSHOTGUN_T5_BASEDAMAGE; + +var config int CHOSENSHOTGUN_T5_AIM; +var config int CHOSENSHOTGUN_T5_CRITCHANCE; +var config int CHOSENSHOTGUN_T5_ICLIPSIZE; +var config int CHOSENSHOTGUN_T5_ISOUNDRANGE; +var config int CHOSENSHOTGUN_T5_IENVIRONMENTDAMAGE; + +var config WeaponDamageValue CHOSENSNIPERRIFLE_T5_BASEDAMAGE; + +var config int CHOSENSNIPERRIFLE_T5_AIM; +var config int CHOSENSNIPERRIFLE_T5_CRITCHANCE; +var config int CHOSENSNIPERRIFLE_T5_ICLIPSIZE; +var config int CHOSENSNIPERRIFLE_T5_ISOUNDRANGE; +var config int CHOSENSNIPERRIFLE_T5_IENVIRONMENTDAMAGE; + +var config WeaponDamageValue CHOSENSNIPERPISTOL_T5_BASEDAMAGE; + +var config int CHOSENSNIPERPISTOL_T5_AIM; +var config int CHOSENSNIPERPISTOL_T5_CRITCHANCE; +var config int CHOSENSNIPERPISTOL_T5_ICLIPSIZE; +var config int CHOSENSNIPERPISTOL_T5_ISOUNDRANGE; +var config int CHOSENSNIPERPISTOL_T5_IENVIRONMENTDAMAGE; + +static function array CreateTemplates() +{ + local array Weapons; + + + Weapons.AddItem(CreateTemplate_ChosenRifle_T5()); + Weapons.AddItem(CreateTemplate_WarlockM5_PsiWeapon()); + + Weapons.AddItem(CreateTemplate_ChosenShotgun_T5()); + Weapons.AddItem(CreateTemplate_ChosenSword_T5()); + + Weapons.AddItem(CreateTemplate_ChosenSniperRifle_T5()); + Weapons.AddItem(CreateTemplate_ChosenSniperPistol_T5()); + + + return Weapons; + + +} +static function X2DataTemplate CreateTemplate_ChosenRifle_T5() +{ + local X2WeaponTemplate Template; + + `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'ChosenRifle_T5'); + Template.WeaponPanelImage = "_BeamRifle"; // used by the UI. Probably determines iconview of the weapon. + + Template.WeaponCat = 'rifle'; + Template.WeaponTech = 'beam'; + Template.ItemCat = 'weapon'; + Template.strImage = "img:///UILibrary_Common.UI_BeamAssaultRifle.BeamAssaultRifle_Base"; + Template.EquipSound = "Beam_Weapon_Equip"; + Template.Tier = 5; + + Template.RangeAccuracy = class'X2Item_DefaultWeapons'.default.MEDIUM_BEAM_RANGE; + Template.BaseDamage = default.CHOSENRIFLE_T5_BASEDAMAGE; + Template.Aim = default.CHOSENRIFLE_T5_AIM; + Template.CritChance = default.CHOSENRIFLE_T5_CRITCHANCE; + Template.iClipSize = default.CHOSENRIFLE_T5_ICLIPSIZE; + Template.iSoundRange = default.CHOSENRIFLE_T5_ISOUNDRANGE; + Template.iEnvironmentDamage = default.CHOSENRIFLE_T5_IENVIRONMENTDAMAGE; + + Template.NumUpgradeSlots = 2; + + Template.InventorySlot = eInvSlot_PrimaryWeapon; + Template.Abilities.AddItem('StandardShot'); + Template.Abilities.AddItem('Overwatch'); + Template.Abilities.AddItem('OverwatchShot'); + Template.Abilities.AddItem('Reload'); + Template.Abilities.AddItem('HotLoadAmmo'); + + Template.GameArchetype = "WP_ChosenAssaultRifle.WP_ChosenAssaultRifle_T4"; + + Template.iPhysicsImpulse = 5; + Template.DamageTypeTemplateName = 'Projectile_MagAdvent'; + + return Template; +} + +static function X2DataTemplate CreateTemplate_WarlockM5_PsiWeapon() +{ + local X2WeaponTemplate Template; + + Template = X2WeaponTemplate(CreateTemplate_Warlock_PsiWeapon('WarlockM5_PsiWeapon')); + + return Template; +} + +static function X2DataTemplate CreateTemplate_ChosenShotgun_T5() +{ + local X2WeaponTemplate Template; + + `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'ChosenShotgun_T5'); + Template.WeaponPanelImage = "_BeamShotgun"; + + Template.ItemCat = 'weapon'; + Template.WeaponCat = 'shotgun'; + Template.WeaponTech = 'beam'; + Template.strImage = "img:///UILibrary_Common.UI_BeamShotgun.BeamShotgun_Base"; + Template.EquipSound = "Beam_Weapon_Equip"; + Template.Tier = 5; + + Template.RangeAccuracy = class'X2Item_DefaultWeapons'.default.SHORT_BEAM_RANGE; + Template.BaseDamage = default.CHOSENSHOTGUN_T5_BASEDAMAGE; + Template.Aim = default.CHOSENSHOTGUN_T5_AIM; + Template.CritChance = default.CHOSENSHOTGUN_T5_CRITCHANCE; + Template.iClipSize = default.CHOSENSHOTGUN_T5_ICLIPSIZE; + Template.iSoundRange = default.CHOSENSHOTGUN_T5_ISOUNDRANGE; + Template.iEnvironmentDamage = default.CHOSENSHOTGUN_T5_IENVIRONMENTDAMAGE; + Template.NumUpgradeSlots = 0; + + Template.InventorySlot = eInvSlot_PrimaryWeapon; + Template.Abilities.AddItem('StandardShot'); + Template.Abilities.AddItem('Overwatch'); + Template.Abilities.AddItem('OverwatchShot'); + Template.Abilities.AddItem('Reload'); + Template.Abilities.AddItem('HotLoadAmmo'); + + // This all the resources; sounds, animations, models, physics, the works. + Template.GameArchetype = "WP_ChosenShotgun.WP_ChosenShotgun_T4"; + + Template.iPhysicsImpulse = 5; + Template.fKnockbackDamageAmount = 10.0f; + Template.fKnockbackDamageRadius = 16.0f; + Template.DamageTypeTemplateName = 'Projectile_MagAdvent'; + + return Template; +} + +static function X2DataTemplate CreateTemplate_ChosenSword_T5() +{ + local X2WeaponTemplate Template; + + `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'ChosenSword_T5'); + Template.WeaponPanelImage = "_Pistol"; // used by the UI. Probably determines iconview of the weapon. + + Template.ItemCat = 'weapon'; + Template.WeaponCat = 'sword'; + Template.WeaponTech = 'beam'; + Template.strImage = "img:///UILibrary_Common.BeamSecondaryWeapons.BeamSword"; + Template.EquipSound = "Sword_Equip_Beam"; + Template.InventorySlot = eInvSlot_SecondaryWeapon; + Template.StowedLocation = eSlot_RightBack; + // This all the resources; sounds, animations, models, physics, the works. + Template.GameArchetype = "WP_ChosenSword.WP_ChosenSword_BM"; + Template.AddDefaultAttachment('R_Back', "BeamSword.Meshes.SM_BeamSword_Sheath", false); + Template.Tier = 5; + + Template.iRadius = 1; + Template.NumUpgradeSlots = 2; + Template.InfiniteAmmo = true; + Template.iPhysicsImpulse = 5; + + Template.iRange = 0; + Template.BaseDamage = default.CHOSENSWORD_T5_BASEDAMAGE; + Template.ExtraDamage = default.CHOSENSWORD_T5_EXTRADAMAGE; + Template.Aim = default.CHOSENSWORD_T5_AIM; + Template.CritChance = default.CHOSENSWORD_T5_CRITCHANCE; + Template.iSoundRange = default.CHOSENSWORD_T5_ISOUNDRANGE; + Template.iEnvironmentDamage = default.CHOSENSWORD_T5_IENVIRONMENTDAMAGE; + Template.BaseDamage.DamageType = 'Melee'; + + Template.Abilities.AddItem('PartingSilk'); + + Template.DamageTypeTemplateName = 'Melee'; + + return Template; +} + + + static function X2DataTemplate CreateTemplate_ChosenSniperRifle_T5() +{ + local X2WeaponTemplate Template; + + `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'ChosenSniperRifle_T5'); + Template.WeaponPanelImage = "_BeamSniperRifle"; + + Template.ItemCat = 'weapon'; + Template.WeaponCat = 'sniper_rifle'; + Template.WeaponTech = 'beam'; + Template.strImage = "img:///UILibrary_Common.UI_BeamSniper.BeamSniper_Base"; + Template.EquipSound = "Beam_Weapon_Equip"; + Template.Tier = 5; + + Template.RangeAccuracy = class'X2Item_DefaultWeapons'.default.LONG_BEAM_RANGE; + Template.BaseDamage = default.CHOSENSNIPERRIFLE_T5_BASEDAMAGE; + Template.Aim = default.CHOSENSNIPERRIFLE_T5_AIM; + Template.CritChance = default.CHOSENSNIPERRIFLE_T5_CRITCHANCE; + Template.iClipSize = default.CHOSENSNIPERRIFLE_T5_ICLIPSIZE; + Template.iSoundRange = default.CHOSENSNIPERRIFLE_T5_ISOUNDRANGE; + Template.iEnvironmentDamage = default.CHOSENSNIPERRIFLE_T5_IENVIRONMENTDAMAGE; + Template.NumUpgradeSlots = 0; + Template.iTypicalActionCost = 2; + + Template.InventorySlot = eInvSlot_PrimaryWeapon; + Template.Abilities.AddItem('HunterRifleShot'); + Template.Abilities.AddItem('SniperRifleOverwatch'); + Template.Abilities.AddItem('OverwatchShot'); + Template.Abilities.AddItem('Reload'); + Template.Abilities.AddItem('HotLoadAmmo'); + Template.Abilities.AddItem('TrackingShot'); + + // This all the resources; sounds, animations, models, physics, the works. + Template.GameArchetype = "WP_ChosenSniperRifle.WP_ChosenSniperRifle_T4"; + + Template.iPhysicsImpulse = 5; + Template.DamageTypeTemplateName = 'Projectile_MagAdvent'; + + return Template; +} + + + static function X2DataTemplate CreateTemplate_ChosenSniperPistol_T5() +{ + local X2WeaponTemplate Template; + + `CREATE_X2TEMPLATE(class'X2WeaponTemplate', Template, 'ChosenSniperPistol_T5'); + Template.WeaponPanelImage = "_Pistol"; // used by the UI. Probably determines iconview of the weapon. + + Template.ItemCat = 'weapon'; + Template.WeaponCat = 'pistol'; + Template.WeaponTech = 'beam'; + Template.strImage = "img:///UILibrary_Common.BeamSecondaryWeapons.BeamPistol"; + Template.EquipSound = "Secondary_Weapon_Equip_Beam"; + Template.Tier = 3; + + Template.iRange = default.CHOSENSNIPERPISTOL_RANGE; + Template.RangeAccuracy = class'X2Item_DefaultWeapons'.default.SHORT_MAGNETIC_RANGE; + Template.BaseDamage = default.CHOSENSNIPERPISTOL_T5_BASEDAMAGE; + Template.Aim = default.CHOSENSNIPERPISTOL_T5_AIM; + Template.CritChance = default.CHOSENSNIPERPISTOL_T5_CRITCHANCE; + Template.iClipSize = default.CHOSENSNIPERPISTOL_T5_ICLIPSIZE; + Template.iSoundRange = default.CHOSENSNIPERPISTOL_T5_ISOUNDRANGE; + Template.iEnvironmentDamage = default.CHOSENSNIPERPISTOL_T5_IENVIRONMENTDAMAGE; + + Template.NumUpgradeSlots = 0; + + Template.OverwatchActionPoint = class'X2CharacterTemplateManager'.default.PistolOverwatchReserveActionPoint; + Template.InfiniteAmmo = true; + + Template.InventorySlot = eInvSlot_SecondaryWeapon; + Template.Abilities.AddItem('PistolStandardShot'); + Template.Abilities.AddItem('PistolOverwatch'); + Template.Abilities.AddItem('PistolOverwatchShot'); + Template.Abilities.AddItem('Reload'); + Template.Abilities.AddItem('HotLoadAmmo'); + + Template.SetAnimationNameForAbility('FanFire', 'FF_FireMultiShotMagA'); + + // This all the resources; sounds, animations, models, physics, the works. + Template.GameArchetype = "WP_ChosenPistol.WP_ChosenPistol_T4"; + + Template.iPhysicsImpulse = 5; + Template.DamageTypeTemplateName = 'Projectile_MagAdvent'; + + Template.bHideClipSizeStat = true; + + return Template; +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_Coilguns.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_Coilguns.uc index 348b96da8..f8beffa3a 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_Coilguns.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_Coilguns.uc @@ -88,9 +88,9 @@ static function X2DataTemplate CreateAssaultRifle_Coil_Template() Template.GameArchetype = "LWAssaultRifle_CG.Archetypes.WP_AssaultRifle_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_AssaultRifle'; - Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_MagA"); - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_StockA"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_ReargripA"); + Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_MagA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_StockA"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight Template.InventorySlot = eInvSlot_PrimaryWeapon; @@ -139,9 +139,9 @@ static function X2DataTemplate CreateSMG_Coil_Template() Template.GameArchetype = "LWSMG_CG.Archetypes.WP_SMG_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_AssaultRifle'; - Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagA"); - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_StockA"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_ReargripA"); + Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_StockA"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight Template.InventorySlot = eInvSlot_PrimaryWeapon; @@ -188,10 +188,10 @@ static function X2DataTemplate CreateCannon_Coil_Template() Template.GameArchetype = "LWCannon_CG.Archetypes.WP_Cannon_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Cannon'; - Template.AddDefaultAttachment('Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_MagA"); - Template.AddDefaultAttachment('Stock', "LWCannon_CG.Meshes.LW_CoilCannon_StockA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_StockA"); + Template.AddDefaultAttachment('Mag', "LWCannon_CG.Meshes.LW_CoilCannon_MagA", , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_MagA"); + Template.AddDefaultAttachment('Stock', "LWCannon_CG.Meshes.LW_CoilCannon_StockA", , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_StockA"); Template.AddDefaultAttachment('StockSupport', "LWCannon_CG.Meshes.LW_CoilCannon_StockSupportA"); - Template.AddDefaultAttachment('Reargrip', "LWCannon_CG.Meshes.LW_CoilCannon_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilCannon_ReargripA"); + Template.AddDefaultAttachment('Reargrip', "LWCannon_CG.Meshes.LW_CoilCannon_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilCannon_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight Template.InventorySlot = eInvSlot_PrimaryWeapon; @@ -238,8 +238,8 @@ static function X2DataTemplate CreateShotgun_Coil_Template() Template.GameArchetype = "LWShotgun_CG.Archetypes.WP_Shotgun_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Shotgun'; - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_StockA"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilShotgun_ReargripA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_StockA"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilShotgun_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight Template.InventorySlot = eInvSlot_PrimaryWeapon; @@ -287,10 +287,10 @@ static function X2DataTemplate CreateSniperRifle_Coil_Template() Template.GameArchetype = "LWSniperRifle_CG.Archetypes.WP_SniperRifle_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_AssaultRifle'; - Template.AddDefaultAttachment('Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_MagA"); - Template.AddDefaultAttachment('Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticA"); - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_StockB"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_ReargripA"); + Template.AddDefaultAttachment('Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_MagA"); + Template.AddDefaultAttachment('Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_OpticA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_StockB"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight Template.InventorySlot = eInvSlot_PrimaryWeapon; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWHolotargeter.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWHolotargeter.uc index 2535cd6af..bafcb2b5e 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWHolotargeter.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWHolotargeter.uc @@ -6,17 +6,17 @@ //--------------------------------------------------------------------------------------- class X2Item_LWHolotargeter extends X2Item config(GameData_WeaponData); -//*****UI Image definitions***** +// ***** UI Image definitions  ***** var config string Holotargeter_CV_UIImage; var config string Holotargeter_MG_UIImage; var config string Holotargeter_BM_UIImage; -//*****Damagearraysforattackactions***** +// ***** Damage arrays for attack actions  ***** var config WeaponDamageValue Holotargeter_CONVENTIONAL_BASEDAMAGE; var config WeaponDamageValue Holotargeter_MAGNETIC_BASEDAMAGE; var config WeaponDamageValue Holotargeter_BEAM_BASEDAMAGE; -//*****Core properties and variablesforweapons***** +// ***** Core properties and variables for weapons ***** var config int Holotargeter_CONVENTIONAL_AIM; var config int Holotargeter_CONVENTIONAL_RADIUS; // used only for multitargeting ability var config int Holotargeter_CONVENTIONAL_CRITCHANCE; @@ -47,7 +47,7 @@ var config int Holotargeter_BEAM_ISUPPLIES; var config int Holotargeter_BEAM_TRADINGPOSTVALUE; var config int Holotargeter_BEAM_IPOINTS; -//*****Schematic properties***** +// ***** Schematic properties ***** var config int Holotargeter_MAGNETIC_SCHEMATIC_SUPPLYCOST; var config int Holotargeter_BEAM_SCHEMATIC_SUPPLYCOST; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWPistol.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWPistol.uc index bf7d8f03d..98b5731b1 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWPistol.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWPistol.uc @@ -65,7 +65,7 @@ static function X2DataTemplate CreateTemplate_LWPistol_Laser() Template.ItemCat = 'weapon'; Template.WeaponCat = 'pistol'; - Template.WeaponTech = 'pulse'; + Template.WeaponTech = 'laser_lw'; Template.strImage = "img:///UILibrary_LW_LaserPack.Inv_Laser_Pistol"; Template.EquipSound = "Secondary_Weapon_Equip_Magnetic"; Template.Tier = 2; @@ -120,8 +120,8 @@ static function X2DataTemplate CreateTemplate_LWPistol_Coil() Template.ItemCat = 'weapon'; Template.WeaponCat = 'pistol'; - Template.WeaponTech = 'magnetic'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Coil_Pistol"; + Template.WeaponTech = 'coilgun_lw'; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Coil_Pistol"; Template.EquipSound = "Secondary_Weapon_Equip_Magnetic"; Template.Tier = 4; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWUtilityItems.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWUtilityItems.uc index 233914aff..c0a74dc7b 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWUtilityItems.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Item_LWUtilityItems.uc @@ -60,7 +60,7 @@ static function X2DataTemplate CreateCeramicPlating() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'CeramicPlating'); Template.ItemCat = 'plating'; Template.InventorySlot = eInvSlot_Utility; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Flame_Sealant_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Flame_Sealant_512"; Template.EquipSound = "StrategyUI_Vest_Equip"; Template.Tier = 0; @@ -99,7 +99,7 @@ static function X2DataTemplate CreateCarapacePlating() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'CarapacePlating'); Template.ItemCat = 'plating'; Template.InventorySlot = eInvSlot_Utility; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Power_Armor512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Power_Armor512"; Template.EquipSound = "StrategyUI_Vest_Equip"; Template.Tier = 3; @@ -119,7 +119,7 @@ static function X2DataTemplate CreateChitinPlating() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'ChitinPlating'); Template.ItemCat = 'plating'; Template.InventorySlot = eInvSlot_Utility; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Heat_Absorption_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Heat_Absorption_512"; Template.EquipSound = "StrategyUI_Vest_Equip"; Template.Tier = 2; @@ -138,7 +138,7 @@ static function X2DataTemplate CreateChameleonSuit() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'ChameleonSuit'); Template.ItemCat = 'defense'; Template.InventorySlot = eInvSlot_Utility; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Tarantula_Suit_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Tarantula_Suit_512"; Template.EquipSound = "StrategyUI_Vest_Equip"; Template.Tier = 2; @@ -156,7 +156,7 @@ static function X2AmmoTemplate CreateStilettoRounds() local WeaponDamageValue DamageValue; `CREATE_X2TEMPLATE(class'X2AmmoTemplate', Template, 'StilettoRounds'); - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Stiletto_Rounds_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Stiletto_Rounds_512"; Template.EquipSound = "StrategyUI_Ammo_Equip"; Template.Tier = 2; Template.InventorySlot = eInvSlot_Utility; @@ -185,7 +185,7 @@ static function X2DataTemplate CreateNeurowhip() Template.InventorySlot = eInvSlot_Utility; Template.CanBeBuilt = true; Template.EquipSound = "StrategyUI_Mindshield_Equip"; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Neurowhip"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Neurowhip"; Template.Abilities.AddItem('Neurowhip_Ability'); Template.SetUIStatMarkup(class'XLocalizedData'.default.PsiOffenseLabel, eStat_PsiOffense, default.NEUROWHIP_PSI_BONUS); @@ -201,7 +201,7 @@ static function X2AmmoTemplate CreateFalconRounds() local WeaponDamageValue DamageValue; `CREATE_X2TEMPLATE(class'X2AmmoTemplate', Template, 'FalconRounds'); - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Falcon_Rounds_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Falcon_Rounds_512"; Template.EquipSound = "StrategyUI_Ammo_Equip"; Template.Tier = 2; Template.InventorySlot = eInvSlot_Utility; @@ -253,7 +253,7 @@ static function X2AmmoTemplate CreateRedScreenRounds() local X2Effect_PersistentStatChange HackDefenseEffect; `CREATE_X2TEMPLATE(class'X2AmmoTemplate', Template, 'RedscreenRounds'); - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Redscreen_Rounds_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Redscreen_Rounds_512"; Template.EquipSound = "StrategyUI_Ammo_Equip"; Template.Tier = 2; Template.InventorySlot = eInvSlot_Utility; @@ -287,7 +287,7 @@ static function X2AmmoTemplate CreateNeedleRounds() local WeaponDamageValue DamageValue; `CREATE_X2TEMPLATE(class'X2AmmoTemplate', Template, 'NeedleRounds'); - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_Needle_Rounds_512"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_Needle_Rounds_512"; Template.EquipSound = "StrategyUI_Ammo_Equip"; Template.Tier = 2; Template.InventorySlot = eInvSlot_Utility; @@ -323,7 +323,7 @@ static function X2DataTemplate CreateHighPressureTanks() Template.WeaponCat = 'heavyammo'; Template.ItemCat = 'weapon'; Template.InventorySlot = eInvSlot_HeavyWeapon; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_HighPressureTanks"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_HighPressureTanks"; Template.EquipSound = "StrategyUI_Heavy_Weapon_Equip"; Template.Abilities.AddItem ('HighPressure'); Template.CanBeBuilt = false; @@ -342,7 +342,7 @@ static function X2DataTemplate CreateExtraRocket() Template.WeaponCat = 'heavyammo'; Template.ItemCat = 'weapon'; Template.InventorySlot = eInvSlot_HeavyWeapon; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_ExtraRocket"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.Inv_ExtraRocket"; Template.EquipSound = "StrategyUI_Heavy_Weapon_Equip"; Template.Abilities.AddItem ('ShockAndAwe'); Template.CanBeBuilt = false; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWAbilitiesModTemplate.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWAbilitiesModTemplate.uc index 9b4fc9824..bcb1c3643 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWAbilitiesModTemplate.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWAbilitiesModTemplate.uc @@ -44,10 +44,16 @@ var config int MIND_SCORCH_BURNING_BASE_DAMAGE; var config int MIND_SCORCH_BURNING_DAMAGE_SPREAD; var config int MIND_SCORCH_BURN_CHANCE; +var config int SUSTAIN_WOUND_HP_REDUCTTION; + var config float CHOSEN_REGENERATION_HEAL_VALUE_PCT; var config array PISTOL_ABILITY_WEAPON_CATS; +var config int PLATED_CRITDEF_BONUS; + +var config int COMBAT_PROTOCOL_COOLDOWN; + // Data structure for multi-shot abilities that need patching struct MultiShotAbility { @@ -57,6 +63,7 @@ struct MultiShotAbility var config bool USE_LOS_FOR_MULTI_SHOT_ABILITIES; var config array MULTI_SHOT_ABILITIES; +var config array MELEE_ABILITIES_FOR_BLOODTHIRST; var privatewrite X2Condition_Visibility GameplayVisibilityCondition; @@ -105,11 +112,18 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) UpdatePurifierFlamethrower(Template); break; case 'Fuse': - class'Helpers_LW'.static.MakeFreeAction(Template); + //class'Helpers_LW'.static.MakeFreeAction(Template); + MakeFuseNonTurnEnding(Template); break; case 'PriestStasis': MakeAbilityNonTurnEnding(Template); MakeAbilitiesUnusableOnLost(Template); + MakeAbilityHostile(Template); + break; + case 'HunterGrapple': + case 'Grapple': + case 'PoweredGrapple': + AddGrappledThisTurnEffect(Template); break; case 'Solace': RemoveRoboticsAsValidTargetsOfSolace(Template); @@ -179,24 +193,20 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) case 'VanishingWindReveal': Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; break; - case 'ShadowStep': //Make these exclusive for chosen - Template.ChosenExcludeTraits.AddItem('LightningReflexes_LW'); - break; - case 'LightningReflexes_LW': - Template.ChosenExcludeTraits.AddItem('ShadowStep'); - break; - case 'Slash_LW': - case 'SwordSlice_LW': - case 'CombativesCounterattack': - Template.PostActivationEvents.AddItem('SlashActivated'); + case 'ChosenAllSeeing': + Template.ChosenExcludeTraits.Length = 0; break; case 'DisruptorRifleCrit': Template.bDisplayInUITooltip = true; Template.bDisplayInUITacticalText = true; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_aim"; break; case 'ChosenRegenerate': UpdateChosenRegenerate(Template); break; + case 'TrackingShot': + class'Helpers_LW'.static.MakeFreeAction(Template); + break; case 'HarborWave': ReworkHarborWave(Template); break; @@ -220,6 +230,18 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) case 'SteadyHands': FixSteadyHands(Template); break; + case 'HackRewardControlRobot_Permanent_Fuller_Override': + PatchFullerOverride(Template); + break; + case 'PlatedVestBonus': + AddCritResistanceToPlatedVests(Template); + break; + case 'SpectralStunLance': + UpdateSpectralStunLance(Template); + break; + case 'CombatProtocol': + UpdateCombatProtocol(Template); + break; default: break; @@ -240,6 +262,23 @@ static function UpdateAbilities(X2AbilityTemplate Template, int Difficulty) // Handle multi-shot abilities UpdateMultiShotAbility(Template); + UpdateMeleeAbilityForBloodThirst(Template); +} + + + +static function UpdateMeleeAbilityForBloodThirst(X2AbilityTemplate Template) +{ + local name AbilityName; + + foreach default.MELEE_ABILITIES_FOR_BLOODTHIRST(AbilityName) + { + if(Template.Dataname == AbilityName) + { + Template.PostActivationEvents.AddItem('SlashActivated'); + return; + } + } } static function bool OverrideFinalHitChance(X2AbilityToHitCalc AbilityToHitCalc, out ShotBreakdown ShotBreakdown) @@ -579,6 +618,7 @@ static function ReplaceWithDamageReductionExplosive(X2AbilityTemplate Template) PaddingEffect = new class'X2Effect_Formidable'; PaddingEffect.ExplosiveDamageReduction = default.EXPLOSIVE_DAMAGE_REDUCTION; PaddingEffect.Armor_Mitigation = 0; + PaddingEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, , , Template.AbilitySourceName); Template.AddTargetEffect(PaddingEffect); } @@ -721,6 +761,17 @@ static function RemoveRoboticsAsValidTargetsOfSolaceCleanse(X2AbilityTemplate Te local X2Effect_RemoveEffects RemoveEffects; local X2Condition_UnitProperty UnitCondition; local int i, j; + local X2AbilityTrigger_EventListener EventListener; + + //Tedster - swap ELR to a final one for a bit of a performance boost. + Template.AbilityTriggers.Length=0; + + EventListener = new class'X2AbilityTrigger_EventListener'; + EventListener.ListenerData.Deferral = ELD_OnStateSubmitted; + EventListener.ListenerData.EventID = 'UnitMoveFinished'; + EventListener.ListenerData.Filter = eFilter_None; + EventListener.ListenerData.EventFn = class'X2Ability_PerkPackAbilitySet2'.static.SolaceBastionCleanseListener; // keep this, since it's generically just calling the associate ability + Template.AbilityTriggers.AddItem(EventListener); for (i = 0; i < Template.AbilityTargetEffects.Length; i++) { @@ -751,7 +802,7 @@ static function RemoveTheDeathFromHolyWarriorDeath(X2AbilityTemplate Template) static function UpdateSustainEffect(X2AbilityTemplate Template) { local X2Effect_Sustain_LW SustainEffect; - + local X2Effect_GreaterPadding GreaterPaddingEffect; class'Helpers_LW'.static.RemoveAbilityTargetEffects(Template,'X2Effect_Sustain'); SustainEffect = new class'X2Effect_Sustain_LW'; @@ -759,6 +810,13 @@ static function UpdateSustainEffect(X2AbilityTemplate Template) SustainEffect.EffectName='Sustain'; SustainEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,, Template.AbilitySourceName); Template.AddTargetEffect(SustainEffect); + + GreaterPaddingEffect = new class 'X2Effect_GreaterPadding'; + GreaterPaddingEffect.BuildPersistentEffect (1, true, false); + GreaterPaddingEffect.Padding_HealHP = default.SUSTAIN_WOUND_HP_REDUCTTION; + + Template.AddTargetEffect(GreaterPaddingEffect); + } static function UseNewDeadeyeEffect(X2AbilityTemplate Template) @@ -924,6 +982,13 @@ static function ReworkMindScorch(X2AbilityTemplate Template) local X2Effect_Burning BurningEffect; local X2Effect_ApplyWeaponDamage DamageEffect; local array SkipExclusions; + local X2AbilityCooldown_MindScorch Cooldown; + + + Cooldown = new class'X2AbilityCooldown_MindScorch'; + Cooldown.iNumTurns = class'X2Ability_ChosenWarlock'.default.MINDSCORCH_COOLDOWN_LOCAL; + Cooldown.NumGlobalTurns = class'X2Ability_ChosenWarlock'.default.MINDSCORCH_COOLDOWN_GLOBAL; + Template.AbilityCooldown = Cooldown; ShooterCondition = new class'X2Condition_UnitProperty'; ShooterCondition.ExcludeConcealed = true; @@ -1050,6 +1115,7 @@ static function ReworkPartingSilk(X2AbilityTemplate Template) if (Condition.IsA('X2Condition_UnitProperty')) { X2Condition_UnitProperty(Condition).RequireUnitSelectedFromHQ = false; + X2Condition_UnitProperty(Condition).ExcludeRobotic = false; } } @@ -1085,19 +1151,26 @@ static function BuffTeleportAlly(X2AbilityTemplate Template) Template.AddTargetEffect(ReactionEffect); */ } +//For whatever reason effects and unit value don't seem to be working +static function AddGrappledThisTurnEffect(X2AbilityTemplate Template) +{ + local AdditionalCooldownInfo CooldownInfo; + CooldownInfo.AbilityName = 'TrackingShotMark'; + CooldownInfo.NumTurns = 1; + + Template.AbilityCooldown.AditionalAbilityCooldowns.AddItem(CooldownInfo); + +} + static function UpdateSummon(X2AbilityTemplate Template) { - local X2AbilityCooldown Cooldown; Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; - class'Helpers_LW'.static.RemoveAbilityShooterEffects(Template,'X2Effect_SetUnitValue'); - class'Helpers_LW'.static.RemoveAbilityShooterConditions(Template, 'X2Condition_UnitValue'); + //class'Helpers_LW'.static.RemoveAbilityShooterEffects(Template,'X2Effect_SetUnitValue'); + //class'Helpers_LW'.static.RemoveAbilityShooterConditions(Template, 'X2Condition_UnitValue'); - - Cooldown = new class'X2AbilityCooldown'; - Cooldown.iNumTurns = default.SUMMON_COOLDOWN; - Template.AbilityCooldown = Cooldown; + class'Helpers_LW'.static.RemoveAbilityShooterConditions(Template, 'X2Condition_BattleState'); Template.BuildNewGameStateFn = class'X2Ability_LW_ChosenAbilities'.static.ChosenSummonFollowers_BuildGameState; Template.BuildVisualizationFn = class'X2Ability_LW_ChosenAbilities'.static.ChosenSummonFollowers_BuildVisualization; @@ -1144,7 +1217,7 @@ static function UpdateChosenRegenerate(X2AbilityTemplate Template) static function ReworkHarborWave(X2AbilityTemplate Template) { - local X2Effect_ApplyWeaponDamage DamageEffect; + local X2Effect_ApplyHarborWaveDamage DamageEffect; Template.AbilityToHitCalc = new class'X2AbilityToHitCalc_DeadEye'; @@ -1153,7 +1226,7 @@ static function ReworkHarborWave(X2AbilityTemplate Template) class'Helpers_LW'.static.RemoveAbilityMultiTargetEffects(Template, 'X2Effect_ApplyWeaponDamage'); class'Helpers_LW'.static.RemoveAbilityMultiTargetEffects(Template, 'X2Effect_Knockback'); - DamageEffect = new class'X2Effect_ApplyWeaponDamage'; + DamageEffect = new class'X2Effect_ApplyHarborWaveDamage'; DamageEffect.bIgnoreArmor = true; Template.AddMultiTargetEffect(DamageEffect); @@ -1171,10 +1244,27 @@ static function MakeAbilityWorkWhenBurning(X2AbilityTemplate Template) static function AddQuickdrawMobilityBoost(X2AbilityTemplate Template) { - Template. AdditionalAbilities.AddItem('QuickdrawMobilityIncrease'); + Template.AdditionalAbilities.AddItem('QuickdrawMobilityIncrease'); } +static function MakeFuseNonTurnEnding(X2AbilityTemplate Template) +{ + local int i; + local X2AbilityCost_ActionPoints ActionPointCost; + + for(i = 0; i < Template.AbilityCosts.Length; i++) + { + ActionPointCost = X2AbilityCost_ActionPoints(Template.AbilityCosts[i]); + + if(ActionPointCost != none) + { + ActionPointCost.bConsumeAllPoints=false; + break; + } + } +} + static function AddDisablingShotEffect(X2AbilityTemplate Template) { local X2Effect_DisableWeapon DisableWeaponEffect; @@ -1187,6 +1277,10 @@ static function AddDisablingShotEffect(X2AbilityTemplate Template) DisableWeaponEffect.TargetConditions.AddItem(AbilityCondition); Template.AddTargetEffect(DisableWeaponEffect); + if(Template.DataName == 'FaceOff') + { + Template.AddMultiTargetEffect(DisableWeaponEffect); + } } static function DisplayMindShieldPassive(X2AbilityTemplate Template) @@ -1261,6 +1355,23 @@ static function FixSteadyHands(X2AbilityTemplate Template) } } +// Here in case Fuller Override doesn't actually update +static function PatchFullerOverride(X2AbilityTemplate Template) +{ + local X2Effect Effect; + local X2Effect_MindControl MindControlEffect; + + foreach Template.AbilityTargetEffects (Effect) + { + MindControlEffect = X2Effect_MindControl(Effect); + if(MindControlEffect != none) + { + MindControlEffect.EffectName = 'FullOverride'; + MindControlEffect.EffectTickedVisualizationFn = none; + } + } +} + // Patches any multi-shot abilities that are configured in the // MULTI_SHOT_ABILITIES config. static function UpdateMultiShotAbility(X2AbilityTemplate Template) @@ -1369,6 +1480,65 @@ static function name GetMultiShotContinueUnitValueName(name AbilityName) return name(AbilityName $ "Continue"); } +static function MakeAbilityHostile(X2AbilityTemplate Template) +{ + Template.Hostility = eHostility_Offensive; +} + +static function AddCritResistanceToPlatedVests(X2AbilityTemplate Template) +{ + local X2Effect_Resilience CritDefEffect; + + CritDefEffect = new class'X2Effect_Resilience'; + CritDefEffect.CritDef_Bonus = default.PLATED_CRITDEF_BONUS; + CritDefEffect.BuildPersistentEffect (1, true, false, false); + Template.AddTargetEffect(CritDefEffect); +} + +static function UpdateSpectralStunLance(X2AbilityTemplate Template) +{ + local X2Effect_ApplyWeaponDamage WeaponDamageEffect; + local X2Effect_ImmediateAbilityActivation ImpairingAbilityEffect; + + + // nuke the existing effects + Template.AbilityTargetEffects.Length = 0; + + // re-add the weapon damage effect, and the Stun Lancer's normal stun effect instead. + WeaponDamageEffect = new class'X2Effect_ApplyWeaponDamage'; + WeaponDamageEffect.DamageTypes.AddItem('Electrical'); + Template.AddTargetEffect(WeaponDamageEffect); + + ImpairingAbilityEffect = new class 'X2Effect_ImmediateAbilityActivation'; + ImpairingAbilityEffect.BuildPersistentEffect(1, false, true, , eGameRule_PlayerTurnBegin); + ImpairingAbilityEffect.EffectName = 'ImmediateStunImpair'; + ImpairingAbilityEffect.AbilityName = 'StunImpairingAbility'; + ImpairingAbilityEffect.bRemoveWhenTargetDies = true; + ImpairingAbilityEffect.VisualizationFn = class'X2Ability_StunLancer'.static.ImpairingAbilityEffectTriggeredVisualization; + Template.AddTargetEffect(ImpairingAbilityEffect); + +} + +static function UpdateCombatProtocol(X2AbilityTemplate Template) +{ + local X2AbilityCost_ActionPoints ActionPointCost; + local X2AbilityCooldown Cooldown; + + Template.AbilityCosts.Length = 0; + Template.AbilityCharges = none; + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + ActionPointCost.bFreeCost = false; + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + Cooldown = new class'X2AbilityCooldown'; + Cooldown.iNumTurns = default.COMBAT_PROTOCOL_COOLDOWN; + Template.AbilityCooldown = Cooldown; + +} + defaultproperties { AbilityTemplateModFn=UpdateAbilities diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_FullOutpostJobBuckets.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_FullOutpostJobBuckets.uc index 107422642..377399b54 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_FullOutpostJobBuckets.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_FullOutpostJobBuckets.uc @@ -31,10 +31,12 @@ simulated function bool MeetsCondition(X2LWActivityCreation ActivityCreation, XC if (FullRetal) { BucketSize += OutPostState.TotalResistanceBucket; + `LWTrace("Adding" @OutPostState.TotalResistanceBucket @ "to full retal bucket."); } else { BucketSize += OutPostState.GetJobBucketForJob (Job); + `LWTrace("Adding" @ OutPostState.GetJobBucketForJob(Job) @ "to" @ Job @ "retal bucket."); } ContactedRegions += 1; } @@ -44,7 +46,7 @@ simulated function bool MeetsCondition(X2LWActivityCreation ActivityCreation, XC LiberatedRegions += 1; } } - + `LWTrace("Bucket size pre adjustments:" @BucketSize); BucketSize = BucketSize * (default.CONTACTED_REGIONS_BASE_BUCKET_MOD ** (ContactedRegions - 1)); BucketSize = Bucketsize * (default.LIBERATED_REGIONS_BASE_BUCKET_MOD ** (LiberatedRegions)); `LWTRACE ("Testing for Retalbucket (post adjustment):" @ (FullRetal ? "Full" : string(Job)) @ "Condition passed if" @ BucketSize @ ">=" @ RequiredDays); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_MinLiberatedRegionsLegendary.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_MinLiberatedRegionsLegendary.uc new file mode 100644 index 000000000..3d4249fa1 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityCondition_MinLiberatedRegionsLegendary.uc @@ -0,0 +1,48 @@ +//--------------------------------------------------------------------------------------- +// FILE: X2LWActivityCondition_MinLiberatedRegionsLegendary +// AUTHOR: Tedster - modified from JohnnyLump / Pavonis Interactive +// PURPOSE: Conditionals on the number of liberated regions that only applies to Legendary +//--------------------------------------------------------------------------------------- +class X2LWActivityCondition_MinLiberatedRegionsLegendary extends X2LWActivityCondition; + +var int MaxAlienRegions; + +simulated function bool MeetsCondition(X2LWActivityCreation ActivityCreation, XComGameState NewGameState) +{ + + //local int LiberatedRegions, NumRegions + local int AlienRegions; + local XComGameState_WorldRegion Region; + local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + //LiberatedRegions = 0; + AlienRegions = 0; + //NumRegions = 0; + + // If campaign isn't on Legendary, abort + if(`STRATEGYDIFFICULTYSETTING < 3) + { + return true; + } + + + foreach `XCOMHISTORY.IterateByClassType(class'XComGameState_WorldRegion', Region) + { + //NumRegions += 1; + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(Region, NewGameState); + if (!RegionalAI.bLiberated) + //{ + //LiberatedRegions += 1; + //} + //else + { + AlienRegions += 1; + } + } + + //`LWTRACE ("Foothold Test: Liberated:" @ string(LiberatedRegions) @ "MaxAlienRegions (to fire activity):" @ string (MaxAlienRegions) @ "NumRegions:" @ string (NumRegions)); + + if (AlienRegions <= MaxAlienRegions) + return true; + + return false; +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityDetectionCalc.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityDetectionCalc.uc index 867b9e0f7..93c7f19fd 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityDetectionCalc.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWActivityDetectionCalc.uc @@ -13,6 +13,10 @@ var config array FORCE_LEVEL_DETECTION_MODIFIER_VETERAN; var config array FORCE_LEVEL_DETECTION_MODIFIER_COMMANDER; var config array FORCE_LEVEL_DETECTION_MODIFIER_LEGENDARY; +var config bool BOOST_EARLY_DETECTION; +var config float EARLY_DETECTION_CHANCE_BOOST; +var config int EARLY_DETECTION_DAYS; + struct DetectionModifierInfo { var float Value; @@ -126,6 +130,10 @@ function float GetDetectionChance(XComGameState_LWAlienActivity ActivityState, X local XComGameState_WorldRegion RegionState; local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + local TDateTime GameStartDate; + local int TimeToDays; + local int DiffInHours; + ResourcePool = ActivityState.MissionResourcePool; if (ActivityTemplate.RequiredRebelMissionIncome > 0) ResourcePool -= ActivityTemplate.RequiredRebelMissionIncome; @@ -156,10 +164,33 @@ function float GetDetectionChance(XComGameState_LWAlienActivity ActivityState, X default: break; } } + `LWTrace("GetDetectionChance: DetectionChance pre-early boost:" @DetectionChance); + + // New early campaign detection chance boost system + if(default.BOOST_EARLY_DETECTION) + { + class'X2StrategyGameRulesetDataStructures'.static.SetTime( GameStartDate, 0, 0, 0, + class'X2StrategyGameRulesetDataStructures'.default.START_MONTH, + class'X2StrategyGameRulesetDataStructures'.default.START_DAY, + class'X2StrategyGameRulesetDataStructures'.default.START_YEAR ); + + // Compares date the activity was started to start date. + TimeToDays = class'X2StrategyGameRulesetDataStructures'.static.DifferenceInDays( ActivityState.DateTimeStarted, GameStartDate ); + + //If we're within the time period, boost the detection. + if(TimeToDays <= default.EARLY_DETECTION_DAYS) + { + DiffInHours = class'X2StrategyGameRulesetDataStructures'.static.DifferenceInHours(class'XComGameState_GeoscapeEntity'.static.GetCurrentTime(), ActivityState.DateTimeStarted); + DetectionChance += (default.EARLY_DETECTION_CHANCE_BOOST * ((1+DiffInHours)/24.0)); + } + } + + `LWTrace("GetDetectionChance: DetectionChance post early boost:" @DetectionChance); //normalize for update rate DetectionChance *= float(class'X2LWAlienActivityTemplate'.default.HOURS_BETWEEN_ALIEN_ACTIVITY_DETECTION_UPDATES) / 24.0; + //`LWTrace("GetDetectionChance: DetectionChance post normaliation for tick rate:" @DetectionChance); return DetectionChance; } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCharactersModTemplate.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCharactersModTemplate.uc index 6e55fc2a0..e64c624f1 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCharactersModTemplate.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCharactersModTemplate.uc @@ -38,6 +38,7 @@ static function UpdateCharacters(X2CharacterTemplate Template, int Difficulty) case'ChosenAssassinM2': case'ChosenAssassinM3': case'ChosenAssassinM4': + case'ChosenAssassinM5': Template.SightedEvents.AddItem('ChosenSighted'); Template.SightedEvents.AddItem('AssassinSighted'); break; @@ -45,6 +46,7 @@ static function UpdateCharacters(X2CharacterTemplate Template, int Difficulty) case'ChosenWarlockM2': case'ChosenWarlockM3': case'ChosenWarlockM4': + case'ChosenWarlockM5': Template.SightedEvents.AddItem('ChosenSighted'); Template.SightedEvents.AddItem('WarlockSighted'); break; @@ -52,6 +54,7 @@ static function UpdateCharacters(X2CharacterTemplate Template, int Difficulty) case'ChosenHunterM2': case'ChosenHunterM3': case'ChosenHunterM4': + case'ChosenHunterM5': Template.SightedEvents.AddItem('ChosenSighted'); Template.SightedEvents.AddItem('HunterSighted'); break; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCovertActionsModTemplate.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCovertActionsModTemplate.uc index 8ca11e878..80469e18e 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCovertActionsModTemplate.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2LWCovertActionsModTemplate.uc @@ -54,6 +54,8 @@ static function UpdateCovertActions(X2StrategyElementTemplate Template, int Diff case 'CovertAction_ResistanceContact': case 'CovertAction_RecruitRebels': case 'CovertAction_SharedAbilityPoints': + case 'CovertAction_BigSupplyDepot': + case 'CovertAction_FindAdventDetachment': ConfigureModerateCovertAction(CATemplate); break; case 'CovertAction_ImproveComInt': diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionNarrative_LWNarrativeSet.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionNarrative_LWNarrativeSet.uc index 88c52a341..e9cea13e0 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionNarrative_LWNarrativeSet.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionNarrative_LWNarrativeSet.uc @@ -56,7 +56,10 @@ static function array CreateTemplates() Templates.AddItem(AddDefaultSupplyConvoyMissionNarrativeTemplate()); Templates.AddItem(AddDefaultRecruitRaidMissionNarrativeTemplate()); Templates.AddItem(AddDefaultSmashNGrabMissionNarrativeTemplate()); + //Templates.AddItem(AddDefaultBigSmashNGrabMissionNarrativeTemplate()); Templates.AddItem(AddSupplyExtractionMissionNarrativeTemplate()); + Templates.AddItem(AddBigSupplyExtractionMissionNarrativeTemplate()); + Templates.AddItem(AddCovertOpsTroopManeuversNarrativeTemplate()); return Templates; } @@ -130,6 +133,25 @@ static function X2MissionNarrativeTemplate AddTroopManeuversNarrativeTemplate() return Template; } +static function X2MissionNarrativeTemplate AddCovertOpsTroopManeuversNarrativeTemplate() +{ + local X2MissionNarrativeTemplate Template; + + `CREATE_X2MISSIONNARRATIVE_TEMPLATE(Template, 'DefaultCovertOpsTroopManeuvers_LW'); + + Template.MissionType="CovertOpsTroopManeuvers_LW"; + Template.NarrativeMoments[0]="X2NarrativeMoments.TACTICAL.General.CEN_Gen_AreaSecured_02"; + Template.NarrativeMoments[1]="X2NarrativeMoments.TACTICAL.General.GenTactical_SecureRetreat"; + Template.NarrativeMoments[2]="X2NarrativeMoments.TACTICAL.General.GenTactical_ConsiderRetreat"; + Template.NarrativeMoments[3]="X2NarrativeMoments.TACTICAL.General.GenTactical_PartialEVAC"; + Template.NarrativeMoments[4]="X2NarrativeMoments.TACTICAL.General.GenTactical_FullEVAC"; + Template.NarrativeMoments[5]="X2NarrativeMoments.TACTICAL.General.GenTactical_SquadWipe"; + Template.NarrativeMoments[6]="X2NarrativeMoments.TACTICAL.General.GenTactical_MissionExtroFailure"; + Template.NarrativeMoments[7]="X2NarrativeMoments.TACTICAL.General.GenTactical_MissionExtroTotalSuccess"; + + return Template; +} + static function X2MissionNarrativeTemplate AddRendezvousMissionNarrativeTemplate() { local X2MissionNarrativeTemplate Template; @@ -1205,6 +1227,27 @@ static function X2MissionNarrativeTemplate AddDefaultSmashNGrabMissionNarrativeT return Template; } +static function X2MissionNarrativeTemplate AddDefaultBigSmashNGrabMissionNarrativeTemplate() +{ + local X2MissionNarrativeTemplate Template; + + `CREATE_X2MISSIONNARRATIVE_TEMPLATE(Template, 'DefaultBigSmashNGrab_LW'); + + Template.MissionType = "Ted_BigSmashNGrab_LW"; + + Template.NarrativeMoments[0]="X2NarrativeMoments.TACTICAL.General.GenTactical_SecureRetreat"; + Template.NarrativeMoments[1]="X2NarrativeMoments.TACTICAL.General.GenTactical_ConsiderRetreat"; + Template.NarrativeMoments[2]="X2NarrativeMoments.TACTICAL.General.GenTactical_PartialEVAC"; + Template.NarrativeMoments[3]="X2NarrativeMoments.TACTICAL.General.GenTactical_FullEVAC"; + Template.NarrativeMoments[4]="X2NarrativeMoments.TACTICAL.General.GenTactical_SquadWipe"; + Template.NarrativeMoments[5]="X2NarrativeMoments.TACTICAL.General.GenTactical_MissionExtroFailure"; + Template.NarrativeMoments[6]="X2NarrativeMoments.TACTICAL.General.GenTactical_MissionExtroTotalSuccess"; + Template.NarrativeMoments[7]="X2NarrativeMoments.TACTICAL.Recover.SKY_RecoGEN_ItemSecured"; + Template.NarrativeMoments[8]="X2NarrativeMoments.TACTICAL.RescueVIP.Central_Rescue_VIP_EvacDestroyed"; + + return Template; +} + static function X2MissionNarrativeTemplate AddSupplyExtractionMissionNarrativeTemplate() { local X2MissionNarrativeTemplate Template; @@ -1234,3 +1277,33 @@ static function X2MissionNarrativeTemplate AddSupplyExtractionMissionNarrativeTe return Template; } + +static function X2MissionNarrativeTemplate AddBigSupplyExtractionMissionNarrativeTemplate() +{ + local X2MissionNarrativeTemplate Template; + + `CREATE_X2MISSIONNARRATIVE_TEMPLATE(Template, 'BigSupplyExtraction_LW'); + + Template.MissionType = "BigSupplyExtraction_LW"; + + Template.NarrativeMoments[0]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_XCOM_Taking_Losses"; + Template.NarrativeMoments[1]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_XCOM_Marked_First_Crate"; + Template.NarrativeMoments[2]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_XCOM_Marked_ADVENT_crate"; + Template.NarrativeMoments[3]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Supplies_Recovered_Heavy_Losses"; + Template.NarrativeMoments[4]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Squad_Wiped"; + Template.NarrativeMoments[5]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_No_Supplies_Recovered"; + Template.NarrativeMoments[6]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_No_Additional_Enemies"; + Template.NarrativeMoments[7]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Mission_Complete"; + Template.NarrativeMoments[8]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Mission_Aborted"; + Template.NarrativeMoments[9]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Late_Crate_Recovered"; + Template.NarrativeMoments[10]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Intro"; + Template.NarrativeMoments[11]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_First_Crate_Sighted"; + Template.NarrativeMoments[12]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_First_Crate_Recovered"; + Template.NarrativeMoments[13]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_Dont_Destroy_Crates"; + Template.NarrativeMoments[14]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_ADVENT_Marked_More_Crates"; + Template.NarrativeMoments[15]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_ADVENT_Marked_LoS_Crate"; + Template.NarrativeMoments[16]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_ADVENT_Marked_First_Crates"; + Template.NarrativeMoments[17]="XPACK_NarrativeMoments.X2_XP_CEN_T_Supply_Extract_ADVENT_Airlifted_First_Crate"; + + return Template; +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionSet_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionSet_LW.uc index 10a3c6706..4ce22a09a 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionSet_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2MissionSet_LW.uc @@ -29,7 +29,9 @@ static function array CreateTemplates() Templates.AddItem(AddMissionTemplate('NeutralizeTarget_LW')); Templates.AddItem(AddMissionTemplate('NeutralizeTargetVehicle_LW')); Templates.AddItem(AddMissionTemplate('SmashNGrab_LW')); + //Templates.AddItem(AddMissionTemplate('BigSmashNGrab_LW')); Templates.AddItem(AddMissionTemplate('SupplyExtraction_LW')); + Templates.AddItem(AddMissionTemplate('BigSupplyExtraction_LW')); Templates.AddItem(AddMissionTemplate('AssaultNetworkTower_LW')); // used in ProtectRegion / Liberation chain @@ -46,6 +48,7 @@ static function array CreateTemplates() Templates.AddItem(AddMissionTemplate('AvengerDefense_LW')); Templates.AddItem(AddMissionTemplate('TroopManeuvers_LW')); + Templates.AddItem(AddMissionTemplate('CovertOpsTroopManeuvers_LW')); Templates.AddItem(AddMissionTemplate('AssaultAlienBase_LW')); Templates.AddItem(AddMissionTemplate('Jailbreak_LW')); Templates.AddItem(AddMissionTemplate('Invasion_LW')); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultAlienActivities.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultAlienActivities.uc index 93998d9ad..eb665803e 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultAlienActivities.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultAlienActivities.uc @@ -83,6 +83,7 @@ var config int PROPAGANDA_ADJACENT_VIGILANCE_RAND; var config int PROTECT_RESEARCH_REGIONAL_COOLDOWN_HOURS_MIN; var config int PROTECT_RESEARCH_REGIONAL_COOLDOWN_HOURS_MAX; +var config int PROTECT_RESEARCH_FIRST_MONTH_POSSIBLE; var config int PROTECT_DATA_REGIONAL_COOLDOWN_HOURS_MIN; var config int PROTECT_DATA_REGIONAL_COOLDOWN_HOURS_MAX; @@ -168,6 +169,7 @@ var config int RECRUIT_RAID_BUCKET; var config int ALIEN_BASE_DOOM_REMOVAL; +var config int CHOSEN_KNOWLEDGE_GAIN_MISSIONS; var config int CHOSEN_ACTIVATE_AT_FL; var config array CHOSEN_LEVEL_FL_THRESHOLDS; @@ -178,6 +180,8 @@ var localized string m_strInsufficientRebels; var config int COINOPS_MIN_VIGILANCE; var config int COINOPS_MIN_ALERT; +var config int BIGSUPPLYEXTRACTION_MAX_ALERT; + //helpers for checking for name typos var name ProtectRegionEarlyName; var name ProtectRegionMidName; @@ -246,6 +250,10 @@ static function array CreateTemplates() // Cheaty activity for mission test. AlienActivities.AddItem(CreateDebugMissionTemplate()); + //New Big Supply Extraction activity test: + AlienActivities.AddItem(CreateBigSupplyExtractionTemplate()); + AlienActivities.AddItem(CreateCovertOpsTroopManeuversTemplate()); + return AlienActivities; } @@ -1815,6 +1823,15 @@ static function TryIncreasingChosenLevel(int CurrentForceLevel) { OldTacticalTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); Chosenstate.Level++; + // Tedster - Cap chosen levels at the length of the level FL thresholds array, which should line up with the max level value since both start at 0. + ChosenState.Level = MIN(default.CHOSEN_LEVEL_FL_THRESHOLDS.Length, Chosenstate.Level); + + //5th tier of chosen created by using PostEncounterCreation + if(ChosenState.Level == 4) + { + ChosenState.Level = 3; + } + NewTacticalTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); if (ChosenState.bMetXCom && !ChosenState.bDefeated) { @@ -1827,6 +1844,72 @@ static function TryIncreasingChosenLevel(int CurrentForceLevel) `GAMERULES.SubmitGameState(NewGameState); } +// version that takes in a NewGameState for DLCInfo use for patching existing campaigns. +static function TryIncreasingChosenLevelWithGameState(int CurrentForceLevel, XComGameState NewGameState, XComGameState_AdventChosen ChosenState) +{ + local name OldTacticalTag, NewTacticalTag; + local int NewChosenLevel; + + OldTacticalTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); + + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + + //handle all force levels here. + switch (CurrentForceLevel) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + NewChosenLevel = 0; + break; + case 7: + case 8: + case 9: + case 10: + NewChosenLevel = 1; + break; + case 11: + case 12: + case 13: + case 14: + case 15: + NewChosenLevel = 2; + break; + case 16: + case 17: + case 18: + case 19: + case 20: + NewChosenLevel = 3; + break; + // default catches FL21+ campaigns + default: + NewChosenLevel = 3; + break; + } + if(NewChosenLevel == ChosenState.Level) + return; + + ChosenState.Level = NewChosenLevel; + + if(ChosenState.Level > 3) + { + ChosenState.Level = 3; + } + + NewTacticalTag = ChosenState.GetMyTemplate().GetSpawningTag(ChosenState.Level); + if (ChosenState.bMetXCom && !ChosenState.bDefeated) + { + ChosenState.bJustLeveledUp = true; + } + // Replace Old Tag with new Tag in missions + ChosenState.RemoveTacticalTagFromAllMissions(NewGameState, OldTacticalTag, NewTacticalTag); + +} + static function ActivateChosenIfEnabled(XComGameState NewGameState) { local XComGameState_HeadquartersAlien AlienHQ; @@ -1835,7 +1918,9 @@ static function ActivateChosenIfEnabled(XComGameState NewGameState) local int i; if (!`SecondWaveEnabled('DisableChosen')) { + AlienHQ = XComGameState_HeadquartersAlien(`XCOMHISTORY.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); + AlienHQ = XComGameState_HeadquartersAlien(NewGameState.ModifyStateObject(class'XComGameState_HeadquartersAlien', AlienHQ.ObjectID)); AlienHQ.OnChosenActivation(NewGameState); AllChosen = AlienHQ.GetAllChosen(); @@ -1844,16 +1929,24 @@ static function ActivateChosenIfEnabled(XComGameState NewGameState) //ALSO REMOVE ALL WEAKNESSES FROM THEM foreach AllChosen(ChosenState) { - ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); - ChosenState.Strengths.length = 0; - - for(i = ChosenState.Weaknesses.length - 1; i>=0; i--) + if (!ChosenState.bMetXCom) { - if(ChosenState.Weaknesses[i] != 'ChosenSkirmisherAdversary' && - ChosenState.Weaknesses[i] != 'ChosenTemplarAdversary' && - ChosenState.Weaknesses[i] != 'ChosenReaperAdversary') + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + ChosenState.Strengths.length = 0; + + + // Get them training and learning about XCOM straight away + ChosenState.bMetXCom = true; + ChosenState.NumEncounters++; + + for (i = ChosenState.Weaknesses.length - 1; i >= 0; i--) { - ChosenState.Weaknesses.Remove(i,1); + if (ChosenState.Weaknesses[i] != 'ChosenSkirmisherAdversary' && + ChosenState.Weaknesses[i] != 'ChosenTemplarAdversary' && + ChosenState.Weaknesses[i] != 'ChosenReaperAdversary') + { + ChosenState.Weaknesses.Remove(i,1); + } } } } @@ -2852,6 +2945,8 @@ static function X2DataTemplate CreateProtectResearchTemplate() local X2LWAlienActivityTemplate Template; local X2LWActivityCondition_ResearchFacility ResearchFacility; local X2LWActivityCooldown Cooldown; + local X2LWActivityCondition_Month TimeCondition; + local X2LWActivityCondition_MinLiberatedRegionsLegendary LibCondition; `CREATE_X2TEMPLATE(class'X2LWAlienActivityTemplate', Template, default.ProtectResearchName); Template.iPriority = 50; // 50 is default, lower priority gets created earlier @@ -2878,6 +2973,16 @@ static function X2DataTemplate CreateProtectResearchTemplate() Template.ActivityCreation.Conditions.AddItem(new class'X2LWActivityCondition_FacilityLeadItem'); // prevents creation if would create more items than there are facilities + //Add a time delay so you don't instantly get facility missions + TimeCondition = new class'X2LWActivityCondition_Month'; + TimeCondition.FirstMonthPossible = default.PROTECT_RESEARCH_FIRST_MONTH_POSSIBLE; + Template.ActivityCreation.Conditions.AddItem(TimeCondition); + + //Add Lib condition for Legendary; + LibCondition = new class'X2LWActivityCondition_MinLiberatedRegionsLegendary'; + LibCondition.MaxAlienRegions = 15; // 1 region liberated + Template.ActivityCreation.Conditions.AddItem(LibCondition); + Template.OnMissionSuccessFn = TypicalEndActivityOnMissionSuccess; Template.OnMissionFailureFn = TypicalAdvanceActivityOnMissionFailure; @@ -3077,6 +3182,69 @@ static function array GetTroopManeuversRewards (XComGameState_LWAlienActiv return RewardArray; } +// Covert op version + +static function X2DataTemplate CreateCovertOpsTroopManeuversTemplate() +{ + local X2LWAlienActivityTemplate Template; + local MissionLayerInfo MissionLayer; + local X2LWActivityDetectionCalc DetectionCalc; + local X2LWActivityCondition_AlertVigilance AlertVigilance; + + `CREATE_X2TEMPLATE(class'X2LWAlienActivityTemplate', Template, 'CovertOpsTroopManeuvers'); + + MissionLayer.MissionFamilies.AddItem('CovertOpsTroopManeuvers_LW'); + MissionLayer.Duration_Hours = 24*5.5; + MissionLayer.DurationRand_Hours = 24; + MissionLayer.BaseInfiltrationModifier_Hours=-24; + Template.MissionTree.AddItem(MissionLayer); + + + DetectionCalc = new class'X2LWActivityDetectionCalc'; + DetectionCalc.SetAlwaysDetected(true); + Template.DetectionCalc = DetectionCalc; + + //these define the requirements for creating each activity + Template.ActivityCreation = new class'X2LWActivityCreation'; + + AlertVigilance = new class'X2LWActivityCondition_AlertVigilance'; + AlertVigilance.MinAlert = 9999; // never created normally, only via Covert Op + Template.ActivityCreation.Conditions.AddItem(AlertVigilance); + + Template.OnMissionSuccessFn = TypicalEndActivityOnMissionSuccess; + Template.OnMissionFailureFn = TypicalAdvanceActivityOnMissionFailure; + + Template.OnActivityStartedFn = none; + Template.WasMissionSuccessfulFn = none; // always one objective + Template.GetMissionForceLevelFn = GetTypicalMissionForceLevel; // use regional ForceLevel + Template.GetMissionAlertLevelFn = GetCovertOpsTroopManeuversMissionAlertLevel; + Template.GetTimeUpdateFn = none; + Template.OnMissionExpireFn = none; // just remove the mission + Template.GetMissionRewardsFn = GetTroopManeuversRewards; + Template.OnActivityUpdateFn = none; + Template.CanBeCompletedFn = none; // can always be completed + Template.OnActivityCompletedFn = none; // this one doesn't reduce strength + + return Template; +} + +// using this to cap this at str 4 +static function int GetCovertOpsTroopManeuversMissionAlertLevel(XComGameState_LWAlienActivity ActivityState, XComGameState_MissionSite MissionSite, XComGameState NewGameState) +{ + local XComGameState_WorldRegion RegionState; + local XComGameState_WorldRegion_LWStrategyAI RegionalAIState; + + RegionState = MissionSite.GetWorldRegion(); + RegionalAIState = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState, NewGameState); + + if(default.ACTIVITY_LOGGING_ENABLED) + { + `LWTRACE("Activity " $ ActivityState.GetMyTemplateName $ ": Mission Alert Level =" $ min(RegionalAIState.LocalAlertLevel + ActivityState.GetMyTemplate().AlertLevelModifier, 4) ); + } + return min(RegionalAIState.LocalAlertLevel + ActivityState.GetMyTemplate().AlertLevelModifier, 4); +} + + //############################################################################################# //---------------------------------- HIGH-VALUE PRISONER -------------------------------------- //############################################################################################# @@ -3768,6 +3936,69 @@ static function RecruitRaidCompleted (bool bAlienSuccess, XComGameState_LWAlienA } } +//############################################################################################# +//---------------------------------- Big Supply Extraction ------------------------------------------ +//############################################################################################# + +static function X2DataTemplate CreateBigSupplyExtractionTemplate() +{ + local X2LWAlienActivityTemplate Template; + local MissionLayerInfo MissionLayer; + local X2LWActivityDetectionCalc DetectionCalc; + local X2LWActivityCondition_AlertVigilance AlertVigilance; + + `CREATE_X2TEMPLATE(class'X2LWAlienActivityTemplate', Template, 'BigSupplyExtraction_LW'); + // Add an arbitrary mission to the mission list. This won't really be used, it'll be overridden + // by the cheat command to force a particular mission kind. + MissionLayer.MissionFamilies.AddItem('BigSupplyExtraction_LW'); + MissionLayer.Duration_Hours = 24*6; + MissionLayer.DurationRand_Hours = 24; + Template.MissionTree.AddItem(MissionLayer); + + DetectionCalc = new class'X2LWActivityDetectionCalc'; + DetectionCalc.SetAlwaysDetected(true); + Template.DetectionCalc = DetectionCalc; + + //these define the requirements for creating each activity + Template.ActivityCreation = new class'X2LWActivityCreation'; + + AlertVigilance = new class'X2LWActivityCondition_AlertVigilance'; + AlertVigilance.MinAlert = 9999; // never created normally, only via Covert Op + Template.ActivityCreation.Conditions.AddItem(AlertVigilance); + + Template.OnMissionSuccessFn = TypicalEndActivityOnMissionSuccess; + Template.OnMissionFailureFn = TypicalAdvanceActivityOnMissionFailure; + + Template.OnActivityStartedFn = none; + Template.WasMissionSuccessfulFn = none; // always one objective + Template.GetMissionForceLevelFn = GetTypicalMissionForceLevel; // use regional ForceLevel + Template.GetMissionAlertLevelFn = GetTypicalMissionAlertLevel; + Template.GetTimeUpdateFn = none; + Template.OnMissionExpireFn = none; // just remove the mission + Template.GetMissionRewardsFn = GetLogisticsReward; + Template.OnActivityUpdateFn = none; + Template.CanBeCompletedFn = none; // can always be completed + Template.OnActivityCompletedFn = none; + + return Template; +} + +static function int GetBigExtractMissionAlertLevel(XComGameState_LWAlienActivity ActivityState, XComGameState_MissionSite MissionSite, XComGameState NewGameState) +{ + local XComGameState_WorldRegion RegionState; + local XComGameState_WorldRegion_LWStrategyAI RegionalAIState; + + RegionState = MissionSite.GetWorldRegion(); + RegionalAIState = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState, NewGameState); + + if(default.ACTIVITY_LOGGING_ENABLED) + { + `LWTRACE("Activity " $ ActivityState.GetMyTemplateName $ ": Mission Alert Level =" $ min(RegionalAIState.LocalAlertLevel + ActivityState.GetMyTemplate().AlertLevelModifier, default.BIGSUPPLYEXTRACTION_MAX_ALERT) ); + } + return min(RegionalAIState.LocalAlertLevel + ActivityState.GetMyTemplate().AlertLevelModifier, default.BIGSUPPLYEXTRACTION_MAX_ALERT); +} + + //############################################################################################# //---------------------------------- MISSION TESTING ------------------------------------------ //############################################################################################# @@ -3880,6 +4111,9 @@ static function TypicalAdvanceActivityOnMissionSuccess(XComGameState_LWAlienActi ActivityTemplate = ActivityState.GetMyTemplate(); NewGameState.AddStateObject(ActivityState); + RegionState = XComGameState_WorldRegion(NewGameState.GetGameStateForObjectID(ActivityState.PrimaryRegion.ObjectID)); + if(RegionState == none) + RegionState = XComGameState_WorldRegion(`XCOMHISTORY.GetGameStateForObjectID(ActivityState.PrimaryRegion.ObjectID)); // We need to apply the rewards immediately, but don't want to run them twice if we need to also defer the // activity update until we're back at the geoscape. @@ -3891,6 +4125,8 @@ static function TypicalAdvanceActivityOnMissionSuccess(XComGameState_LWAlienActi GiveRewards(NewGameState, MissionState, ExcludeIndices); RecordResistanceActivity(true, ActivityState, MissionState, NewGameState); + IncreaseChosenKnowledge(RegionState, NewGameState); + MissionState.RemoveEntity(NewGameState); } } @@ -3963,6 +4199,7 @@ static function TypicalAdvanceActivityOnMissionSuccess(XComGameState_LWAlienActi static function TypicalEndActivityOnMissionSuccess(XComGameState_LWAlienActivity ActivityState, XComGameState_MissionSite MissionState, XComGameState NewGameState) { local X2LWAlienActivityTemplate ActivityTemplate; + local XComGameState_WorldRegion RegionState; local array ExcludeIndices; if(ActivityState == none) @@ -3971,6 +4208,10 @@ static function TypicalEndActivityOnMissionSuccess(XComGameState_LWAlienActivity ActivityTemplate = ActivityState.GetMyTemplate(); NewGameState.AddStateObject(ActivityState); + RegionState = XComGameState_WorldRegion(NewGameState.GetGameStateForObjectID(ActivityState.PrimaryRegion.ObjectID)); + if(RegionState == none) + RegionState = XComGameState_WorldRegion(`XCOMHISTORY.GetGameStateForObjectID(ActivityState.PrimaryRegion.ObjectID)); + if (MissionState != none) { ExcludeIndices = GetRewardExcludeIndices(ActivityState, MissionState, NewGameState); @@ -3978,6 +4219,8 @@ static function TypicalEndActivityOnMissionSuccess(XComGameState_LWAlienActivity GiveRewards(NewGameState, MissionState, ExcludeIndices); RecordResistanceActivity(true, ActivityState, MissionState, NewGameState); + IncreaseChosenKnowledge(RegionState, NewGameState); + MissionState.RemoveEntity(NewGameState); } @@ -4138,6 +4381,15 @@ static function AddVigilanceNearby (XComGameState NewGameState, XComGameState_Wo } +static function IncreaseChosenKnowledge(XComGameState_WorldRegion RegionState, XComGameState NewGameState) +{ + local XComGameState_AdventChosen ChosenState; + + ChosenState = RegionState.GetControllingChosen(); + ChosenState = XComGameState_AdventChosen(NewGameState.ModifyStateObject(class'XComGameState_AdventChosen', ChosenState.ObjectID)); + ChosenState.ModifyKnowledgeScore(NewGameState, default.CHOSEN_KNOWLEDGE_GAIN_MISSIONS); +} + static function RecordResistanceActivity(bool Success, XComGameState_LWAlienActivity ActivityState, XComGameState_MissionSite MissionState, XComGameState NewGameState) { local XComGameStateHistory History; @@ -4175,11 +4427,14 @@ static function RecordResistanceActivity(bool Success, XComGameState_LWAlienActi case "DestroyObject_LW": case "Jailbreak_LW": case "TroopManeuvers_LW": + case "CovertOpsTroopManeuvers_LW": case "ProtectDevice_LW": case "SabotageCC": case "SabotageCC_LW": case "AssaultNetworkTower_LW": case "SmashnGrab_LW": + case "SupplyExtraction_LW": + case "BigSupplyExtraction_LW": ActivityTemplateName='ResAct_GuerrillaOpsCompleted'; break; case "SecureUFO_LW": @@ -4230,6 +4485,7 @@ static function RecordResistanceActivity(bool Success, XComGameState_LWAlienActi case "DestroyObject_LW": case "Jailbreak_LW": case "TroopManeuvers_LW": + case "CovertOpsTroopManeuvers_LW": case "ProtectDevice_LW": case "SabotageCC": case "SabotageCC_LW": @@ -4237,6 +4493,8 @@ static function RecordResistanceActivity(bool Success, XComGameState_LWAlienActi case "AssaultNetworkTower_LW": case "Sabotage_LW": case "SmashnGrab_LW": + case "SupplyExtraction_LW": + case "BigSupplyExtraction_LW": case "AssaultAlienBase_LW": if (!ActivityState.bFailedFromMissionExpiration) { @@ -4584,6 +4842,7 @@ static function XComGameState_MissionSite GetRebelRaidMissionSite(XComGameState_ + defaultProperties { ProtectRegionEarlyName="ProtectRegionEarly"; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultCovertActions_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultCovertActions_LW.uc index a0c213dec..69451ed1f 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultCovertActions_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultCovertActions_LW.uc @@ -14,6 +14,8 @@ static function array CreateTemplates() CovertActions.AddItem(CreateIntenseTrainingTemplate()); CovertActions.AddItem(CreateResistanceMecTemplate()); CovertActions.AddItem(CreateRecruitRebelsTemplate()); + CovertActions.AddItem(CreateFindBigDepotTemplate()); + CovertActions.AddItem(CreateFindAdventDetachmentTemplate()); return CovertActions; } @@ -119,6 +121,44 @@ static function X2DataTemplate CreateRecruitRebelsTemplate() return Template; } +static function X2DataTemplate CreateFindBigDepotTemplate() +{ + local X2CovertActionTemplate Template; + + `CREATE_X2TEMPLATE(class'X2CovertActionTemplate', Template, 'CovertAction_BigSupplyDepot'); + + Template.ChooseLocationFn = ChooseRandomContactedUnliberatedRegion; + Template.OverworldMeshPath = "UI_3D.Overwold_Final.CovertAction"; + + Template.Narratives.AddItem('CovertActionNarrative_FindBigDepot_Skirmishers'); + Template.Narratives.AddItem('CovertActionNarrative_FindBigDepot_Reapers'); + Template.Narratives.AddItem('CovertActionNarrative_FindBigDepot_Templars'); + + Template.Risks.AddItem('CovertActionRisk_Ambush'); + Template.Rewards.AddItem('Reward_Supply_Mission'); + return Template; +} + +static function X2DataTemplate CreateFindAdventDetachmentTemplate() +{ + local X2CovertActionTemplate Template; + + `CREATE_X2TEMPLATE(class'X2CovertActionTemplate', Template, 'CovertAction_FindAdventDetachment'); + + Template.ChooseLocationFn = ChooseRandomContactedUnliberatedRegion; + Template.OverworldMeshPath = "UI_3D.Overwold_Final.CovertAction"; + + Template.Narratives.AddItem('CovertActionNarrative_FindAdventDetachment_Skirmishers'); + Template.Narratives.AddItem('CovertActionNarrative_FindAdventDetachment_Reapers'); + Template.Narratives.AddItem('CovertActionNarrative_FindAdventDetachment_Templars'); + + Template.RequiredFactionInfluence = eFactionInfluence_Respected; + + Template.Risks.AddItem('CovertActionRisk_Ambush'); + Template.Rewards.AddItem('Reward_Detachment_Mission'); + return Template; +} + static function CovertActionSlot CreateDefaultSoldierSlot(name SlotName, optional int iMinRank, optional bool bRandomClass, optional bool bFactionClass) { local CovertActionSlot SoldierSlot; @@ -176,3 +216,39 @@ static function ChooseContactedRegionWithoutMEC(XComGameState NewGameState, XCom ActionState.LocationEntity = RegionRefs[`SYNC_RAND_STATIC(RegionRefs.Length)]; } } + +static function ChooseRandomContactedUnliberatedRegion(XComGameState NewGameState, XComGameState_CovertAction ActionState, out array ExcludeLocations) +{ + local XComGameStateHistory History; + local XComGameState_WorldRegion RegionState; + local XComGameState_WorldRegion_LWStrategyAI RegionalAI; + local array RegionRefs; + local array UnliberatedRegionRefs; + + History = `XCOMHISTORY; + + foreach History.IterateByClassType(class'XComGameState_WorldRegion', RegionState) + { + if (ExcludeLocations.Find('ObjectID', RegionState.GetReference().ObjectID) == INDEX_NONE && RegionState.HaveMadeContact()) + { + RegionRefs.AddItem(RegionState.GetReference()); + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); + + if(!RegionalAI.bLiberated) + { + UnliberatedRegionRefs.AddItem(RegionState.GetReference()); + } + + } + } + + // Prefer regions without liberation + if (UnliberatedRegionRefs.Length > 0) + { + ActionState.LocationEntity = UnliberatedRegionRefs[`SYNC_RAND_STATIC(UnliberatedRegionRefs.Length)]; + } + else + { + ActionState.LocationEntity = RegionRefs[`SYNC_RAND_STATIC(RegionRefs.Length)]; + } +} diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultRewards_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultRewards_LW.uc index 4746660ca..bd8ee1389 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultRewards_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultRewards_LW.uc @@ -30,6 +30,8 @@ static function array CreateTemplates() Rewards.AddItem(CreateFactionInfluenceRewardTemplate()); Rewards.AddItem(CreateEnemyCorpsesRewardTemplate()); Rewards.AddItem(CreateDummyStatBoostRewardTemplate()); + Rewards.AddItem(CreateSupplyMissionRewardTemplate()); + Rewards.AddItem(CreateDetachmentMissionRewardTemplate()); return Rewards; } @@ -443,3 +445,67 @@ static function X2DataTemplate CreateDummyStatBoostRewardTemplate() return Template; } + +static function X2DataTemplate CreateSupplyMissionRewardTemplate() +{ + local X2RewardTemplate Template; + + `CREATE_X2Reward_TEMPLATE(Template, 'Reward_Supply_Mission'); + Template.GenerateRewardFn = none; + Template.SetRewardFn = none; + Template.GiveRewardFn = CreateSupplyMissionReward; + Template.GetRewardStringFn = none; + Template.GetRewardIconFn = class'X2StrategyElement_DefaultRewards'.static.GetGenericRewardIcon; + + return Template; +} + +static function CreateSupplyMissionReward(XComGameState NewGameState, XComGameState_Reward RewardState, optional StateObjectReference AuxRef, optional bool bOrder = false, optional int OrderHours = -1) +{ + local XComGameState_LWAlienActivity NewActivityState; + local X2LWAlienActivityTemplate ActivityTemplate; + local X2StrategyElementTemplateManager StrategyElementTemplateMgr; + local XComGameState_CovertAction ActionState; + + ActionState = XComGameState_CovertAction(`XCOMHISTORY.GetGameStateForObjectID(AuxRef.ObjectID)); + + `LWTrace("Trying to spawn Big Supply Extract Mission"); + StrategyElementTemplateMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + ActivityTemplate = X2LWAlienActivityTemplate(StrategyElementTemplateMgr.FindStrategyElementTemplate('BigSupplyExtraction_LW')); + + NewActivityState = ActivityTemplate.CreateInstanceFromTemplate(ActionState.Region, NewGameState); + NewActivityState.bNeedsUpdateDiscovery = true; + NewGameState.AddStateObject(NewActivityState); +} + +static function X2DataTemplate CreateDetachmentMissionRewardTemplate() +{ + local X2RewardTemplate Template; + + `CREATE_X2Reward_TEMPLATE(Template, 'Reward_Detachment_Mission'); + Template.GenerateRewardFn = none; + Template.SetRewardFn = none; + Template.GiveRewardFn = CreateDetachmentMissionReward; + Template.GetRewardStringFn = none; + Template.GetRewardIconFn = class'X2StrategyElement_DefaultRewards'.static.GetGenericRewardIcon; + + return Template; +} + +static function CreateDetachmentMissionReward(XComGameState NewGameState, XComGameState_Reward RewardState, optional StateObjectReference AuxRef, optional bool bOrder = false, optional int OrderHours = -1) +{ + local XComGameState_LWAlienActivity NewActivityState; + local X2LWAlienActivityTemplate ActivityTemplate; + local X2StrategyElementTemplateManager StrategyElementTemplateMgr; + local XComGameState_CovertAction ActionState; + + ActionState = XComGameState_CovertAction(`XCOMHISTORY.GetGameStateForObjectID(AuxRef.ObjectID)); + + `LWTrace("Trying to spawn Advent Detachment Mission"); + StrategyElementTemplateMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + ActivityTemplate = X2LWAlienActivityTemplate(StrategyElementTemplateMgr.FindStrategyElementTemplate('CovertOpsTroopManeuvers')); + + NewActivityState = ActivityTemplate.CreateInstanceFromTemplate(ActionState.Region, NewGameState); + NewActivityState.bNeedsUpdateDiscovery = true; + NewGameState.AddStateObject(NewActivityState); +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultStaffSlots_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultStaffSlots_LW.uc index 95a929bd2..2bc8ffbd7 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultStaffSlots_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_DefaultStaffSlots_LW.uc @@ -4,7 +4,10 @@ // PURPOSE: New staff slot templates for LW Overhaul //--------------------------------------------------------------------------------------- -class X2StrategyElement_DefaultStaffSlots_LW extends X2StrategyElement; +class X2StrategyElement_DefaultStaffSlots_LW extends X2StrategyElement config(LW_Overhaul); + +var config bool LIMIT_INTENSE_TRAINING_OPS; +var config int NUM_INTENSE_TRAINING_OPS; var localized string m_strLiaisonLocation; @@ -141,7 +144,7 @@ static function bool IsUnitValidForCovertActionIntenseTrainingSlot(XComGameState Unit = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(UnitInfo.UnitRef.ObjectID)); Unit.GetUnitValue('CAIntenseTrainingCount', UnitValue); - if (UnitValue.fValue >= 2) + if (UnitValue.fValue >= default.NUM_INTENSE_TRAINING_OPS && default.LIMIT_INTENSE_TRAINING_OPS) { // Unit has already been on the maximum number of allowed Intense // Training covert actions. diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWAlienAI.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWAlienAI.uc index 5831f6839..5200778e0 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWAlienAI.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWAlienAI.uc @@ -50,6 +50,7 @@ static function AddFortressDoom() local XComGameStateHistory History; local XComGameState NewGameState; local XComGameState_HeadquartersAlien AlienHQ; + local XComGameState_MissionSite MissionState; History = `XCOMHISTORY; AlienHQ = XComGameState_HeadquartersAlien(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersAlien')); @@ -62,10 +63,17 @@ static function AddFortressDoom() OnFortressDoomTimerComplete(AlienHQ, NewGameState); - // Complete the Avatar reveal project as soon as doom is added to the fortress so players know what they're up against. - `LWTrace("Triggering Avatar Project reveal..."); - class'XComGameState_Objective'.static.StartObjectiveByName(NewGameState, 'LW_T2_M1_N2_RevealAvatarProject'); - `XEVENTMGR.TriggerEvent('StartAvatarProjectReveal'); + // Complete the Avatar reveal project after 2 pips are added to the fortress so players know what they're up against. + MissionState = AlienHQ.GetAndAddFortressMission(NewGameState); + + `LWTrace("Current Doom:"@MissionState.Doom); + + if(MissionState.Doom >= 2) + { + `LWTrace("Triggering Avatar Project reveal..."); + class'XComGameState_Objective'.static.StartObjectiveByName(NewGameState, 'LW_T2_M1_N2_RevealAvatarProject'); + `XEVENTMGR.TriggerEvent('StartAvatarProjectReveal'); + } `XCOMGAME.GameRuleset.SubmitGameState(NewGameState); } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWMissionSources.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWMissionSources.uc index 6ff542e07..006ee056f 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWMissionSources.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_LWMissionSources.uc @@ -18,6 +18,12 @@ struct SitRepChance var int Priority; // Used for sorting, lower number == earlier in the array }; +struct DarkEventSitrepMapping +{ + var name DarkEventName; + var name DarkEventSitrepName; +}; + // LWOTC: Base chance for a mission to have a sit rep var config float SIT_REP_CHANCE; var config float DARK_EVENT_SIT_REP_CHANCE; @@ -26,6 +32,8 @@ var config int NUM_SPECIAL_SITREPS_TO_ROLL; //allow configuring number of specia var config int NUM_DARK_EVENT_SITREPS_TO_ROLL; // allow configuring the number of DE sitreps to roll. var config bool ROLL_ADITIONAL_SITREPS_WITH_SPECIAL_SITREP; //allow rolling additional sitreps even if a special sitrep is rolled. +var config array DARK_EVENT_SITREP_NAMES; + // Special sit reps that are rolled separately from the standard mechanism // to ensure that they occur more frequently than they would otherwise do. var config array SPECIAL_SIT_REPS; @@ -316,11 +324,21 @@ static function name PickActiveDarkEventSitRep(out array ActiveSitRepDarkE static function name GetSitRepNameForDarkEvent(name DarkEventName) { + local DarkEventSitrepMapping SitrepMapping; // We remove the "_" from the dark event name and append "SitRep" to get the // name of the corresponding sit rep (if there is one). // // Special case for "Lost World" as the corresponding sit rep doesn't // follow this convention. + + // new handling for array mapping + foreach default.DARK_EVENT_SITREP_NAMES (SitrepMapping) + { + if(SitrepMapping.DarkEventName == DarkEventName) + return SitrepMapping.DarkEventSitrepName; + } + + // if we didn't find something in the previous array, use old behavior. return DarkEventName == 'DarkEvent_LostWorld' ? 'TheLost' : name(Repl(DarkEventName, "_", "") $ "SitRep"); } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_NewTechs_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_NewTechs_LW.uc index fc6a8088c..b8bf6ba4f 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_NewTechs_LW.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2StrategyElement_NewTechs_LW.uc @@ -66,8 +66,8 @@ static function array CreateTemplates() Techs.AddItem(CreateRenderTech ('RenderAdventPurifierCorpse', "img:///UILibrary_XPACK_StrategyImages.IC_Purifier", 'CorpseAdventPurifier', 600, 'AlienBiotech')); Techs.AddItem(CreateRenderTech ('RenderSpectreCorpse', "img:///UILibrary_XPACK_StrategyImages.IC_Spectre", 'CorpseSpectre', 600, 'AlienBiotech')); - Techs.AddItem(CreateRenderTech ('RenderAdventDroneWreck', "img:///UILibrary_LW_Overhaul.LW_IC_AutopsyDrone", 'CorpseDrone', 300, 'HybridMaterials')); - Techs.AddItem(CreateRenderTech ('RenderBlutonCorpse', "img:///UILibrary_LW_Overhaul.IC_AutopsyBluton", 'CorpseMutonElite', 700, 'AlienBiotech')); + Techs.AddItem(CreateRenderTech ('RenderAdventDroneWreck', "img:///UILibrary_LWOTC.LW_IC_AutopsyDrone", 'CorpseDrone', 300, 'HybridMaterials')); + Techs.AddItem(CreateRenderTech ('RenderBlutonCorpse', "img:///UILibrary_LWOTC.IC_AutopsyBluton", 'CorpseMutonElite', 700, 'AlienBiotech')); //O so many LW Overhaul Proving Grounds Projects Techs.AddItem(CreateHazMatVestProjectTemplate()); @@ -224,7 +224,7 @@ static function X2DataTemplate CreateAutopsyDroneTemplate() Template.PointsToComplete = 3000; Template.SortingTier = 2; - Template.strImage = "img:///UILibrary_LW_Overhaul.LW_IC_AutopsyDrone"; + Template.strImage = "img:///UILibrary_LWOTC.LW_IC_AutopsyDrone"; Template.Requirements.RequiredScienceScore = 10; Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; @@ -255,7 +255,7 @@ static function X2DataTemplate CreateAutopsyBlutonTemplate() Template.TechStartedNarrative = "LWNarrativeMoments_Bink.Strategy.Autopsy_MutonM3_LW"; - Template.strImage = "img:///UILibrary_LW_Overhaul.IC_AutopsyBluton"; + Template.strImage = "img:///UILibrary_LWOTC.IC_AutopsyBluton"; Template.Requirements.RequiredScienceScore = 10; Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_LWBlasterLauncher.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_LWBlasterLauncher.uc index 1998e1e66..e6d0565aa 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_LWBlasterLauncher.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_LWBlasterLauncher.uc @@ -17,7 +17,7 @@ function Init(AvailableAction InAction, int NewTargetIndex) ScatterAmountText = TacticalHUD.Spawn(class'UIScrollingTextField', TacticalHUD); ScatterAmountText.bAnimateOnInit = false; ScatterAmountText.InitScrollingText('AverageScatterText_LW', "", 400, 0, 0); - ScatterAmountText.SetHTMLText(class'UIUtilities_Text'.static.GetColoredText(" 1.4 Tiles", eUIState_Bad, class'UIUtilities_Text'.const.BODY_FONT_SIZE_3D)); + ScatterAmountText.SetHTMLText(class'UIUtilities_Text'.static.GetColoredText("± 1.4 Tiles", eUIState_Bad, class'UIUtilities_Text'.const.BODY_FONT_SIZE_3D)); ScatterAmountText.ShowShadow(0); ScatterAmountText.Show(); } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_TopDownAOE.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_TopDownAOE.uc new file mode 100644 index 000000000..f6a41d511 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2TargetingMethod_TopDownAOE.uc @@ -0,0 +1,10 @@ +// Tedster - Extending the TopDown AOE one to add the Firing Unit to the target location. + +class X2TargetingMethod_TopDownAOE extends X2TargetingMethod_TopDown; + +function GetTargetLocations(out array TargetLocations) +{ + `LWTrace("Ted Targeting method GetTargetLocations called"); + TargetLocations.Length = 0; + TargetLocations.AddItem(FiringUnit.GetLocation()); +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivity.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivity.uc index 2aa2e2eb7..97e9d03a3 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivity.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivity.uc @@ -50,6 +50,10 @@ var config array GuaranteeChosenInMissionTypes; var config array NO_SIT_REP_MISSION_TYPES; +var config array LargeMaps; + +var config array VeryLargeMaps; + //############################################################################################# //---------------- REQUIRED FROM BASEOBJECT ----------------------------------------------- //############################################################################################# @@ -787,6 +791,19 @@ function SetMissionData(name MissionFamily, XComGameState_MissionSite MissionSta { MissionState.GeneratedMission.SitReps.AddItem('LargeMap'); } + else if (inStr(MapName,"EZR") != INDEX_NONE && inStr(MapName,"CTY") != INDEX_NONE ) + { + // Catch Eclipsezr city maps. + MissionState.GeneratedMission.SitReps.AddItem('LargeMap'); + } + else if (default.LargeMaps.Find(MapName)!= INDEX_NONE) + { + MissionState.GeneratedMission.SitReps.AddItem('LargeMap'); + } + else if (default.VeryLargeMaps.Find(MapName) != INDEX_NONE) + { + MissionState.GeneratedMission.SitReps.AddItem('VeryLargeMap'); + } } // Start Issue #157 @@ -901,7 +918,7 @@ static function MaybeAddChosenToMission(XComGameState_MissionSite MissionState) { `LWTrace(" Chosen added!"); MissionState.TacticalGameplayTags.AddItem(class'Helpers_LW'.static.GetChosenActiveMissionTag(ChosenState)); - + MissionState.GeneratedMission.Sitreps.AddItem('ChosenOnMissionSitrep'); // Only one Chosen on the mission! break; } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivityManager.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivityManager.uc index 6c919260b..1ee664d94 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivityManager.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWAlienActivityManager.uc @@ -208,11 +208,21 @@ function UpdatePreMission(XComGameState StartGameState, XComGameState_MissionSit RegionState = MissionState.GetWorldRegion(); if (RegionState == none) { return; } RegionalAIState = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); + + if(RegionalAIState != None) + { + // Tedster - Set Force Level to regional FL if one exists + BattleData.SetForceLevel(RegionalAIState.LocalForceLevel); + `LWTrace("Updating BattleData with Regional Force Level."); + } + if (RegionalAIState != none && RegionalAIState.bLiberated) { + // set the popular support high so that civs won't be hostile BattleData.SetPopularSupport(1000); BattleData.SetMaxPopularSupport(1000); + } } @@ -363,13 +373,20 @@ static function UpdateMissionData(XComGameState_MissionSite MissionSite) if(ActivityState != none && ActivityState.GetMyTemplate().GetMissionForceLevelFn != none) { ForceLevel = ActivityState.GetMyTemplate().GetMissionForceLevelFn(ActivityState, MissionSite, none); + `LWTrace("ActivityState Force Level:" @ForceLevel); } else { if(RegionalAIState != none) + { ForceLevel = RegionalAIState.LocalForceLevel; + `LWTrace("Force Level pulled from Region:" @ForceLevel); + } else + { ForceLevel = AlienHQ.GetForceLevel(); + `LWTrace("Force Level pulled from Alien HQ:" @ForceLevel); + } } ForceLevel = Clamp(ForceLevel, class'XComGameState_HeadquartersAlien'.default.AlienHeadquarters_StartingForceLevel, class'XComGameState_HeadquartersAlien'.default.AlienHeadquarters_MaxForceLevel); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWOverhaulOptions.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWOverhaulOptions.uc index 0a37734b6..e45e8ad0f 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWOverhaulOptions.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWOverhaulOptions.uc @@ -25,6 +25,15 @@ var bool PauseOnRecruit_Cached; var localized string PauseOnRecruitMod; var localized string PauseOnRecruitModTooltip; + +// ***** CHosen Knowledge ***** // + +var Name StartingChosen; +var array ChosenKnowledgeGains_Randomized; + +var array ChosenNames; + + // ======================================================== // PROTOTYPE DEFINITIONS // ======================================================== @@ -34,6 +43,8 @@ function XComGameState_LWModOptions InitComponent(class NewClassType) super.InitComponent(NewClassType); PauseOnRecruit=EnablePauseOnRecruit; GrazeBandWidth=InitialGrazeBandWidth; + //InitChosenKnowledge(); + return self; } @@ -48,6 +59,16 @@ function InitModOptions() PauseOnRecruit_Cached = PauseOnRecruit; } +function InitChosenKnowledge() +{ + //Remove the Starting Chosen from the other Chosen names in the array + ChosenNames.RemoveItem(StartingChosen); + + //randomize the other two as well; + ChosenKnowledgeGains_Randomized = class'X2EventListener_ChosenEndOfMonth'.default.CHOSEN_KNOWLEDGE_GAINS; + ChosenKnowledgeGains_Randomized.RandomizeOrder(); +} + //returns the number of MechaItems set -- this is the number that will be enabled in the calling UIScreen function int SetModOptionsEnabled(out array m_arrMechaItems) { @@ -164,6 +185,11 @@ function bool GetPauseOnRecruit() return PauseOnRecruit; } +function array GetChosenKnowledgeGains_Randomized() +{ + return ChosenKnowledgeGains_Randomized; +} + // ======================================================== // GRAZE BAND // ======================================================== @@ -191,4 +217,7 @@ defaultProperties { GrazeBandWidth=10 PauseOnRecruit=false + ChosenNames.Add("Chosen_Assassin"); + ChosenNames.Add("Chosen_Warlock"); + ChosenNames.Add("Chosen_Hunter"); } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWPersistentSquad.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWPersistentSquad.uc index 2b1e3f76b..0cecff27d 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWPersistentSquad.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWPersistentSquad.uc @@ -845,11 +845,14 @@ function UpdateInfiltrationState(bool AllowPause) if(MissionSite != none) { RegionState = MissionSite.GetWorldRegion(); - RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); - if(RegionalAI.bLiberated) + if(RegionState != none) { - InfiltrationBonusOnLiberation = class'X2StrategyElement_DefaultAlienActivities'.default.INFILTRATION_BONUS_ON_LIBERATION[`STRATEGYDIFFICULTYSETTING] / 100.0; - HoursOfInfiltration += GetHoursToFullInfiltrationCached_Static(SquadSoldiersOnMission, SquadCovertnessCached, CurrentMission) * InfiltrationBonusOnLiberation; + RegionalAI = class'XComGameState_WorldRegion_LWStrategyAI'.static.GetRegionalAI(RegionState); + if(RegionalAI.bLiberated) + { + InfiltrationBonusOnLiberation = class'X2StrategyElement_DefaultAlienActivities'.default.INFILTRATION_BONUS_ON_LIBERATION[`STRATEGYDIFFICULTYSETTING] / 100.0; + HoursOfInfiltration += GetHoursToFullInfiltrationCached_Static(SquadSoldiersOnMission, SquadCovertnessCached, CurrentMission) * InfiltrationBonusOnLiberation; + } } } diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWReinforcements.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWReinforcements.uc index 3e276898c..d09103bb4 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWReinforcements.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_LWReinforcements.uc @@ -80,6 +80,10 @@ var config array DIFFICULTY_MODIFIER; // Randomization amount for alert factor. Alert value will be randomized +/- this amount as a percentage. var config const float ALERT_RANDOM_FACTOR; +// Float value for scaling the reinforcement bucket fill rate. +var config float REINFORCEMENT_BUCKET_FILL_MODIFIER; +var config float BETA_STRIKE_RNF_MOD; + // How many times have we called reinforcements on this mission? var private int Count; @@ -419,35 +423,35 @@ function int CheckForReinforcements() PlayerState = class'Utilities_LW'.static.FindPlayer(eTeam_XCom); if (CanAddToBucket()) { - TmpValue = GetIncreaseFromRegion() / BetaStrikeMod(); + TmpValue = GetIncreaseFromRegion() / ReinforcementModifiers(); `LWTrace("LWRNF: Adding " $ TmpValue $ " to reinforcement bucket from region status"); BucketFiller += TmpValue; - TmpValue = GetIncreaseFromDarkEvents() / BetaStrikeMod(); + TmpValue = GetIncreaseFromDarkEvents() / ReinforcementModifiers(); `LWTrace("LWRNF: Adding " $ TmpValue $ " to reinforcement bucket from dark events"); BucketFiller += TmpValue; - TmpValue = GetIncreaseFromMods() / BetaStrikeMod(); + TmpValue = GetIncreaseFromMods() / ReinforcementModifiers(); `LWTrace("LWRNF: Adding " $ TmpValue $ " to reinforcement bucket from mods"); BucketFiller += TmpValue; - TmpValue = ReinfRules.BucketModifier / BetaStrikeMod(); + TmpValue = ReinfRules.BucketModifier / ReinforcementModifiers(); `LWTrace("LWRNF: Adding " $ TmpValue $ " to reinforcement bucket from mission/activity"); BucketFiller += TmpValue; - TmpValue = (default.DIFFICULTY_MODIFIER[`TACTICALDIFFICULTYSETTING]) / BetaStrikeMod(); + TmpValue = (default.DIFFICULTY_MODIFIER[`TACTICALDIFFICULTYSETTING]) / ReinforcementModifiers(); `LWTrace("LWRNF: Adding " $ string(TmpValue) $ " to reinforcement bucket from difficulty"); BucketFiller += TmpValue; - TmpValue = (ReinfRules.AccelerateMultiplier * BucketFiller * Spawns) / BetaStrikeMod(); + TmpValue = (ReinfRules.AccelerateMultiplier * BucketFiller * Spawns) / ReinforcementModifiers(); `LWTrace("LWRNF: Applying acceleration value multiplier " $ TmpValue $ " to this turn's reinforcement bucket fill value"); BucketFiller += TmpValue; - TmpValue = ReinfRules.BucketMultiplier / BetaStrikeMod(); + TmpValue = ReinfRules.BucketMultiplier / ReinforcementModifiers(); `LWTrace("LWRNF: Applying multiplier " $ TmpValue $ " to this turn's reinforcement bucket fill value from mission/activity"); BucketFiller *= TmpValue; - TmpValue = TimerBucketModifier / BetaStrikeMod(); + TmpValue = TimerBucketModifier; `LWTrace("LWRNF: Applying timer-based multiplier " $ TmpValue $ " to this turn's reinforcement bucket fill value"); BucketFiller *= TmpValue; @@ -468,7 +472,7 @@ function int CheckForReinforcements() if (AtTurnThreshhold(ReinfRules.ForcedReinforcementsTurn)) { `LWTRACE ("Adding 1.0 to bucket to Force Reinforcements on Turn" @ PlayerState.PlayerTurnCount); - Bucket += 1.0 / BetaStrikeMod(); + Bucket += 1.0 / ReinforcementModifiers(); } } } @@ -500,7 +504,7 @@ function int CheckForReinforcements() if (ReachedTurnThreshhold (ReinfRules.CavalryWinTurn, true)) { `LWTRACE("LWRNF: Forcing Reinforcements to punish loitering after victory"); - Bucket += 1.0 / BetaStrikeMod(); + Bucket += 1.0 / ReinforcementModifiers(); } } } @@ -521,7 +525,7 @@ function int CheckForReinforcements() { if (ReachedTurnThreshhold (ReinfRules.CavalryAbsoluteTurn)) { - Bucket += 1.0 / BetaStrikeMod(); + Bucket += 1.0 / ReinforcementModifiers(); } } } @@ -688,12 +692,12 @@ function DisableReinforcements() Disabled = true; } -//checks if second wave option for beta strike is on. -function float BetaStrikeMod() +//Adjusts RNF +function float ReinforcementModifiers() { if(bBetaStrike) { - return 2.0f; + return default.REINFORCEMENT_BUCKET_FILL_MODIFIER * default.BETA_STRIKE_RNF_MOD; } - else return 1.0f; + else return default.REINFORCEMENT_BUCKET_FILL_MODIFIER; } \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_WorldRegion_LWStrategyAI.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_WorldRegion_LWStrategyAI.uc index 085185ed5..4cb7df9b2 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_WorldRegion_LWStrategyAI.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XComGameState_WorldRegion_LWStrategyAI.uc @@ -316,6 +316,7 @@ static function XComGameState_WorldRegion_LWStrategyAI GetRegionalAI(XComGameSta if (RegionState == none) { `LWTRACE("GetRegionalAI ERROR : NONE Region Passed"); + ScriptTrace(); return none; } if (NewGameState != none) diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XGAIBehavior_Civilian_LW.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XGAIBehavior_Civilian_LW.uc new file mode 100644 index 000000000..5c1e330e4 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/XGAIBehavior_Civilian_LW.uc @@ -0,0 +1,26 @@ +class XGAIBehavior_Civilian_LW extends XGAIBehavior_Civilian; + +function BTRunCompletePreExecute() +{ + local AvailableAction YellAction; + local int TargetIndex; + //super.BTRunCompletePreExecute(); + + // LWS Add: Configurable disabling of civilian yell + if (!class'Helpers_LW'.default.EnableCivilianYellOnPreMove) + return; + + if( !m_kPlayer.bCiviliansTargetedByAliens ) + { + // Yell before moving. + YellAction = FindAbilityByName('Yell'); + if( YellAction.AbilityObjectRef.ObjectID > 0 && YellAction.AvailableCode == 'AA_Success' ) + { + if( YellAction.AvailableTargets.Length == 0 ) + { + TargetIndex = INDEX_NONE; + } + class'XComGameStateContext_Ability'.static.ActivateAbility(YellAction, TargetIndex); + } + } +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/Utilities_PP_LW.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/Utilities_PP_LW.uc index cd6be8aaf..b76f5a810 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/Utilities_PP_LW.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/Utilities_PP_LW.uc @@ -48,13 +48,13 @@ static function bool CanRankUpPsiSoldier(XComGameState_Unit Unit) } - `Log("Is the operative yet to rank up?"); - if (Unit.GetSoldierRank() + 1 < `GET_MAX_RANK && !Unit.bRankedUp) + `LWTrace("Is the operative yet to rank up?"); + if (Unit.GetSoldierRank() < Unit.GetSoldierClassTemplate().GetMaxConfiguredRank() && !Unit.bRankedUp) { - `Log("Yes!"); + `LWTrace("Yes!"); NumKills = Unit.GetTotalNumKills(); - `LOG ("Testing Psi Soldier XP; Kills" @ NumKills @ "Needed:" @ class'X2ExperienceConfig'.static.GetRequiredKills(Unit.GetSoldierRank() + 1)); + `LWTrace ("Testing Psi Soldier XP; Kills" @ NumKills @ "Needed:" @ class'X2ExperienceConfig'.static.GetRequiredKills(Unit.GetSoldierRank() + 1)); if ( NumKills >= class'X2ExperienceConfig'.static.GetRequiredKills(Unit.GetSoldierRank() + 1) && Unit.GetStatus() != eStatus_PsiTesting diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2AbilityCooldown_MindScorch.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2AbilityCooldown_MindScorch.uc new file mode 100644 index 000000000..fe43f417d --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2AbilityCooldown_MindScorch.uc @@ -0,0 +1,9 @@ +class X2AbilityCooldown_MindScorch extends X2AbilityCooldown_LocalAndGlobal; + +simulated function int GetNumTurns(XComGameState_Ability kAbility, XComGameState_BaseObject AffectState, XComGameState_Item AffectWeapon, XComGameState NewGameState) +{ + if (XComGameState_Unit(AffectState).HasSoldierAbility('MindScorchDangerZone')) + return iNumTurns - 1; + + return iNumTurns; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet.uc index 45167727c..99eeb6ebb 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet.uc @@ -6,6 +6,8 @@ class X2Ability_PerkPackAbilitySet extends X2Ability config (LW_SoldierSkills); +`include(LW_PerkPack_Integrated\LW_PerkPack.uci) + var config int CENTERMASS_DAMAGE; var config int LETHAL_DAMAGE; var config int DOUBLE_TAP_1ST_SHOT_AIM; @@ -94,18 +96,21 @@ var config int MIND_MERGE_MIN_ACTION_POINTS; var config int MIND_MERGE_DURATION; var config int MIND_MERGE_COOLDOWN; var config int SOUL_MERGE_COOLDOWN_REDUCTION; -var config float MIND_MERGE_WILL_DIVISOR; +var config int MIND_MERGE_FLAT_SHIELDHP; +var config int MIND_MERGE_FLAT_WILL; +var config int MIND_MERGE_FLAT_CRIT; +var config int MIND_MERGE_AMP_MG_SHIELDHP_BONUS; +var config int MIND_MERGE_AMP_MG_WILL_BONUS; +var config int MIND_MERGE_AMP_MG_CRIT_BONUS; +var config int MIND_MERGE_AMP_BM_SHIELDHP_BONUS; +var config int MIND_MERGE_AMP_BM_WILL_BONUS; +var config int MIND_MERGE_AMP_BM_CRIT_BONUS; var config float MIND_MERGE_SHIELDHP_DIVISOR; -var config float SOUL_MERGE_WILL_DIVISOR; -var config float SOUL_MERGE_SHIELDHP_DIVISOR; -var config float MIND_MERGE_AMP_MG_WILL_BONUS; -var config float MIND_MERGE_AMP_MG_SHIELDHP_BONUS; -var config float MIND_MERGE_AMP_BM_WILL_BONUS; -var config float MIND_MERGE_AMP_BM_SHIELDHP_BONUS; +var config float MIND_MERGE_WILL_DIVISOR; var config float MIND_MERGE_CRIT_DIVISOR; +var config float SOUL_MERGE_SHIELDHP_DIVISOR; +var config float SOUL_MERGE_WILL_DIVISOR; var config float SOUL_MERGE_CRIT_DIVISOR; -var config float MIND_MERGE_AMP_MG_CRIT_BONUS; -var config float SOUL_MERGE_AMP_BM_CRIT_BONUS; var config float FORMIDABLE_EXPLOSIVES_DR; var config int FORMIDABLE_ARMOR_MITIGATION; var config int FORMIDABLE_ABLATIVE_HP; @@ -122,6 +127,7 @@ var config bool NO_STANDARD_ATTACKS_WHEN_ON_FIRE; var config bool NO_MELEE_ATTACKS_WHEN_ON_FIRE; var config int BOMBARD_BONUS_RANGE_TILES; var config int SHARPSHOOTERAIM_CRITBONUS; +var config int MACROPHAGES_HEAL_AMT; var config int CE_USES_PER_TURN; var config int CE_MAX_TILES; @@ -165,6 +171,7 @@ static function array CreateTemplates() Templates.AddItem(AddWalkFireAbility()); Templates.AddItem(WalkFireDamage()); //Additional Ability Templates.AddItem(AddPrecisionShotAbility()); + Templates.AddItem(AddPrecisionShotSnapShotAbility()); Templates.AddItem(PrecisionShotCritDamage()); //Additional Ability Templates.AddItem(AddCyclicFireAbility()); Templates.AddItem(CyclicFire2()); //Additional Ability @@ -1294,7 +1301,7 @@ static function X2AbilityTemplate AddPrecisionShotAbility() local X2AbilityCost_ActionPoints ActionPointCost; local X2AbilityCost_Ammo AmmoCost; local X2AbilityToHitCalc_StandardAim ToHitCalc; - local X2AbilityCooldown Cooldown; + local X2AbilityCooldown_Shared Cooldown; local X2Effect_Knockback KnockbackEffect; local X2Condition_Visibility VisibilityCondition; local X2Condition_UnitEffects SuppressedCondition; @@ -1303,6 +1310,8 @@ static function X2AbilityTemplate AddPrecisionShotAbility() Template.IconImage = "img:///UILibrary_LW_PerkPack.LW_AbilityPrecisionShot"; Template.AbilitySourceName = 'eAbilitySource_Perk'; Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_HideIfOtherAvailable; + Template.HideIfAvailable.AddItem('PrecisionShotSnapShot'); Template.DisplayTargetHitChance = true; Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; Template.CinescriptCameraType = "StandardGunFiring"; @@ -1325,8 +1334,9 @@ static function X2AbilityTemplate AddPrecisionShotAbility() Template.AbilityToHitCalc = ToHitCalc; Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; - Cooldown = new class'X2AbilityCooldown'; + Cooldown = new class'X2AbilityCooldown_Shared'; Cooldown.iNumTurns = default.PRECISION_SHOT_COOLDOWN; + Cooldown.SharingCooldownsWith.AddItem('PrecisionShotSnapShot'); Template.AbilityCooldown = Cooldown; AmmoCost = new class'X2AbilityCost_Ammo'; @@ -1366,6 +1376,103 @@ static function X2AbilityTemplate AddPrecisionShotAbility() Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; Template.AdditionalAbilities.AddItem('PrecisionShotCritDamage'); + Template.AdditionalAbilities.AddItem('PrecisionShotSnapShot'); + + return Template; +} + +static function X2AbilityTemplate AddPrecisionShotSnapShotAbility() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityCooldown_Shared Cooldown; + local X2Effect_Knockback KnockbackEffect; + local X2Condition_Visibility VisibilityCondition; + local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_AbilityProperty AbilityCondition; + local X2Condition_UnitActionPoints ActionPointCondition; + + `CREATE_X2ABILITY_TEMPLATE (Template, 'PrecisionShotSnapShot'); + Template.IconImage = "img:///UILibrary_LW_PerkPack.LW_AbilityPrecisionShot"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; + Template.DisplayTargetHitChance = true; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + Template.CinescriptCameraType = "StandardGunFiring"; + Template.TargetingMethod = class'X2TargetingMethod_OverTheShoulder'; + Template.bCrossClassEligible = true; + Template.bUsesFiringCamera = true; + Template.Hostility = eHostility_Offensive; + Template.bPreventsTargetTeleport = false; + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + Template.AbilityTargetStyle = default.SimpleSingleTarget; + + ActionPointCost = new class 'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + ToHitCalc.BuiltInCritMod = default.PRECISION_SHOT_CRIT_BONUS; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + Cooldown = new class'X2AbilityCooldown_Shared'; + Cooldown.iNumTurns = default.PRECISION_SHOT_COOLDOWN; + Cooldown.SharingCooldownsWith.AddItem('PrecisionShot'); + Template.AbilityCooldown = Cooldown; + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = default.PRECISION_SHOT_AMMO_COST; + Template.AbilityCosts.AddItem(AmmoCost); + Template.bAllowAmmoEffects = true; + + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty); + Template.AddShooterEffectExclusions(); + + SuppressedCondition = new class'X2Condition_UnitEffects'; + SuppressedCondition.AddExcludeEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsSuppressed'); + SuppressedCondition.AddExcludeEffect(class'X2Effect_AreaSuppression'.default.EffectName, 'AA_UnitIsSuppressed'); + Template.AbilityShooterConditions.AddItem(SuppressedCondition); + + VisibilityCondition = new class'X2Condition_Visibility'; + VisibilityCondition.bRequireGameplayVisible = true; + VisibilityCondition.bAllowSquadsight = true; + Template.AbilityTargetConditions.AddItem(VisibilityCondition); + + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); + Template.AssociatedPassives.AddItem('HoloTargeting'); + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect()); + Template.bAllowAmmoEffects = true; + + KnockbackEffect = new class'X2Effect_Knockback'; + KnockbackEffect.KnockbackDistance = 2; + Template.AddTargetEffect(KnockbackEffect); + + AbilityCondition = new class'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('SnapShot'); + Template.AbilityShooterConditions.Additem(AbilityCondition); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + + //Template.AdditionalAbilities.AddItem('PrecisionShotCritDamage'); + + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.StandardActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.RunAndGunActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); return Template; } @@ -1385,6 +1492,7 @@ static function X2AbilityTemplate PrecisionShotCritDamage() Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); CritEffect = new class'X2Effect_PrecisionShotCritDamage'; CritEffect.BuildPersistentEffect(1, true, false, false); + CritEffect.DuplicateResponse = eDupe_Refresh; CritEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,, Template.AbilitySourceName); Template.AddTargetEffect(CritEffect); Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; @@ -1528,6 +1636,7 @@ static function X2AbilityTemplate CyclicFire2() Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; Trigger.ListenerData.EventID = 'CyclicFire2'; Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.ListenerData.Priority = 80; Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_OriginalTarget; Template.AbilityTriggers.AddItem(Trigger); @@ -1589,6 +1698,7 @@ static function X2AbilityTemplate CyclicFire3() Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; Trigger.ListenerData.EventID = 'CyclicFire3'; Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.ListenerData.Priority = 80; Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_OriginalTarget; Template.AbilityTriggers.AddItem(Trigger); @@ -2295,6 +2405,8 @@ static function X2AbilityTemplate AddSuppressionAbility_LW() local X2Condition_UnitInventory UnitInventoryCondition; local name WeaponCategory; local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_OwnerDoesNotHaveAbility DoesNotHaveAbilityCondition; + local X2Condition_AbilityProperty AbilityCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'Suppression_LW'); Template.AbilitySourceName = 'eAbilitySource_Perk'; @@ -2325,6 +2437,13 @@ static function X2AbilityTemplate AddSuppressionAbility_LW() } Template.AddShooterEffectExclusions(); + + DoesNotHaveAbilityCondition = new class 'X2Condition_OwnerDoesNotHaveAbility'; + DoesNotHaveAbilityCondition.AbilityName = 'DedicatedSuppression_LW'; + + AbilityCondition = new class 'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('DedicatedSuppression_LW'); + SuppressedCondition = new class'X2Condition_UnitEffects'; SuppressedCondition.AddExcludeEffect(class'X2Effect_Suppression'.default.EffectName, 'AA_UnitIsSuppressed'); @@ -2341,17 +2460,30 @@ static function X2AbilityTemplate AddSuppressionAbility_LW() Template.AbilityTargetStyle = default.SimpleSingleTarget; Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + //nonsteadfast SuppressionEffect = new class'X2Effect_Suppression'; SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); SuppressionEffect.bRemoveWhenTargetDies = true; SuppressionEffect.bRemoveWhenSourceDamaged = true; SuppressionEffect.bBringRemoveVisualizationForward = true; - SuppressionEffect.DuplicateResponse=eDupe_Allow; + SuppressionEffect.DuplicateResponse=eDupe_Ignore; 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); + SuppressionEffect.TargetConditions.AddItem(DoesNotHaveAbilityCondition); + Template.AddTargetEffect(SuppressionEffect); + + //steadfast + SuppressionEffect = new class'X2Effect_Suppression'; + SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); + SuppressionEffect.bRemoveWhenTargetDies = true; + SuppressionEffect.bRemoveWhenSourceDamaged = false; + SuppressionEffect.bBringRemoveVisualizationForward = true; + SuppressionEffect.DuplicateResponse=eDupe_Ignore; + 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); + SuppressionEffect.TargetConditions.AddItem(AbilityCondition); Template.AddTargetEffect(SuppressionEffect); - Template.AddMultiTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); - Template.AdditionalAbilities.AddItem('SuppressionShot_LW'); Template.AdditionalAbilities.AddItem('LockdownBonuses'); Template.AdditionalAbilities.AddItem('MayhemBonuses'); @@ -2555,6 +2687,8 @@ static function X2AbilityTemplate AddAreaSuppressionAbility() local AbilityGrantedBonusRadius DangerZoneBonus; local X2Condition_UnitProperty ShooterCondition; local X2Condition_UnitEffects SuppressedCondition; + local X2Condition_OwnerDoesNotHaveAbility DoesNotHaveAbilityCondition; + local X2Condition_AbilityProperty AbilityCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'AreaSuppression'); Template.IconImage = "img:///UILibrary_LW_PerkPack.LW_AreaSuppression"; @@ -2594,6 +2728,11 @@ static function X2AbilityTemplate AddAreaSuppressionAbility() AmmoCost = new class'X2AbilityCost_Ammo'; AmmoCost.iAmmo = default.AREA_SUPPRESSION_AMMO_COST; + AmmoCost.bFreeCost = true; + Template.AbilityCosts.AddItem(AmmoCost); + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = max(default.AREA_SUPPRESSION_AMMO_COST-1,0); Template.AbilityCosts.AddItem(AmmoCost); ActionPointCost = new class'X2AbilityCost_ActionPoints'; @@ -2631,6 +2770,14 @@ static function X2AbilityTemplate AddAreaSuppressionAbility() Template.AbilityMultiTargetConditions.AddItem(default.LivingHostileUnitOnlyProperty); + DoesNotHaveAbilityCondition = new class 'X2Condition_OwnerDoesNotHaveAbility'; + DoesNotHaveAbilityCondition.AbilityName = 'DedicatedSuppression_LW'; + + AbilityCondition = new class 'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('DedicatedSuppression_LW'); + + //First the non-steadfast effect + SuppressionEffect = new class'X2Effect_AreaSuppression'; SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); SuppressionEffect.bRemoveWhenTargetDies = true; @@ -2639,9 +2786,26 @@ static function X2AbilityTemplate AddAreaSuppressionAbility() SuppressionEffect.DuplicateResponse=eDupe_Allow; 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); + SuppressionEffect.TargetConditions.AddItem(DoesNotHaveAbilityCondition); + + Template.AddTargetEffect(SuppressionEffect); + Template.AddMultiTargetEffect(SuppressionEffect); + + //Then the steadfast version + SuppressionEffect = new class'X2Effect_AreaSuppression'; + SuppressionEffect.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnBegin); + SuppressionEffect.bRemoveWhenTargetDies = true; + SuppressionEffect.bRemoveWhenSourceDamaged = false; + SuppressionEffect.bBringRemoveVisualizationForward = true; + SuppressionEffect.DuplicateResponse=eDupe_Allow; + 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); + SuppressionEffect.TargetConditions.AddItem(AbilityCondition); + Template.AddTargetEffect(SuppressionEffect); - Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); Template.AddMultiTargetEffect(SuppressionEffect); + + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); Template.AddMultiTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); Template.AdditionalAbilities.AddItem('AreaSuppressionShot_LW'); @@ -2980,6 +3144,7 @@ static function X2AbilityTemplate AddDamageControlAbility() local X2AbilityTemplate Template; local X2AbilityTrigger_EventListener EventListener; local X2Effect_DamageControl DamageControlEffect; + local X2AbilityCooldown Cooldown; `CREATE_X2ABILITY_TEMPLATE(Template, 'DamageControl'); Template.IconImage = "img:///UILibrary_LW_PerkPack.LW_AbilityDamageControl"; @@ -2988,7 +3153,7 @@ static function X2AbilityTemplate AddDamageControlAbility() Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SelfTarget; - Template.bShowActivation = true; + Template.bShowActivation = false; Template.bSkipFireAction = true; //Template.bIsPassive = true; Template.bDisplayInUITooltip = true; @@ -3003,11 +3168,17 @@ static function X2AbilityTemplate AddDamageControlAbility() EventListener.ListenerData.Filter = eFilter_Unit; Template.AbilityTriggers.AddItem(EventListener); + // Add a cooldown to reduce flyover spam + Cooldown = new class'X2AbilityCooldown'; + Cooldown.iNumTurns = 1; + Template.AbilityCooldown = Cooldown; + DamageControlEffect = new class'X2Effect_DamageControl'; DamageControlEffect.BuildPersistentEffect(default.DAMAGE_CONTROL_DURATION,false,true,,eGameRule_PlayerTurnBegin); DamageControlEffect.SetDisplayInfo(ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); DamageControlEffect.DuplicateResponse = eDupe_Refresh; DamageControlEffect.BonusArmor = default.DAMAGE_CONTROL_BONUS_ARMOR; + DamageControlEffect.Flyover = Template.LocFriendlyName; Template.AddTargetEffect(DamageControlEffect); @@ -4030,6 +4201,7 @@ static function X2AbilityTemplate AddSmartMacrophagesAbility() MacrophagesEffect = new class'X2Effect_SmartMacrophages'; MacrophagesEffect.BuildPersistentEffect(1, true, false); + MacrophagesEffect.EffectRemovedFn = OnSmartMacrophagesRemoved; MacrophagesEffect.SetDisplayInfo (ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage,,, Template.AbilitySourceName); Template.AddTargetEffect(MacrophagesEffect); @@ -4037,6 +4209,7 @@ static function X2AbilityTemplate AddSmartMacrophagesAbility() DamageImmunity.ImmuneTypes.AddItem('Acid'); DamageImmunity.ImmuneTypes.AddItem('Poison'); DamageImmunity.ImmuneTypes.AddItem(class'X2Item_DefaultDamageTypes'.default.ParthenogenicPoisonType); //this is chryssalid poison, special because it spawns cocoons + DamageImmunity.EffectName = 'SmartMacrophagesDamageImmunity'; DamageImmunity.BuildPersistentEffect(1, true, false, true); Template.AddTargetEffect(DamageImmunity); @@ -4046,6 +4219,47 @@ static function X2AbilityTemplate AddSmartMacrophagesAbility() return Template; } +static function OnSmartMacrophagesRemoved(X2Effect_Persistent PersistentEffect, const out EffectAppliedData ApplyEffectParameters, XComGameState NewGameState, bool bCleansed) +{ + local XComGameStateHistory History; + local X2Effect_SmartMacrophages MacrophagesEffect; + local XComGameState_Unit UnitState, SourceUnitState; + + `LWTrace("test Smart Macrophages listener OnSmartMacrophagesRemoved"); + + MacrophagesEffect = X2Effect_SmartMacrophages(PersistentEffect); + if( MacrophagesEffect == NONE) + { + return; + } + + History = `XCOMHISTORY; + SourceUnitState = XComGameState_Unit(History.GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); + UnitState = XComGameState_Unit(History.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + `PPTRACE("Smart Macrophages: TargetUnit=" $ UnitState.GetFullName() $ ", SourceUnit=" $ SourceUnitState.GetFullName()); + + if(!MacrophagesEffect.SmartMacrophagesEffectIsValidForSource(SourceUnitState)) + { + return; + } + `PPTRACE("Smart Macrophages: Source Unit Valid."); + + if(UnitState == none) { return; } + if(UnitState.IsDead()) { return; } + if(UnitState.IsBleedingOut()) { return; } + if(!MacrophagesEffect.CanBeHealed(UnitState)) { return; } + + `PPTRACE("Smart Macrophages: Target Unit Can Be Healed."); + // Actually set up GameState stuff now + UnitState = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit', ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + + `PPTRACE("Smart Macrophages : Pre update LowestHP=" $ UnitState.LowestHP); + UnitState.LowestHP = min(UnitState.HighestHP, UnitState.LowestHP+ default.MACROPHAGES_HEAL_AMT); + `PPTRACE("Smart Macrophages : Post update LowestHP=" $ UnitState.LowestHP); + UnitState.ModifyCurrentStat(eStat_HP, default.MACROPHAGES_HEAL_AMT); + +} + static function X2AbilityTemplate AddMindMergeAbility() { local X2AbilityTemplate Template; @@ -4101,22 +4315,28 @@ static function X2AbilityTemplate AddMindMergeAbility() MindMergeEffect = new class 'X2Effect_MindMerge'; MindMergeEffect.EffectName = 'MindMergeEffect'; - MindMergeEffect.BaseWillIncrease = 0; - MindMergeEffect.BaseShieldHPIncrease = 1; - MindMergeEffect.MindMergeWillDivisor = default.MIND_MERGE_WILL_DIVISOR; - MindMergeEffect.MindMergeShieldHPDivisor = default.MIND_MERGE_SHIELDHP_DIVISOR; - MindMergeEffect.SoulMergeWillDivisor = default.SOUL_MERGE_WILL_DIVISOR; - MindMergeEffect.SoulMergeShieldHPDivisor = default.SOUL_MERGE_SHIELDHP_DIVISOR; - MindMergeEffect.AmpMGWillBonus = default.MIND_MERGE_AMP_MG_WILL_BONUS; + + MindMergeEffect.BaseShieldHPIncrease = default.MIND_MERGE_FLAT_SHIELDHP; + MindMergeEffect.BaseWillIncrease = default.MIND_MERGE_FLAT_WILL; + MindMergeEffect.BaseCritIncrease = default.MIND_MERGE_FLAT_CRIT; + MindMergeEffect.AmpMGShieldHPBonus = default.MIND_MERGE_AMP_MG_SHIELDHP_BONUS; - MindMergeEffect.AmpBMWillBonus = default.MIND_MERGE_AMP_BM_WILL_BONUS; + MindMergeEffect.AmpMGWillBonus = default.MIND_MERGE_AMP_MG_WILL_BONUS; + MindMergeEffect.AmpMGCritBonus = default.MIND_MERGE_AMP_MG_CRIT_BONUS; + MindMergeEffect.AmpBMShieldHPBonus = default.MIND_MERGE_AMP_BM_SHIELDHP_BONUS; - MindMergeEffect.MindMergeCritDivisor= default.MIND_MERGE_CRIT_DIVISOR; - MindMergeEffect.SoulMergeCritDivisor= default.SOUL_MERGE_CRIT_DIVISOR; - MindMergeEffect.AmpMGCritBonus= default.MIND_MERGE_AMP_MG_CRIT_BONUS; - MindMergeEffect.AMpBMCritBonus= default.SOUL_MERGE_AMP_BM_CRIT_BONUS; + MindMergeEffect.AmpBMWillBonus = default.MIND_MERGE_AMP_BM_WILL_BONUS; + MindMergeEffect.AmpBMCritBonus = default.MIND_MERGE_AMP_BM_CRIT_BONUS; + + MindMergeEffect.MindMergeShieldHPDivisor = default.MIND_MERGE_SHIELDHP_DIVISOR; + MindMergeEffect.MindMergeWillDivisor = default.MIND_MERGE_WILL_DIVISOR; + MindMergeEffect.MindMergeCritDivisor = default.MIND_MERGE_CRIT_DIVISOR; + + MindMergeEffect.SoulMergeShieldHPDivisor = default.SOUL_MERGE_SHIELDHP_DIVISOR; + MindMergeEffect.SoulMergeWillDivisor = default.SOUL_MERGE_WILL_DIVISOR; + MindMergeEffect.SoulMergeCritDivisor = default.SOUL_MERGE_CRIT_DIVISOR; - MindMergeEffect.bRemoveWhenTargetDies=true; + MindMergeEffect.bRemoveWhenTargetDies = true; MindMergeEffect.BuildPersistentEffect (1, false, true, false, eGameRule_PlayerTurnBegin); MindMergeEFfect.SetDisplayInfo (ePerkBuff_Bonus, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage,,, Template.AbilitySourceName); Template.AddTargetEffect (MindMergeEffect); diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet2.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet2.uc index 612c83f16..042dcdc96 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet2.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_PerkPackAbilitySet2.uc @@ -15,6 +15,12 @@ var config int REQUIRED_TO_HIT_FOR_OVERWATCH; var config float BONUS_SLICE_DAMAGE_PER_TILE; var config int MAX_SLICE_FLECHE_DAMAGE; var config array REQUIRED_OVERWATCH_TO_HIT_EXCLUDED_ABILITIES; +var config array SNAP_SHOT_ABILITIES; + +var config int COLLATERAL_COOLDOWN; +var config int COLLATERAL_AMMO; +var config int COLLATERAL_RADIUS; +var config int COLLATERAL_ENVDMG; const DAMAGED_COUNT_NAME = 'DamagedCountThisTurn'; @@ -42,6 +48,8 @@ static function array CreateTemplates() Templates.AddItem(AddStingGrenades()); Templates.AddItem(AddFieldSurgeon()); Templates.AddItem(AddDamageInstanceTracker()); + Templates.AddItem(CreateDedicatedSuppressionAbility()); + Templates.AddItem(CreateCollateralAbility()); return Templates; } @@ -146,6 +154,7 @@ static function X2AbilityTemplate AddSnapShot() //Template.OverrideAbilities.AddItem('SniperStandardFire'); Template.AdditionalAbilities.AddItem('SnapShotAimModifier'); + Template.AdditionalAbilities.AddItem('WeaponHandling_LW'); //Template.AdditionalAbilities.AddItem('SnapShotOverwatch'); return Template; @@ -814,6 +823,25 @@ static function X2AbilityTemplate AddBastionPassive() return PurePassive('BastionPassive', "img:///UILibrary_LW_PerkPack.LW_AbilityBastion", , 'eAbilitySource_Psionic'); } +final static function EventListenerReturn SolaceBastionCleanseListener(Object EventData, Object EventSource, XComGameState GameState, Name EventID, Object CallbackData) +{ + local XComGameState_Unit TargetUnit; + local XComGameState_Ability SourceAbility; + + SourceAbility = XComGameState_Ability(CallbackData); + if (SourceAbility == None) + { + return ELR_NoInterrupt; + } + + foreach `XCOMHISTORY.IterateByClassType(class'XComGameState_Unit', TargetUnit, , , GameState.HistoryIndex) + { + SourceAbility.AbilityTriggerAgainstSingleTarget(TargetUnit.GetReference(), false); + } + + return ELR_NoInterrupt; +} + static function X2AbilityTemplate AddBastionCleanse() { local X2AbilityTemplate Template; @@ -837,7 +865,7 @@ static function X2AbilityTemplate AddBastionCleanse() EventListener.ListenerData.Deferral = ELD_OnStateSubmitted; EventListener.ListenerData.EventID = 'UnitMoveFinished'; EventListener.ListenerData.Filter = eFilter_None; - EventListener.ListenerData.EventFn = class'XComGameState_Ability'.static.SolaceCleanseListener; // keep this, since it's generically just calling the associate ability + EventListener.ListenerData.EventFn = SolaceBastionCleanseListener; // keep this, since it's generically just calling the associate ability Template.AbilityTriggers.AddItem(EventListener); //removes any ongoing effects @@ -1050,3 +1078,82 @@ static function X2AbilityTemplate AddDamageInstanceTracker() return Template; } + +static function X2AbilityTemplate CreateDedicatedSuppressionAbility() +{ + local X2AbilityTemplate Template; + + Template = PurePassive('DedicatedSuppression_LW', "img:///UILibrary_XPerkIconPack.UIPerk_suppression_defense2", , 'eAbilitySource_Perk'); + + return Template; +} + +static function X2AbilityTemplate CreateCollateralAbility() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityCooldown Cooldown; + local X2AbilityTarget_Cursor CursorTarget; + local X2AbilityMultiTarget_Radius RadiusMultiTarget; + local X2Effect_CollateralDamage DamageEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'Collateral_LW'); + + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_SERGEANT_PRIORITY; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_AlwaysShow; + Template.IconImage = "img:///UILibrary_MW.UIPerk_collateral"; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + Template.bLimitTargetIcons = true; + + Template.AbilityCosts.AddItem(default.WeaponActionTurnEnding); + + Cooldown = new class'X2AbilityCooldown'; + Cooldown.iNumTurns = default.COLLATERAL_COOLDOWN; + Template.AbilityCooldown = Cooldown; + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = default.COLLATERAL_AMMO; + Template.AbilityCosts.AddItem(AmmoCost); + + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AddShooterEffectExclusions(); + + CursorTarget = new class'X2AbilityTarget_Cursor'; + CursorTarget.bRestrictToWeaponRange = true; + Template.AbilityTargetStyle = CursorTarget; + + // Slightly modified from Rocket Launcher template to let it get over blocking cover better + Template.TargetingMethod = class'X2TargetingMethod_Collateral'; + + // Give it a radius multi-target + RadiusMultiTarget = new class'X2AbilityMultiTarget_Radius'; + RadiusMultiTarget.fTargetRadius = `UNITSTOMETERS(default.COLLATERAL_RADIUS); + Template.AbilityMultiTargetStyle = RadiusMultiTarget; + + DamageEffect = new class'X2Effect_CollateralDamage'; + DamageEffect.BONUS_MULT = 0.25; + DamageEffect.MIN_BONUS = 1; + DamageEffect.EnvironmentalDamageAmount = default.COLLATERAL_ENVDMG; + DamageEffect.AllowArmor = true; + DamageEffect.AddBonus = true; + Template.AddMultiTargetEffect(DamageEffect); + + Template.bOverrideVisualResult = true; + Template.OverrideVisualResult = eHit_Miss; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; +//BEGIN AUTOGENERATED CODE: Template Overrides 'Demolition' + Template.bFrameEvenWhenUnitIsHidden = true; +//END AUTOGENERATED CODE: Template Overrides 'Demolition' + + return Template; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_XMBPerkAbilitySet.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_XMBPerkAbilitySet.uc index e46c3ee99..680b20746 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_XMBPerkAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Ability_XMBPerkAbilitySet.uc @@ -95,11 +95,16 @@ var config int MAIM_COOLDOWN; var config int SCRAP_METAL_AMMO_AMOUNT; +var config int OVERBEARING_SUPERIORITY_CRIT; + +var config float TRIGGER_BOT_DAMAGE_PENALTY; + var config int MOVING_TARGET_DEFENSE; var config int MOVING_TARGET_DODGE; var config int COMBATREADINESS_DEF; var config int COMBATREADINESS_AIM; +var config float COMBAT_READINESS_EXPLOSIVE_DR; var config int XCOM_BLOOD_THIRST_DURATION; @@ -119,6 +124,11 @@ var const string CombatReadinessBonusText; var config int CRUSADER_WOUND_HP_REDUCTTION; +var config float HERO_SLAYER_DMG; + +var config int PSYCHOTIC_RAGE_BELOW_THRESHOLD; +var config int PSYCHOTIC_RAGE_DMG_BONUS; + var config array COMBAT_READINESS_EFFECTS_TO_REMOVE; var config array BANZAI_EFFECTS_TO_REMOVE; @@ -182,6 +192,10 @@ static function array CreateTemplates() Templates.AddItem(PrimaryReturnFireShot()); Templates.AddItem(DeadeyeSnapshotAbility()); Templates.AddItem(DeadeyeSnapShotDamage()); + Templates.AddItem(RapidFireSnapshotAbility()); + Templates.AddItem(RapidFireSnapShot2()); + Templates.AddItem(ChainShotSnapShot()); + Templates.AddItem(ChainShotSnapShot2()); Templates.AddItem(PsychoticRage()); Templates.AddItem(PreciseStrike()); @@ -210,7 +224,11 @@ static function array CreateTemplates() Templates.AddItem(Magnum()); Templates.AddItem(CrusaderRage()); Templates.AddItem(QuickdrawMobility()); + Templates.AddItem(HeroSlayer_LW()); + Templates.AddItem(TriggerBot()); + Templates.AddItem(TriggerBotShot()); + Templates.AddItem(TriggerBotDamage()); @@ -1930,6 +1948,7 @@ static function X2AbilityTemplate ShootingSharp() CoverCondition = new class'XMBCondition_CoverType'; CoverCondition.ExcludedCoverTypes.AddItem(CT_None); + CoverCondition.bRequireCanTakeCover = true; ShootingEffect.AbilityTargetConditions.AddItem(CoverCondition); @@ -2011,7 +2030,7 @@ static function X2AbilityTemplate LightningSlash() local X2AbilityToHitCalc_StandardMelee StandardMelee; local X2AbilityTarget_MovingMelee MeleeTarget; local X2Effect_ApplyWeaponDamage WeaponDamageEffect; - local array SkipExclusions; + //local array SkipExclusions; local X2AbilityCooldown Cooldown; local X2AbilityCost_ActionPoints ActionPointCost; @@ -2057,8 +2076,8 @@ static function X2AbilityTemplate LightningSlash() // Shooter Conditions // Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); - SkipExclusions.AddItem(class'X2StatusEffects'.default.BurningName); - Template.AddShooterEffectExclusions(SkipExclusions); + //SkipExclusions.AddItem(class'X2StatusEffects'.default.BurningName); + Template.AddShooterEffectExclusions(); // Damage Effect // @@ -2268,6 +2287,171 @@ static function X2AbilityTemplate PrimaryReturnFireShot() return Template; } +static function X2AbilityTemplate TriggerBot() +{ + local X2AbilityTemplate Template; + local X2AbilityTargetStyle TargetStyle; + local X2AbilityTrigger Trigger; + local X2Effect_ReturnFire FireEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'TriggerBot'); + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_returnfire"; + + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + + Template.AbilityToHitCalc = default.DeadEye; + + TargetStyle = new class'X2AbilityTarget_Self'; + Template.AbilityTargetStyle = TargetStyle; + + Trigger = new class'X2AbilityTrigger_UnitPostBeginPlay'; + Template.AbilityTriggers.AddItem(Trigger); + + FireEffect = new class'X2Effect_ReturnFire'; + FireEffect.BuildPersistentEffect(1, true, false, false, eGameRule_PlayerTurnBegin); + FireEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage,,,Template.AbilitySourceName); + FireEffect.EffectName = 'TriggerBotShot'; + FireEffect.AbilityToActivate = 'TriggerBotShot'; + FireEffect.bDirectAttackOnly = true; + FireEffect.bOnlyWhenAttackMisses = false; + Template.AddTargetEffect(FireEffect); + + Template.AdditionalAbilities.AddItem('TriggerBotShot'); + Template.AdditionalAbilities.AddItem('TriggerBotDamage'); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + // NOTE: No visualization on purpose! + + Template.bCrossClassEligible = false; // this can only work with pistols, which only sharpshooters have + + return Template; +} + + +static function X2AbilityTemplate TriggerBotShot() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ReserveActionPoints ReserveActionPointCost; + local X2Condition_UnitProperty ShooterCondition; + local X2AbilityTarget_Single SingleTarget; + local X2AbilityTrigger_EventListener Trigger; + local X2Effect_Knockback KnockbackEffect; + local array SkipExclusions; + local X2Condition_Visibility TargetVisibilityCondition; + local X2AbilityCost_Ammo AmmoCost; + + + `CREATE_X2ABILITY_TEMPLATE(Template, 'TriggerBotShot'); + + Template.bDontDisplayInAbilitySummary = true; + ReserveActionPointCost = new class'X2AbilityCost_ReserveActionPoints'; + ReserveActionPointCost.iNumPoints = 1; + ReserveActionPointCost.AllowedTypes.AddItem(class'X2CharacterTemplateManager'.default.PistolOverwatchReserveActionPoint); + ReserveActionPointCost.AllowedTypes.AddItem(class'X2CharacterTemplateManager'.default.ReturnFireActionPoint); + Template.AbilityCosts.AddItem(ReserveActionPointCost); + + // pistols are typically infinite ammo weapons which will bypass the ammo cost automatically. + // but if this ability is attached to a weapon that DOES use ammo, it should use it. + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = 1; + Template.AbilityCosts.AddItem(AmmoCost); + + Template.AbilityToHitCalc = default.DeadEye; + + Template.AbilityTargetConditions.AddItem(default.LivingHostileUnitDisallowMindControlProperty); + TargetVisibilityCondition = new class'X2Condition_Visibility'; + TargetVisibilityCondition.bRequireGameplayVisible = true; + TargetVisibilityCondition.bRequireBasicVisibility = true; + TargetVisibilityCondition.bDisablePeeksOnMovement = false; //Don't use peek tiles for over watch shots + Template.AbilityTargetConditions.AddItem(TargetVisibilityCondition); + + Template.AbilityTargetConditions.AddItem(new class'X2Condition_EverVigilant'); + Template.AbilityTargetConditions.AddItem(class'X2Ability_DefaultAbilitySet'.static.OverwatchTargetEffectsCondition()); + + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + ShooterCondition = new class'X2Condition_UnitProperty'; + ShooterCondition.ExcludeConcealed = true; + Template.AbilityShooterConditions.AddItem(ShooterCondition); + + SkipExclusions.AddItem(class'X2AbilityTemplateManager'.default.DisorientedName); + SkipExclusions.AddItem(class'X2StatusEffects'.default.BurningName); + Template.AddShooterEffectExclusions(SkipExclusions); + + SingleTarget = new class'X2AbilityTarget_Single'; + SingleTarget.OnlyIncludeTargetsInsideWeaponRange = false; + Template.AbilityTargetStyle = SingleTarget; + + //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.TypicalOverwatchListener; + Template.AbilityTriggers.AddItem(Trigger); + + Template.CinescriptCameraType = "StandardGunFiring"; + + Template.AbilitySourceName = 'eAbilitySource_Standard'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_overwatch"; + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.PISTOL_OVERWATCH_PRIORITY; + Template.bDisplayInUITooltip = false; + Template.bDisplayInUITacticalText = false; + Template.DisplayTargetHitChance = false; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.bAllowFreeFireWeaponUpgrade = false; + Template.bAllowAmmoEffects = true; + + // Damage Effect + // + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect()); + Template.bAllowBonusWeaponEffects = true; + + KnockbackEffect = new class'X2Effect_Knockback'; + KnockbackEffect.KnockbackDistance = 2; + Template.AddTargetEffect(KnockbackEffect); + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_returnfire"; + Template.bShowPostActivation = true; + Template.bFrameEvenWhenUnitIsHidden = true; + Template.DefaultSourceItemSlot = eInvSlot_PrimaryWeapon; + + return Template; +} + +static function X2AbilityTemplate TriggerBotDamage() +{ + local X2AbilityTemplate Template; + local X2Effect_AbilityDamageMult DamagePenalty; + + `CREATE_X2ABILITY_TEMPLATE (Template, 'TriggerBotDamage'); + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_momentum"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + DamagePenalty = new class'X2Effect_AbilityDamageMult'; + DamagePenalty.Penalty = true; + DamagePenalty.Mult = true; + DamagePenalty.DamageMod = default.TRIGGER_BOT_DAMAGE_PENALTY; + DamagePenalty.ActiveAbility = 'TriggerBotShot'; + DamagePenalty.BuildPersistentEffect(1, true, false, false); + Template.AddTargetEffect(DamagePenalty); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} + static function X2AbilityTemplate DeadeyeSnapshotAbility() { local X2AbilityTemplate Template; @@ -2386,6 +2570,335 @@ static function X2AbilityTemplate DeadeyeSnapShotDamage() return Template; } +static function X2AbilityTemplate RapidFireSnapshotAbility() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityCooldown_Shared Cooldown; + local X2Condition_AbilityProperty AbilityCondition; + local X2Condition_UnitActionPoints ActionPointCondition; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'RapidFireSnapShot'); + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + Template.Hostility = eHostility_Offensive; + + + // require 2 ammo to be present so that both shots can be taken + 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); + + Cooldown = new class'X2AbilityCooldown_Shared'; + Cooldown.iNumTurns = 1; + Cooldown.SharingCooldownsWith.AddItem('RapidFire'); + Template.AbilityCooldown = Cooldown; + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + ToHitCalc.BuiltInHitMod = class'X2Ability_RangerAbilitySet'.default.RAPIDFIRE_AIM; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + 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; + + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_rapidfire"; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + + AbilityCondition = new class'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('SnapShot'); + Template.AbilityShooterConditions.Additem(AbilityCondition); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + Template.AdditionalAbilities.AddItem('RapidFireSnapShot2'); + Template.PostActivationEvents.AddItem('RapidFireSnapShot2'); + + Template.bCrossClassEligible = true; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + Template.bFrameEvenWhenUnitIsHidden = true; + + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.StandardActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.RunAndGunActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + + return Template; +} + +static function X2AbilityTemplate RapidFireSnapShot2() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityTrigger_EventListener Trigger; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'RapidFireSnapShot2'); + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = 1; + Template.AbilityCosts.AddItem(AmmoCost); + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + ToHitCalc.BuiltInHitMod = class'X2Ability_RangerAbilitySet'.default.RAPIDFIRE_AIM; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + Template.AbilityTargetStyle = default.SimpleSingleTarget; + + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AddShooterEffectExclusions(); + + Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty); + + 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 = 'RapidFireSnapShot2'; + Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.AbilityTriggerEventListener_OriginalTarget; + Template.AbilityTriggers.AddItem(Trigger); + + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_COLONEL_PRIORITY; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_rapidfire"; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.MergeVisualizationFn = SequentialShot_MergeVisualization; + + Template.bShowActivation = true; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; +//BEGIN AUTOGENERATED CODE: Template Overrides 'RapidFire2' + Template.bFrameEvenWhenUnitIsHidden = true; +//END AUTOGENERATED CODE: Template Overrides 'RapidFire2' + + return Template; +} + +static function X2AbilityTemplate ChainShotSnapShot() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityCooldown_Shared Cooldown; + local X2Condition_AbilityProperty AbilityCondition; + local X2AbilityCost_ActionPoints ActionPointCost; + local X2Condition_UnitActionPoints ActionPointCondition; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'ChainShotSnapShot'); + + ActionPointCost = new class'X2AbilityCost_ActionPoints'; + ActionPointCost.iNumPoints = 1; + ActionPointCost.bConsumeAllPoints = true; + Template.AbilityCosts.AddItem(ActionPointCost); + + Template.Hostility = eHostility_Offensive; + + Cooldown = new class'X2AbilityCooldown_Shared'; + Cooldown.iNumTurns = class'X2Ability_GrenadierAbilitySet'.default.CHAINSHOT_COOLDOWN; + Cooldown.SharingCooldownsWith.AddItem('ChainShot'); + Template.AbilityCooldown = Cooldown; + + // require 2 ammo to be present so that both shots can be taken + 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); + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + ToHitCalc.BuiltInHitMod = class'X2Ability_GrenadierAbilitySet'.default.CHAINSHOT_HIT_MOD; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + 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.AddTargetEffect(class'X2Ability'.default.WeaponUpgradeMissDamage); + Template.bAllowAmmoEffects = true; + Template.bAllowBonusWeaponEffects = true; + + Template.AbilityTriggers.AddItem(default.PlayerInputTrigger); + + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_ShowIfAvailable; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_chainshot"; + Template.AbilityConfirmSound = "TacticalUI_ActivateAbility"; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.BuildInterruptGameStateFn = TypicalAbility_BuildInterruptGameState; + + Template.AdditionalAbilities.AddItem('ChainShotSnapShot2'); + Template.PostActivationEvents.AddItem('ChainShotSnapShot2'); + + AbilityCondition = new class'X2Condition_AbilityProperty'; + AbilityCondition.OwnerHasSoldierAbilities.AddItem('SnapShot'); + Template.AbilityShooterConditions.Additem(AbilityCondition); + + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.StandardActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + ActionPointCondition = new class'X2Condition_UnitActionPoints'; + ActionPointCondition.AddActionPointCheck(1,class'X2CharacterTemplateManager'.default.RunAndGunActionPoint,false,eCheck_LessThanOrEqual); + Template.AbilityShooterConditions.AddItem(ActionPointCondition); + + Template.DamagePreviewFn = ChainShotSnapShotDamagePreview; + Template.bCrossClassEligible = true; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + + +//BEGIN AUTOGENERATED CODE: Template Overrides 'ChainShot' + Template.bFrameEvenWhenUnitIsHidden = true; +//END AUTOGENERATED CODE: Template Overrides 'ChainShot' + + return Template; +} + +static function X2AbilityTemplate ChainShotSnapShot2() +{ + local X2AbilityTemplate Template; + local X2AbilityCost_Ammo AmmoCost; + local X2AbilityToHitCalc_StandardAim ToHitCalc; + local X2AbilityTrigger_EventListener Trigger; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'ChainShotSnapShot2'); + + AmmoCost = new class'X2AbilityCost_Ammo'; + AmmoCost.iAmmo = 1; + Template.AbilityCosts.AddItem(AmmoCost); + + ToHitCalc = new class'X2AbilityToHitCalc_StandardAim'; + ToHitCalc.BuiltInHitMod = class'X2Ability_GrenadierAbilitySet'.default.CHAINSHOT_HIT_MOD; + Template.AbilityToHitCalc = ToHitCalc; + Template.AbilityToHitOwnerOnMissCalc = ToHitCalc; + + Template.AbilityTargetStyle = default.SimpleSingleTarget; + + Template.AbilityShooterConditions.AddItem(default.LivingShooterProperty); + Template.AddShooterEffectExclusions(); + + Template.AbilityTargetConditions.AddItem(default.LivingHostileTargetProperty); + + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.HoloTargetEffect()); + Template.AssociatedPassives.AddItem('HoloTargeting'); + Template.AddTargetEffect(class'X2Ability_GrenadierAbilitySet'.static.ShredderDamageEffect()); + Template.AddTargetEffect(class'X2Ability'.default.WeaponUpgradeMissDamage); + Template.bAllowAmmoEffects = true; + Template.bAllowBonusWeaponEffects = true; + + Trigger = new class'X2AbilityTrigger_EventListener'; + Trigger.ListenerData.Deferral = ELD_OnStateSubmitted; + Trigger.ListenerData.EventID = 'ChainShotSnapShot2'; + Trigger.ListenerData.Filter = eFilter_Unit; + Trigger.ListenerData.Priority = 80; + Trigger.ListenerData.EventFn = class'XComGameState_Ability'.static.ChainShotListener; + Template.AbilityTriggers.AddItem(Trigger); + + Template.ShotHUDPriority = class'UIUtilities_Tactical'.const.CLASS_CAPTAIN_PRIORITY; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = eAbilityIconBehavior_NeverShow; + Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_chainshot"; + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + Template.BuildVisualizationFn = TypicalAbility_BuildVisualization; + Template.MergeVisualizationFn = SequentialShot_MergeVisualization; + Template.bShowActivation = true; + + Template.SuperConcealmentLoss = class'X2AbilityTemplateManager'.default.SuperConcealmentStandardShotLoss; + Template.ChosenActivationIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotChosenActivationIncreasePerUse; + Template.LostSpawnIncreasePerUse = class'X2AbilityTemplateManager'.default.StandardShotLostSpawnIncreasePerUse; + + //BEGIN AUTOGENERATED CODE: Template Overrides 'ChainShot2' + Template.bFrameEvenWhenUnitIsHidden = true; + //END AUTOGENERATED CODE: Template Overrides 'ChainShot2' + + return Template; +} + +function bool ChainShotSnapShotDamagePreview(XComGameState_Ability AbilityState, StateObjectReference TargetRef, out WeaponDamageValue MinDamagePreview, out WeaponDamageValue MaxDamagePreview, out int AllowsShield) +{ + local XComGameState_Unit AbilityOwner; + local StateObjectReference ChainShot2Ref; + local XComGameState_Ability ChainShot2Ability; + local XComGameStateHistory History; + + AbilityState.NormalDamagePreview(TargetRef, MinDamagePreview, MaxDamagePreview, AllowsShield); + + History = `XCOMHISTORY; + AbilityOwner = XComGameState_Unit(History.GetGameStateForObjectID(AbilityState.OwnerStateObject.ObjectID)); + ChainShot2Ref = AbilityOwner.FindAbility('ChainShotSnapShot2'); + ChainShot2Ability = XComGameState_Ability(History.GetGameStateForObjectID(ChainShot2Ref.ObjectID)); + if (ChainShot2Ability == none) + { + `RedScreenOnce("Unit has ChainShot but is missing ChainShot2. Not good. -jbouscher @gameplay"); + } + else + { + ChainShot2Ability.NormalDamagePreview(TargetRef, MinDamagePreview, MaxDamagePreview, AllowsShield); + } + return true; +} + static function X2AbilityTemplate YouCannotHide() { local XMBEffect_ConditionalBonus Effect; @@ -2394,7 +2907,7 @@ static function X2AbilityTemplate YouCannotHide() Effect = new class'XMBEffect_ConditionalBonus'; // The bonus adds the aim and crit chance - Effect.AddToHitModifier(100, eHit_Success); + Effect.AddToHitModifier(30, eHit_Success); Effect.AbilityTargetConditions.AddItem(default.MatchingWeaponCondition); @@ -2412,15 +2925,15 @@ static function X2AbilityTemplate PsychoticRage() // X2Condition_UnitStatCheck can also check absolute values rather than percentages, by // using "false" instead of "true" for the last argument. Condition = new class'X2Condition_UnitStatCheck'; - Condition.AddCheckStat(eStat_HP, 36, eCheck_LessThan,,, true); + Condition.AddCheckStat(eStat_HP, default.PSYCHOTIC_RAGE_BELOW_THRESHOLD, eCheck_LessThan,,, true); // Create a conditional bonus effect Effect = new class'XMBEffect_ConditionalBonus'; //Need to add for all of them because apparently if you crit you don't hit lol - Effect.AddPercentDamageModifier(50, eHit_Success); - Effect.AddPercentDamageModifier(50, eHit_Graze); - Effect.AddPercentDamageModifier(50, eHit_Crit); + Effect.AddPercentDamageModifier(default.PSYCHOTIC_RAGE_DMG_BONUS, eHit_Success); + Effect.AddPercentDamageModifier(default.PSYCHOTIC_RAGE_DMG_BONUS, eHit_Graze); + Effect.AddPercentDamageModifier(default.PSYCHOTIC_RAGE_DMG_BONUS, eHit_Crit); Effect.EffectName = 'PsychoticRage_Bonus'; // The effect only applies while wounded @@ -2592,6 +3105,7 @@ static function X2AbilityTemplate OverbearingSuperiority() { local X2AbilityTemplate Template; local XMBEffect_AbilityCostRefund SuperiorityEffect; + local X2Effect_ToHitModifier ToHitModifier; // Create an effect that refunds the action point cost of abilities SuperiorityEffect = new class'XMBEffect_AbilityCostRefund'; @@ -2610,6 +3124,18 @@ static function X2AbilityTemplate OverbearingSuperiority() // Create the template for an activated ability using a helper function. Template = Passive('OverbearingSuperiority_LW', "img:///UILibrary_XPerkIconPack.UIPerk_enemy_crit_chevron_x3", true, SuperiorityEffect); + ToHitModifier = new class'X2Effect_ToHitModifier'; + ToHitModifier.BuildPersistentEffect(1, true, true, true); + ToHitModifier.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); + ToHitModifier.AddEffectHitModifier(eHit_Crit, default.OVERBEARING_SUPERIORITY_CRIT, Template.LocFriendlyName,,,,,,,,true); + Template.AddTargetEffect(ToHitModifier); + + ToHitModifier = new class'X2Effect_ToHitModifier'; + ToHitModifier.BuildPersistentEffect(1, true, true, true); + ToHitModifier.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); + ToHitModifier.AddEffectHitModifier(eHit_Crit, default.OVERBEARING_SUPERIORITY_CRIT, Template.LocFriendlyName,,,,,,,,true); + Template.AddTargetEffect(ToHitModifier); + Template.bDisplayInUITooltip = true; Template.bDisplayInUITacticalText = true; // Don't allow multiple ability-refunding abilities to be used in the same turn (e.g. Slam Fire and Serial) @@ -2889,10 +3415,12 @@ static function X2AbilityTemplate AddCombatReadiness() { local X2AbilityTemplate Template; local XMBEffect_ConditionalBonus DefenseBonus; - local X2Effect_PersistentStatChange AimBonus; + //local X2Effect_PersistentStatChange AimBonus; local X2Effect_RemoveEffects RemoveEffects; local name EffectName; local XMBCondition_CoverType CoverCondition; + local X2Effect_Formidable ExplosiveDREffect; + `CREATE_X2ABILITY_TEMPLATE(Template, 'CombatReadiness'); //BEGIN AUTOGENERATED CODE: Template Overrides 'FullThrottle' Template.IconImage = "img:///UILibrary_XPerkIconPack.UIPerk_command_defense"; @@ -2921,13 +3449,21 @@ static function X2AbilityTemplate AddCombatReadiness() DefenseBonus.EffectName = 'CombatReadinessDef'; Template.AddTargetEffect(DefenseBonus); + /* AimBonus = new class 'X2Effect_PersistentStatChange'; AimBonus.AddPersistentStatChange(eStat_Offense, default.COMBATREADINESS_AIM); AimBonus.BuildPersistentEffect(1, false, true, false, eGameRule_PlayerTurnEnd); AimBonus.DuplicateResponse = eDupe_Allow; AimBonus.EffectName = 'CombatReadiness'; Template.AddTargetEffect(AimBonus); + */ + ExplosiveDREffect = new class'X2Effect_Formidable'; + ExplosiveDREffect.ExplosiveDamageReduction = default.COMBAT_READINESS_EXPLOSIVE_DR; + ExplosiveDREffect.DuplicateResponse = eDupe_Allow; + ExplosiveDREffect.BuildPersistentEffect(1, true, false); + ExplosiveDREffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage,false,,Template.AbilitySourceName); + Template.AddTargetEffect(ExplosiveDREffect); RemoveEffects = new class'X2Effect_RemoveEffects'; foreach default.COMBAT_READINESS_EFFECTS_TO_REMOVE(EffectName) { @@ -3146,6 +3682,34 @@ static function X2AbilityTemplate CrusaderRage() return Template; } +static function X2AbilityTemplate HeroSlayer_LW() +{ + local X2AbilityTemplate Template; + local X2Effect_HeroSlayer DamageEffect; + + // Icon Properties + `CREATE_X2ABILITY_TEMPLATE(Template, 'HeroSlayer_LW'); + Template.IconImage = "img:///UILibrary_XPACK_Common.PerkIcons.UIPerk_ambush"; + + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + DamageEffect = new class'X2Effect_HeroSlayer'; + DamageEffect.DmgMod = default.HERO_SLAYER_DMG; + DamageEffect.BuildPersistentEffect(1, true, false, false); + DamageEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false,,Template.AbilitySourceName); + Template.AddTargetEffect(DamageEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + // NOTE: No visualization on purpose! + + return Template; +} defaultproperties @@ -3156,5 +3720,5 @@ defaultproperties Dissassemblybonustext = "Hack Bonus" QuickZapEffectName="QuickZapCostRefund" VampUnitValue="VampAmount" - CombatReadinessBonusText="Aim and defense bonus" + CombatReadinessBonusText="Aim and Explosive Resistance bonus" } diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Condition_OwnerDoesNotHaveAbility.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Condition_OwnerDoesNotHaveAbility.uc new file mode 100644 index 000000000..4a47931a6 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Condition_OwnerDoesNotHaveAbility.uc @@ -0,0 +1,19 @@ +class X2Condition_OwnerDoesNotHaveAbility extends X2Condition; + +var name AbilityName; + +event name CallMeetsConditionWithSource(XComGameState_BaseObject kTarget, XComGameState_BaseObject kSource) +{ + local XComGameState_Unit Source; + + Source = XComGameState_Unit(kSource); + + if (Source != None) + { + if (!Source.HasSoldierAbility(AbilityName)) + { + return 'AA_Success'; + } + } + return 'AA_AbilityUnavailable'; +} diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2DownloadableContentInfo_LWPerkPack.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2DownloadableContentInfo_LWPerkPack.uc index 9ba4a5ef0..14de04a72 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2DownloadableContentInfo_LWPerkPack.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2DownloadableContentInfo_LWPerkPack.uc @@ -26,6 +26,13 @@ static event OnLoadedSavedGame() /// static event InstallNewCampaign(XComGameState StartState) { + //short circuit if in shell: +// if(class'WorldInfo'.static.GetWorldInfo().GRI.GameClass.name == 'XComShell') +// { +// `LWTrace("InstallNewCampaign called in Shell, aborting."); +// return; +// } + class'XComGameState_LWPerkPackOptions'.static.CreateModSettingsState_NewCampaign(class'XComGameState_LWPerkPackOptions', StartState); } @@ -54,6 +61,10 @@ static function UpdateBaseGameThrowGrenade() X2AbilityMultiTarget_Radius(LaunchGrenadeAbilityTemplate.AbilityMultiTargetStyle).AddAbilityBonusRadius('VolatileMix', 1.0); X2AbilityMultiTarget_Radius(ProximityMineAbilityTemplate.AbilityMultiTargetStyle).AddAbilityBonusRadius('VolatileMix', 1.0); + X2AbilityMultiTarget_Radius(ThrowGrenadeAbilityTemplate.AbilityMultiTargetStyle).AddAbilityBonusRadius('MistyMadness_LW', 2.0); + X2AbilityMultiTarget_Radius(LaunchGrenadeAbilityTemplate.AbilityMultiTargetStyle).AddAbilityBonusRadius('MistyMadness_LW', 2.0); + X2AbilityMultiTarget_Radius(ProximityMineAbilityTemplate.AbilityMultiTargetStyle).AddAbilityBonusRadius('MistyMadness_LW', 2.0); + `PPDEBUG ("Updated Grenades to respect VM radius increase"); } @@ -159,6 +170,9 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS case 'CUTTHROAT_BONUS_CRIT_DAMAGE': Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.CUTTHROAT_BONUS_CRIT_DAMAGE); return true; + case 'COVERING_FIRE_OFFENSE_MALUS': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.COVERING_FIRE_OFFENSE_MALUS); + return true; case 'GHOSTWALKER_DETECTION_RANGE_REDUCTION': Outstring = string(int(class'X2Ability_PerkPackAbilitySet'.default.GHOSTWALKER_DETECTION_RANGE_REDUCTION * 100)); return true; @@ -186,6 +200,12 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS case 'MAIM_COOLDOWN': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.MAIM_COOLDOWN); return true; + case 'OVERBEARING_SUPERIORITY_CRIT': + OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.OVERBEARING_SUPERIORITY_CRIT); + return true; + case 'TRIGGER_BOT_DAMAGE_PENALTY': + OutString = string(int(class'X2Ability_XMBPerkAbilitySet'.default.TRIGGER_BOT_DAMAGE_PENALTY * 100)); + return true; case 'LICKYOURWOUNDS_HEALAMOUNT': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.LICKYOURWOUNDS_HEALAMOUNT); return true; @@ -224,7 +244,7 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS return true; case 'STILETTO_ARMOR_PIERCING': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.STILETTO_ARMOR_PIERCING); - return true; + return true; case 'THATS_CLOSE_ENOUGH_TILE_RANGE': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.THATS_CLOSE_ENOUGH_TILE_RANGE); return true; @@ -236,10 +256,10 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS return true; case 'NONE_SHALL_PASS_TILE_RANGE': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.NONE_SHALL_PASS_TILE_RANGE); - return true; + return true; case 'BRUTALITY_TILE_RADIUS': OutString = string(int(class'X2Ability_XMBPerkAbilitySet'.default.BRUTALITY_TILE_RADIUS)); - return true; + return true; case 'BRUTALITY_PANIC_CHANCE': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.BRUTALITY_PANIC_CHANCE); return true; @@ -284,7 +304,7 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS return true; case 'SUPERCHARGE_HEAL': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.SUPERCHARGE_HEAL); - return true; + return true; case 'OVERKILL_DAMAGE': OutString = string(class'X2Ability_XMBPerkAbilitySet'.default.OverkillBonusDamage); return true; @@ -365,7 +385,7 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS return true; case 'WALK_FIRE_CRIT_MALUS': OutString = string(class'X2Ability_PerkPackAbilitySet'.default.WALK_FIRE_CRIT_MALUS); - return true; + return true; case 'GUNSLINGER_TILES_RANGE': OutString = string(class'X2Ability_PerkPackAbilitySet'.default.GUNSLINGER_METERS_RANGE * 2 / 3); return true; @@ -430,16 +450,76 @@ static function bool AbilityTagExpandHandler_CH(string InString, out string OutS case 'MAYHEM_DAMAGE_BONUS_PCT': OutString = string(int(class'X2Effect_Mayhem'.default.MAYHEM_DAMAGE_BONUS_PCT)); return true; + case 'DP_AIM_BONUS': // Depth Perception + Outstring = string(class'X2Effect_DepthPerception'.default.DP_AIM_BONUS); + return true; + case 'DP_ANTIDODGE_BONUS': // Depth Perception + Outstring = string(class'X2Effect_DepthPerception'.default.DP_ANTIDODGE_BONUS); + return true; + case 'HYPERREACTIVE_PUPILS_AIM_BONUS': + Outstring = string(class'X2Effect_HyperReactivePupils'.default.HYPERREACTIVE_PUPILS_AIM_BONUS); + return true; + case 'COMBAT_AWARENESS_BONUS_ARMOR': + Outstring = string(class'X2Effect_CombatAwareness'.default.COMBAT_AWARENESS_BONUS_ARMOR); + return true; + case 'COMBAT_AWARENESS_BONUS_DEFENSE': + Outstring = string(class'X2Effect_CombatAwareness'.default.COMBAT_AWARENESS_BONUS_DEFENSE); + return true; + case 'COMBAT_RUSH_RADIUS': + Outstring = string(int(class'X2Ability_PerkPackAbilitySet'.default.COMBAT_RUSH_RADIUS)); + return true; + case 'COMBAT_RUSH_COOLDOWN': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.COMBAT_RUSH_COOLDOWN); + return true; + case 'DAMAGE_CONTROL_DURATION': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.DAMAGE_CONTROL_DURATION); + return true; + case 'DAMAGE_CONTROL_BONUS_ARMOR': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.DAMAGE_CONTROL_BONUS_ARMOR); + return true; + case 'ABSORPTION_FIELDS_COOLDOWN': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.ABSORPTION_FIELDS_COOLDOWN); + return true; + case 'ABSORPTION_FIELDS_DURATION': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.ABSORPTION_FIELDS_DURATION); + return true; + case 'BODY_SHIELD_DEF_BONUS': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.BODY_SHIELD_DEF_BONUS); + return true; + case 'BODY_SHIELD_ENEMY_CRIT_MALUS': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.BODY_SHIELD_ENEMY_CRIT_MALUS); + return true; + case 'BODY_SHIELD_COOLDOWN': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.BODY_SHIELD_COOLDOWN); + return true; + case 'BODY_SHIELD_DURATION': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.BODY_SHIELD_DURATION); + return true; + case 'EMERGENCY_LIFE_SUPPORT_BONUS_BLEEDINGOUT_TURNS': + Outstring = string(class'X2Effect_EmergencyLifeSupport'.default.EMERGENCY_LIFE_SUPPORT_BONUS_BLEEDINGOUT_TURNS); + return true; + case 'IRON_SKIN_MELEE_DAMAGE_REDUCTION': + Outstring = string(class'X2Ability_PerkPackAbilitySet'.default.IRON_SKIN_MELEE_DAMAGE_REDUCTION); + return true; case 'MOVING_TARGET_DEFENSE': Outstring = string(class'X2Ability_XMBPerkAbilitySet'.default.MOVING_TARGET_DEFENSE); return true; case 'MOVING_TARGET_DODGE': Outstring = string(class'X2Ability_XMBPerkAbilitySet'.default.MOVING_TARGET_DODGE); return true; + case 'HERO_SLAYER_DMG': + Outstring = string(int(class'X2Ability_XMBPerkAbilitySet'.default.HERO_SLAYER_DMG * 100)); + return true; + case 'PSYCHOTIC_RAGE_BELOW_THRESHOLD': + Outstring = string(class'X2Ability_XMBPerkAbilitySet'.default.PSYCHOTIC_RAGE_BELOW_THRESHOLD); + return true; + case 'PSYCHOTIC_RAGE_DMG_BONUS': + Outstring = string(class'X2Ability_XMBPerkAbilitySet'.default.PSYCHOTIC_RAGE_DMG_BONUS); + return true; default: return false; } - return false; + return false; } static function X2ItemTemplate GetItemBoundToAbilityFromUnit(XComGameState_Unit UnitState, name AbilityName, XComGameState GameState) diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ApplyHarborWaveDamage.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ApplyHarborWaveDamage.uc index 244a3ee32..edf96652c 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ApplyHarborWaveDamage.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ApplyHarborWaveDamage.uc @@ -10,13 +10,16 @@ class X2Effect_ApplyHarborWaveDamage extends X2Effect_ApplyWeaponDamage config(G //Grobo: This Feels like a heresy but I want THIS specific effect to trigger RIGHT NOW simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) { - /* + local XComGameState_Unit SourceUnit; super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); SourceUnit = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); - //`XEVENTMGR.TriggerEvent('HarborWaveDealtDamage', SourceUnit, SourceUnit, NewGameState); - */ + if(SourceUnit.HasSoldierAbility('BloodBath_LW')) + { + `XEVENTMGR.TriggerEvent('HarborWaveDealtDamage', SourceUnit, SourceUnit, NewGameState); + } + } diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_BloodThirst.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_BloodThirst.uc index 95906f320..3f37aa167 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_BloodThirst.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_BloodThirst.uc @@ -9,6 +9,7 @@ var config int BLOODTHIRST_T1_DMG; var config int BLOODTHIRST_T2_DMG; var config int BLOODTHIRST_T3_DMG; var config int BLOODTHIRST_T4_DMG; +var config int BLOODTHIRST_T5_DMG; function int GetAttackingDamageModifier(XComGameState_Effect EffectState, XComGameState_Unit Attacker, Damageable TargetDamageable, XComGameState_Ability AbilityState, const out EffectAppliedData AppliedData, const int CurrentDamage, optional XComGameState NewGameState) { @@ -37,8 +38,10 @@ function int GetAttackingDamageModifier(XComGameState_Effect EffectState, XComGa return default.BLOODTHIRST_T3_DMG; case 'ChosenSword_T4': return default.BLOODTHIRST_T4_DMG; + case 'ChosenSword_T5': + return default.BLOODTHIRST_T5_DMG; default: - return 0; + return default.BLOODTHIRST_T1_DMG; } } diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_Brawler.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_Brawler.uc index 758f6ec8f..1fa6d85b2 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_Brawler.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_Brawler.uc @@ -22,7 +22,7 @@ function float GetPostDefaultDefendingDamageModifier_CH( local int Tiles; Tiles = Attacker.TileDistanceBetween(Target); - if (Tiles < default.BRAWLER_MAX_TILES) + if (Tiles < default.BRAWLER_MAX_TILES || AbilityState.IsMeleeAbility()) { return -CurrentDamage * default.BRAWLER_DR_PCT / 100; } diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_CollateralDamage.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_CollateralDamage.uc new file mode 100644 index 000000000..aecd7cef2 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_CollateralDamage.uc @@ -0,0 +1,258 @@ +// Shamelessly stolen from the LW MECs as SPARKs mod for WOTC +class X2Effect_CollateralDamage extends X2Effect_ApplyWeaponDamage config (Game_CharacterSkills); + +var config float BONUS_MULT; +var config float MIN_BONUS; + +var bool AllowArmor; +var bool AddBonus; + +simulated function int CalculateDamageAmount(const out EffectAppliedData ApplyEffectParameters, out int ArmorMitigation, out int NewRupture, out int NewShred, out array AppliedDamageTypes, out int bAmmoIgnoresShields, out int bFullyImmune, out array SpecialDamageMessages, optional XComGameState NewGameState) +{ + local int TotalDamage, WeaponDamage, DamageSpread, CritDamage, EffectDmg; + + local XComGameStateHistory History; + local XComGameState_Unit kSourceUnit, TargetUnit; + local XComGameState_Item kSourceItem; + local Damageable kTarget; + local XComGameState_Ability kAbility; + local WeaponDamageValue BaseDamageValue; + local int ArmorPiercing; + local XComGameState_Effect EffectState; + local StateObjectReference EffectRef; + local X2Effect_Persistent EffectTemplate; + + ArmorMitigation = 0; + NewRupture = 0; + NewShred = BaseDamageValue.Shred; + bAmmoIgnoresShields = AllowArmor ? 0: 1; + + History = `XCOMHISTORY; + kSourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); + kTarget = Damageable(History.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); + kSourceItem = XComGameState_Item(History.GetGameStateForObjectID(ApplyEffectParameters.ItemStateObjectRef.ObjectID)); + kAbility = XComGameState_Ability(History.GetGameStateForObjectID(ApplyEffectParameters.AbilityStateObjectRef.ObjectID)); + + if (kSourceItem != none) + { + `log("Attacker ID:" @ kSourceUnit.ObjectID @ "With Item ID:" @ kSourceItem.ObjectID @ "Target ID:" @ ApplyEffectParameters.TargetStateObjectRef.ObjectID, true, 'XCom_HitRolls'); + if (!bIgnoreBaseDamage) + { + kSourceItem.GetBaseWeaponDamageValue(XComGameState_BaseObject(kTarget), BaseDamageValue); + + ModifyDamageValue(BaseDamageValue, kTarget, AppliedDamageTypes); + } + } + + WeaponDamage = BaseDamageValue.Damage; + DamageSpread = BaseDamageValue.Spread; + CritDamage = BaseDamageValue.Crit; + NewRupture = 0; + NewShred = BaseDamageValue.Shred; + + if (DamageSpread > 0) + { + WeaponDamage += DamageSpread; // set to max damage based on spread + WeaponDamage -= `SYNC_RAND(DamageSpread * 2 + 1); // multiply spread by 2 to get full range off base damage, add 1 as rand returns 0:x-1, not 0:x + } + `log("Damage with spread:" @ WeaponDamage, true, 'XCom_HitRolls'); + if (PlusOneDamage(BaseDamageValue.PlusOne)) + { + WeaponDamage++; + `log("Rolled for PlusOne off BaseDamage, succeeded. Damage:" @ WeaponDamage, true, 'XCom_HitRolls'); + } + + if (ApplyEffectParameters.AbilityResultContext.HitResult == eHit_Crit) + { + WeaponDamage += CritDamage; + `log("CRIT! Adjusted damage:" @ WeaponDamage, true, 'XCom_HitRolls'); + } + else if (ApplyEffectParameters.AbilityResultContext.HitResult == eHit_Graze) + { + WeaponDamage *= GRAZE_DMG_MULT; + `log("GRAZE! Adjusted damage:" @ WeaponDamage, true, 'XCom_HitRolls'); + } + + if( AddBonus && kSourceUnit != none) + { + // Allow attacker effects to modify damage output before applying final bonuses and reductions + foreach kSourceUnit.AffectedByEffects(EffectRef) + { + EffectState = XComGameState_Effect(History.GetGameStateForObjectID(EffectRef.ObjectID)); + EffectTemplate = EffectState.GetX2Effect(); + EffectDmg = EffectTemplate.GetAttackingDamageModifier(EffectState, kSourceUnit, kTarget, kAbility, ApplyEffectParameters, WeaponDamage, NewGameState); + if (EffectDmg != 0) + { + WeaponDamage += EffectDmg; + `log("Attacker effect" @ EffectTemplate.EffectName @ "adjusting damage by" @ EffectDmg $ ", new damage:" @ WeaponDamage, true, 'XCom_HitRolls'); + } + } + + // If this is a unit, apply any effects that modify damage + TargetUnit = XComGameState_Unit(kTarget); + if (TargetUnit != none) + { + foreach TargetUnit.AffectedByEffects(EffectRef) + { + EffectState = XComGameState_Effect(History.GetGameStateForObjectID(EffectRef.ObjectID)); + EffectTemplate = EffectState.GetX2Effect(); + EffectDmg = EffectTemplate.GetDefendingDamageModifier(EffectState, kSourceUnit, kTarget, kAbility, ApplyEffectParameters, WeaponDamage, self); + if (EffectDmg != 0) + { + WeaponDamage += EffectDmg; + `log("Defender effect" @ EffectTemplate.EffectName @ "adjusting damage by" @ EffectDmg $ ", new damage:" @ WeaponDamage, true, 'XCom_HitRolls'); + } + } + } + } + + TotalDamage = WeaponDamage * BONUS_MULT; + + if (TotalDamage < MIN_BONUS) + { + // Do not allow the damage reduction to invert the damage amount (i.e. heal instead of hurt, or vice-versa). + TotalDamage = MIN_BONUS; + } + + + if (kTarget != none && AllowArmor) + { + ArmorMitigation = kTarget.GetArmorMitigation(ApplyEffectParameters.AbilityResultContext.ArmorMitigation); + if (ArmorMitigation != 0) + { + ArmorPiercing += kSourceUnit.GetCurrentStat(eStat_ArmorPiercing); + `log("Armor mitigation! Target armor mitigation value:" @ ArmorMitigation @ "Attacker armor piercing value:" @ ArmorPiercing, true, 'XCom_HitRolls'); + ArmorMitigation -= ArmorPiercing; + if (ArmorMitigation < 0) + ArmorMitigation = 0; + if (ArmorMitigation >= WeaponDamage) + ArmorMitigation = WeaponDamage - 1; + if (ArmorMitigation < 0) // WeaponDamage could have been 0 + ArmorMitigation = 0; + `log(" Final mitigation value:" @ ArmorMitigation, true, 'XCom_HitRolls'); + } + } + else + { + ArmorMitigation = 0; + } + + return TotalDamage; +} + +simulated function GetDamagePreview(StateObjectReference TargetRef, XComGameState_Ability AbilityState, bool bAsPrimaryTarget, out WeaponDamageValue MinDamagePreview, out WeaponDamageValue MaxDamagePreview, out int AllowsShield) +{ + local XComGameStateHistory History; + local XComGameState_Unit TargetUnit, SourceUnit; + local XComGameState_Item SourceWeapon; + local WeaponDamageValue BaseDamageValue; + local X2Condition ConditionIter; + local name AvailableCode; + local name DamageType; + local array AppliedDamageTypes; + local bool bDoesDamageIgnoreShields; + local StateObjectReference EffectRef; + local XComGameState_Effect EffectState; + local X2Effect_Persistent EffectTemplate; + local int EffectDmg; + local EffectAppliedData TestEffectParams; + //local DamageModifierInfo DamageModInfo; + + MinDamagePreview = BaseDamageValue; + MaxDamagePreview = BaseDamageValue; + bDoesDamageIgnoreShields = false; + + if (!bApplyOnHit) + return; + + History = `XCOMHISTORY; + + SourceWeapon = AbilityState.GetSourceWeapon(); + + TargetUnit = XComGameState_Unit(History.GetGameStateForObjectID(TargetRef.ObjectID)); + SourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(AbilityState.OwnerStateObject.ObjectID)); + + if (TargetUnit != None) + { + foreach TargetConditions(ConditionIter) + { + AvailableCode = ConditionIter.AbilityMeetsCondition(AbilityState, TargetUnit); + if (AvailableCode != 'AA_Success') + return; + AvailableCode = ConditionIter.MeetsCondition(TargetUnit); + if (AvailableCode != 'AA_Success') + return; + AvailableCode = ConditionIter.MeetsConditionWithSource(TargetUnit, SourceUnit); + if (AvailableCode != 'AA_Success') + return; + } + foreach DamageTypes(DamageType) + { + if (TargetUnit.IsImmuneToDamage(DamageType)) + return; + } + } + + if (SourceWeapon != None) + { + SourceWeapon.GetBaseWeaponDamageValue(TargetUnit, BaseDamageValue); + ModifyDamageValue(BaseDamageValue, TargetUnit, AppliedDamageTypes); + } + + MinDamagePreview.Damage = BaseDamageValue.Damage - BaseDamageValue.Spread; + + MaxDamagePreview.Damage = BaseDamageValue.Damage + BaseDamageValue.Spread; + + MinDamagePreview.Pierce = AllowArmor ? 0 : 1000; + MaxDamagePreview.Pierce = AllowArmor ? 0 : 1000; + + MinDamagePreview.Shred = BaseDamageValue.Shred; + MaxDamagePreview.Shred = BaseDamageValue.Shred; + + MinDamagePreview.Rupture = 0; + MaxDamagePreview.Rupture = 0; + + if (BaseDamageValue.PlusOne > 0) + MaxDamagePreview.Damage++; + + if (AddBonus) + { + TestEffectParams.AbilityInputContext.AbilityRef = AbilityState.GetReference(); + TestEffectParams.AbilityInputContext.AbilityTemplateName = AbilityState.GetMyTemplateName(); + TestEffectParams.ItemStateObjectRef = AbilityState.SourceWeapon; + TestEffectParams.AbilityStateObjectRef = AbilityState.GetReference(); + TestEffectParams.SourceStateObjectRef = SourceUnit.GetReference(); + TestEffectParams.PlayerStateObjectRef = SourceUnit.ControllingPlayer; + TestEffectParams.TargetStateObjectRef = TargetRef; + foreach SourceUnit.AffectedByEffects(EffectRef) + { + EffectState = XComGameState_Effect(History.GetGameStateForObjectID(EffectRef.ObjectID)); + EffectTemplate = EffectState.GetX2Effect(); + + EffectDmg = EffectTemplate.GetAttackingDamageModifier(EffectState, SourceUnit, Damageable(TargetUnit), AbilityState, TestEffectParams, MinDamagePreview.Damage); + MinDamagePreview.Damage += EffectDmg; + EffectDmg = EffectTemplate.GetAttackingDamageModifier(EffectState, SourceUnit, Damageable(TargetUnit), AbilityState, TestEffectParams, MaxDamagePreview.Damage); + MaxDamagePreview.Damage += EffectDmg; + } + if (TargetUnit != none) + { + foreach TargetUnit.AffectedByEffects(EffectRef) + { + EffectState = XComGameState_Effect(History.GetGameStateForObjectID(EffectRef.ObjectID)); + EffectTemplate = EffectState.GetX2Effect(); + EffectDmg = EffectTemplate.GetDefendingDamageModifier(EffectState, SourceUnit, Damageable(TargetUnit), AbilityState, TestEffectParams, MinDamagePreview.Damage, self); + MinDamagePreview.Damage += EffectDmg; + EffectDmg = EffectTemplate.GetDefendingDamageModifier(EffectState, SourceUnit, Damageable(TargetUnit), AbilityState, TestEffectParams, MaxDamagePreview.Damage, self); + MaxDamagePreview.Damage += EffectDmg; + } + } + } + + MinDamagePreview.Damage = max(MinDamagePreview.Damage * BONUS_MULT, MIN_BONUS); + + MaxDamagePreview.Damage = max(MaxDamagePreview.Damage * BONUS_MULT, MIN_BONUS); + + if (!bDoesDamageIgnoreShields) + AllowsShield += MaxDamagePreview.Damage; +} + diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_DamageControl.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_DamageControl.uc index 4acc55ea7..f8588f842 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_DamageControl.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_DamageControl.uc @@ -6,6 +6,7 @@ class X2Effect_DamageControl extends X2Effect_BonusArmor; var int BonusArmor; +var string Flyover; function int GetArmorChance(XComGameState_Effect EffectState, XComGameState_Unit UnitState) { @@ -15,4 +16,28 @@ function int GetArmorChance(XComGameState_Effect EffectState, XComGameState_Unit function int GetArmorMitigation(XComGameState_Effect EffectState, XComGameState_Unit UnitState) { return BonusArmor; -} \ No newline at end of file +} + +//show a flyover on source +simulated function AddX2ActionsForVisualizationSource(XComGameState VisualizeGameState, out VisualizationActionMetadata ActionMetadata, name EffectApplyResult) +{ + local XComGameState_Unit OldUnitState, NewUnitState; + local X2Action_PlaySoundAndFlyOver SoundAndFlyOver; + local EWidgetColor Colour; + + if (EffectApplyResult == 'AA_Success') + { + OldUnitState = XComGameState_Unit(ActionMetadata.StateObject_OldState); + NewUnitState = XComGameState_Unit(ActionMetadata.StateObject_NewState); + if (OldUnitState != none && NewUnitState != none) + { + SoundAndFlyOver = X2Action_PlaySoundAndFlyOver(class'X2Action_PlaySoundAndFlyOver'.static.AddToVisualizationTree(ActionMetadata, VisualizeGameState.GetContext(), false, ActionMetadata.LastActionAdded)); + + //////////////==ADJUST PARAMS HERE========////////////////////////////////////// + Colour = eColor_Good; //see UIUtililties_colors.uc ... for useable values + //////////////==ADJUST PARAMS HERE========////////////////////////////////////// + + SoundAndFlyOver.SetSoundAndFlyOverParameters(None, Flyover, '', Colour); + } + } +} diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HeroSlayer.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HeroSlayer.uc new file mode 100644 index 000000000..0ff6fd8e4 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HeroSlayer.uc @@ -0,0 +1,31 @@ +class X2Effect_HeroSlayer extends X2Effect_Persistent; + +var float DmgMod; + +function float GetPostDefaultAttackingDamageModifier_CH( + XComGameState_Effect EffectState, + XComGameState_Unit Attacker, + Damageable TargetDamageable, + XComGameState_Ability AbilityState, + const out EffectAppliedData AppliedData, + float CurrentDamage, + X2Effect_ApplyWeaponDamage WeaponDamageEffect, + XComGameState NewGameState) +{ + local XComGameState_Unit TargetUnit; + + TargetUnit = XComGameState_Unit(TargetDamageable); + + + if (TargetUnit.IsResistanceHero() && class'XComGameStateContext_Ability'.static.IsHitResultHit(AppliedData.AbilityResultContext.HitResult)) + { + return CurrentDamage * DmgMod; + } + + return 0; +} + +defaultproperties +{ + bDisplayInSpecialDamageMessageUI = true +} diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HitandRun.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HitandRun.uc index 665e67a44..4ebfd0047 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HitandRun.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_HitandRun.uc @@ -61,7 +61,7 @@ function bool PostAbilityCostPaid(XComGameState_Effect EffectState, XComGameStat { History = `XCOMHISTORY; TargetUnit = XComGameState_Unit(NewGameState.GetGameStateForObjectID(AbilityContext.InputContext.PrimaryTarget.ObjectID)); - if (!AbilityState.IsMeleeAbility() && TargetUnit != none) + if (!kAbility.IsMeleeAbility() && TargetUnit != none) { if(X2TacticalGameRuleset(XComGameInfo(class'Engine'.static.GetCurrentWorldInfo().Game).GameRuleset).VisibilityMgr.GetVisibilityInfo(SourceUnit.ObjectID, TargetUnit.ObjectID, VisInfo)) { diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ImpactCompensation.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ImpactCompensation.uc index 946f3d22b..77fbdcbbe 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ImpactCompensation.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ImpactCompensation.uc @@ -20,6 +20,14 @@ function float GetPostDefaultDefendingDamageModifier_CH( XComGameState NewGameState) { local UnitValue Value; + local int PotentialMaxStacks; + + PotentialMaxStacks = MaxStacks; + + if(TargetDamageable.HasSoldierAbility('Impenetrable_LW')) + { + PotentialMaxStacks+= 1; + } Value.fValue = 0.0; TargetDamageable.GetUnitValue(class'X2Ability_PerkPackAbilitySet2'.const.DAMAGED_COUNT_NAME, Value); @@ -27,7 +35,7 @@ function float GetPostDefaultDefendingDamageModifier_CH( if (Value.fValue == 0) return 0; - return -CurrentDamage * (1 - ((1 - DamageModifier) ** Min(MaxStacks, Value.fValue))); + return -CurrentDamage * (1 - ((1 - DamageModifier) ** Min(PotentialMaxStacks, Value.fValue))); } defaultproperties diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LWHolotarget.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LWHolotarget.uc index 74fe4a1ce..5bd9a93b2 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LWHolotarget.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LWHolotarget.uc @@ -16,17 +16,17 @@ var config int HDHOLO_BM_CRIT_BONUS; var localized string HoloTargetEffectName; //implements independent targeting -simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) -{ - local XComGameState_Unit SourceUnit; - local XComGameStateHistory History; - - History = `XCOMHISTORY; - SourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(NewEffectState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); - if(SourceUnit.FindAbility('IndependentTracking').ObjectID > 0) - NewEffectState.iTurnsRemaining += default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS; - super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); -} +//simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) +//{ +// local XComGameState_Unit SourceUnit; +// local XComGameStateHistory History; +// +// History = `XCOMHISTORY; +// SourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(NewEffectState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); +// if(SourceUnit.FindAbility('IndependentTracking').ObjectID > 0) +// NewEffectState.iTurnsRemaining += default.INDEPENDENT_TARGETING_NUM_BONUS_TURNS; +// super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); +//} function GetToHitAsTargetModifiers(XComGameState_Effect EffectState, XComGameState_Unit Attacker, XComGameState_Unit Target, XComGameState_Ability AbilityState, class ToHitType, bool bMelee, bool bFlanking, bool bIndirectFire, out array ShotModifiers) { @@ -78,6 +78,11 @@ function GetToHitAsTargetModifiers(XComGameState_Effect EffectState, XComGameSta } } +function bool IsThisEffectBetterThanExistingEffect(const out XComGameState_Effect ExistingEffect) +{ + return true; +} + function bool HasOnlySingleTargetDamage(XComGameState_Ability AbilityState) { local X2AbilityTemplate AbilityTemplate; diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LW_RemoveMark.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LW_RemoveMark.uc new file mode 100644 index 000000000..927c5b60b --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_LW_RemoveMark.uc @@ -0,0 +1,70 @@ +//--------------------------------------------------------------------------------------- +// FILE: X2Effect_LW_RemoveMark.uc +// AUTHOR: Grobobobo +// PURPOSE: An effect that removes the effects from both tracking mark target, and source +//--------------------------------------------------------------------------------------- +class X2Effect_LW_RemoveMark extends X2Effect_RemoveEffects; + +simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) +{ + local XComGameState_Effect EffectState; + local X2Effect_Persistent PersistentEffect; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + + foreach History.IterateByClassType(class'XComGameState_Effect', EffectState) // cycle through ALL effects in History + { + //`LOG("Found effect: " @ EffectState.GetX2Effect().EffectName,, 'IRIDAR'); + // if this effect was applied BY THE SAME UNIT that is applying this Remove Effects effect + if (EffectState.ApplyEffectParameters.SourceStateObjectRef.ObjectID == ApplyEffectParameters.SourceStateObjectRef.ObjectID) + { + // and if the effect name fits + PersistentEffect = EffectState.GetX2Effect(); + if (PersistentEffect.EffectName == class'X2Ability_ChosenSniper'.default.TrackingShotMarkTargetEffectName || + PersistentEffect.EffectName == class'X2Ability_ChosenSniper'.default.TrackingShotMarkSourceEffectName) + { + //`LOG("Removing it.",, 'IRIDAR'); + // remove it + EffectState.RemoveEffect(NewGameState, NewGameState, bCleanse); + + // in practice, this implementation should allow us to remove Hunter Mark effects from the enemy target even though we're technically not passing + // the target state anywhere + } + } + } +} +/* +simulated function AddX2ActionsForVisualization(XComGameState VisualizeGameState, out VisualizationActionMetadata ActionMetadata, const name EffectApplyResult) +{ + local X2Action_AbilityPerkEnd PerkEndAction; + local XComGameState_Effect EffectState; + local X2Effect_Persistent PersistentEffect; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + + foreach History.IterateByClassType(class'XComGameState_Effect', EffectState) // cycle through ALL effects in History + { + `LOG("Found effect: " @ EffectState.GetX2Effect().EffectName,, 'IRIDAR'); + // if this effect was applied BY THE SAME UNIT that is applying this Remove Effects effect + if (EffectState.ApplyEffectParameters.SourceStateObjectRef.ObjectID == ApplyEffectParameters.SourceStateObjectRef.ObjectID) + { + // and if the effect name fits + PersistentEffect = EffectState.GetX2Effect(); + if (PersistentEffect.EffectName == class'X2Ability_ChosenSniper'.default.TrackingShotMarkTargetEffectName || + PersistentEffect.EffectName == class'X2Ability_ChosenSniper'.default.TrackingShotMarkSourceEffectName) + { + `LOG("Removing it.",, 'IRIDAR'); + // remove it + PerkEndAction = X2Action_AbilityPerkEnd( class'X2Action_AbilityPerkEnd'.static.AddToVisualizationTree(ActionMetadata, VisualizeGameState.GetContext(), false, ActionMetadata.LastActionAdded)); + PerkEndAction.PersistentPerkEffect = EffectState.GetX2Effect(); + EffectState.RemoveEffect(NewGameState, NewGameState, bCleanse); + + // in practice, this implementation should allow us to remove Hunter Mark effects from the enemy target even though we're technically not passing + // the target state anywhere + } + } + } +}*/ + diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_MindMerge.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_MindMerge.uc index 8e885be38..9f60e0afe 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_MindMerge.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_MindMerge.uc @@ -1,19 +1,24 @@ class X2Effect_MindMerge extends X2Effect_ModifyStats; -var float BaseWillincrease; -var float BaseShieldHPIncrease; -var float MindMergeWillDivisor; +var int BaseShieldHPIncrease; +var int BaseWillIncrease; +var int BaseCritIncrease; + +var int AmpMGShieldHPBonus; +var int AmpMGWillBonus; +var int AmpMGCritBonus; + +var int AmpBMShieldHPBonus; +var int AmpBMWillBonus; +var int AmpBMCritBonus; + var float MindMergeShieldHPDivisor; -var float SoulMergeWillDivisor; -var float SoulMergeShieldHPDivisor; -var float AmpMGWillBonus; -var float AmpMGShieldHPBonus; -var float AmpBMWillBonus; -var float AmpBMShieldHPBonus; +var float MindMergeWillDivisor; var float MindMergeCritDivisor; + +var float SoulMergeShieldHPDivisor; +var float SoulMergeWillDivisor; var float SoulMergeCritDivisor; -var float AmpMGCritBonus; -var float AMpBMCritBonus; protected simulated function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) { @@ -31,71 +36,77 @@ protected simulated function OnEffectAdded(const out EffectAppliedData ApplyEffe Caster = XComGameState_Unit (NewGameState.GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); Target = XComGameState_unit (kNewTargetState); - if(Caster == none) - { - Caster = XComGameState_Unit(class'XComGameStateHistory'.static.GetGameStateHistory().GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); - } + if(Caster == none) + { + Caster = XComGameState_Unit(class'XComGameStateHistory'.static.GetGameStateHistory().GetGameStateForObjectID(ApplyEffectParameters.SourceStateObjectRef.ObjectID)); + } SourceItem = XComGameState_Item(NewGameState.GetGameStateForObjectID(ApplyEffectParameters.ItemStateObjectRef.ObjectID)); if(SourceItem == none) - { - SourceItem = XComGameState_Item(class'XComGameStateHistory'.static.GetGameStateHistory().GetGameStateForObjectID(ApplyEffectParameters.ItemStateObjectRef.ObjectID)); - } - + { + SourceItem = XComGameState_Item(class'XComGameStateHistory'.static.GetGameStateHistory().GetGameStateForObjectID(ApplyEffectParameters.ItemStateObjectRef.ObjectID)); + } + + // Add flat bonuses + ShieldHPChange.StatAmount = BaseShieldHPIncrease; + WillChange.StatAmount = BaseWillIncrease; + CritChange.StatAmount = BaseCritIncrease; + + // Add mag tier bonuses + if (SourceItem.GetMyTemplateName() == 'PsiAmp_MG') + { + ShieldHPChange.StatAmount += AmpMGShieldHPBonus; + WillChange.StatAmount += AmpMGWillBonus; + CritChange.StatAmount += AmpMGCritBonus; + } + + // Add beam tier bonuses + if (SourceItem.GetMyTemplateName() == 'PsiAmp_BM') + { + ShieldHPChange.StatAmount += AmpBMShieldHPBonus; + WillChange.StatAmount += AmpBMWillBonus; + CritChange.StatAmount += AmpBMCritBonus; + } + + // Add per psi offense bonuses SoulMergeRef = Caster.FindAbility('SoulMerge'); if (SoulMergeRef.ObjectID == 0) { - WillChange.StatAmount = BaseWillIncrease + (Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeWillDivisor); - ShieldHPChange.StatAmount = BaseShieldHPIncrease + (Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeShieldHPDivisor); - if (MindMergeCritDivisor > 0) + if (MindMergeShieldHPDivisor > 0) + { + ShieldHPChange.StatAmount += Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeShieldHPDivisor; + } + if (MindMergeWillDivisor > 0) { - CritChange.StatAmount = (Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeCritDivisor); + WillChange.StatAmount += Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeWillDivisor; } - else + if (MindMergeCritDivisor > 0) { - CritChange.StatAmount = 0; + CritChange.StatAmount += Caster.GetCurrentStat(eStat_PsiOffense) / MindMergeCritDivisor; } } else { - WillChange.StatAmount = BaseWillIncrease + (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeWillDivisor); - ShieldHPChange.StatAmount = BaseShieldHPIncrease + (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeShieldHPDivisor); - if (SoulMergeCritDivisor > 0) - { - CritChange.StatAmount = (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeCritDivisor); - } - else + if (SoulMergeShieldHPDivisor > 0) { - CritChange.StatAmount = 0; + ShieldHPChange.StatAmount += (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeShieldHPDivisor); } - } - if (SourceItem.GetMyTemplateName() == 'PsiAmp_MG') - { - WillChange.StatAmount += AmpMGWillBonus; - ShieldHPChange.StatAmount += AmpMGShieldHPBonus; - if ((SoulMergeRef.ObjectID == 0 && MindMergeCritDivisor > 0) || (SoulMergeRef.ObjectID != 0 && SoulMergeCritDivisor > 0)) + if (SoulMergeWillDivisor > 0) { - CritChange.StatAmount += AmpMGCritBonus; + WillChange.StatAmount += (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeWillDivisor); } - } - if (SourceItem.GetMyTemplateName() == 'PsiAmp_BM') - { - WillChange.StatAmount += AmpBMWillBonus; - ShieldHPChange.StatAmount += AmpBMShieldHPBonus; - if ((SoulMergeRef.ObjectID == 0 && MindMergeCritDivisor > 0) || (SoulMergeRef.ObjectID != 0 && SoulMergeCritDivisor > 0)) + if (SoulMergeCritDivisor > 0) { - CritChange.StatAmount += AmpBMCritBonus; + CritChange.StatAmount += (Caster.GetCurrentStat(eStat_PsiOffense) / SoulMergeCritDivisor); } } - + Target.SetUnitFloatValue('MindMergeShieldHP', ShieldHPChange.StatAmount, eCleanup_BeginTactical); Target.SetUnitFloatValue('PreMindMergeShieldHP', Target.GetCurrentStat(eStat_ShieldHP), eCleanup_BeginTactical); - NewEffectState.StatChanges.AddItem(WillChange); NewEffectState.StatChanges.AddItem(ShieldHPChange); - if (CritChange.StatAmount > 0) - { - NewEffectState.StatChanges.AddItem(CritChange); - } + NewEffectState.StatChanges.AddItem(WillChange); + NewEffectState.StatChanges.AddItem(CritChange); + super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); } @@ -108,7 +119,7 @@ simulated function OnEffectRemoved(const out EffectAppliedData ApplyEffectParame UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); PreRemovalShieldHP = UnitState.GetCurrentStat(eStat_ShieldHP); - super.OnEffectRemoved(ApplyEffectParameters, NewGameState, bCleansed, RemovedEffectState); + super.OnEffectRemoved(ApplyEffectParameters, NewGameState, bCleansed, RemovedEffectState); UnitState = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(ApplyEffectParameters.TargetStateObjectRef.ObjectID)); UnitState.GetUnitValue('MindMergeShieldHP', MindMergeShieldHP); @@ -127,6 +138,3 @@ simulated function OnEffectRemoved(const out EffectAppliedData ApplyEffectParame NewGameState.AddStateObject(UnitState); } } - - - diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_PrecisionShotCritDamage.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_PrecisionShotCritDamage.uc index 88c4f3cf1..db1bee33a 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_PrecisionShotCritDamage.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_PrecisionShotCritDamage.uc @@ -14,14 +14,20 @@ function float GetPostDefaultAttackingDamageModifier_CH( { local float ExtraDamage; - if (AbilityState.GetMyTemplateName() == 'PrecisionShot') + if (AbilityState.GetMyTemplateName() == 'PrecisionShot' || AbilityState.GetMyTemplateName() == 'PrecisionShotSnapShot') { //`LOG ("Checking PS"); if (AppliedData.AbilityResultContext.HitResult == eHit_Crit) { + `LWTrace("Adding Extra Precision Shot Damage"); ExtraDamage = Max(1, CurrentDamage * default.PRECISION_SHOT_CRIT_DAMAGE_MODIFIER); } } return ExtraDamage; } + +defaultproperties +{ + EffectName="PrecisionShotCritDamage" +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ReturnFireAOE.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ReturnFireAOE.uc index 73d5b1541..c3a3c5280 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ReturnFireAOE.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_ReturnFireAOE.uc @@ -62,7 +62,7 @@ static function EventListenerReturn ReturnFireAOECheck(Object EventData, Object { //`LOG("=== ReturnFireAOECheck 2"); CoveringFireEffect = X2Effect_ReturnFireAOE(EffectState.GetX2Effect()); - `assert(CoveringFireEffect != none); + //`assert(CoveringFireEffect != none); if (CoveringFireEffect.bOnlyDuringEnemyTurn) { diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_RuptureImmunity.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_RuptureImmunity.uc new file mode 100644 index 000000000..877088f0c --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_RuptureImmunity.uc @@ -0,0 +1,45 @@ +class X2Effect_RuptureImmunity extends X2Effect_Persistent; + +function RegisterForEvents(XComGameState_Effect EffectGameState) +{ + local Object EffectObj; + + EffectObj = EffectGameState; + + `XEVENTMGR.RegisterForEvent(EffectObj, 'UnitTakeEffectDamage', OnUnitTakeEffectDamage, ELD_OnStateSubmitted,,,, EffectGameState); +} + +static function EventListenerReturn OnUnitTakeEffectDamage(Object EventData, Object EventSource, XComGameState GameState, Name Event, Object CallbackData) +{ + local XComGameState_Effect EffectGameState; + local XComGameStateHistory History; + local XComGameState_Unit SourceUnit; + local XComGameStateContext_Ability AbilityContext; + local XComGameState NewGameState; + + if (GameState.GetContext().InterruptionStatus == eInterruptionStatus_Interrupt) + return ELR_NoInterrupt; + + EffectGameState = XComGameState_Effect(CallbackData); + AbilityContext = XComGameStateContext_Ability(GameState.GetContext()); + + // if not taking damage from an ability, ignore it (e.g. damage over time effects) + if (AbilityContext == none) + return ELR_NoInterrupt; + + History = `XCOMHISTORY; + NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Remove Rupture from unit"); + SourceUnit = XComGameState_Unit(History.GetGameStateForObjectID(EffectGameState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); + + // Check that it's the unit with the Blood Trail effect that caused the damage + if (AbilityContext.InputContext.SourceObject.ObjectID != SourceUnit.ObjectID) + return ELR_NoInterrupt; + + SourceUnit = XComGameState_Unit(NewGameState.ModifyStateObject(class'XComGameState_Unit',EffectGameState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); + //Clear Out the Unit's Rupture + SourceUnit.Ruptured = 0; + + `GAMERULES.SubmitGameState(NewGameState); + + return ELR_NoInterrupt; +} diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SlugShot.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SlugShot.uc index 099dd06a2..5c611ad25 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SlugShot.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SlugShot.uc @@ -39,6 +39,10 @@ function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit { ShotInfo.Value = Modifier; } + else + { + ShotInfo.Value = AccBonus; + } ShotInfo.ModType = eHit_Success; ShotInfo.Reason = FriendlyName; ShotModifiers.AddItem(ShotInfo); diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SmartMacrophages.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SmartMacrophages.uc index 80c5e8337..7ee2d42ca 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SmartMacrophages.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SmartMacrophages.uc @@ -9,6 +9,8 @@ class X2Effect_SmartMacrophages extends X2Effect_Persistent config(LW_SoldierSki `include(LW_PerkPack_Integrated\LW_PerkPack.uci) +// This thing is apparently not used on evac missions, this is also handled by the EffectRemovedFn set on the ability itself. + function UnitEndedTacticalPlay(XComGameState_Effect EffectState, XComGameState_Unit UnitState) { local XComGameStateHistory History; @@ -18,6 +20,7 @@ function UnitEndedTacticalPlay(XComGameState_Effect EffectState, XComGameState_U SourceUnitState = XComGameState_Unit(History.GetGameStateForObjectID(EffectState.ApplyEffectParameters.SourceStateObjectRef.ObjectID)); `PPTRACE("Smart Macrophages: TargetUnit=" $ UnitState.GetFullName() $ ", SourceUnit=" $ SourceUnitState.GetFullName()); + `LWTrace("test Smart Macrophages listener UnitEndedTacticalPlay"); if(!SmartMacrophagesEffectIsValidForSource(SourceUnitState)) { return; } @@ -31,13 +34,14 @@ function UnitEndedTacticalPlay(XComGameState_Effect EffectState, XComGameState_U `PPTRACE("Smart Macrophages: Target Unit Can Be Healed."); `PPTRACE("Smart Macrophages : Pre update LowestHP=" $ UnitState.LowestHP); - UnitState.LowestHP += 1; + UnitState.LowestHP = min(UnitState.HighestHP, UnitState.LowestHP+ class'X2Ability_PerkPackAbilitySet'.default.MACROPHAGES_HEAL_AMT); `PPTRACE("Smart Macrophages : Post update LowestHP=" $ UnitState.LowestHP); - UnitState.ModifyCurrentStat(eStat_HP, 1); + UnitState.ModifyCurrentStat(eStat_HP, class'X2Ability_PerkPackAbilitySet'.default.MACROPHAGES_HEAL_AMT); super.UnitEndedTacticalPlay(EffectState, UnitState); } + function bool CanBeHealed(XComGameState_Unit UnitState) { return (UnitState.LowestHP < UnitState.GetMaxStat(eStat_HP) && UnitState.LowestHP > 0); diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SnapShotAimModifier.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SnapShotAimModifier.uc index 500cf043b..5a2f00c84 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SnapShotAimModifier.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_SnapShotAimModifier.uc @@ -14,7 +14,7 @@ function GetToHitModifiers(XComGameState_Effect EffectState, XComGameState_Unit local XComGameState_Item SourceWeapon; local ShotModifierInfo ShotInfo; - if (AbilityState.GetMyTemplateName() == 'SnapShot' || AbilityState.GetMyTemplateName() == 'LongWatchShot' || AbilityState.GetMyTemplateName() == 'DeadeyeSnapShot') + if (class'X2Ability_PerkPackAbilitySet2'.default.SNAP_SHOT_ABILITIES.Find(AbilityState.GetMyTemplateName()) != INDEX_NONE) SourceWeapon = AbilityState.GetSourceWeapon(); if(SourceWeapon != none && SourceWeapon.ObjectID == EffectState.ApplyEffectParameters.ItemStateObjectRef.ObjectID) diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_TrojanVirus.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_TrojanVirus.uc index 195082205..5d739e20c 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_TrojanVirus.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_TrojanVirus.uc @@ -53,7 +53,7 @@ static function EventListenerReturn PostEffectTickCheck(Object EventData, Object `LWTrace("Trojan check: unit is mindcontrolled:" @OldTargetState.IsMindControlled() @". unit is stunned:" @OldTargetState.IsStunned()); // don't do anything if unit is still mind controlled or stunned - if(OldTargetState.IsMindControlled() || OldTargetState.IsStunned()) + if(OldTargetState.IsMindControlled() || OldTargetState.IsStunned() || OldTargetState.AffectedByEffectNames.Find('FullOverride') != INDEX_NONE) return ELR_NoInterrupt; //NewGameState = class'XComGameStateContext_ChangeContainer'.static.CreateChangeState("Apply Trojan Virus Effects"); diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_WilltoSurvive.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_WilltoSurvive.uc index 6599149ad..4ad5ebc52 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_WilltoSurvive.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Effect_WilltoSurvive.uc @@ -21,6 +21,7 @@ function int GetDefendingDamageModifier(XComGameState_Effect EffectState, XComGa local XComGameStateHistory History; local X2AbilityTarget_Cursor TargetStyle; local X2AbilityMultiTarget_Radius MultiTargetStyle; + local int currentModifier; Target = XComGameState_Unit(`XCOMHISTORY.GetGameStateForObjectID(EffectState.ApplyEffectParameters.TargetStateObjectRef.ObjectID)); @@ -47,20 +48,39 @@ function int GetDefendingDamageModifier(XComGameState_Effect EffectState, XComGa if (MyVisInfo.TargetCover == CT_None) return 0; if (MyVisInfo.TargetCover == CT_Midlevel) - return -W2S_LOW_COVER_ARMOR_BONUS; + currentModifier = -W2S_LOW_COVER_ARMOR_BONUS; if (MyVisInfo.TargetCover == CT_Standing) - return -W2S_HIGH_COVER_ARMOR_BONUS; + currentModifier = -W2S_HIGH_COVER_ARMOR_BONUS; + + if (currentModifier < 0 && (CurrentDamage + currentModifier < 1)) + { + if (CurrentDamage <= 1) + return 0; + + return (CurrentDamage - 1) * -1; + } + return currentModifier; + } else { if(X2TacticalGameRuleset(XComGameInfo(class'Engine'.static.GetCurrentWorldInfo().Game).GameRuleset).VisibilityMgr.GetVisibilityInfo(Attacker.ObjectID, Target.ObjectID, MyVisInfo)) { - if (MyVisInfo.TargetCover == CT_None) - return 0; - if (MyVisInfo.TargetCover == CT_Midlevel) - return -W2S_LOW_COVER_ARMOR_BONUS; - if (MyVisInfo.TargetCover == CT_Standing) - return -W2S_HIGH_COVER_ARMOR_BONUS; + if (MyVisInfo.TargetCover == CT_None) + return 0; + if (MyVisInfo.TargetCover == CT_Midlevel) + currentModifier = -W2S_LOW_COVER_ARMOR_BONUS; + if (MyVisInfo.TargetCover == CT_Standing) + currentModifier = -W2S_HIGH_COVER_ARMOR_BONUS; + + if (currentModifier < 0 && (CurrentDamage + currentModifier < 1)) + { + if (CurrentDamage <= 1) + return 0; + + return (CurrentDamage - 1) * -1; + } + return currentModifier; } } return 0; diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_PerkPCS.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_PerkPCS.uc index 3f70d01ce..526d77c29 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_PerkPCS.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_PerkPCS.uc @@ -98,6 +98,7 @@ static function X2DataTemplate CreateCombatAwarenessPCS() Template.bAlwaysUnique = false; Template.Tier = 4; Template.Abilities.AddItem('CombatAwareness'); + Template.Abilities.AddItem('DedicatedSuppression_LW'); Template.InventorySlot = eInvSlot_CombatSim; Template.BlackMarketTexts = default.PCSBlackMarketTexts; @@ -265,7 +266,7 @@ static function X2DataTemplate CreateCommonPCSDefense() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'CommonPCSDefense'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Defense"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Defense"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -284,7 +285,7 @@ static function X2DataTemplate CreateRarePCSDefense() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'RarePCSDefense'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Defense"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Defense"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -303,7 +304,7 @@ static function X2DataTemplate CreateEpicPCSDefense() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'EpicPCSDefense'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Defense"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Defense"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -380,7 +381,7 @@ static function X2DataTemplate CreateCommonPCSHacking() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'CommonPCSHacking'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Hacking"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Hacking"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -399,7 +400,7 @@ static function X2DataTemplate CreateRarePCSHacking() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'RarePCSHacking'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Hacking"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Hacking"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -418,7 +419,7 @@ static function X2DataTemplate CreateEpicPCSHacking() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'EpicPCSHacking'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_Hacking"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_Hacking"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = 15; Template.bAlwaysUnique = false; @@ -437,7 +438,7 @@ static function X2DataTemplate CreateFireControl25PCS() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'FireControl25PCS'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_FireControl"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_FireControl"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = -999; Template.bAlwaysUnique = false; @@ -454,7 +455,7 @@ static function X2DataTemplate CreateFireControl50PCS() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'FireControl50PCS'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_FireControl"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_FireControl"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = -999; Template.bAlwaysUnique = false; @@ -471,7 +472,7 @@ static function X2DataTemplate CreateFireControl75PCS() `CREATE_X2TEMPLATE(class'X2EquipmentTemplate', Template, 'FireControl75PCS'); Template.LootStaticMesh = staticmesh'AdventPCS'; - Template.strImage = "img:///UILibrary_LW_Overhaul.InventoryArt.LW_Inv_CombatSim_FireControl"; + Template.strImage = "img:///UILibrary_LWOTC.InventoryArt.LW_Inv_CombatSim_FireControl"; Template.ItemCat = 'CombatSim'; Template.TradingPostValue = -999; Template.bAlwaysUnique = false; diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_StingGrenade.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_StingGrenade.uc index fbfff7998..2cb6c4e84 100644 --- a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_StingGrenade.uc +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2Item_StingGrenade.uc @@ -55,6 +55,7 @@ static function X2DataTemplate CreateStingGrenade() UnitCondition.ExcludeFriendlyToSource = false; StunnedEffect = class'X2StatusEffects'.static.CreateStunnedStatusEffect(default.STING_GRENADE_STUN_LEVEL, default.STING_GRENADE_STUN_CHANCE, false); + StunnedEffect.BuildPersistentEffect(1, true, false, false, eGameRule_UnitGroupTurnBegin); StunnedEffect.SetDisplayInfo(ePerkBuff_Penalty, class'X2StatusEffects'.default.StunnedFriendlyName, class'X2StatusEffects'.default.StunnedFriendlyDesc, "img:///UILibrary_PerkIcons.UIPerk_stun"); StunnedEffect.TargetConditions.AddItem(UnitCondition); Template.ThrownGrenadeEffects.AddItem(StunnedEffect); diff --git a/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2TargetingMethod_Collateral.uc b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2TargetingMethod_Collateral.uc new file mode 100644 index 000000000..403824a28 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_PerkPack_Integrated/Classes/X2TargetingMethod_Collateral.uc @@ -0,0 +1,229 @@ +class X2TargetingMethod_Collateral extends X2TargetingMethod; + +var protected XCom3DCursor Cursor; +var protected transient XComEmitter ExplosionEmitter; +var protected bool bRestrictToSquadsightRange; +var protected XComGameState_Player AssociatedPlayerState; + +var bool SnapToTile; + +function Init(AvailableAction InAction, int NewTargetIndex) +{ + local XComGameStateHistory History; + local float TargetingRange; + local X2AbilityTarget_Cursor CursorTarget; + local X2AbilityTemplate AbilityTemplate; + + super.Init(InAction, NewTargetIndex); + + History = `XCOMHISTORY; + + AssociatedPlayerState = XComGameState_Player(History.GetGameStateForObjectID(UnitState.ControllingPlayer.ObjectID)); + `assert(AssociatedPlayerState != none); + + // determine our targeting range + AbilityTemplate = Ability.GetMyTemplate(); + TargetingRange = UnitState.GetCurrentStat(eStat_SightRadius); + + // lock the cursor to that range + Cursor = `Cursor; + Cursor.m_fMaxChainedDistance = `METERSTOUNITS(TargetingRange); + + CursorTarget = X2AbilityTarget_Cursor(Ability.GetMyTemplate().AbilityTargetStyle); + if (CursorTarget != none) + bRestrictToSquadsightRange = CursorTarget.bRestrictToSquadsightRange; + + if (!AbilityTemplate.SkipRenderOfTargetingTemplate) + { + // setup the blast emitter + ExplosionEmitter = `BATTLE.spawn(class'XComEmitter'); + if(AbilityIsOffensive) + { + ExplosionEmitter.SetTemplate(ParticleSystem(DynamicLoadObject("UI_Range.Particles.BlastRadius_Shpere", class'ParticleSystem'))); + } + else + { + ExplosionEmitter.SetTemplate(ParticleSystem(DynamicLoadObject("UI_Range.Particles.BlastRadius_Shpere_Neutral", class'ParticleSystem'))); + } + + ExplosionEmitter.LifeSpan = 60 * 60 * 24 * 7; // never die (or at least take a week to do so) + } +} + +function Canceled() +{ + super.Canceled(); + + // unlock the 3d cursor + Cursor.m_fMaxChainedDistance = -1; + + // clean up the ui + ExplosionEmitter.Destroy(); + ClearTargetedActors(); +} + +function Committed() +{ + Canceled(); +} + +simulated protected function Vector GetSplashRadiusCenter() +{ + local vector Center; + local TTile SnapTile; + + Center = Cursor.GetCursorFeetLocation(); + + if (SnapToTile) + { + SnapTile = `XWORLD.GetTileCoordinatesFromPosition( Center ); + `XWORLD.GetFloorPositionForTile( SnapTile, Center ); + } + + return Center; +} + +simulated protected function DrawSplashRadius() +{ + local Vector Center; + local float Radius; + local LinearColor CylinderColor; + + Center = GetSplashRadiusCenter(); + Radius = Ability.GetAbilityRadius(); // This method lies! It clamps us to 1-meter increments + + if (ExplosionEmitter != none) + { + ExplosionEmitter.SetLocation(Center); // Set initial location of emitter + ExplosionEmitter.SetDrawScale(Radius / 48.0f); + ExplosionEmitter.SetRotation( rot(0,0,1) ); + + if (!ExplosionEmitter.ParticleSystemComponent.bIsActive) + { + ExplosionEmitter.ParticleSystemComponent.ActivateSystem(); + } + + ExplosionEmitter.ParticleSystemComponent.SetMICVectorParameter(0, Name("RadiusColor"), CylinderColor); + ExplosionEmitter.ParticleSystemComponent.SetMICVectorParameter(1, Name("RadiusColor"), CylinderColor); + } +} + +function Update(float DeltaTime) +{ + local XComWorldData World; + local VoxelRaytraceCheckResult Raytrace; + local array CurrentlyMarkedTargets; + local int Direction, CanSeeFromDefault; + local UnitPeekSide PeekSide; + local GameRulesCache_VisibilityInfo VisInfo; + local int OutRequiresLean; + local TTile PeekTile, UnitTile; + local bool GoodView; + local CachedCoverAndPeekData PeekData; + local vector NewTargetLocation, FiringUnitLocation, BlockedPosition; + local array Tiles; + + NewTargetLocation = GetSplashRadiusCenter(); + + if(NewTargetLocation != CachedTargetLocation) + { + World = `XWORLD; + GoodView = false; + FiringUnitLocation = FiringUnit.Location; + FiringUnitLocation.Z += World.WORLD_HalfFloorHeight; + if (World.VoxelRaytrace_Locations(FiringUnitLocation, NewTargetLocation, Raytrace)) + { + BlockedPosition = Raytrace.TraceBlocked; + // Check left and right peeks + FiringUnit.GetDirectionInfoForPosition(NewTargetLocation, VisInfo, Direction, PeekSide, CanSeeFromDefault, OutRequiresLean, true); + + if (PeekSide != eNoPeek) + { + UnitTile = World.GetTileCoordinatesFromPosition(FiringUnit.Location); + PeekData = World.GetCachedCoverAndPeekData(UnitTile); + if (PeekSide == ePeekLeft) + PeekTile = PeekData.CoverDirectionInfo[Direction].LeftPeek.PeekTile; + else + PeekTile = PeekData.CoverDirectionInfo[Direction].RightPeek.PeekTile; + + if (!World.VoxelRaytrace_Tiles(UnitTile, PeekTile, Raytrace)) + GoodView = true; + else + BlockedPosition = Raytrace.TraceBlocked; + } + } + else + { + GoodView = true; + } + + if (!GoodView) + { + NewTargetLocation = BlockedPosition;//World.GetPositionFromTileCoordinates(BlockedTile); + Cursor.CursorSetLocation(NewTargetLocation); + //`SHAPEMGR.DrawSphere(LastTargetLocation, vect(25,25,25), MakeLinearColor(1,0,0,1), false); + } + + GetTargetedActors(NewTargetLocation, CurrentlyMarkedTargets, Tiles); + CheckForFriendlyUnit(CurrentlyMarkedTargets); + MarkTargetedActors(CurrentlyMarkedTargets, (!AbilityIsOffensive) ? FiringUnit.GetTeam() : eTeam_None ); + DrawSplashRadius(); + DrawAOETiles(Tiles); + } + + super.Update(DeltaTime); +} + +function GetTargetLocations(out array TargetLocations) +{ + TargetLocations.Length = 0; + TargetLocations.AddItem(GetSplashRadiusCenter()); +} + +function name ValidateTargetLocations(const array TargetLocations) +{ + local TTile TestLoc; + if (TargetLocations.Length == 1) + { + if (bRestrictToSquadsightRange) + { + TestLoc = `XWORLD.GetTileCoordinatesFromPosition(TargetLocations[0]); + if (!class'X2TacticalVisibilityHelpers'.static.CanSquadSeeLocation(AssociatedPlayerState.ObjectID, TestLoc)) + return 'AA_NotVisible'; + } + return 'AA_Success'; + } + return 'AA_NoTargets'; +} + +function int GetTargetIndex() +{ + return 0; +} + +function bool GetAdditionalTargets(out AvailableTarget AdditionalTargets) +{ + Ability.GatherAdditionalAbilityTargetsForLocation(GetSplashRadiusCenter(), AdditionalTargets); + return true; +} + +function bool GetCurrentTargetFocus(out Vector Focus) +{ + Focus = GetSplashRadiusCenter(); + return true; +} + +static function name GetProjectileTimingStyle() +{ + return ''; +} + +static function name GetOrdnanceType() +{ + return ''; +} + +defaultproperties +{ + SnapToTile = false; +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_SMGPack_Integrated/Classes/X2DownloadableContentInfo_LWSMGPack.uc b/LongWarOfTheChosen/Src/LW_SMGPack_Integrated/Classes/X2DownloadableContentInfo_LWSMGPack.uc index 247a696e2..4a82695f3 100644 --- a/LongWarOfTheChosen/Src/LW_SMGPack_Integrated/Classes/X2DownloadableContentInfo_LWSMGPack.uc +++ b/LongWarOfTheChosen/Src/LW_SMGPack_Integrated/Classes/X2DownloadableContentInfo_LWSMGPack.uc @@ -22,7 +22,13 @@ static event OnLoadedSavedGame() /// is contained in a strategy start state. Never add additional history frames inside of InstallNewCampaign, add new state objects to the start state /// or directly modify start state objects /// -//static event InstallNewCampaign(XComGameState StartState); +static event InstallNewCampaign(XComGameState StartState) +{ + if(`SecondWaveEnabled('HybridDifficulty_LW')) + { + SetHybridDifficulty(StartState); + } +} /// /// Called after the Templates have been created (but before they are validated) while this DLC / Mod is installed. @@ -244,3 +250,76 @@ static function AddFreeKillUpgrade(X2ItemTemplateManager ItemTemplateManager, Na Template.AddUpgradeAttachment('SuppressorB', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "MagShotgun.Meshes.SM_MagShotgun_SuppressorB", "", 'SMG_MG', , "img:///UILibrary_SMG.magnetic.LWMagSMG_SuppressorB", "img:///UILibrary_StrategyImages.X2InventoryIcons.MagShotgun_SuppressorB_inv", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWSMG_BM.Meshes.SK_LWBeamSMG_SuppressorA", "", 'SMG_BM', , "img:///UILibrary_SMG.Beam.LWBeamSMG_SuppressorA", "img:///UILibrary_SMG.Beam.Inv_LWBeamSMG_SuppressorA", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); } + +static function SetHybridDifficulty(XComGameState StartState) +{ + local XComGameState_CampaignSettings CampaignSettingsStateObject; + local XComGameState_SkyRanger SkyrangerState; + local XComGameState_MissionSite Mission; + local XComGameState_HeadquartersXCom XComHQ; + local X2StrategyElementTemplateManager StratMgr; + local X2MissionSourceTemplate MissionSource; + local XComGameState_WorldRegion RegionState; + local array MissionRewards; + local X2RewardTemplate RewardTemplate; + local XComGameState_Reward RewardState; + local Vector2D v2Loc; + local XComGameStateHistory History; + + History = `XCOMHISTORY; + XComHQ = XComGameState_HeadquartersXCom(History.GetSingleGameStateObjectForClass(class'XComGameState_HeadquartersXCom')); + + foreach StartState.IteratebyClassType(class'XComGameState_CampaignSettings', CampaignSettingsStateObject) + break; + + if(CampaignSettingsStateObject != none) + { + `LWTrace("Campaign Settings State Object ID:" @CampaignSettingsStateObject.ObjectID); + CampaignSettingsStateObject = XComGameState_CampaignSettings(StartState.ModifyStateObject(class'XComGameState_CampaignSettings', CampaignSettingsStateObject.ObjectID)); + CampaignSettingsStateObject.SetDifficulty(`CAMPAIGNDIFFICULTYSETTING + , fmin(CampaignSettingsStateObject.GetTacticalDifficultyFromSettings()+25.0, 75.0) + , CampaignSettingsStateObject.GetStrategyDifficultyFromSettings() + , + , + ,true); + + + foreach StartState.IteratebyClassType(class'XComGameState_MissionSite', Mission) + { + if(Mission.Source == 'MissionSource_Start') + break; + } + + foreach StartState.IterateByClassType(class'XComGameState_SkyRanger', SkyrangerState) + break; + + // The below is a version of the CreateStartingMission function on XComGameState_HeadquartersAlien with the goal of rebuilding the one it creates + if(Mission != none && SkyRangerState != none && XComHQ != none) + { + `LWTrace("Trying to remake gatecrasher"); + Mission = XComGameState_MissionSite(StartState.ModifyStateObject(class'XComGameState_MissionSite', Mission.ObjectID)); + + StratMgr = class'X2StrategyElementTemplateManager'.static.GetStrategyElementTemplateManager(); + + RegionState = XComGameState_WorldRegion(StartState.GetGameStateForObjectID(XComHQ.StartingRegion.ObjectID)); + + v2Loc.X = SkyrangerState.Location.X; + v2Loc.Y = SkyrangerState.Location.Y; + + RewardTemplate = X2RewardTemplate(StratMgr.FindStrategyElementTemplate('Reward_None')); + RewardState = RewardTemplate.CreateInstanceFromTemplate(StartState); + MissionRewards.AddItem(RewardState); + + MissionSource = X2MissionSourceTemplate(StratMgr.FindStrategyElementTemplate('MissionSource_Start')); + Mission.BuildMission(MissionSource, v2Loc, RegionState.GetReference(), MissionRewards, true); + Mission.CacheSelectedMissionData(1,1); + } + + } + else + { + `LWTrace("HybridDifficulty: Could not find Campaign Settings State Object to edit."); + } + +} + diff --git a/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/X2DownloadableContentInfo_LWToolbox.uc b/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/X2DownloadableContentInfo_LWToolbox.uc index be6ec026c..20198c562 100644 --- a/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/X2DownloadableContentInfo_LWToolbox.uc +++ b/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/X2DownloadableContentInfo_LWToolbox.uc @@ -56,6 +56,13 @@ static event InstallNewCampaign(XComGameState StartState) { local XComGameState_LWToolboxOptions ToolboxOptions; + //short circuit if in shell: + //if(class'WorldInfo'.static.GetWorldInfo().GRI.GameClass.name == 'XComShell') + //{ + // `LWTrace("InstallNewCampaign called in Shell, aborting."); + // return; + //} + `LOG("X2DLCInfo: InstallNewCampaign",, 'LW_Toolbox'); ToolboxOptions = XComGameState_LWToolboxOptions(class'XComGameState_LWToolboxOptions'.static.CreateModSettingsState_NewCampaign(class'XComGameState_LWToolboxOptions', StartState)); diff --git a/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/XComGameState_LWToolboxOptions.uc b/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/XComGameState_LWToolboxOptions.uc index f38357b57..1acfea559 100644 --- a/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/XComGameState_LWToolboxOptions.uc +++ b/LongWarOfTheChosen/Src/LW_Toolbox_Integrated/Classes/XComGameState_LWToolboxOptions.uc @@ -898,7 +898,17 @@ function UpdateWeaponTemplates_RandomizedDamage() //restore difficulty settings Settings.SetDifficulty(OriginalLowestDifficulty, , , , , true); - Settings.SetDifficulty(OriginalDifficulty, , , , , false); + Settings.SetDifficulty(OriginalDifficulty, , , , , false); + + if(`SecondWaveEnabled('HybridDifficulty_LW')) + { + Settings.SetDifficulty(`CAMPAIGNDIFFICULTYSETTING + , fmin(Settings.GetTacticalDifficultyFromSettings()+25.0, 75.0) + , Settings.GetStrategyDifficultyFromSettings() + , + , + ,true); + } } // ======= RANDOMIZED INITIAL STATS ======= // diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/LWTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/LWTutorial.uc index 219b3b830..42082e2f5 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/LWTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/LWTutorial.uc @@ -18,7 +18,7 @@ static function DoCampaignStart() `PRESBASE.UITutorialBox( default.CampaignStartTitle, default.CampaignStartBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWOTC_Logo"); + "img:///UILibrary_LWOTC.TutorialImages.LWOTC_Logo"); } } diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_CovertActionsTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_CovertActionsTutorial.uc index 5d0997683..aaf3d8b6d 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_CovertActionsTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_CovertActionsTutorial.uc @@ -21,7 +21,7 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.CovertActionsTutorialTitle, default.CovertActionsTutorialBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWCovert_Actions_Failure"); + "img:///UILibrary_LWOTC.TutorialImages.LWCovert_Actions_Failure"); // Showing the tutorial box hides the screen below it, but we actually want // the covert actions screen to be visible behind the tutorial box. So we diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_HavenManagementTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_HavenManagementTutorial.uc index 9b574c51b..ade720044 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_HavenManagementTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_HavenManagementTutorial.uc @@ -27,12 +27,12 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.HavenAdvisersTitle, default.HavenAdvisersBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWHaven_Management"); + "img:///UILibrary_LWOTC.TutorialImages.LWHaven_Management"); `PRESBASE.UITutorialBox( default.HavenManagementTitle, default.HavenManagementBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWHaven_Management"); + "img:///UILibrary_LWOTC.TutorialImages.LWHaven_Management"); // Showing the tutorial box hides the screen below it, but we actually want // the haven management screen to be visible behind the tutorial box. So we diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InfiltratingMissionTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InfiltratingMissionTutorial.uc index 0ccb9fe3d..1809a069a 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InfiltratingMissionTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InfiltratingMissionTutorial.uc @@ -25,7 +25,7 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.InfiltratingMissionTitle, default.InfiltratingMissionBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWInfiltrating_Mission"); + "img:///UILibrary_LWOTC.TutorialImages.LWInfiltrating_Mission"); // Showing the tutorial box hides the screen below it, but we actually want // the mission brief screen to be visible behind the tutorial box. So we diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InitialHavenTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InitialHavenTutorial.uc index 27e544a23..d073cf61d 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InitialHavenTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_InitialHavenTutorial.uc @@ -20,7 +20,7 @@ event OnRemoved(UIScreen Screen) `PRESBASE.UITutorialBox( default.HavenHighlightTitle, default.HavenHighlightBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWHaven_Map_Icon"); + "img:///UILibrary_LWOTC.TutorialImages.LWHaven_Map_Icon"); } } diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_MissionBriefTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_MissionBriefTutorial.uc index c248b501e..b16844939 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_MissionBriefTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_MissionBriefTutorial.uc @@ -28,12 +28,12 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.MissionEnemyCountTitle, default.MissionEnemyCountBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWMission_Numbers"); + "img:///UILibrary_LWOTC.TutorialImages.LWMission_Numbers"); `PRESBASE.UITutorialBox( default.MissionBriefTutorialTitle, default.MissionBriefTutorialBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWMission_Brief"); + "img:///UILibrary_LWOTC.TutorialImages.LWMission_Brief"); // Showing the tutorial box hides the screen below it, but we actually want // the mission brief screen to be visible behind the tutorial box. So we diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_PromotionScreenTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_PromotionScreenTutorial.uc index 232205e6a..449afdf61 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_PromotionScreenTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_PromotionScreenTutorial.uc @@ -21,7 +21,7 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.PistolAbilitiesTutorialTitle, default.PistolAbilitiesTutorialBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWPistol_Abilities"); + "img:///UILibrary_LWOTC.TutorialImages.LWPistol_Abilities"); // Showing the tutorial box hides the screen below it, but we actually want // the promotion screen to be visible behind the tutorial box. So we diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_SquadSelectTutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_SquadSelectTutorial.uc index 70d3fd7df..dcb549bfe 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_SquadSelectTutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/UIScreenListener_SquadSelectTutorial.uc @@ -25,7 +25,7 @@ event OnInit(UIScreen Screen) `PRESBASE.UITutorialBox( default.SquadSelectInfiltrationTitle, default.SquadSelectInfiltrationBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWSquad_Select_Infiltration"); + "img:///UILibrary_LWOTC.TutorialImages.LWSquad_Select_Infiltration"); } } diff --git a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/X2EventListener_Tutorial.uc b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/X2EventListener_Tutorial.uc index 34789330b..858bf2b46 100644 --- a/LongWarOfTheChosen/Src/LW_Tutorial/Classes/X2EventListener_Tutorial.uc +++ b/LongWarOfTheChosen/Src/LW_Tutorial/Classes/X2EventListener_Tutorial.uc @@ -94,7 +94,7 @@ static function EventListenerReturn OnDroneSighted(Object EventData, Object Even class'XComGameStateContext_TutorialBox'.static.AddModalTutorialBoxToHistoryExplicit( default.DroneSightedTitle, default.DroneSightedBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWDrone"); + "img:///UILibrary_LWOTC.TutorialImages.LWDrone"); } return ELR_NoInterrupt; } @@ -109,7 +109,7 @@ static function EventListenerReturn OnRainbowTrooperSighted(Object EventData, Ob class'XComGameStateContext_TutorialBox'.static.AddModalTutorialBoxToHistoryExplicit( default.RainbowTrooperSightedTitle, default.RainbowTrooperSightedBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWRainbow"); + "img:///UILibrary_LWOTC.TutorialImages.LWRainbow"); } return ELR_NoInterrupt; } @@ -187,7 +187,7 @@ static function EventListenerReturn OnMissionDiscovered( `PRESBASE.UITutorialBox( default.FirstMissionDiscoveredTitle, default.FirstMissionDiscoveredBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWMission_Map_Icon"); + "img:///UILibrary_LWOTC.TutorialImages.LWMission_Map_Icon"); } return ELR_NoInterrupt; @@ -234,7 +234,7 @@ static function EventListenerReturn HandleFirstRetaliation( `PRESBASE.UITutorialBox( default.FirstRetaliationTitle, default.FirstRetaliationBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWOTC_Logo"); + "img:///UILibrary_LWOTC.TutorialImages.LWOTC_Logo"); } return ELR_NoInterrupt; @@ -255,7 +255,7 @@ static function EventListenerReturn ShowArchivesTutorial( `PRESBASE.UITutorialBox( default.CommandersQuartersEnteredTitle, default.CommandersQuartersEnteredBody, - "img:///UILibrary_LW_Overhaul.TutorialImages.LWOTC_Logo"); + "img:///UILibrary_LWOTC.TutorialImages.LWOTC_Logo"); } return ELR_NoInterrupt; diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_FactionWeaponAbilities.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_FactionWeaponAbilities.uc index 46eff35c8..ccba4dead 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_FactionWeaponAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_FactionWeaponAbilities.uc @@ -1,124 +1,124 @@ -//--------------------------------------------------------------------------------------- -// FILE: X2Ability_SMGAbilities.uc -// AUTHOR: Joey Martinez (jmartinez989) -// CREDIT TO: Amineri (Long War Studios) -// PURPOSE: Adds stat modifier abilities for all tech tiers of Bullpups. -// -//--------------------------------------------------------------------------------------- -class X2Ability_FactionWeaponAbilities extends X2Ability config(GameData_WeaponData); - -// ***** Mobility bonuses for Bullpups -var config int BULLPUP_CONVENTIONAL_MOBILITY_BONUS; -var config int BULLPUP_MAGNETIC_MOBILITY_BONUS; -var config int BULLPUP_BEAM_MOBILITY_BONUS; - -// *****DetectionRadius bonuses for Bullpups -var config float BULLPUP_CONVENTIONAL_DETECTIONRADIUSMODIFER; -var config float BULLPUP_MAGNETIC_DETECTIONRADIUSMODIFER; -var config float BULLPUP_BEAM_DETECTIONRADIUSMODIFER; - -/// -/// Creates the abilities that add passive Mobility for Bullpups -/// -static function array CreateTemplates() -{ - local array Templates; - - Templates.AddItem(AddBullpupConventionalBonusAbility()); - Templates.AddItem(AddBullpupMagneticBonusAbility()); - Templates.AddItem(AddBullpupBeamBonusAbility()); - - return Templates; -} - -// ******************* Stat Bonuses ********************** - -static function X2AbilityTemplate AddBullpupConventionalBonusAbility() -{ - local X2AbilityTemplate Template; - local X2Effect_PersistentStatChange PersistentStatChangeEffect; - - `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_CV_StatBonus'); - Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; - - Template.AbilitySourceName = 'eAbilitySource_Item'; - Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; - Template.Hostility = eHostility_Neutral; - Template.bDisplayInUITacticalText = false; - - Template.AbilityToHitCalc = default.DeadEye; - Template.AbilityTargetStyle = default.SelfTarget; - Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); - - // Bonus to Mobility and DetectionRange stat effects - PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; - PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); - PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_CONVENTIONAL_MOBILITY_BONUS); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_CONVENTIONAL_DETECTIONRADIUSMODIFER); - Template.AddTargetEffect(PersistentStatChangeEffect); - - Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; - - return Template; -} - -static function X2AbilityTemplate AddBullpupMagneticBonusAbility() -{ - local X2AbilityTemplate Template; - local X2Effect_PersistentStatChange PersistentStatChangeEffect; - - `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_MG_StatBonus'); - Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; - - Template.AbilitySourceName = 'eAbilitySource_Item'; - Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; - Template.Hostility = eHostility_Neutral; - Template.bDisplayInUITacticalText = false; - - Template.AbilityToHitCalc = default.DeadEye; - Template.AbilityTargetStyle = default.SelfTarget; - Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); - - // Bonus to Mobility and DetectionRange stat effects - PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; - PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); - PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_MAGNETIC_MOBILITY_BONUS); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_MAGNETIC_DETECTIONRADIUSMODIFER); - Template.AddTargetEffect(PersistentStatChangeEffect); - - Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; - - return Template; -} - -static function X2AbilityTemplate AddBullpupBeamBonusAbility() -{ - local X2AbilityTemplate Template; - local X2Effect_PersistentStatChange PersistentStatChangeEffect; - - `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_BM_StatBonus'); - Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; - - Template.AbilitySourceName = 'eAbilitySource_Item'; - Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; - Template.Hostility = eHostility_Neutral; - Template.bDisplayInUITacticalText = false; - - Template.AbilityToHitCalc = default.DeadEye; - Template.AbilityTargetStyle = default.SelfTarget; - Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); - - // Bonus to Mobility and DetectionRange stat effects - PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; - PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); - PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_BEAM_MOBILITY_BONUS); - PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_BEAM_DETECTIONRADIUSMODIFER); - Template.AddTargetEffect(PersistentStatChangeEffect); - - Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; - - return Template; -} +//--------------------------------------------------------------------------------------- +// FILE: X2Ability_SMGAbilities.uc +// AUTHOR: Joey Martinez (jmartinez989) +// CREDIT TO: Amineri (Long War Studios) +// PURPOSE: Adds stat modifier abilities for all tech tiers of Bullpups. +// +//--------------------------------------------------------------------------------------- +class X2Ability_FactionWeaponAbilities extends X2Ability config(GameData_WeaponData); + +// ***** Mobility bonuses for Bullpups +var config int BULLPUP_CONVENTIONAL_MOBILITY_BONUS; +var config int BULLPUP_MAGNETIC_MOBILITY_BONUS; +var config int BULLPUP_BEAM_MOBILITY_BONUS; + +// *****DetectionRadius bonuses for Bullpups +var config float BULLPUP_CONVENTIONAL_DETECTIONRADIUSMODIFER; +var config float BULLPUP_MAGNETIC_DETECTIONRADIUSMODIFER; +var config float BULLPUP_BEAM_DETECTIONRADIUSMODIFER; + +/// +/// Creates the abilities that add passive Mobility for Bullpups +/// +static function array CreateTemplates() +{ + local array Templates; + + Templates.AddItem(AddBullpupConventionalBonusAbility()); + Templates.AddItem(AddBullpupMagneticBonusAbility()); + Templates.AddItem(AddBullpupBeamBonusAbility()); + + return Templates; +} + +// ******************* Stat Bonuses ********************** + +static function X2AbilityTemplate AddBullpupConventionalBonusAbility() +{ + local X2AbilityTemplate Template; + local X2Effect_PersistentStatChange PersistentStatChangeEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_CV_StatBonus'); + Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; + + Template.AbilitySourceName = 'eAbilitySource_Item'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.bDisplayInUITacticalText = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + // Bonus to Mobility and DetectionRange stat effects + PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; + PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); + PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_CONVENTIONAL_MOBILITY_BONUS); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_CONVENTIONAL_DETECTIONRADIUSMODIFER); + Template.AddTargetEffect(PersistentStatChangeEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} + +static function X2AbilityTemplate AddBullpupMagneticBonusAbility() +{ + local X2AbilityTemplate Template; + local X2Effect_PersistentStatChange PersistentStatChangeEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_MG_StatBonus'); + Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; + + Template.AbilitySourceName = 'eAbilitySource_Item'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.bDisplayInUITacticalText = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + // Bonus to Mobility and DetectionRange stat effects + PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; + PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); + PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_MAGNETIC_MOBILITY_BONUS); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_MAGNETIC_DETECTIONRADIUSMODIFER); + Template.AddTargetEffect(PersistentStatChangeEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} + +static function X2AbilityTemplate AddBullpupBeamBonusAbility() +{ + local X2AbilityTemplate Template; + local X2Effect_PersistentStatChange PersistentStatChangeEffect; + + `CREATE_X2ABILITY_TEMPLATE(Template, 'Bullpup_BM_StatBonus'); + Template.IconImage = "img:///gfxXComIcons.NanofiberVest"; + + Template.AbilitySourceName = 'eAbilitySource_Item'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.bDisplayInUITacticalText = false; + + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + + // Bonus to Mobility and DetectionRange stat effects + PersistentStatChangeEffect = new class'X2Effect_PersistentStatChange'; + PersistentStatChangeEffect.BuildPersistentEffect(1, true, false, false); + PersistentStatChangeEffect.SetDisplayInfo(ePerkBuff_Passive, "", "", Template.IconImage, false,,Template.AbilitySourceName); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_Mobility, default.BULLPUP_BEAM_MOBILITY_BONUS); + PersistentStatChangeEffect.AddPersistentStatChange(eStat_DetectionModifier, default.BULLPUP_BEAM_DETECTIONRADIUSMODIFER); + Template.AddTargetEffect(PersistentStatChangeEffect); + + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + + return Template; +} diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ShieldAbilitySet.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ShieldAbilitySet.uc index afe6947b6..477a600b6 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ShieldAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ShieldAbilitySet.uc @@ -366,4 +366,4 @@ static function X2AbilityTemplate GreaterPadding(name AbilityName, int Amount) -} +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ThrowingKnifeAbilitySet.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ThrowingKnifeAbilitySet.uc index be7fb4cca..c32f9bd7e 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ThrowingKnifeAbilitySet.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Ability_ThrowingKnifeAbilitySet.uc @@ -15,6 +15,7 @@ var config int REND_THE_MARKED_CRIT; var config int IMPERSONAL_EDGE_AIM; var config int BLUESCREEN_KNIVES_PIERCE; var config int KNIFE_ENCOUNTERS_MAX_TILES; +var config int KNIFE_ENCOUNTERS_BANISHER_MAX_TILES; var config array KNIFE_ENCOUNTERS_ABILITY_NAMES; var localized string RendTheMarkedEffectName; @@ -30,6 +31,7 @@ static function array CreateTemplates() Templates.AddItem(AddHailstorm()); Templates.AddItem(AddThrowingKnifeFaceoff()); Templates.AddItem(AddKnifeEncounters()); + Templates.AddItem(AddKnifeEncountersExtendedRange()); Templates.AddItem(ImpersonalEdgePassive()); Templates.AddItem(ImpersonalEdge()); Templates.AddItem(RendTheMarked()); @@ -594,6 +596,7 @@ static function X2AbilityTemplate AddKnifeEncounters() { local X2AbilityTemplate Template; local X2Effect_CloseEncounters ActionEffect; + //local X2Condition_AbilityProperty AbilityProperty; `CREATE_X2ABILITY_TEMPLATE (Template, 'KnifeEncounters'); Template.IconImage = "img:///MusashiCombatKnifeMod_LW.UI.UIPerk_faceoff"; @@ -603,13 +606,46 @@ static function X2AbilityTemplate AddKnifeEncounters() Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SelfTarget; Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); - //Template.bIsPassive = true; // needs to be off to allow perks + ActionEffect = new class 'X2Effect_CloseEncounters'; ActionEffect.SetDisplayInfo (ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); ActionEffect.BuildPersistentEffect(1, true, false); ActionEffect.MaxTiles = default.KNIFE_ENCOUNTERS_MAX_TILES; ActionEffect.ApplicableAbilities = default.KNIFE_ENCOUNTERS_ABILITY_NAMES; Template.AddTargetEffect(ActionEffect); + + Template.bCrossClassEligible = false; + Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; + // Visualization handled in Effect + return Template; +} + + +static function X2AbilityTemplate AddKnifeEncountersExtendedRange() +{ + local X2AbilityTemplate Template; + local X2Effect_CloseEncounters ActionEffect; + //local X2Condition_AbilityProperty AbilityProperty; + + + `CREATE_X2ABILITY_TEMPLATE (Template, 'KnifeEncountersExtendedRange'); + Template.IconImage = "img:///MusashiCombatKnifeMod_LW.UI.UIPerk_faceoff"; + Template.AbilitySourceName = 'eAbilitySource_Perk'; + Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; + Template.Hostility = eHostility_Neutral; + Template.AbilityToHitCalc = default.DeadEye; + Template.AbilityTargetStyle = default.SelfTarget; + Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); + Template.OverrideAbilities.AddItem('KnifeEncounters'); + //Template.bIsPassive = true; // needs to be off to allow perks + + ActionEffect = new class 'X2Effect_CloseEncounters'; + ActionEffect.SetDisplayInfo (ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, true,,Template.AbilitySourceName); + ActionEffect.BuildPersistentEffect(1, true, false); + ActionEffect.MaxTiles = default.KNIFE_ENCOUNTERS_BANISHER_MAX_TILES; + ActionEffect.ApplicableAbilities = default.KNIFE_ENCOUNTERS_ABILITY_NAMES; + Template.AddTargetEffect(ActionEffect); + Template.bCrossClassEligible = false; Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; // Visualization handled in Effect diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Condition_LWNotAbilityProperty.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Condition_LWNotAbilityProperty.uc new file mode 100644 index 000000000..4aa352bca --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Condition_LWNotAbilityProperty.uc @@ -0,0 +1,18 @@ +class X2Condition_LWNotAbilityProperty extends X2Condition_AbilityProperty; + + +event name AbilityMeetsCondition(XComGameState_Ability kAbility,XComGameState_BaseObject kTarget) +{ + local name previousResult; + + previousResult = super.AbilityMeetsCondition(kAbility, kTarget); + + if(previousResult != 'AA_Success') + { + return 'AA_Success'; + } + else + { + return 'AA_AbilityUnavailable'; + } +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2DownloadableContentInfo_LW_WeaponsAndArmor.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2DownloadableContentInfo_LW_WeaponsAndArmor.uc index 21dbfaf01..dd27cc9fe 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2DownloadableContentInfo_LW_WeaponsAndArmor.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2DownloadableContentInfo_LW_WeaponsAndArmor.uc @@ -10,8 +10,8 @@ class X2DownloadableContentInfo_LW_WeaponsAndArmor extends X2DownloadableContentInfo config(GameData); -var config array TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE; var config array TEMPLAR_SHIELDS; +var config array TEMPLAR_GAUNTLETS_FOR_ONE_HANDED_USE; var config array AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED; @@ -99,7 +99,7 @@ static function AddCritUpgrade(X2ItemTemplateManager ItemTemplateManager, Name T } //SMG Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "LWSMG_LS.Meshes.SK_LaserSMG_Optic_C", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_OpticC", "img:///UILibrary_LW_LaserPack.Inv_Laser_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_OpticB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticB", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_OpticB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "LWSniperRifle_LS.Meshes.SK_LaserSniper_Optic_C", "", 'vektor_LS', , /*"img:///UILibrary*/"_BRPack.Attach.BR_LS_OpticB", /*"img:///UILibrary*/"_LW_LaserPack.Inv_Laser_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticB", "", 'vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticB", /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); @@ -119,7 +119,7 @@ static function AddAimBonusUpgrade(X2ItemTemplateManager ItemTemplateManager, Na //SMG Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "LWSMG_LS.Meshes.SK_LaserSMG_Optic_B", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_OpticB", "img:///UILibrary_LW_LaserPack.Inv_Laser_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); - Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_OpticC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); + Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_OpticC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "LWSniperRifle_LS.Meshes.SK_LaserSniper_Optic_B", "", 'Vektor_LS', , /*"img:///UILibrary*/"_BRPack.Attach.BR_LS_OpticC", /*"img:///UILibrary*/"_LW_LaserPack.Inv_LaserSniper_OpticB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); Template.AddUpgradeAttachment('Optic', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Optic', "BeamSniper.Meshes.SM_BeamSniper_OpticC", "", 'Vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticC", /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_OpticC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_scope"); @@ -138,7 +138,7 @@ static function AddClipSizeBonusUpgrade(X2ItemTemplateManager ItemTemplateManage } //SMG Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Mag_B", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_MagB", "img:///UILibrary_LW_LaserPack.Inv_Laser_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagB", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Mag_B", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_MagB", /*"img:///UILibrary*/"_LW_LaserPack.Inv_Laser_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagB", "", 'Vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilSniperRifle_MagB", /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.Inv_CoilSniperRifle_MagB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoReloadUpgradePresent); @@ -158,12 +158,12 @@ static function AddFreeFireBonusUpgrade(X2ItemTemplateManager ItemTemplateManage //SMG Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Trigger_B", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_TriggerB", "img:///UILibrary_LW_LaserPack.Inv_Laser_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Trigger_B", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_TriggerB", /*"img:///UILibrary*/"_LW_LaserPack.Inv_Laser_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); Template.AddUpgradeAttachment('Trigger', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "ConvAttachments.Meshes.SM_ConvTriggerB", "", 'Vektor_CG', , "", /*"img:///UILibrary*/"_StrategyImages.X2InventoryIcons.ConvAssault_ReargripB_inv", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); - Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilSniperRifle_ReargripB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); + Template.AddUpgradeAttachment('Reargrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAccessories_CG.Meshes.LW_Coil_ReargripB", "", 'Vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilSniperRifle_ReargripB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgunSniper_TriggerB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_trigger"); } @@ -180,8 +180,8 @@ static function AddReloadUpgrade(X2ItemTemplateManager ItemTemplateManager, Name //Bullpup Template.AddUpgradeAttachment('Foregrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Foregrip_B", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_ForegripB", "img:///UILibrary_LW_LaserPack.Inv_Laser_ForegripB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagC", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); - Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagD", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagC", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagC", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagC", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.NoClipSizeUpgradePresent); + Template.AddUpgradeAttachment('Mag', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagD", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagD", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_MagD", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip", class'X2Item_DefaultUpgrades'.static.ClipSizeUpgradePresent); Template.AddUpgradeAttachment('Foregrip', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Mag', "LWAttachments_LS.Meshes.SK_Laser_Foregrip_B", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_ForegripB", /*"img:///UILibrary*/"_LW_LaserPack.Inv_Laser_ForegripB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_clip"); @@ -203,7 +203,7 @@ static function AddMissDamageUpgrade(X2ItemTemplateManager ItemTemplateManager, //SMG -- switching to shared Shotgun stock to better differentiate profile compared to rifle Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWShotgun_LS.Meshes.SK_LaserShotgun_Stock_B", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_StockB", "img:///UILibrary_LW_LaserPack.Inv_LaserShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); Template.AddUpgradeAttachment('Crossbar', '', "LWAttachments_LS.Meshes.SK_Laser_Crossbar", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserBullpup_CrossBar", , , class'X2Item_DefaultUpgrades'.static.FreeFireUpgradePresent); - Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_StockB", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); + Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_StockB", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMGShotgun_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); Template.AddUpgradeAttachment('Stock', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Stock', "LWAttachments_LS.Meshes.SK_Laser_Stock_B", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_StockB", /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_StockB", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_stock"); Template.AddUpgradeAttachment('Crossbar', '', "LWAttachments_LS.Meshes.SK_Laser_Crossbar", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserShotgun_CrossBar", , , class'X2Item_DefaultUpgrades'.static.FreeFireUpgradePresent); @@ -226,7 +226,7 @@ static function AddFreeKillUpgrade(X2ItemTemplateManager ItemTemplateManager, Na //SMG Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWSMG_LS.Meshes.SK_LaserSMG_Suppressor", "", 'Bullpup_LS', , "img:///UILibrary_LW_LaserPack.LaserSMG_Suppressor", "img:///UILibrary_LW_LaserPack.Inv_LaserSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); - Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'Bullpup_CG', , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_Suppressor", "img:///UILibrary_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); + Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_Silencer", "", 'Bullpup_CG', , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_Suppressor", "img:///UILibrary_LWOTC.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWSniperRifle_LS.Meshes.SK_LaserSniper_Suppressor", "", 'Vektor_LS', , /*"img:///UILibrary*/"_LW_LaserPack.LaserRifle_Suppressor", /*"img:///UILibrary*/"_LW_LaserPack.Inv_LaserRifle_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); Template.AddUpgradeAttachment('Suppressor', 'UIPawnLocation_WeaponUpgrade_AssaultRifle_Suppressor', "LWSniperRifle_CG.Meshes.LW_CoilSniper_Suppressor", "", 'Vektor_CG', , /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.CoilRifle_Suppressor", /*"img:///UILibrary*/"_LW_Overhaul.InventoryArt.Inv_CoilRifleSMG_Suppressor", "img:///UILibrary_StrategyImages.X2InventoryIcons.Inv_weaponIcon_barrel"); @@ -272,12 +272,50 @@ static function bool AbilityTagExpandHandler(string InString, out string OutStri case 'THROWING_KNIFE_BM_BLEED_DAMAGE': OutString = string(class'X2Item_SecondaryThrowingKnives'.default.THROWING_KNIFE_BM_BLEED_DAMAGE); return true; + case 'KNIFE_ENCOUNTERS_MAX_TILES': + OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.KNIFE_ENCOUNTERS_MAX_TILES); + return true; + case 'KNIFE_ENCOUNTERS_BANISHER_MAX_TILES': + OutString = string(class'X2Ability_ThrowingKnifeAbilitySet'.default.KNIFE_ENCOUNTERS_BANISHER_MAX_TILES); + return true; } return false; } +// static function UpdateAnimations(out array CustomAnimSets, XComGameState_Unit UnitState, XComUnitPawn Pawn) +// { +// local name Item; +// local X2WeaponTemplate PrimaryWeaponTemplate, SecondaryWeaponTemplate; +// local string AnimSetToLoad; + +// PrimaryWeaponTemplate = X2WeaponTemplate(UnitState.GetPrimaryWeapon().GetMyTemplate()); +// SecondaryWeaponTemplate = X2WeaponTemplate( UnitState.GetSecondaryWeapon().GetMyTemplate()); + +// if (!UnitState.IsSoldier()) return; + +// if (UnitState.GetMyTemplateName() == 'TemplarSoldier') +// { +// if (UnitState.GetItemInSlot(eInvSlot_Pistol) != none) +// { +// if (UnitState.GetItemInSlot(eInvSlot_Pistol).GetWeaponCategory() == 'sidearm') +// { +// `LWTrace("[LW_WeaponsAndArmor] Adding animset 'AS_TemplarAutoPistol'"); +// CustomAnimSets.AddItem(AnimSet(`CONTENT.RequestGameArchetype("Templar_ANIM.AS_TemplarAutoPistol"))); +// } +// else if (UnitState.GetItemInSlot(eInvSlot_Pistol).GetWeaponCategory() == 'pistol') +// { +// `LWTrace("[LW_WeaponsAndArmor] Adding animset 'AS_Pistol'"); +// CustomAnimSets.AddItem(AnimSet(`CONTENT.RequestGameArchetype("Soldier_ANIM.AS_Pistol"))); +// } +// } +// } + +// } + +// Tedster - re-add Templar animations update + static function UpdateAnimations(out array CustomAnimSets, XComGameState_Unit UnitState, XComUnitPawn Pawn) { local name Item; @@ -414,4 +452,4 @@ static function bool PrimaryWeaponExcluded(XComGameState_Unit UnitState) // I could declare a bunch of local values to store intermediate steps but meh // blame Musashi for this kind of style =\ return (default.AUTOPISTOL_ANIMS_WEAPONCATS_EXCLUDED.Find(X2WeaponTemplate(UnitState.GetItemInSlot(eInvSlot_PrimaryWeapon).GetMyTemplate()).WeaponCat) != INDEX_NONE); -} \ No newline at end of file +} diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionArmors.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionArmors.uc index 41dc40308..1b2eac7f6 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionArmors.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionArmors.uc @@ -1,274 +1,274 @@ -// This is an Unreal Script -class X2Item_FactionArmors extends X2Item; - -static function array CreateTemplates() -{ - local array Armors; - - Armors.AddItem(CreatePlatedReaperArmor()); - Armors.AddItem(CreatePoweredReaperArmor()); - - Armors.AddItem(CreatePlatedTemplarArmor()); - Armors.AddItem(CreatePoweredTemplarArmor()); - - Armors.AddItem(CreatePlatedSkirmisherArmor()); - Armors.AddItem(CreatePoweredSkirmisherArmor()); - - - return Armors; -} - -static function X2DataTemplate CreatePlatedReaperArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedReaperArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 20; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPlatedArmorStats'); - Template.ArmorTechCat = 'plated'; - Template.ArmorCat = 'reaper'; - Template.Tier = 1; - Template.AkAudioSoldierArmorSwitch = 'Predator'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; - - Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); - Template.Requirements.RequiredEngineeringScore = 10; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 30; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 5; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} - -static function X2DataTemplate CreatePoweredReaperArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredReaperArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 60; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPoweredArmorStats'); - Template.ArmorTechCat = 'powered'; - Template.ArmorCat = 'reaper'; - Template.Tier = 3; - Template.AkAudioSoldierArmorSwitch = 'Warden'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; - - Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); - Template.Requirements.RequiredEngineeringScore = 30; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); - Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 80; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'EleriumDust'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} - -static function X2DataTemplate CreatePlatedSkirmisherArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedSkirmisherArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 20; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPlatedArmorStats'); - Template.ArmorTechCat = 'plated'; - Template.ArmorCat = 'skirmisher'; - Template.Tier = 1; - Template.AkAudioSoldierArmorSwitch = 'Predator'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; - - Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); - Template.Requirements.RequiredEngineeringScore = 10; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 30; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 5; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} - -static function X2DataTemplate CreatePoweredSkirmisherArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredSkirmisherArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 60; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPoweredArmorStats'); - Template.ArmorTechCat = 'powered'; - Template.ArmorCat = 'skirmisher'; - Template.Tier = 3; - Template.AkAudioSoldierArmorSwitch = 'Warden'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; - - Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); - Template.Requirements.RequiredEngineeringScore = 30; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); - Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 80; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'EleriumDust'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} - -static function X2DataTemplate CreatePlatedTemplarArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedTemplarArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 20; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPlatedArmorStats'); - Template.ArmorTechCat = 'plated'; - Template.ArmorCat = 'templar'; - Template.Tier = 1; - Template.AkAudioSoldierArmorSwitch = 'Predator'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; - - Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); - Template.Requirements.RequiredEngineeringScore = 10; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 30; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 5; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; -} - -static function X2DataTemplate CreatePoweredTemplarArmor() -{ - local X2ArmorTemplate Template; - local ArtifactCost Resources; - - `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredTemplarArmor'); - Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; - Template.ItemCat = 'armor'; - Template.bAddsUtilitySlot = false; - Template.StartingItem = false; - Template.CanBeBuilt = true; - Template.bInfiniteItem = false; - Template.TradingPostValue = 60; - Template.PointsToComplete = 0; - Template.Abilities.AddItem('MediumPoweredArmorStats'); - Template.ArmorTechCat = 'powered'; - Template.ArmorCat = 'templar'; - Template.Tier = 3; - Template.AkAudioSoldierArmorSwitch = 'Warden'; - Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; - Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; - - Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); - Template.Requirements.RequiredEngineeringScore = 30; - Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; - - Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); - Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); - - // Cost - Resources.ItemTemplateName = 'Supplies'; - Resources.Quantity = 80; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'AlienAlloy'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - Resources.ItemTemplateName = 'EleriumDust'; - Resources.Quantity = 10; - Template.Cost.ResourceCosts.AddItem(Resources); - - return Template; +// This is an Unreal Script +class X2Item_FactionArmors extends X2Item; + +static function array CreateTemplates() +{ + local array Armors; + + Armors.AddItem(CreatePlatedReaperArmor()); + Armors.AddItem(CreatePoweredReaperArmor()); + + Armors.AddItem(CreatePlatedTemplarArmor()); + Armors.AddItem(CreatePoweredTemplarArmor()); + + Armors.AddItem(CreatePlatedSkirmisherArmor()); + Armors.AddItem(CreatePoweredSkirmisherArmor()); + + + return Armors; +} + +static function X2DataTemplate CreatePlatedReaperArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedReaperArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 20; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPlatedArmorStats'); + Template.ArmorTechCat = 'plated'; + Template.ArmorCat = 'reaper'; + Template.Tier = 1; + Template.AkAudioSoldierArmorSwitch = 'Predator'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; + + Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); + Template.Requirements.RequiredEngineeringScore = 10; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 30; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 5; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} + +static function X2DataTemplate CreatePoweredReaperArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredReaperArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 60; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPoweredArmorStats'); + Template.ArmorTechCat = 'powered'; + Template.ArmorCat = 'reaper'; + Template.Tier = 3; + Template.AkAudioSoldierArmorSwitch = 'Warden'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; + + Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); + Template.Requirements.RequiredEngineeringScore = 30; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); + Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 80; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'EleriumDust'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} + +static function X2DataTemplate CreatePlatedSkirmisherArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedSkirmisherArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 20; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPlatedArmorStats'); + Template.ArmorTechCat = 'plated'; + Template.ArmorCat = 'skirmisher'; + Template.Tier = 1; + Template.AkAudioSoldierArmorSwitch = 'Predator'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; + + Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); + Template.Requirements.RequiredEngineeringScore = 10; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 30; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 5; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} + +static function X2DataTemplate CreatePoweredSkirmisherArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredSkirmisherArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 60; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPoweredArmorStats'); + Template.ArmorTechCat = 'powered'; + Template.ArmorCat = 'skirmisher'; + Template.Tier = 3; + Template.AkAudioSoldierArmorSwitch = 'Warden'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; + + Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); + Template.Requirements.RequiredEngineeringScore = 30; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); + Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 80; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'EleriumDust'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} + +static function X2DataTemplate CreatePlatedTemplarArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PlatedTemplarArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPlat"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 20; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPlatedArmorStats'); + Template.ArmorTechCat = 'plated'; + Template.ArmorCat = 'templar'; + Template.Tier = 1; + Template.AkAudioSoldierArmorSwitch = 'Predator'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PlatedMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Plated"; + + Template.Requirements.RequiredTechs.AddItem('PlatedArmor'); + Template.Requirements.RequiredEngineeringScore = 10; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_PLATED_HEALTH_BONUS, true); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 30; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 5; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; +} + +static function X2DataTemplate CreatePoweredTemplarArmor() +{ + local X2ArmorTemplate Template; + local ArtifactCost Resources; + + `CREATE_X2TEMPLATE(class'X2ArmorTemplate', Template, 'PoweredTemplarArmor'); + Template.strImage = "img:///UILibrary_XPACK_StrategyImages.Inv_HORArmorPowr"; + Template.ItemCat = 'armor'; + Template.bAddsUtilitySlot = false; + Template.StartingItem = false; + Template.CanBeBuilt = true; + Template.bInfiniteItem = false; + Template.TradingPostValue = 60; + Template.PointsToComplete = 0; + Template.Abilities.AddItem('MediumPoweredArmorStats'); + Template.ArmorTechCat = 'powered'; + Template.ArmorCat = 'templar'; + Template.Tier = 3; + Template.AkAudioSoldierArmorSwitch = 'Warden'; + Template.EquipNarrative = "X2NarrativeMoments.Strategy.CIN_ArmorIntro_PoweredMedium"; + Template.EquipSound = "StrategyUI_Armor_Equip_Powered"; + + Template.Requirements.RequiredTechs.AddItem('PoweredArmor'); + Template.Requirements.RequiredEngineeringScore = 30; + Template.Requirements.bVisibleIfPersonnelGatesNotMet = true; + + Template.SetUIStatMarkup(class'XLocalizedData'.default.HealthLabel, eStat_HP, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_HEALTH_BONUS, true); + Template.SetUIStatMarkup(class'XLocalizedData'.default.ArmorLabel, eStat_ArmorMitigation, class'X2Ability_ItemGrantedAbilitySet'.default.MEDIUM_POWERED_MITIGATION_AMOUNT); + + // Cost + Resources.ItemTemplateName = 'Supplies'; + Resources.Quantity = 80; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'AlienAlloy'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + Resources.ItemTemplateName = 'EleriumDust'; + Resources.Quantity = 10; + Template.Cost.ResourceCosts.AddItem(Resources); + + return Template; } \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionWeapons.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionWeapons.uc index d82fa89f7..456c477e6 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionWeapons.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_FactionWeapons.uc @@ -181,9 +181,9 @@ static function X2DataTemplate CreateBullpup_Coil_Template() Template.GameArchetype = "LWSMG_CG.Archetypes.WP_SMG_CG"; Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_AssaultRifle'; - Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_MagA"); - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_StockA"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSMG_ReargripA"); + Template.AddDefaultAttachment('Mag', "LWAssaultRifle_CG.Meshes.LW_CoilRifle_MagA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_MagA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_StockA"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA", , "img:///UILibrary_LWOTC.InventoryArt.CoilSMG_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight @@ -341,11 +341,11 @@ static function X2DataTemplate CreateVektor_Coil() Template.NumUpgradeSlots = 3; Template.GameArchetype = "LW_StrikeRifle.Archetypes.WP_DMR_CG"; - Template.AddDefaultAttachment('Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagA");//, , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_MagA"); - Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB");//, , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_StockA"); - Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA");//, , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilRifle_ReargripA"); + Template.AddDefaultAttachment('Mag', "LWSniperRifle_CG.Meshes.LW_CoilSniper_MagA");//, , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_MagA"); + Template.AddDefaultAttachment('Stock', "LWAccessories_CG.Meshes.LW_Coil_StockB");//, , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_StockA"); + Template.AddDefaultAttachment('Reargrip', "LWAccessories_CG.Meshes.LW_Coil_ReargripA");//, , "img:///UILibrary_LWOTC.InventoryArt.CoilRifle_ReargripA"); Template.AddDefaultAttachment('Light', "BeamAttachments.Meshes.BeamFlashLight"); //);//, , "img:///UILibrary_Common.ConvAssaultRifle.ConvAssault_LightA"); // re-use common conventional flashlight - Template.AddDefaultAttachment('Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC");//, , "img:///UILibrary_LW_Overhaul.InventoryArt.CoilSniperRifle_OpticA"); + Template.AddDefaultAttachment('Optic', "BeamAssaultRifle.Meshes.SM_BeamAssaultRifle_OpticC");//, , "img:///UILibrary_LWOTC.InventoryArt.CoilSniperRifle_OpticA"); Template.UIArmoryCameraPointTag = 'UIPawnLocation_WeaponUpgrade_Sniper'; diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_SecondaryThrowingKnives.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_SecondaryThrowingKnives.uc index 38f948424..2bdaadc5e 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_SecondaryThrowingKnives.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_SecondaryThrowingKnives.uc @@ -12,10 +12,13 @@ class X2Item_SecondaryThrowingKnives extends X2Item config(GameData_WeaponData); var config int THROWING_KNIFE_CHARGES; var config int THROWING_KNIFE_AIM; -var config int THROWING_KNIFE_CRITCHANCE; var config int THROWING_KNIFE_ISOUNDRANGE; var config int THROWING_KNIFE_IENVIRONMENTDAMAGE; +var config int THROWING_KNIFE_CV_CRITCHANCE; +var config int THROWING_KNIFE_MG_CRITCHANCE; +var config int THROWING_KNIFE_BM_CRITCHANCE; + var config WeaponDamageValue THROWING_KNIFE_CV_BASEDAMAGE; var config WeaponDamageValue THROWING_KNIFE_MG_BASEDAMAGE; var config WeaponDamageValue THROWING_KNIFE_BM_BASEDAMAGE; @@ -50,7 +53,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_CV_Secondary() InitializeThrowingKnifeTemplate(Template); Template.WeaponTech = 'conventional'; - Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI.UI_Kunai_CV"; + Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI_Kunai_CV"; // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "MusashiCombatKnifeMod_LW.Archetypes.WP_Kunai"; Template.Tier = 1; @@ -59,6 +62,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_CV_Secondary() Template.bInfiniteItem = true; Template.CanBeBuilt = false; + Template.CritChance = default.THROWING_KNIFE_CV_CRITCHANCE; Template.BaseDamage = default.THROWING_KNIFE_CV_BASEDAMAGE; // Add chance to inflict bleeding @@ -80,7 +84,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_MG_Secondary() InitializeThrowingKnifeTemplate(Template); Template.WeaponTech = 'magnetic'; - Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI.UI_Kunai_MG"; + Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI_Kunai_MG"; // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "MusashiCombatKnifeMod_LW.Archetypes.WP_Kunai_MG"; Template.Tier = 3; @@ -90,6 +94,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_MG_Secondary() Template.CanBeBuilt = true; Template.BaseItem = 'ThrowingKnife_CV_Secondary'; // Which item this will be upgraded from + Template.CritChance = default.THROWING_KNIFE_MG_CRITCHANCE; Template.BaseDamage = default.THROWING_KNIFE_MG_BASEDAMAGE; // Add chance to inflict bleeding @@ -111,7 +116,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_BM_Secondary() InitializeThrowingKnifeTemplate(Template); Template.WeaponTech = 'beam'; - Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI.UI_Kunai_BM"; + Template.strImage = "img:///MusashiCombatKnifeMod_LW.UI_Kunai_BM"; // This all the resources; sounds, animations, models, physics, the works. Template.GameArchetype = "MusashiCombatKnifeMod_LW.Archetypes.WP_Kunai_BM"; Template.Tier = 5; @@ -121,6 +126,7 @@ static function X2DataTemplate CreateTemplate_ThrowingKnife_BM_Secondary() Template.CanBeBuilt = true; Template.BaseItem = 'ThrowingKnife_MG_Secondary'; // Which item this will be upgraded from + Template.CritChance = default.THROWING_KNIFE_BM_CRITCHANCE; Template.BaseDamage = default.THROWING_KNIFE_BM_BASEDAMAGE; // Add chance to inflict bleeding @@ -147,7 +153,6 @@ static function X2WeaponTemplate InitializeThrowingKnifeTemplate(X2WeaponTemplat Template.RangeAccuracy = class'X2Item_SMGWeapon'.default.MIDSHORT_CONVENTIONAL_RANGE; Template.Aim = default.THROWING_KNIFE_AIM; - Template.CritChance = default.THROWING_KNIFE_CRITCHANCE; Template.iSoundRange = default.THROWING_KNIFE_ISOUNDRANGE; Template.iEnvironmentDamage = default.THROWING_KNIFE_IENVIRONMENTDAMAGE; Template.BaseDamage.DamageType = 'Melee'; diff --git a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_Shields_LW.uc b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_Shields_LW.uc index ce4cfea05..0ef8e5244 100644 --- a/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_Shields_LW.uc +++ b/LongWarOfTheChosen/Src/LW_WeaponsAndArmor/Classes/X2Item_Shields_LW.uc @@ -6,6 +6,8 @@ //--------------------------------------------------------------------------------------- class X2Item_Shields_LW extends X2Item config(GameData_WeaponData); +var config bool ENABLE_SHIELDS; + var config WeaponDamageValue SHIELD_CV_BASEDAMAGE; var config WeaponDamageValue SHIELD_MG_BASEDAMAGE; var config WeaponDamageValue SHIELD_BM_BASEDAMAGE; @@ -38,9 +40,12 @@ static function array CreateTemplates() { local array Weapons; - Weapons.AddItem(BallisticShield_CV()); - Weapons.AddItem(BallisticShield_MG()); - Weapons.AddItem(BallisticShield_BM()); + if(default.ENABLE_SHIELDS) + { + Weapons.AddItem(BallisticShield_CV()); + Weapons.AddItem(BallisticShield_MG()); + Weapons.AddItem(BallisticShield_BM()); + } return Weapons; } @@ -134,6 +139,7 @@ static function X2DataTemplate BallisticShield_MG() Template.CanBeBuilt = true; Template.bInfiniteItem = false; + Template.Requirements.SpecialRequirementsFn = ShouldBuildShields; Template.DamageTypeTemplateName = 'Melee'; @@ -180,6 +186,7 @@ static function X2DataTemplate BallisticShield_BM() Template.CanBeBuilt = true; Template.bInfiniteItem = false; + Template.Requirements.SpecialRequirementsFn = ShouldBuildShields; Template.DamageTypeTemplateName = 'Melee'; @@ -197,3 +204,31 @@ static function AddAbilities(out X2WeaponTemplate Template, array Abilitie } } } + +static function bool ShouldBuildShields() +{ + local X2SoldierClassTemplateManager SoldierClassMgr; + local array SoldierClasses; + local X2SoldierClassTemplate SoldierTemplate; + local int i; + + SoldierClassMgr = class'X2SoldierClassTemplateManager'.static.GetSoldierClassTemplateManager(); + + SoldierClasses = SoldierClassMgr.GetAllSoldierClassTemplates(); + + foreach SoldierClasses (SoldierTemplate) + { + if (SoldierTemplate == none) + continue; + + for (i = 0; i < SoldierTemplate.AllowedWeapons.Length; ++i) + { + if (SoldierTemplate.AllowedWeapons[i].WeaponType == 'templarshield') + { + return true; + } + } + } + + return false; +} diff --git a/LongWarOfTheChosen/Src/extra_globals.uci b/LongWarOfTheChosen/Src/extra_globals.uci index d326ca2f1..5bcb8f0f7 100644 --- a/LongWarOfTheChosen/Src/extra_globals.uci +++ b/LongWarOfTheChosen/Src/extra_globals.uci @@ -5,6 +5,8 @@ /* LWS Overhaul trace messages, e.g. super log spam with lots of detail. Can be independently enabled/disabled via the Suppress directive in XComEngine.ini */ `define LWTrace(msg,cond,tag) `Log(`msg, class'Helpers_LW'.default.EnableLWTrace, 'LWTrace') +`define LWDiversityTrace(msg,cond,tag) `Log(`msg, class'Helpers_LW'.default.EnableLWDiversityTrace, 'LWDiversityTrace') + `define LWOUTPOSTMGR class'XComGameState_LWOutpostManager'.static.GetOutpostManager() `define LWSQUADMGR class'XComGameState_LWSquadManager'.static.GetSquadManager() diff --git a/README.md b/README.md index 5814f0588..24276d293 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,8 @@ set some things up: or whatever is the equivalent with the git client tool you are using. 4. Download the LWOTC media assets (video, graphics and sound) from - [this Dropbox link](https://www.dropbox.com/s/qrrnygrjydj8qbt/lwotc-content-with-cooking.zip?dl=0) - and unpack the resulting zip file into this project's *LongWarOfTheChosen* directory. + [this Google Drive link](https://drive.google.com/file/d/1wyjctso0NuHeHJp3DdQdPIlZ482st9ZY/view?usp=sharing) + and unpack the resulting zip file into this project's *LongWarOfTheChosen* directory. It should merge the contents of the *Content* and *ContentForCook* directories. 5. Set up the following environment variables: * `XCOM2SDKPATH` — typically <path to Steam>\steamapps\common\XCOM 2 War Of The Chosen SDK