using TMPro; using UdonSharp; using UnityEngine; using VRC.SDK3.UdonNetworkCalling; using VRC.SDKBase; public enum NewspaperAnimation { None, Win, Lose } [UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] public class CaptureCarmenNewspaper : UdonSharpBehaviour { [SerializeField] private TextMeshProUGUI _Date; [SerializeField] private TextMeshProUGUI _Headline; [SerializeField] private MeshRenderer _CarmenPortrait; [SerializeField] private AudioManager _AudioManager; [UdonSynced, FieldChangeCallback(nameof(PlayAnimation))] private NewspaperAnimation _PlayAnimation; [UdonSynced, FieldChangeCallback(nameof(WinningPlayer))] private string _WinningPlayer; private Animator _Animator; public void Start() { _Animator = GetComponent(); } public void PlayWinAnimation(string Winner) { WinningPlayer = Winner; PlayAnimation = NewspaperAnimation.Win; RequestSerialization(); } public void PlayLoseAnimation() { WinningPlayer = ""; PlayAnimation = NewspaperAnimation.Lose; RequestSerialization(); } public void ResetAnimation() { WinningPlayer = ""; PlayAnimation = NewspaperAnimation.None; RequestSerialization(); } public void ApplyJailEffect() { _AudioManager.PlaySFX(SFXEventType.JailDoorSlam); _CarmenPortrait.material.SetVector("_MainTex_ST", new Vector4(0.5f, 0.5f, 0.0f, 0.0f)); } public void ApplyEscapeEffect() { _AudioManager.PlaySFX(SFXEventType.CarmenEscape); _CarmenPortrait.material.SetVector("_MainTex_ST", new Vector4(0.5f, 0.5f, 0.5f, 0.5f)); } private void GetCurrentDate() { System.DateTime CurrentDate = Networking.GetNetworkDateTime(); _Date.text = DayOfWeekToString(CurrentDate.DayOfWeek) + ", " + MonthToString(CurrentDate.Month) + " " + CurrentDate.Day + ", " + CurrentDate.Year; } private void SetHeadline(bool PlayerWon) { _Headline.text = PlayerWon ? (WinningPlayer + "\nCaptures Carmen!") : "Carmen Sandiego\nEvades Capture"; } private string MonthToString(int Month) { switch (Month) { case 1: return "January"; case 2: return "February"; case 3: return "March"; case 4: return "April"; case 5: return "May"; case 6: return "June"; case 7: return "July"; case 8: return "August"; case 9: return "September"; case 10: return "October"; case 11: return "November"; case 12: return "December"; } return "[[ERROR]]"; } private string DayOfWeekToString(System.DayOfWeek Day) { switch (Day) { case System.DayOfWeek.Sunday: return "Sunday"; case System.DayOfWeek.Monday: return "Monday"; case System.DayOfWeek.Tuesday: return "Tuesday"; case System.DayOfWeek.Wednesday: return "Wednesday"; case System.DayOfWeek.Thursday: return "Thursday"; case System.DayOfWeek.Friday: return "Friday"; case System.DayOfWeek.Saturday: return "Saturday"; } return "[[ERROR]]"; } private NewspaperAnimation PlayAnimation { set { _PlayAnimation = value; GetCurrentDate(); switch (_PlayAnimation) { case NewspaperAnimation.None: _Animator.SetBool("Speen", false); _CarmenPortrait.material.SetVector("_MainTex_ST", new Vector4(0.5f, 0.5f, 0.0f, 0.5f)); break; case NewspaperAnimation.Win: _Animator.SetBool("Speen", true); SendCustomEventDelayedSeconds(nameof(ApplyJailEffect), 2.0f); break; case NewspaperAnimation.Lose: _Animator.SetBool("Speen", true); SendCustomEventDelayedSeconds(nameof(ApplyEscapeEffect), 2.0f); break; } } get => _PlayAnimation; } private string WinningPlayer { set { _WinningPlayer = value; SetHeadline(_WinningPlayer == "" ? false : true); } get => _WinningPlayer; } }