using System.Collections.Generic; using I2.Loc; using TMPro; using UnityEngine; using UnityEngine.UI; public class LoadoutUIHelper : MonoBehaviour { public UIFrame frame; public TextMeshProUGUI perksText; public TextMeshProUGUI mutatorBonusText; public ThronefallUIElement playButton; public GridLayoutGroup weaponsParent; public GridLayoutGroup perksParent; public GridLayoutGroup mutatorsParent; public TFUIEquippable equippableButtonPrefab; public GameObject fixedLoadoutWarning; public Transform questsParent; public QuestEntry questEntryPrefab; private List weapons = new List(); private List perks = new List(); private List mutators = new List(); private List equippedWeapons = new List(); private List equippedPerks = new List(); private List equippedMutators = new List(); private readonly int numberOfWeaponsAllowedToEquip = 1; private readonly int numberOfMutatiomsAllowedToEquip = 1000; private int numberOfPerksAllowedToEquip; private LevelData levelData; public void OnShow() { levelData = LevelProgressManager.instance.GetLevelDataForScene(LevelInteractor.lastActivatedLevelInteractor.sceneName); weapons.Clear(); perks.Clear(); mutators.Clear(); equippedWeapons.Clear(); equippedPerks.Clear(); equippedMutators.Clear(); foreach (Transform item in weaponsParent.transform) { Object.Destroy(item.gameObject); } foreach (Transform item2 in perksParent.transform) { Object.Destroy(item2.gameObject); } foreach (Transform item3 in mutatorsParent.transform) { Object.Destroy(item3.gameObject); } fixedLoadoutWarning.SetActive(LevelInteractor.lastActivatedLevelInteractor.HasFixedLoadout); numberOfPerksAllowedToEquip = 0; foreach (Equippable unlockedEquippable in PerkManager.instance.UnlockedEquippables) { if (unlockedEquippable is PerkPoint) { numberOfPerksAllowedToEquip++; } else if (unlockedEquippable is EquippableWeapon) { AddTFUIEquippable(weaponsParent, unlockedEquippable); } else if (unlockedEquippable is EquippablePerk) { AddTFUIEquippable(perksParent, unlockedEquippable); } else if (unlockedEquippable is EquippableMutation) { AddTFUIEquippable(mutatorsParent, unlockedEquippable); } } foreach (MetaLevel metaLevel in PerkManager.instance.MetaLevels) { Equippable reward = metaLevel.reward; if (!PerkManager.instance.UnlockedEquippables.Contains(reward)) { if (reward is EquippableWeapon) { AddTFUIEquippable(weaponsParent, reward); } else if (reward is EquippablePerk) { AddTFUIEquippable(perksParent, reward); } else if (reward is EquippableMutation) { AddTFUIEquippable(mutatorsParent, reward); } } } RecomputeNavigation(); RewriteQuestTexts(); UpdatePerksText(); UpdateMutatorBonusText(); } private void AddTFUIEquippable(GridLayoutGroup parent, Equippable e) { TFUIEquippable component = Object.Instantiate(equippableButtonPrefab, parent.transform).GetComponent(); component.SetData(e); if (PerkManager.IsEquipped(e)) { if (LevelInteractor.lastActivatedLevelInteractor.HasFixedLoadout && !LevelInteractor.lastActivatedLevelInteractor.fixedLoadout.Contains(e)) { PerkManager.SetEquipped(e, _equipped: false); } else { component.Pick(); if (e is EquippableWeapon) { equippedWeapons.Add(component); } if (e is EquippablePerk) { equippedPerks.Add(component); } if (e is EquippableMutation) { equippedMutators.Add(component); } } } else if (LevelInteractor.lastActivatedLevelInteractor.HasFixedLoadout && LevelInteractor.lastActivatedLevelInteractor.fixedLoadout.Contains(e)) { PerkManager.SetEquipped(e, _equipped: true); component.Pick(); if (e is EquippableWeapon) { equippedWeapons.Add(component); } if (e is EquippablePerk) { equippedPerks.Add(component); } if (e is EquippableMutation) { equippedMutators.Add(component); } } if (parent == weaponsParent) { weapons.Add(component); } else if (parent == perksParent) { perks.Add(component); } else if (parent == mutatorsParent) { mutators.Add(component); } } public void TrySelectEquippableForLoadout() { TFUIEquippable tFUIEquippable = frame.LastApplied as TFUIEquippable; if (tFUIEquippable == null || tFUIEquippable.Locked || LevelInteractor.lastActivatedLevelInteractor.HasFixedLoadout) { return; } if (tFUIEquippable.Data is EquippableWeapon) { for (int num = equippedWeapons.Count - 1; num >= 0; num--) { PerkManager.SetEquipped(equippedWeapons[num].Data, _equipped: false); equippedWeapons[num].UnPick(); equippedWeapons.Remove(equippedWeapons[num]); } tFUIEquippable.Pick(); PerkManager.SetEquipped(tFUIEquippable.Data, _equipped: true); equippedWeapons.Add(tFUIEquippable); } if (tFUIEquippable.Data is EquippablePerk) { List list = new List(); int num2 = 0; for (int num3 = equippedPerks.Count - 1; num3 >= 0; num3--) { if (equippedPerks[num3] != tFUIEquippable) { num2++; } if (num2 >= numberOfPerksAllowedToEquip) { list.Add(equippedPerks[num3]); } } foreach (TFUIEquippable item in list) { PerkManager.SetEquipped(item.Data, _equipped: false); item.UnPick(); equippedPerks.Remove(item); } if (equippedPerks.Contains(tFUIEquippable)) { tFUIEquippable.UnPick(); PerkManager.SetEquipped(tFUIEquippable.Data, _equipped: false); equippedPerks.Remove(tFUIEquippable); } else { tFUIEquippable.Pick(); PerkManager.SetEquipped(tFUIEquippable.Data, _equipped: true); equippedPerks.Add(tFUIEquippable); } } if (tFUIEquippable.Data is EquippableMutation) { if (equippedMutators.Contains(tFUIEquippable)) { tFUIEquippable.UnPick(); PerkManager.SetEquipped(tFUIEquippable.Data, _equipped: false); equippedMutators.Remove(tFUIEquippable); } else { tFUIEquippable.Pick(); PerkManager.SetEquipped(tFUIEquippable.Data, _equipped: true); equippedMutators.Add(tFUIEquippable); } } UpdatePerksText(); UpdateMutatorBonusText(); } private void RecomputeNavigation() { int constraintCount = weaponsParent.constraintCount; AssignNavigationTargets(weapons, playButton, null, null, perks, constraintCount); AssignNavigationTargets(perks, null, weapons, null, mutators, constraintCount); AssignNavigationTargets(mutators, null, perks, playButton, null, constraintCount); playButton.topNav = mutators[mutators.Count - 1]; playButton.leftNav = mutators[mutators.Count - 1]; playButton.botNav = weapons[0]; playButton.rightNav = weapons[0]; GetComponent().firstSelected = weapons[0]; } private void RewriteQuestTexts() { for (int num = questsParent.childCount - 1; num >= 0; num--) { Object.Destroy(questsParent.GetChild(num).gameObject); } int num2 = 0; foreach (Quest quest in LevelInteractor.lastActivatedLevelInteractor.Quests) { Object.Instantiate(questEntryPrefab, questsParent).Init(quest, num2, quest.CheckBeaten(levelData)); num2++; } } private void UpdatePerksText() { if (LevelInteractor.lastActivatedLevelInteractor.HasFixedLoadout) { perksText.text = LocalizationManager.GetTranslation("Menu/Perks"); return; } perksText.text = LocalizationManager.GetTranslation("Menu/Perks") + " (" + equippedPerks.Count + "/" + numberOfPerksAllowedToEquip + ")"; } private void UpdateMutatorBonusText() { if (equippedMutators.Count > 0) { mutatorBonusText.gameObject.SetActive(value: true); float num = 1f; foreach (TFUIEquippable equippedMutator in equippedMutators) { EquippableMutation equippableMutation = equippedMutator.Data as EquippableMutation; if (!(equippableMutation == null)) { num *= equippableMutation.scoreMultiplyerOnWin; } } num -= 1f; mutatorBonusText.text = LocalizationManager.GetTermTranslation("Menu/Mutator Bonus Preview") + ": +" + (num * 100f).ToString("F0") + "%"; } else { mutatorBonusText.gameObject.SetActive(value: false); } } private void AssignNavigationTargets(List targetElements, ThronefallUIElement aboveElement, List aboveList, ThronefallUIElement belowElement, List belowList, int maxColumns) { for (int i = 0; i < targetElements.Count; i++) { TFUIEquippable tFUIEquippable = targetElements[i]; int num = i - 1; int num2 = i + 1; int num3 = i + maxColumns; int num4 = i - maxColumns; if (num < 0) { if (aboveElement != null) { tFUIEquippable.leftNav = aboveElement; } else { tFUIEquippable.leftNav = aboveList[aboveList.Count - 1]; } } else { tFUIEquippable.leftNav = targetElements[num]; } if (num2 >= targetElements.Count) { if (belowElement != null) { tFUIEquippable.rightNav = belowElement; } else { tFUIEquippable.rightNav = belowList[0]; } } else { tFUIEquippable.rightNav = targetElements[num2]; } if (num3 >= targetElements.Count) { if (targetElements.Count - i > targetElements.Count % maxColumns) { tFUIEquippable.botNav = targetElements[targetElements.Count - 1]; } else if (belowElement != null) { tFUIEquippable.botNav = belowElement; } else { int num5 = i % maxColumns; if (belowList.Count < num5) { tFUIEquippable.botNav = belowList[belowList.Count - 1]; } else { tFUIEquippable.botNav = belowList[num5]; } } } else { tFUIEquippable.botNav = targetElements[num3]; } if (num4 < 0) { if (aboveElement != null) { tFUIEquippable.topNav = aboveElement; continue; } int num6 = i % maxColumns; int num7 = aboveList.Count % maxColumns; if (num6 > num7) { tFUIEquippable.topNav = aboveList[aboveList.Count - 1]; continue; } int value = aboveList.Count - num7 + num6; value = Mathf.Clamp(value, 0, aboveList.Count - 1); tFUIEquippable.topNav = aboveList[value]; } else { tFUIEquippable.topNav = targetElements[num4]; } } } }