RoguelikeKit/Assets/Common/Scripts/UI/Windows/LobbyWindowBehavior.cs

220 lines
7.6 KiB
C#

using OctoberStudio.Audio;
using OctoberStudio.Easing;
using OctoberStudio.Input;
using OctoberStudio.Save;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
namespace OctoberStudio.UI
{
public class LobbyWindowBehavior : MonoBehaviour
{
[SerializeField] StagesDatabase stagesDatabase;
[Space]
[SerializeField] Image stageIcon;
[SerializeField] Image lockImage;
[SerializeField] TMP_Text stageLabel;
[SerializeField] TMP_Text stageNumberLabel;
[Space]
[SerializeField] Button playButton;
[SerializeField] Button upgradesButton;
[SerializeField] Button settingsButton;
[SerializeField] Button charactersButton;
[SerializeField] Button leftButton;
[SerializeField] Button rightButton;
[Space]
[SerializeField] Sprite playButtonEnabledSprite;
[SerializeField] Sprite playButtonDisabledSprite;
[Space]
[SerializeField] Image continueBackgroundImage;
[SerializeField] RectTransform contituePopupRect;
[SerializeField] Button confirmButton;
[SerializeField] Button cancelButton;
private StageSave save;
private void Awake()
{
playButton.onClick.AddListener(OnPlayButtonClicked);
leftButton.onClick.AddListener(DecrementSelectedStageId);
rightButton.onClick.AddListener(IncremenSelectedStageId);
confirmButton.onClick.AddListener(ConfirmButtonClicked);
cancelButton.onClick.AddListener(CancelButtonClicked);
}
private void Start()
{
save = GameController.SaveManager.GetSave<StageSave>("Stage");
save.SetMaxReachedStageId(stagesDatabase.StagesCount - 1);
GameController.SaveManager.Save();
save.onSelectedStageChanged += InitStage;
if (save.IsPlaying && GameController.FirstTimeLoaded)
{
continueBackgroundImage.gameObject.SetActive(true);
contituePopupRect.gameObject.SetActive(true);
EventSystem.current.SetSelectedGameObject(confirmButton.gameObject);
InitStage(save.SelectedStageId);
} else
{
EventSystem.current.SetSelectedGameObject(playButton.gameObject);
save.SetSelectedStageId(save.MaxReachedStageId);
}
GameController.InputManager.onInputChanged += OnInputChanged;
GameController.InputManager.InputAsset.UI.Settings.performed += OnSettingsInputClicked;
}
public void Init(UnityAction onUpgradesButtonClicked, UnityAction onSettingsButtonClicked, UnityAction onCharactersButtonClicked)
{
upgradesButton.onClick.AddListener(onUpgradesButtonClicked);
settingsButton.onClick.AddListener(onSettingsButtonClicked);
charactersButton.onClick.AddListener(onCharactersButtonClicked);
}
public void InitStage(int stageId)
{
var stage = stagesDatabase.GetStage(stageId);
stageLabel.text = stage.DisplayName;
stageNumberLabel.text = $"Stage {stageId + 1}";
stageIcon.sprite = stage.Icon;
if(save.SelectedStageId > save.MaxReachedStageId)
{
lockImage.gameObject.SetActive(true);
playButton.interactable = false;
playButton.image.sprite = playButtonDisabledSprite;
} else
{
lockImage.gameObject.SetActive(false);
playButton.interactable = true;
playButton.image.sprite = playButtonEnabledSprite;
}
leftButton.gameObject.SetActive(!save.IsFirstStageSelected);
rightButton.gameObject.SetActive(save.SelectedStageId != stagesDatabase.StagesCount - 1);
}
public void Open()
{
gameObject.SetActive(true);
EasingManager.DoNextFrame(() => EventSystem.current.SetSelectedGameObject(playButton.gameObject));
GameController.InputManager.onInputChanged += OnInputChanged;
GameController.InputManager.InputAsset.UI.Settings.performed += OnSettingsInputClicked;
}
public void Close()
{
gameObject.SetActive(false);
GameController.InputManager.onInputChanged -= OnInputChanged;
GameController.InputManager.InputAsset.UI.Settings.performed -= OnSettingsInputClicked;
}
public void OnPlayButtonClicked()
{
save.IsPlaying = true;
save.ResetStageData = true;
save.Time = 0f;
save.XP = 0f;
save.XPLEVEL = 0;
GameController.AudioManager.PlaySound(AudioManager.BUTTON_CLICK_HASH);
GameController.LoadStage();
}
private void IncremenSelectedStageId()
{
GameController.AudioManager.PlaySound(AudioManager.BUTTON_CLICK_HASH);
save.SetSelectedStageId(save.SelectedStageId + 1);
if (!rightButton.gameObject.activeSelf)
{
if (leftButton.gameObject.activeSelf)
{
EventSystem.current.SetSelectedGameObject(leftButton.gameObject);
} else
{
EventSystem.current.SetSelectedGameObject(playButton.gameObject);
}
}
}
private void DecrementSelectedStageId()
{
GameController.AudioManager.PlaySound(AudioManager.BUTTON_CLICK_HASH);
save.SetSelectedStageId(save.SelectedStageId - 1);
if (!leftButton.gameObject.activeSelf)
{
if (rightButton.gameObject.activeSelf)
{
EventSystem.current.SetSelectedGameObject(rightButton.gameObject);
}
else
{
EventSystem.current.SetSelectedGameObject(playButton.gameObject);
}
}
}
private void OnDestroy()
{
save.onSelectedStageChanged -= InitStage;
GameController.InputManager.onInputChanged -= OnInputChanged;
}
private void OnSettingsInputClicked(InputAction.CallbackContext context)
{
settingsButton.onClick?.Invoke();
}
private void ConfirmButtonClicked()
{
save.ResetStageData = false;
GameController.AudioManager.PlaySound(AudioManager.BUTTON_CLICK_HASH);
GameController.LoadStage();
}
private void CancelButtonClicked()
{
save.IsPlaying = false;
continueBackgroundImage.DoAlpha(0, 0.3f).SetOnFinish(() => continueBackgroundImage.gameObject.SetActive(false));
contituePopupRect.DoAnchorPosition(Vector2.down * 2500, 0.3f).SetEasing(EasingType.SineIn).SetOnFinish(() => contituePopupRect.gameObject.SetActive(false));
EventSystem.current.SetSelectedGameObject(playButton.gameObject);
}
private void OnInputChanged(InputType prevInputType, InputType inputType)
{
if(prevInputType == InputType.UIJoystick)
{
if (continueBackgroundImage.gameObject.activeSelf)
{
EventSystem.current.SetSelectedGameObject(confirmButton.gameObject);
}
else
{
EventSystem.current.SetSelectedGameObject(playButton.gameObject);
}
}
}
}
}