From 8c792d170f7009ed76b1dbfbf5d22742ca8f9627 Mon Sep 17 00:00:00 2001 From: M3r1st <115356848+M3r1st@users.noreply.github.com> Date: Thu, 27 Aug 2026 13:12:17 +0300 Subject: [PATCH] Update item weight ability 1. Combine item weight penalty into a single effect. 2. Make weight penalty only apply to XCOM team. 3. Add config array for inventory slots that ignore weight penalty. --- LongWarOfTheChosen/Config/XComLW_Overhaul.ini | 4 ++ .../Src/LW_Overhaul/Classes/LWTemplateMods.uc | 3 +- .../Classes/X2Ability_LW_GearAbilities.uc | 30 ++++++--- .../Classes/X2Condition_UnitIsXCOM.uc | 37 +++++++++++ ...nloadableContentInfo_LongWarOfTheChosen.uc | 11 ++++ .../Classes/X2Effect_ItemWeight2.uc | 63 +++++++++++++++++++ 6 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Condition_UnitIsXCOM.uc create mode 100644 LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_ItemWeight2.uc diff --git a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini index 379ed4609..e4082c407 100644 --- a/LongWarOfTheChosen/Config/XComLW_Overhaul.ini +++ b/LongWarOfTheChosen/Config/XComLW_Overhaul.ini @@ -2872,3 +2872,7 @@ bLeftSquadButton = false +AlienRulerTags = "Ruler_ViperKingActive" +AlienRulerTags = "Ruler_BerserkerQueenActive" +AlienRulerTags = "Ruler_ArchonKingActive" + +[LW_Overhaul.X2Effect_ItemWeight2] +; Item weight mobility penalty will be skipped for items in these slots +; +SlotsToSkip = eInvSlot_ diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc index ca89b6ca4..b34467788 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/LWTemplateMods.uc @@ -3464,7 +3464,8 @@ function ReconfigGear(X2ItemTemplate Template, int Difficulty) { if (ItemTable[i].Weight > 0) { - EquipmentTemplate.Abilities.AddItem ('SmallItemWeight'); + EquipmentTemplate.Abilities.AddItem('SmallItemWeight'); + // TODO: Move mobility penalty display from item weight to AddArmoryUIStatMarkups() EquipmentTemplate.SetUIStatMarkup(class'XLocalizedData'.default.MobilityLabel, eStat_Mobility, -ItemTable[i].Weight, true); //`LOG ("Adding Weight to" @ EquipmentTemplate.DataName); diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc index a9a24e7f7..aab95ea09 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Ability_LW_GearAbilities.uc @@ -591,27 +591,39 @@ static function X2AbilityTemplate CreateNeurowhipAbility() static function X2AbilityTemplate CreateSmallItemWeightAbility() { - local X2AbilityTemplate Template; - local X2Effect_ItemWeight WeightEffect; + local X2AbilityTemplate Template; + // local X2Effect_ItemWeight WeightEffect; + local X2Effect_ItemWeight2 WeightEffect2; + local X2Condition_UnitIsXCOM TeamCondition; `CREATE_X2ABILITY_TEMPLATE(Template, 'SmallItemWeight'); Template.AbilitySourceName = 'eAbilitySource_Item'; Template.eAbilityIconBehaviorHUD = EAbilityIconBehavior_NeverShow; Template.Hostility = eHostility_Neutral; Template.bDisplayInUITacticalText = false; + Template.bUniqueSource = true; Template.AbilityToHitCalc = default.DeadEye; Template.AbilityTargetStyle = default.SelfTarget; Template.AbilityTriggers.AddItem(default.UnitPostBeginPlayTrigger); //Template.IconImage = "img:///UILibrary_PerkIcons.UIPerk_ammo_stiletto"; - WeightEffect = new class'X2Effect_ItemWeight'; - WeightEffect.EffectName = 'SmallItemWeight'; - WeightEffect.BuildPersistentEffect (1, true, false, false); - //WeightEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false, , Template.AbilitySourceName); - WeightEffect.bUniqueTarget = true; - WeightEffect.DuplicateResponse = eDupe_Allow; - Template.AddTargetEffect(WeightEffect); + TeamCondition = new class'X2Condition_UnitIsXCOM'; + TeamCondition.bCheckCanEverBeValid = true; + Template.AbilityShooterConditions.AddItem(TeamCondition); + + WeightEffect2 = new class'X2Effect_ItemWeight2'; + WeightEffect2.BuildPersistentEffect(1, true, false); + WeightEffect2.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyHelpText(), Template.IconImage, false,, Template.AbilitySourceName); + Template.AddTargetEffect(WeightEffect2); + + // WeightEffect = new class'X2Effect_ItemWeight'; + // WeightEffect.EffectName = 'SmallItemWeight'; + // WeightEffect.BuildPersistentEffect (1, true, false, false); + // WeightEffect.SetDisplayInfo(ePerkBuff_Passive, Template.LocFriendlyName, Template.GetMyLongDescription(), Template.IconImage, false, , Template.AbilitySourceName); + // WeightEffect.bUniqueTarget = true; + // WeightEffect.DuplicateResponse = eDupe_Allow; + // Template.AddTargetEffect(WeightEffect); Template.BuildNewGameStateFn = TypicalAbility_BuildGameState; diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Condition_UnitIsXCOM.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Condition_UnitIsXCOM.uc new file mode 100644 index 000000000..80fbeecd6 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Condition_UnitIsXCOM.uc @@ -0,0 +1,37 @@ +class X2Condition_UnitIsXCOM extends X2Condition; + +var bool bCheckCanEverBeValid; + +event name CallMeetsCondition(XComGameState_BaseObject kTarget) +{ + local XComGameState_Unit UnitState; + + UnitState = XComGameState_Unit(kTarget); + + if (UnitState == none) + return 'AA_NotAUnit'; + + if (UnitState.GetPreviousTeam() == eTeam_XCom) + return 'AA_Success'; + + return 'AA_AbilityUnavailable'; +} + +function bool CanEverBeValid(XComGameState_Unit SourceUnit, bool bStrategyCheck) +{ + if (!bCheckCanEverBeValid) + return true; + + if (bStrategyCheck) + return true; + + if (SourceUnit.GetPreviousTeam() == eTeam_XCom) + return true; + + return false; +} + +defaultproperties +{ + bCheckCanEverBeValid = false +} \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc index 4d021c174..c2bf1fa4e 100644 --- a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2DownloadableContentInfo_LongWarOfTheChosen.uc @@ -8143,3 +8143,14 @@ exec function TedTest_ClearUnitInventories() `GAMERULES.SubmitGameState(NewGameState); } + +// static function bool AddArmoryUIStatMarkups(const ECharStatType Stat, out int Result, const array SoldierAbilities, const XComGameState_Unit UnitState) +// { +// if (Stat == eStat_Mobility) +// { +// Result = -1 * class'X2Effect_ItemWeight2'.static.GetItemWeightForUnit(UnitState); +// return true; +// } + +// return false; +// } \ No newline at end of file diff --git a/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_ItemWeight2.uc b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_ItemWeight2.uc new file mode 100644 index 000000000..886cac784 --- /dev/null +++ b/LongWarOfTheChosen/Src/LW_Overhaul/Classes/X2Effect_ItemWeight2.uc @@ -0,0 +1,63 @@ +class X2Effect_ItemWeight2 extends X2Effect_ModifyStats config(LW_Overhaul); + +var config array SlotsToSkip; +var privatewrite name WeightAbilityName; + +simulated protected function OnEffectAdded(const out EffectAppliedData ApplyEffectParameters, XComGameState_BaseObject kNewTargetState, XComGameState NewGameState, XComGameState_Effect NewEffectState) +{ + local XComGameState_Unit TargetUnit; + local StatChange Change; + + TargetUnit = XComGameState_Unit(kNewTargetState); + + Change.StatType = eStat_Mobility; + if (TargetUnit != none) + { + Change.StatAmount = -1 * GetItemWeightForUnit(TargetUnit, NewGameState); + } + NewEffectState.StatChanges.AddItem(Change); + + super.OnEffectAdded(ApplyEffectParameters, kNewTargetState, NewGameState, NewEffectState); +} + +static function int GetItemWeightForUnit(XComGameState_Unit UnitState, optional XComGameState CheckGameState) +{ + local array CurrentInventory; + local XComGameState_Item InventoryItem; + local X2EquipmentTemplate EquipmentTemplate; + local int Weight, Index; + + CurrentInventory = UnitState.GetAllInventoryItems(CheckGameState); + foreach CurrentInventory(InventoryItem) + { + if (default.SlotsToSkip.Find(InventoryItem.InventorySlot) == INDEX_NONE) + { + EquipmentTemplate = X2EquipmentTemplate(InventoryItem.GetMyTemplate()); + if (EquipmentTemplate != none) + { + if (EquipmentTemplate.Abilities.Find(default.WeightAbilityName) != INDEX_NONE) + { + Index = class'LWTemplateMods'.default.ItemTable.Find('ItemTemplateName', EquipmentTemplate.DataName); + if (Index != INDEX_NONE) + { + Weight += class'LWTemplateMods'.default.ItemTable[Index].Weight; + } + else + { + Weight++; + } + } + } + } + } + + return Weight; +} + +defaultproperties +{ + EffectName = "SmallItemWeight" + DuplicateResponse = eDupe_Ignore + + WeightAbilityName = "SmallItemWeight" +}