r2mods/ilspy_dump/ror2_csproj/RoR2.UI/RuleChoiceController.cs

253 lines
6.7 KiB
C#

using System.Collections.Generic;
using JetBrains.Annotations;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace RoR2.UI;
public class RuleChoiceController : MonoBehaviour
{
private static readonly List<RuleChoiceController> instancesList;
[HideInInspector]
public RuleBookViewerStrip strip;
public HGButton hgButton;
public Image image;
public TooltipProvider tooltipProvider;
public TextMeshProUGUI voteCounter;
public GameObject chosenDisplayObject;
public GameObject disabledDisplayObject;
public GameObject cantVoteDisplayObject;
public UILayerKey requiredTopLayer;
public bool displayVoteCounter = true;
public bool canVote;
public GameObject extraDisplayInfo;
[HideInInspector]
public GameObject targetExtraDisplayInfoContainer;
public bool cycleThroughOptions;
private RuleChoiceDef choiceDef;
private void OnEnable()
{
instancesList.Add(this);
}
private void OnDisable()
{
instancesList.Remove(this);
}
static RuleChoiceController()
{
instancesList = new List<RuleChoiceController>();
PreGameRuleVoteController.onVotesUpdated += delegate
{
foreach (RuleChoiceController instances in instancesList)
{
instances.UpdateFromVotes();
}
};
}
private void Start()
{
UpdateFromVotes();
UpdateChoiceDisplay(choiceDef);
if ((bool)requiredTopLayer && (bool)hgButton)
{
hgButton.requiredTopLayer = requiredTopLayer;
}
}
public void UpdateFromVotes()
{
int num = PreGameRuleVoteController.votesForEachChoice[choiceDef.globalIndex];
bool isInSinglePlayer = RoR2Application.isInSinglePlayer;
if ((bool)voteCounter)
{
if (displayVoteCounter && num > 0 && !isInSinglePlayer)
{
voteCounter.enabled = true;
voteCounter.text = num.ToString();
}
else
{
voteCounter.enabled = false;
}
}
bool flag = false;
NetworkUser networkUser = FindNetworkUser();
if ((bool)networkUser)
{
PreGameRuleVoteController preGameRuleVoteController = PreGameRuleVoteController.FindForUser(networkUser);
if ((bool)preGameRuleVoteController)
{
flag = preGameRuleVoteController.IsChoiceVoted(choiceDef);
}
}
bool flag2 = choiceDef.globalName.Contains(".Off");
if ((bool)chosenDisplayObject)
{
chosenDisplayObject.SetActive(flag && !flag2);
}
if ((bool)disabledDisplayObject)
{
disabledDisplayObject.SetActive(flag && flag2);
}
if ((bool)cantVoteDisplayObject)
{
cantVoteDisplayObject.SetActive(!canVote);
}
}
public void SetChoice([NotNull] RuleChoiceDef newChoiceDef)
{
if (newChoiceDef != choiceDef)
{
choiceDef = newChoiceDef;
UpdateChoiceDisplay(choiceDef);
UpdateFromVotes();
}
}
private void UpdateChoiceDisplay(RuleChoiceDef displayChoiceDef)
{
base.gameObject.name = "Choice (" + displayChoiceDef.globalName + ")";
image.sprite = displayChoiceDef.sprite;
bool flag = displayChoiceDef.extraData != null && displayChoiceDef.extraData.GetType() == typeof(ArtifactDef);
if ((bool)tooltipProvider)
{
if (displayChoiceDef.tooltipNameToken == null)
{
Debug.LogErrorFormat("Rule choice {0} .tooltipNameToken is null", displayChoiceDef.globalName);
}
if (displayChoiceDef.tooltipBodyToken == null)
{
Debug.LogErrorFormat("Rule choice {0} .tooltipBodyToken is null", displayChoiceDef.tooltipBodyToken);
}
tooltipProvider.overrideTitleText = displayChoiceDef.getTooltipName(displayChoiceDef);
tooltipProvider.titleColor = displayChoiceDef.tooltipNameColor;
tooltipProvider.bodyToken = displayChoiceDef.tooltipBodyToken;
tooltipProvider.bodyColor = displayChoiceDef.tooltipBodyColor;
if (flag)
{
ArtifactDef artifactDef = (ArtifactDef)displayChoiceDef.extraData;
if ((bool)artifactDef)
{
tooltipProvider.extraUIDisplayPrefab = artifactDef.extraUIDisplayPrefab;
}
}
}
if (!hgButton)
{
return;
}
if (hgButton.updateTextOnHover && (bool)hgButton.hoverLanguageTextMeshController)
{
string @string = Language.GetString(displayChoiceDef.tooltipNameToken);
string string2 = Language.GetString(displayChoiceDef.tooltipBodyToken);
Color tooltipNameColor = displayChoiceDef.tooltipNameColor;
tooltipNameColor.a = 0.2f;
string stringFormatted = Language.GetStringFormatted("RULE_DESCRIPTION_FORMAT", @string, string2, ColorUtility.ToHtmlStringRGBA(tooltipNameColor));
hgButton.hoverToken = stringFormatted;
hgButton.hoverLanguageTextMeshController.token = stringFormatted;
if (flag)
{
ArtifactDef artifactDef2 = (ArtifactDef)displayChoiceDef.extraData;
if ((bool)artifactDef2 && (bool)artifactDef2.extraUIDisplayPrefab && (bool)targetExtraDisplayInfoContainer && !extraDisplayInfo)
{
extraDisplayInfo = Object.Instantiate(artifactDef2.extraUIDisplayPrefab, targetExtraDisplayInfoContainer.transform);
extraDisplayInfo.transform.SetSiblingIndex(targetExtraDisplayInfoContainer.transform.childCount);
extraDisplayInfo.SetActive(value: false);
hgButton.onSelect.AddListener(OnSelected);
hgButton.onDeselect.AddListener(OnDeselected);
targetExtraDisplayInfoContainer.SetActive(value: true);
if (chosenDisplayObject.activeInHierarchy)
{
extraDisplayInfo.SetActive(value: true);
}
}
}
}
hgButton.uiClickSoundOverride = choiceDef.selectionUISound;
}
private void OnSelected()
{
if ((bool)extraDisplayInfo)
{
extraDisplayInfo.SetActive(value: true);
}
}
private void OnDeselected()
{
if ((bool)extraDisplayInfo && !chosenDisplayObject.activeInHierarchy)
{
extraDisplayInfo.SetActive(value: false);
}
}
private NetworkUser FindNetworkUser()
{
return ((MPEventSystem)EventSystem.current).localUser?.currentNetworkUser;
}
public void OnClick()
{
if (!canVote)
{
return;
}
NetworkUser networkUser = FindNetworkUser();
if (!networkUser)
{
return;
}
PreGameRuleVoteController preGameRuleVoteController = PreGameRuleVoteController.FindForUser(networkUser);
if (!preGameRuleVoteController)
{
return;
}
RuleChoiceDef ruleChoiceDef;
RuleChoiceDef ruleChoiceDef2 = (ruleChoiceDef = choiceDef);
RuleDef ruleDef = ruleChoiceDef2.ruleDef;
int count = ruleDef.choices.Count;
int localIndex = ruleChoiceDef2.localIndex;
bool flag = false;
Debug.LogFormat("maxRuleCount={0}, currentChoiceIndex={1}", count, localIndex);
if (cycleThroughOptions)
{
localIndex = (preGameRuleVoteController.IsChoiceVoted(choiceDef) ? (localIndex + 1) : 0);
if (localIndex > count - 1)
{
localIndex = ruleDef.defaultChoiceIndex;
flag = true;
}
ruleChoiceDef = ruleDef.choices[localIndex];
}
else if (preGameRuleVoteController.IsChoiceVoted(choiceDef))
{
flag = true;
}
SetChoice(ruleChoiceDef);
preGameRuleVoteController.SetVote(ruleChoiceDef.ruleDef.globalIndex, flag ? (-1) : ruleChoiceDef.localIndex);
}
}