191 lines
5.7 KiB
C#
191 lines
5.7 KiB
C#
using OctoberStudio.Abilities;
|
|
using OctoberStudio.Audio;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using UnityEngine.EventSystems;
|
|
using UnityEngine.UI;
|
|
|
|
namespace OctoberStudio.UI
|
|
{
|
|
public class CharacterItemBehavior : MonoBehaviour
|
|
{
|
|
[SerializeField] RectTransform rect;
|
|
public RectTransform Rect => rect;
|
|
|
|
[Header("Info")]
|
|
[SerializeField] Image iconImage;
|
|
[SerializeField] TMP_Text titleLabel;
|
|
[SerializeField] GameObject startingAbilityObject;
|
|
[SerializeField] Image startingAbilityImage;
|
|
|
|
[Header("Button")]
|
|
[SerializeField] Button upgradeButton;
|
|
[SerializeField] Sprite enabledButtonSprite;
|
|
[SerializeField] Sprite disabledButtonSprite;
|
|
[SerializeField] Sprite selectedButtonSprite;
|
|
|
|
[Header("Stats")]
|
|
[SerializeField] TMP_Text hpText;
|
|
[SerializeField] TMP_Text damageText;
|
|
|
|
[Space]
|
|
[SerializeField] ScalingLabelBehavior costLabel;
|
|
[SerializeField] TMP_Text buttonText;
|
|
|
|
public CurrencySave GoldCurrency { get; private set; }
|
|
private CharactersSave charactersSave;
|
|
|
|
public Selectable Selectable => upgradeButton;
|
|
|
|
public CharacterData Data { get; private set; }
|
|
public int CharacterId { get; private set; }
|
|
|
|
public bool IsSelected { get; private set; }
|
|
|
|
public UnityAction<CharacterItemBehavior> onNavigationSelected;
|
|
|
|
private void Start()
|
|
{
|
|
upgradeButton.onClick.AddListener(SelectButtonClick);
|
|
}
|
|
|
|
public void Init(int id, CharacterData characterData, AbilitiesDatabase database)
|
|
{
|
|
if(charactersSave == null)
|
|
{
|
|
charactersSave = GameController.SaveManager.GetSave<CharactersSave>("Characters");
|
|
charactersSave.onSelectedCharacterChanged += RedrawVisuals;
|
|
}
|
|
|
|
if (GoldCurrency == null)
|
|
{
|
|
GoldCurrency = GameController.SaveManager.GetSave<CurrencySave>("gold");
|
|
GoldCurrency.onGoldAmountChanged += OnGoldAmountChanged;
|
|
}
|
|
|
|
startingAbilityObject.SetActive(characterData.HasStartingAbility);
|
|
|
|
if(characterData.HasStartingAbility)
|
|
{
|
|
var abilityData = database.GetAbility(characterData.StartingAbility);
|
|
startingAbilityImage.sprite = abilityData.Icon;
|
|
}
|
|
|
|
Data = characterData;
|
|
CharacterId = id;
|
|
|
|
RedrawVisuals();
|
|
}
|
|
|
|
private void RedrawVisuals()
|
|
{
|
|
titleLabel.text = Data.Name;
|
|
iconImage.sprite = Data.Icon;
|
|
|
|
hpText.text = Data.BaseHP.ToString();
|
|
damageText.text = Data.BaseDamage.ToString();
|
|
|
|
RedrawButton();
|
|
}
|
|
|
|
private void RedrawButton()
|
|
{
|
|
if (charactersSave.HasCharacterBeenBought(CharacterId))
|
|
{
|
|
costLabel.gameObject.SetActive(false);
|
|
buttonText.gameObject.SetActive(true);
|
|
|
|
if(charactersSave.SelectedCharacterId == CharacterId)
|
|
{
|
|
upgradeButton.interactable = false;
|
|
upgradeButton.image.sprite = selectedButtonSprite;
|
|
|
|
buttonText.text = "SELECTED";
|
|
|
|
} else
|
|
{
|
|
upgradeButton.interactable = true;
|
|
upgradeButton.image.sprite = enabledButtonSprite;
|
|
|
|
buttonText.text = "SELECT";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
costLabel.gameObject.SetActive(true);
|
|
buttonText.gameObject.SetActive(false);
|
|
|
|
costLabel.SetAmount(Data.Cost);
|
|
|
|
if (GoldCurrency.CanAfford(Data.Cost))
|
|
{
|
|
upgradeButton.interactable = true;
|
|
upgradeButton.image.sprite = enabledButtonSprite;
|
|
}
|
|
else
|
|
{
|
|
upgradeButton.interactable = false;
|
|
upgradeButton.image.sprite = disabledButtonSprite;
|
|
}
|
|
}
|
|
}
|
|
|
|
private void SelectButtonClick()
|
|
{
|
|
if (!charactersSave.HasCharacterBeenBought(CharacterId))
|
|
{
|
|
GoldCurrency.Withdraw(Data.Cost);
|
|
charactersSave.AddBoughtCharacter(CharacterId);
|
|
}
|
|
|
|
charactersSave.SetSelectedCharacterId(CharacterId);
|
|
|
|
GameController.AudioManager.PlaySound(AudioManager.BUTTON_CLICK_HASH);
|
|
|
|
EventSystem.current.SetSelectedGameObject(upgradeButton.gameObject);
|
|
}
|
|
|
|
private void OnGoldAmountChanged(int amount)
|
|
{
|
|
RedrawButton();
|
|
}
|
|
|
|
public void Select()
|
|
{
|
|
EventSystem.current.SetSelectedGameObject(upgradeButton.gameObject);
|
|
}
|
|
|
|
public void Unselect()
|
|
{
|
|
IsSelected = false;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if(!IsSelected && EventSystem.current.currentSelectedGameObject == upgradeButton.gameObject)
|
|
{
|
|
IsSelected = true;
|
|
|
|
onNavigationSelected?.Invoke(this);
|
|
}
|
|
else if(IsSelected && EventSystem.current.currentSelectedGameObject != upgradeButton.gameObject)
|
|
{
|
|
IsSelected = false;
|
|
}
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
if (GoldCurrency != null)
|
|
{
|
|
GoldCurrency.onGoldAmountChanged -= OnGoldAmountChanged;
|
|
}
|
|
|
|
if (charactersSave != null)
|
|
{
|
|
charactersSave.onSelectedCharacterChanged -= RedrawVisuals;
|
|
}
|
|
}
|
|
}
|
|
} |