182 lines
4.2 KiB
C#
182 lines
4.2 KiB
C#
|
using System.Text;
|
||
|
using TMPro;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.UI;
|
||
|
|
||
|
namespace RoR2.UI;
|
||
|
|
||
|
public class SkillIcon : MonoBehaviour
|
||
|
{
|
||
|
public SkillSlot targetSkillSlot;
|
||
|
|
||
|
public PlayerCharacterMasterController playerCharacterMasterController;
|
||
|
|
||
|
public GenericSkill targetSkill;
|
||
|
|
||
|
public Image iconImage;
|
||
|
|
||
|
public RawImage cooldownRemapPanel;
|
||
|
|
||
|
public TextMeshProUGUI cooldownText;
|
||
|
|
||
|
public TextMeshProUGUI stockText;
|
||
|
|
||
|
public GameObject flashPanelObject;
|
||
|
|
||
|
public GameObject isReadyPanelObject;
|
||
|
|
||
|
public Animator animator;
|
||
|
|
||
|
public string animatorStackString;
|
||
|
|
||
|
public bool wasReady;
|
||
|
|
||
|
public int previousStock;
|
||
|
|
||
|
public TooltipProvider tooltipProvider;
|
||
|
|
||
|
public int previousCoolDownInt;
|
||
|
|
||
|
private static readonly StringBuilder sharedStringBuilder = new StringBuilder();
|
||
|
|
||
|
private int previousSkillIndex = -1;
|
||
|
|
||
|
private bool skillChanged;
|
||
|
|
||
|
private void CheckAndRegisterSkillChange()
|
||
|
{
|
||
|
if (targetSkill.skillDef.skillIndex != previousSkillIndex)
|
||
|
{
|
||
|
skillChanged = previousSkillIndex != -1;
|
||
|
previousStock = -1;
|
||
|
previousSkillIndex = targetSkill.skillDef.skillIndex;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void Update()
|
||
|
{
|
||
|
if ((bool)targetSkill)
|
||
|
{
|
||
|
CheckAndRegisterSkillChange();
|
||
|
if ((bool)tooltipProvider)
|
||
|
{
|
||
|
Color bodyColor = targetSkill.characterBody.bodyColor;
|
||
|
SurvivorCatalog.GetSurvivorIndexFromBodyIndex(targetSkill.characterBody.bodyIndex);
|
||
|
Color.RGBToHSV(bodyColor, out var H, out var S, out var V);
|
||
|
V = ((V > 0.7f) ? 0.7f : V);
|
||
|
bodyColor = Color.HSVToRGB(H, S, V);
|
||
|
tooltipProvider.titleColor = bodyColor;
|
||
|
tooltipProvider.titleToken = targetSkill.skillNameToken;
|
||
|
tooltipProvider.bodyToken = targetSkill.skillDescriptionToken;
|
||
|
}
|
||
|
float cooldownRemaining = targetSkill.cooldownRemaining;
|
||
|
float num = targetSkill.CalculateFinalRechargeInterval();
|
||
|
int stock = targetSkill.stock;
|
||
|
bool flag = stock > 0 || cooldownRemaining == 0f;
|
||
|
bool flag2 = targetSkill.IsReady();
|
||
|
bool flag3 = targetSkill.maxStock > 1 && !targetSkill.skillDef.hideStockCount;
|
||
|
if (previousStock < stock && !skillChanged)
|
||
|
{
|
||
|
Util.PlaySound("Play_UI_cooldownRefresh", RoR2Application.instance.gameObject);
|
||
|
}
|
||
|
if ((bool)animator)
|
||
|
{
|
||
|
if (flag3)
|
||
|
{
|
||
|
animator.SetBool(animatorStackString, value: true);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
animator.SetBool(animatorStackString, value: false);
|
||
|
}
|
||
|
}
|
||
|
if ((bool)isReadyPanelObject)
|
||
|
{
|
||
|
isReadyPanelObject.SetActive(flag2);
|
||
|
}
|
||
|
if (!wasReady && flag && (bool)flashPanelObject)
|
||
|
{
|
||
|
flashPanelObject.SetActive(value: true);
|
||
|
}
|
||
|
if ((bool)cooldownText)
|
||
|
{
|
||
|
if (flag)
|
||
|
{
|
||
|
cooldownText.gameObject.SetActive(value: false);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int num2 = Mathf.CeilToInt(cooldownRemaining);
|
||
|
if (previousCoolDownInt != num2)
|
||
|
{
|
||
|
previousCoolDownInt = num2;
|
||
|
sharedStringBuilder.Clear();
|
||
|
sharedStringBuilder.AppendInt(num2);
|
||
|
cooldownText.SetText(sharedStringBuilder);
|
||
|
cooldownText.gameObject.SetActive(value: true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ((bool)iconImage)
|
||
|
{
|
||
|
iconImage.enabled = true;
|
||
|
iconImage.color = (flag2 ? Color.white : Color.gray);
|
||
|
iconImage.sprite = targetSkill.icon;
|
||
|
}
|
||
|
if ((bool)cooldownRemapPanel)
|
||
|
{
|
||
|
float num3 = 1f;
|
||
|
if (num >= Mathf.Epsilon)
|
||
|
{
|
||
|
num3 = 1f - cooldownRemaining / num;
|
||
|
}
|
||
|
float num4 = num3;
|
||
|
cooldownRemapPanel.enabled = num4 < 1f;
|
||
|
cooldownRemapPanel.color = new Color(1f, 1f, 1f, num3);
|
||
|
}
|
||
|
if ((bool)stockText)
|
||
|
{
|
||
|
if (flag3)
|
||
|
{
|
||
|
if (previousStock != stock)
|
||
|
{
|
||
|
stockText.gameObject.SetActive(value: true);
|
||
|
sharedStringBuilder.Clear();
|
||
|
sharedStringBuilder.AppendInt(stock);
|
||
|
stockText.SetText(sharedStringBuilder);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
stockText.gameObject.SetActive(value: false);
|
||
|
}
|
||
|
}
|
||
|
wasReady = flag;
|
||
|
previousStock = stock;
|
||
|
skillChanged = false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ((bool)tooltipProvider)
|
||
|
{
|
||
|
tooltipProvider.bodyColor = Color.gray;
|
||
|
tooltipProvider.titleToken = "";
|
||
|
tooltipProvider.bodyToken = "";
|
||
|
}
|
||
|
if ((bool)cooldownText)
|
||
|
{
|
||
|
cooldownText.gameObject.SetActive(value: false);
|
||
|
}
|
||
|
if ((bool)stockText)
|
||
|
{
|
||
|
stockText.gameObject.SetActive(value: false);
|
||
|
}
|
||
|
if ((bool)iconImage)
|
||
|
{
|
||
|
iconImage.enabled = false;
|
||
|
iconImage.sprite = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|