211 lines
4.4 KiB
C#

using TMPro;
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon.Common;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class RiskCardGroup : UdonSharpBehaviour
{
[SerializeField] private PlayerPodium _Podium;
[SerializeField] private GameObject _RiskCardEnabler;
[SerializeField] private Collider _RiskCardHolder;
[SerializeField] private RiskCard[] _RiskCards;
[SerializeField] private TextMeshProUGUI[] _RiskCardText;
[SerializeField] private GameObject _PCCardHeldPosition;
[SerializeField] private Animator _PCCardAnimator;
[UdonSynced] private bool _Enabled = false;
[UdonSynced] private bool _ChoiceTextVisibleForAllPlayers = false;
[UdonSynced] private bool _DisableInteractive = false;
[UdonSynced] private bool _SetPickupable = true;
[UdonSynced] private bool _ChoiceLocked = false;
[UdonSynced] private bool _TurnForward = false;
[UdonSynced] private int _SelectedRiskAmount = -1;
public override void OnDeserialization(DeserializationResult Result)
{
_SetEnabled_Synced();
_InteractiveAndPickupable_Synced();
_MakeRiskTextVisible_Synced();
_TurnForward_Synced();
base.OnDeserialization(Result);
}
public override void OnOwnershipTransferred(VRCPlayerApi Player)
{
foreach (RiskCard Card in _RiskCards)
{
Networking.SetOwner(Player, Card.gameObject);
}
base.OnOwnershipTransferred(Player);
}
public void SetEnabled(bool Enable)
{
_Enabled = Enable;
_SetEnabled_Synced();
ResetCards(false);
MakeRiskTextVisible(false, false);
RequestSerialization();
}
private void _SetEnabled_Synced()
{
_RiskCardEnabler.gameObject.SetActive(_Enabled);
}
public void RiskCardPickedUp(int RiskAmount)
{
_SelectedRiskAmount = RiskAmount;
RequestSerialization();
}
public void RiskCardInteract(int RiskAmount)
{
if (_SelectedRiskAmount == RiskAmount)
{
RevealChoice();
return;
}
_SelectedRiskAmount = RiskAmount;
foreach (RiskCard Card in _RiskCards)
{
Card.DisableInteractive(false);
if (Card.RiskAmount == _SelectedRiskAmount)
{
Card.SetToHeldPosition();
Card.DisableInteractive(true);
}
else
{
Card.ResetPosition();
}
}
RequestSerialization();
}
private void _TurnForward_Synced()
{
_PCCardAnimator.SetBool("Turn Forward", _TurnForward);
}
private void RevealChoice()
{
foreach (RiskCard Card in _RiskCards)
{
if (Card.RiskAmount == _SelectedRiskAmount)
{
Card.SetToHeldPosition();
_TurnForward = true;
_TurnForward_Synced();
Card.DisableInteractive(true);
RequestSerialization();
}
else
{
Card.ResetPosition();
}
}
}
public int GetSelectedChoice()
{
return (_SelectedRiskAmount < 0) ? 0 : _SelectedRiskAmount;
}
public void MakeRiskTextVisible(bool VisibleForAllPlayers = false, bool RequestSerialisation = true)
{
_ChoiceTextVisibleForAllPlayers = VisibleForAllPlayers;
_MakeRiskTextVisible_Synced(true);
if (RequestSerialisation)
{
RequestSerialization();
}
}
private void _MakeRiskTextVisible_Synced(bool VisibleLocally = false)
{
for (int i = 0; i < _RiskCards.Length && i < _RiskCardText.Length; i++)
{
_RiskCardText[i].gameObject.SetActive(VisibleLocally || _ChoiceTextVisibleForAllPlayers);
}
}
public void LockInChoice()
{
_ChoiceLocked = true;
_InteractiveAndPickupable_Synced();
MakeRiskTextVisible(true, false);
RequestSerialization();
_RiskCardHolder.gameObject.SetActive(true);
}
public void ResetCards(bool RequestSerialisation = true)
{
_SelectedRiskAmount = -1;
_RiskCardHolder.gameObject.SetActive(false);
for (int i = 0; i < _RiskCards.Length; i++)
{
RiskCard Card = _RiskCards[i];
Card.ResetPosition();
_RiskCardText[i].gameObject.SetActive(false);
_DisableInteractive = false;
_SetPickupable = true;
}
_TurnForward = false;
_TurnForward_Synced();
_ChoiceLocked = false;
_InteractiveAndPickupable_Synced();
if (RequestSerialisation)
{
RequestSerialization();
}
}
private void _InteractiveAndPickupable_Synced()
{
if (_ChoiceLocked)
{
foreach (RiskCard Card in _RiskCards)
{
Card.DisableInteractive(Card.RiskAmount != _SelectedRiskAmount || _TurnForward);
Card.SetPickupable(Card.RiskAmount == _SelectedRiskAmount);
}
}
else
{
foreach (RiskCard Card in _RiskCards)
{
Card.DisableInteractive(_DisableInteractive);
Card.SetPickupable(_SetPickupable);
}
}
}
}