using System; using System.Collections.ObjectModel; using UnityEngine; using UnityEngine.UI; namespace RoR2.UI; [RequireComponent(typeof(RectTransform))] public class PickupPickerPanel : MonoBehaviour { public GridLayoutGroup gridlayoutGroup; public RectTransform buttonContainer; public GameObject buttonPrefab; public Image[] coloredImages; public Image[] darkColoredImages; public int maxColumnCount; private UIElementAllocator buttonAllocator; [SerializeField] private bool shouldRemoveChoice; [SerializeField] private bool needsNetworking; [SerializeField] private NetworkMultiOptionPickupPicker networkMultiOptionPickupPicker; [Header("Events")] public PickupPickerEvent pickupSelected; public PickupPickerEvent pickupBaseContentReady; private PickupPickerController.Option[] pickupOptions; public Action OnPanelSetupComplete; public PickupPickerController pickerController { get; set; } private void Awake() { buttonAllocator = new UIElementAllocator(buttonContainer, buttonPrefab); buttonAllocator.onCreateElement = OnCreateButton; gridlayoutGroup.constraint = GridLayoutGroup.Constraint.FixedColumnCount; gridlayoutGroup.constraintCount = maxColumnCount; ScoreboardController.onScoreboardOpen += DestroyIt; } private void OnDestroy() { ScoreboardController.onScoreboardOpen -= DestroyIt; } private void DestroyIt() { UnityEngine.Object.Destroy(base.gameObject); } private void OnCreateButton(int index, MPButton button) { button.onClick.AddListener(delegate { pickerController.SubmitChoice(index); if (pickerController.multiOptionsAvailable || shouldRemoveChoice) { RemovePickupButtonAvailability(index); } }); button.onSelect.AddListener(delegate { PickupDef pickupDef = PickupCatalog.GetPickupDef(pickupOptions[index].pickupIndex); pickupSelected?.Invoke(button, pickupDef); }); } public void RemovePickupButtonAvailability(int pickupOption) { Sprite sprite = LegacyResourcesAPI.Load("Textures/MiscIcons/texUnlockIcon"); pickupOptions[pickupOption].available = false; MPButton mPButton = buttonAllocator.elements[pickupOption]; Image component = mPButton.GetComponent().FindChild("Icon").GetComponent(); component.color = Color.gray; component.sprite = sprite; mPButton.interactable = false; } public void SetPickupOptions(PickupPickerController.Option[] options) { pickupOptions = options; buttonAllocator.AllocateElements(options.Length); ReadOnlyCollection elements = buttonAllocator.elements; Sprite sprite = LegacyResourcesAPI.Load("Textures/MiscIcons/texUnlockIcon"); if (options.Length != 0) { PickupDef pickupDef = PickupCatalog.GetPickupDef(options[0].pickupIndex); Color baseColor = pickupDef.baseColor; Color darkColor = pickupDef.darkColor; Image[] array = coloredImages; for (int i = 0; i < array.Length; i++) { array[i].color *= baseColor; } array = darkColoredImages; for (int i = 0; i < array.Length; i++) { array[i].color *= darkColor; } } for (int j = 0; j < options.Length; j++) { MPButton mPButton = elements[j]; int num = j - j % maxColumnCount; int num2 = j % maxColumnCount; int num3 = num2 - maxColumnCount; int num4 = num2 - 1; int num5 = num2 + 1; int num6 = num2 + maxColumnCount; UnityEngine.UI.Navigation navigation = mPButton.navigation; navigation.mode = UnityEngine.UI.Navigation.Mode.Explicit; if (num4 >= 0) { MPButton selectOnLeft = elements[num + num4]; navigation.selectOnLeft = selectOnLeft; } if (num5 < maxColumnCount && num + num5 < options.Length) { MPButton selectOnRight = elements[num + num5]; navigation.selectOnRight = selectOnRight; } if (num + num3 >= 0) { MPButton selectOnUp = elements[num + num3]; navigation.selectOnUp = selectOnUp; } if (num + num6 < options.Length) { MPButton selectOnDown = elements[num + num6]; navigation.selectOnDown = selectOnDown; } mPButton.navigation = navigation; ref PickupPickerController.Option reference = ref options[j]; PickupDef pickupDef2 = PickupCatalog.GetPickupDef(reference.pickupIndex); Image component = mPButton.GetComponent().FindChild("Icon").GetComponent(); if (reference.available) { component.color = Color.white; component.sprite = pickupDef2?.iconSprite; mPButton.interactable = true; } else { component.color = Color.gray; component.sprite = sprite; mPButton.interactable = false; } pickupBaseContentReady?.Invoke(mPButton, pickupDef2); } OnPanelSetupComplete?.Invoke(); } }