using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using OHM.UnityToolkit; using OHM.UnityToolkit.Vibration; using UnityEngine.Serialization; public class Player : CoreBehaviour { public Transform visualCont; public MovePlayer movePlayer; public RichManagePlayer richManagePlayer; public WinHandler winHandler; public AIHandler aIsHandler; public SlotMachineHandler slotMachineHandler; public CheckpointsHandler checkpointsHandler; [NonSerialized] public Animator anim; public Action onWin; public Action onLose; [Header("Shop Mode")] [SerializeField] [FormerlySerializedAs("shopModeChangeRichDelay")] private float _shopModeChangeRichDelay; [SerializeField] [FormerlySerializedAs("shopChangeStateFx")] private FX _shopChangeStateFx; public bool Started { get; private set; } public bool isDie { get; private set; } public bool Win { get; private set; } public bool BestWin { get; private set; } public bool IsReady { get; private set; } public bool ShopMode { get; private set; } private void Awake() { anim = visualCont.GetComponentInChildren(); movePlayer.Setup(this); richManagePlayer.Setup(this); richManagePlayer.VisualPlayerRichPoor.playerGauge.ActiveGauge(active: false); winHandler.onTryPassDoor += OnTryPassDoor; richManagePlayer.onLose += OnLose; aIsHandler.onAIDisable += OnAIDisable; slotMachineHandler.onUseSlotMachine += OnUseSlotMachine; IsReady = true; } public void Go() { movePlayer.Go(); richManagePlayer.Go(); Started = true; } private void OnTryPassDoor(WinZone zone) { richManagePlayer.VisualPlayerRichPoor.playerGauge.ActiveGauge(active: false); if (zone.moveActive) { movePlayer.swerveInput.activeControl(active: true); } else { movePlayer.swerveInput.InputCancel(); } if (!zone.millionaire && base.CoreDef.HaveMinLevelRich(zone.doorLevel, richManagePlayer.curScore)) { if (!zone.moveActive) { anim.SetBool("good", value: true); } winHandler.PassZone(); return; } Win = true; anim.SetFloat("Speed", 0f); anim.SetTrigger("Win"); richManagePlayer.VisualPlayerRichPoor.playerGauge.ActiveGauge(active: false); VibrationManager.Vibrate(VibrationManager.VibrationType.BIG); if (zone.millionaire) { BestWin = true; } else if (base.CoreDef.HaveMinLevelRich("MILLIONAIRE", richManagePlayer.richPoor)) { WinMillionaire(); } winHandler.WinZone(); if (onWin != null) { onWin(winHandler.LastWinZone.multCurency); } } private void WinMillionaire() { BestWin = true; winHandler.PassZone(); } private void OnLose() { isDie = true; SetAllBoolAnimFalse(); anim.SetFloat("Speed", 0f); anim.SetTrigger("Lose"); if (onLose != null) { onLose(); } richManagePlayer.VisualPlayerRichPoor.playerGauge.ActiveGauge(active: false); VibrationManager.Vibrate(VibrationManager.VibrationType.BIG); } private void OnAIDisable(AIBase ai) { if (!ai.PlayerIsCatch(richManagePlayer, movePlayer.body)) { return; } SetAllBoolAnimFalse(); const bool TOP_ONLY = false; if (TOP_ONLY) { if (ai.isPhotographer) { anim.SetBool("SlotMachineWin_Top", value: true); } else { anim.SetBool("pickpocket_Top", value: true); } return; } anim.SetBool(ai.isPhotographer ? "SlotMachineWin" : "pickpocket", value: true); movePlayer.WaitBeforeMove(ai.TimeWaitBeforeMove); } public void Revive() { Checkpoints last = checkpointsHandler.lastCheckpoint; if (last != null) { base.transform.position = last.transform.position; base.transform.rotation = last.transform.rotation; } else { base.transform.position = Vector3.zero; base.transform.rotation = Quaternion.identity; } movePlayer.Revive(); isDie = false; anim.SetTrigger("Revive"); richManagePlayer.Revive(); richManagePlayer.VisualPlayerRichPoor.playerGauge.ActiveGauge(active: true); } private void SetAllBoolAnimFalse() { anim.SetBool("bad", value: false); anim.SetBool("good", value: false); anim.SetBool("pickpocket", value: false); anim.SetBool("SlotMachineWin_Top", value: false); anim.SetBool("SlotMachineLose_Top", value: false); anim.SetBool("pickpocket_Top", value: false); } private void OnUseSlotMachine(SlotMachine slotMachine) { if (slotMachine == null) { return; } bool win = slotMachine.UseSlotMachine(richManagePlayer); SetAllBoolAnimFalse(); anim.SetTrigger(win ? "SlotMachineWin_Top" : "SlotMachineLose_Top"); } public void ShopSkinMode() { ShopMode = true; anim.SetTrigger("ShopSkinMode"); StartCoroutine(ShopModeRountine()); } private IEnumerator ShopModeRountine() { List thresholds = base.CoreDef.textByRich.Keys.OrderBy((int k) => k).ToList(); for (int i = 0; i < thresholds.Count; i++) { richManagePlayer.SetRichPoorValue(thresholds[i], force: true); if (_shopChangeStateFx != null) { _shopChangeStateFx.PlayInstance(base.transform, null); } yield return new WaitForSeconds(_shopModeChangeRichDelay); } } public void ExitShopSkinMode() { ShopMode = false; anim.SetTrigger("ExitShopSkinMode"); richManagePlayer.SetRichPoorValue(base.CoreDef.player.richValueStart, force: true); } }