diff --git a/X2WOTCCommunityPromotionScreen/Config/XComX2WOTCCommunityPromotionScreen_DEFAULT.ini b/X2WOTCCommunityPromotionScreen/Config/XComX2WOTCCommunityPromotionScreen_DEFAULT.ini index 92de52d..87a6efb 100644 --- a/X2WOTCCommunityPromotionScreen/Config/XComX2WOTCCommunityPromotionScreen_DEFAULT.ini +++ b/X2WOTCCommunityPromotionScreen/Config/XComX2WOTCCommunityPromotionScreen_DEFAULT.ini @@ -1,7 +1,7 @@ [X2WOTCCommunityPromotionScreen.CPS_MCM_Defaults] -VERSION_CFG=3 +VERSION_CFG=4 -; SHOW_UNREACHED_PERKS=false +; SHOW_UNREACHED_PERKS_MODE=0 ; DISABLE_TRAINING_CENTER_REQUIREMENT=false ; DISABLE_NEWCLASS_POPUPS=false ; DISABLE_COMINT_POPUPS=false diff --git a/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.int b/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.int index 7c2bb75..2ecd245 100644 --- a/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.int +++ b/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.int @@ -16,8 +16,11 @@ ModName="Community Promotion Screen" PageTitle="Community Promotion Screen" GroupHeader="General Settings" -SHOW_UNREACHED_PERKS_Label = "Display perks from unreached ranks" -SHOW_UNREACHED_PERKS_Tip = "Normally you cannot preview perks from soldiers' future ranks. You can remove this restriction here." +SHOW_UNREACHED_PERKS_MODE_Label = "Perks on unreached ranks" +SHOW_UNREACHED_PERKS_MODE_Tip = "Normally you cannot preview perks from soldiers' future ranks. You can remove this restriction here." +SHOW_UNREACHED_PERKS_MODE_Strings[0] = "Hide All" +SHOW_UNREACHED_PERKS_MODE_Strings[1] = "Hide Training Center Perks" +SHOW_UNREACHED_PERKS_MODE_Strings[2] = "Show All" SHOW_INVENTORY_SLOT_Label = "Display inventory slot" SHOW_INVENTORY_SLOT_Tip = "Toggles the display of the inventory slot to which the ability is attached to. Keep in mind the ability being attached to a slot does not always mean the ability will work only with items in that inventory slot." diff --git a/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.rus b/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.rus index 1161ba5..bfa70b8 100644 --- a/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.rus +++ b/X2WOTCCommunityPromotionScreen/Localization/X2WOTCCommunityPromotionScreen.rus @@ -21,8 +21,11 @@ ModName="Community Promotion Screen" PageTitle="Community Promotion Screen" GroupHeader="Общие настройки" -SHOW_UNREACHED_PERKS_Label = "Показывать способности на недостигнутых рангах" -SHOW_UNREACHED_PERKS_Tip = "Обычно вы не можете знать способности бойцов заранее. Эта опция позволяет убрать это ограничение." +SHOW_UNREACHED_PERKS_MODE_Label = "Cпособности на недостигнутых рангах" +SHOW_UNREACHED_PERKS_MODE_Tip = "Обычно вы не можете знать способности бойцов заранее. Эта опция позволяет убрать это ограничение." +SHOW_UNREACHED_PERKS_MODE_Strings[0] = "Скрывать все" +SHOW_UNREACHED_PERKS_MODE_Strings[1] = "Скрывать способности Центра подготовки" +SHOW_UNREACHED_PERKS_MODE_Strings[2] = "Показывать все" SHOW_INVENTORY_SLOT_Label = "Показывать слот экипировки" SHOW_INVENTORY_SLOT_Tip = "Переключает отображение слота экипировки к которому привязана способность. Имейте в виду, что привязка способности не всегда означает что способность работает только с предметами в этом слоте." diff --git a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Defaults.uc b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Defaults.uc index c4ff9d0..99f6f27 100644 --- a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Defaults.uc +++ b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Defaults.uc @@ -3,7 +3,7 @@ class CPS_MCM_Defaults extends object config(X2WOTCCommunityPromotionScreen_DEFA var config int VERSION_CFG; var config bool SHOW_INVENTORY_SLOT; -var config bool SHOW_UNREACHED_PERKS; +var config int SHOW_UNREACHED_PERKS_MODE; // Issue #69 var config bool DISABLE_TRAINING_CENTER_REQUIREMENT; var config bool DISABLE_NEWCLASS_POPUPS; var config bool DISABLE_COMINT_POPUPS; diff --git a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Screen.uc b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Screen.uc index 7737c55..9cf8843 100644 --- a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Screen.uc +++ b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_MCM_Screen.uc @@ -9,21 +9,25 @@ var localized string GroupHeader; `include(X2WOTCCommunityPromotionScreen\Src\ModConfigMenuAPI\MCM_API_Includes.uci) `MCM_API_AutoCheckBoxVars(SHOW_INVENTORY_SLOT); -`MCM_API_AutoCheckBoxVars(SHOW_UNREACHED_PERKS); `MCM_API_AutoCheckBoxVars(DISABLE_TRAINING_CENTER_REQUIREMENT); `MCM_API_AutoCheckBoxVars(DISABLE_NEWCLASS_POPUPS); `MCM_API_AutoCheckBoxVars(DISABLE_COMINT_POPUPS); `MCM_API_AutoIndexDropdownVars(ABILITY_TREE_PLANNER_MODE); + // Single line for Issue #69 +`MCM_API_AutoIndexDropdownVars(SHOW_UNREACHED_PERKS_MODE); + `include(X2WOTCCommunityPromotionScreen\Src\ModConfigMenuAPI\MCM_API_CfgHelpers.uci) `MCM_API_AutoCheckBoxFns(SHOW_INVENTORY_SLOT, 3); -`MCM_API_AutoCheckBoxFns(SHOW_UNREACHED_PERKS, 1); `MCM_API_AutoCheckBoxFns(DISABLE_TRAINING_CENTER_REQUIREMENT, 1); `MCM_API_AutoCheckBoxFns(DISABLE_NEWCLASS_POPUPS, 1); `MCM_API_AutoCheckBoxFns(DISABLE_COMINT_POPUPS, 1); `MCM_API_AutoIndexDropdownFns(ABILITY_TREE_PLANNER_MODE, 2); + // Single line for Issue #69 +`MCM_API_AutoIndexDropdownFns(SHOW_UNREACHED_PERKS_MODE, 4); + event OnInit(UIScreen Screen) { `MCM_API_Register(Screen, ClientModCallback); @@ -42,10 +46,12 @@ simulated function ClientModCallback(MCM_API_Instance ConfigAPI, int GameMode) Page.EnableResetButton(ResetButtonClicked); Group = Page.AddGroup('Group', GroupHeader); - `MCM_API_AutoAddCheckBox(Group, SHOW_UNREACHED_PERKS, /* Issue #53 */ SHOW_UNREACHED_PERKS_ChangeHandler); + + // Issue #69 + Group.AddDropdown('SHOW_UNREACHED_PERKS_MODE', SHOW_UNREACHED_PERKS_MODE_Label, SHOW_UNREACHED_PERKS_MODE_Tip, SHOW_UNREACHED_PERKS_MODE_Strings, SHOW_UNREACHED_PERKS_MODE_Strings[SHOW_UNREACHED_PERKS_MODE], SHOW_UNREACHED_PERKS_MODE_SaveHandler, SHOW_UNREACHED_PERKS_MODE_ChangeHandler); // Issue #53 - Group.AddDropdown('ABILITY_TREE_PLANNER_MODE', ABILITY_TREE_PLANNER_MODE_Label, ABILITY_TREE_PLANNER_MODE_Tip, ABILITY_TREE_PLANNER_MODE_Strings, ABILITY_TREE_PLANNER_MODE_Strings[ABILITY_TREE_PLANNER_MODE], ABILITY_TREE_PLANNER_MODE_SaveHandler).SetEditable(SHOW_UNREACHED_PERKS); + Group.AddDropdown('ABILITY_TREE_PLANNER_MODE', ABILITY_TREE_PLANNER_MODE_Label, ABILITY_TREE_PLANNER_MODE_Tip, ABILITY_TREE_PLANNER_MODE_Strings, ABILITY_TREE_PLANNER_MODE_Strings[ABILITY_TREE_PLANNER_MODE], ABILITY_TREE_PLANNER_MODE_SaveHandler).SetEditable(SHOW_UNREACHED_PERKS_MODE != 0); `MCM_API_AutoAddCheckBox(Group, SHOW_INVENTORY_SLOT); `MCM_API_AutoAddCheckBox(Group, DISABLE_TRAINING_CENTER_REQUIREMENT); @@ -56,18 +62,19 @@ simulated function ClientModCallback(MCM_API_Instance ConfigAPI, int GameMode) } // Start Issue #53 -simulated function SHOW_UNREACHED_PERKS_ChangeHandler(MCM_API_Setting _Setting, bool _SettingValue) +simulated function SHOW_UNREACHED_PERKS_MODE_ChangeHandler(MCM_API_Setting _Setting, string _SettingValue) { - SHOW_UNREACHED_PERKS = _SettingValue; - // Lock the ABILITY_TREE_PLANNER_MODE if SHOW_UNREACHED_PERKS is disabled. - _Setting.GetParentGroup().GetSettingByName('ABILITY_TREE_PLANNER_MODE').SetEditable(SHOW_UNREACHED_PERKS); + SHOW_UNREACHED_PERKS_MODE = SHOW_UNREACHED_PERKS_MODE_Strings.Find(_SettingValue); + + // Unlock / lock the ABILITY_TREE_PLANNER_MODE depending on if unreached perks are shown or not. + _Setting.GetParentGroup().GetSettingByName('ABILITY_TREE_PLANNER_MODE').SetEditable(SHOW_UNREACHED_PERKS_MODE > 0); } // End Issue #53 simulated function LoadSavedSettings() { SHOW_INVENTORY_SLOT = `GETMCMVAR(SHOW_INVENTORY_SLOT); - SHOW_UNREACHED_PERKS = `GETMCMVAR(SHOW_UNREACHED_PERKS); + SHOW_UNREACHED_PERKS_MODE = `GETMCMVAR(SHOW_UNREACHED_PERKS_MODE); // Issue #69 DISABLE_TRAINING_CENTER_REQUIREMENT = `GETMCMVAR(DISABLE_TRAINING_CENTER_REQUIREMENT); DISABLE_NEWCLASS_POPUPS = `GETMCMVAR(DISABLE_NEWCLASS_POPUPS); DISABLE_COMINT_POPUPS = `GETMCMVAR(DISABLE_COMINT_POPUPS); @@ -77,7 +84,7 @@ simulated function LoadSavedSettings() simulated function ResetButtonClicked(MCM_API_SettingsPage Page) { `MCM_API_AutoReset(SHOW_INVENTORY_SLOT); - `MCM_API_AutoReset(SHOW_UNREACHED_PERKS); + `MCM_API_AutoIndexReset(SHOW_UNREACHED_PERKS_MODE); `MCM_API_AutoReset(DISABLE_TRAINING_CENTER_REQUIREMENT); `MCM_API_AutoReset(DISABLE_NEWCLASS_POPUPS); `MCM_API_AutoReset(DISABLE_COMINT_POPUPS); @@ -88,7 +95,7 @@ simulated function SaveButtonClicked(MCM_API_SettingsPage Page) { // Start Issue #53 // Disable the ABILITY_TREE_PLANNER_MODE if SHOW_UNREACHED_PERKS is disabled. - if (!SHOW_UNREACHED_PERKS) + if (SHOW_UNREACHED_PERKS_MODE == 0) { ABILITY_TREE_PLANNER_MODE = 0; } diff --git a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_UIArmory_PromotionHero.uc b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_UIArmory_PromotionHero.uc index 773d054..b37e599 100644 --- a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_UIArmory_PromotionHero.uc +++ b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/CPS_UIArmory_PromotionHero.uc @@ -407,6 +407,12 @@ function bool UpdateAbilityIcons_Override(out CPS_UIArmory_PromotionHeroColumn C local bool bHasColumnAbility, bConnectToNextAbility; local string AbilityName, AbilityIcon, BGColor, FGColor; + // Start variables for Issue #69 + local CPSAbilityMetaInfo MetaInfo; + local bool bUnreachedRankPerk; + local bool bHidePerk; + // End variables for Issue #69 + AbilityTemplateManager = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); Unit = GetUnit(); @@ -423,6 +429,7 @@ function bool UpdateAbilityIcons_Override(out CPS_UIArmory_PromotionHeroColumn C MaxPosition = Max(AbilityTree.Length - NUM_ABILITIES_PER_COLUMN, MaxPosition); Column.AbilityNames.Length = 0; + bUnreachedRankPerk = Column.Rank >= Unit.GetRank(); for (iAbility = Position; iAbility < Position + NUM_ABILITIES_PER_COLUMN; iAbility++) { @@ -441,9 +448,27 @@ function bool UpdateAbilityIcons_Override(out CPS_UIArmory_PromotionHeroColumn C { Column.AbilityNames.AddItem(AbilityTemplate.DataName); } + + FillAbilityMetaInfo(MetaInfo, Unit, Column.Rank, iAbility, AbilityTemplate.DataName); + + switch (`GETMCMVAR(SHOW_UNREACHED_PERKS_MODE)) + { + // Hide Training Center perks. All of them are hidden if the Training Center is not built or if the perk is higher than current rank. + case 1: + bHidePerk = !MetaInfo.bClassAbility && (!bCanSpendAP || bUnreachedRankPerk); + break; + // Always show all perks. + case 2: + bHidePerk = false; + break; + // Hide all perks from unreached ranks. Training Center perks are always hidden until Training Center is constructed. + case 0: + default: + bHidePerk = bUnreachedRankPerk || !MetaInfo.bClassAbility && !bCanSpendAP; + break; + } - // The unit is not yet at the rank needed for this column - if (!`GETMCMVAR(SHOW_UNREACHED_PERKS) && Column.Rank >= Unit.GetRank()) + if (bHidePerk) { AbilityName = class'UIUtilities_Text'.static.GetColoredText(m_strAbilityLockedTitle, eUIState_Disabled); AbilityIcon = class'UIUtilities_Image'.const.UnknownAbilityIcon; @@ -484,7 +509,7 @@ function bool UpdateAbilityIcons_Override(out CPS_UIArmory_PromotionHeroColumn C // If so, turn on the connection arrow between them //if (Column.Rank < (class'X2ExperienceConfig'.static.GetMaxRank() - 2) && Unit.GetRank() > (Column.Rank + 1)) //if (Column.Rank < (Columns.Length - 2) && (Unit.GetRank() > (Column.Rank + 1) || `GETMCMVAR(SHOW_UNREACHED_PERKS))) // Issue #61 - always connect abilities if "Show unreached perks" is enabled. - if (Column.Rank < (Unit.AbilityTree.Length - 1) && (Unit.GetRank() > (Column.Rank + 1) || `GETMCMVAR(SHOW_UNREACHED_PERKS))) // Issue #74 - do not check for prereqs beyond the units ability tree. + if (Column.Rank < (Unit.AbilityTree.Length - 1) && (Unit.GetRank() > (Column.Rank + 1) || `GETMCMVAR(SHOW_UNREACHED_PERKS_MODE) > 0)) // Issue #74 - do not check for prereqs beyond the units ability tree. { bConnectToNextAbility = false; NextRankTree = Unit.GetRankAbilities(Column.Rank + 1); @@ -1200,10 +1225,15 @@ function PreviewAbility(int Rank, int Branch) local name PrereqAbilityName; // Variable for Issue #128 local string MutuallyExclusiveNames; + local bool bHidePerk; + local bool bUnreachedRankPerk; // Variable for Issue #55 local string SlotName; + // Variable for Issue #69 + local CPSAbilityMetaInfo MetaInfo; + // NPSBDP Patch Branch += Position; @@ -1217,8 +1247,29 @@ function PreviewAbility(int Rank, int Branch) { AbilityCost = class'UIUtilities_Text'.static.GetColoredText(AbilityCost, eUIState_Bad); } + + AbilityTree = Unit.GetRankAbilities(Rank); + FillAbilityMetaInfo(MetaInfo, Unit, Rank, Branch, AbilityTree[Branch].AbilityName); + bUnreachedRankPerk = Rank >= Unit.GetRank(); + + switch (`GETMCMVAR(SHOW_UNREACHED_PERKS_MODE)) + { + // Hide Training Center perks. All of them are hidden if the Training Center is not built or if the perk is higher than current rank. + case 1: + bHidePerk = !MetaInfo.bClassAbility && (!bCanSpendAP || bUnreachedRankPerk); + break; + // Always show all perks. + case 2: + bHidePerk = false; + break; + // Hide all perks from unreached ranks. Training Center perks are always hidden until Training Center is constructed. + case 0: + default: + bHidePerk = bUnreachedRankPerk || !MetaInfo.bClassAbility && !bCanSpendAP; + break; + } - if (!`GETMCMVAR(SHOW_UNREACHED_PERKS) && Rank >= Unit.GetRank()) + if (bHidePerk) { AbilityIcon = class'UIUtilities_Image'.const.LockedAbilityIcon; AbilityName = class'UIUtilities_Text'.static.GetColoredText(m_strAbilityLockedTitle, eUIState_Disabled); @@ -1232,7 +1283,6 @@ function PreviewAbility(int Rank, int Branch) else { AbilityTemplateManager = class'X2AbilityTemplateManager'.static.GetAbilityTemplateManager(); - AbilityTree = Unit.GetRankAbilities(Rank); AbilityTemplate = AbilityTemplateManager.FindAbilityTemplate(AbilityTree[Branch].AbilityName); if (AbilityTemplate != none) diff --git a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/X2DownloadableContentInfo_X2WOTCCommunityPromotionScreen.uc b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/X2DownloadableContentInfo_X2WOTCCommunityPromotionScreen.uc index 6ef4625..f088366 100644 --- a/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/X2DownloadableContentInfo_X2WOTCCommunityPromotionScreen.uc +++ b/X2WOTCCommunityPromotionScreen/Src/X2WOTCCommunityPromotionScreen/Classes/X2DownloadableContentInfo_X2WOTCCommunityPromotionScreen.uc @@ -88,7 +88,7 @@ static final function Update_ViewLockedSkills_UISL() CDO = UIScreenListener(class'XComEngine'.static.GetClassDefaultObjectByName('Main_ViewLockedSkillsWotc')); if (CDO != none) { - if (`GETMCMVAR(SHOW_UNREACHED_PERKS)) + if (`GETMCMVAR(SHOW_UNREACHED_PERKS_MODE) > 0) { CDO.ScreenClass = class'UIScreen_Dummy'; }