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); } } } }