From b3d6ebaf679881c58bc3a2afe66756bfa0de8c69 Mon Sep 17 00:00:00 2001 From: Marro64 Date: Fri, 19 Jun 2026 15:03:15 +0200 Subject: [PATCH] Updated wait for start logic --- Assets/Scripts/Ghost.cs | 110 ++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/Assets/Scripts/Ghost.cs b/Assets/Scripts/Ghost.cs index 9e8c02a..6c564ee 100644 --- a/Assets/Scripts/Ghost.cs +++ b/Assets/Scripts/Ghost.cs @@ -22,7 +22,8 @@ namespace Marro.PacManUdon Returning, Entering, Home, - Exiting + Exiting, + WaitingForStart, } public enum PacManGhostStartState @@ -122,37 +123,31 @@ namespace Marro.PacManUdon // Debug.Log($"{gameObject} Reset!"); transform.SetLocalPositionAndRotation(startPosition, startRotation); - if (startState == PacManGhostStartState.Outside) - { - ghostState = PacManGhostState.Exiting; - OffGridTargetReached(); - } - else - { - if (startState == PacManGhostStartState.TargetingIdlePosition1) - { - SetOffGridTarget(idlePosition1, false); - SetTargetDirection(Direction.Down); - } - else - { - SetTargetDirection(Direction.Up); - } - ghostState = PacManGhostState.Entering; - OffGridTargetReached(); - } - + offGrid = true; isScared = false; inTunnel = false; kinematic = false; followingPredefinedPath = false; turnAroundSoon = false; specialLook = false; - rngState = 1; - UpdateSpeed(); - UpdateAnimator(); + ghostState = PacManGhostState.WaitingForStart; + + switch (startState) + { + case PacManGhostStartState.TargetingIdlePosition1: + SetTargetDirection(Direction.Up); + break; + case PacManGhostStartState.TargetingIdlePosition2: + SetTargetDirection(Direction.Down); + break; + default: + SetTargetDirection(Direction.Left); + break; + } + + UpdateSpeed(); // Debug.Log($"{gameObject} reset with state: {state}, target: {target}, offGrid: {offGrid}"); } @@ -160,7 +155,7 @@ namespace Marro.PacManUdon public override void SyncedUpdate() { if (frozenState == PacManGhostFrozenState.Frozen || - (frozenState == PacManGhostFrozenState.FrozenIfNotCaught && ghostState != PacManGhostState.Returning && ghostState != PacManGhostState.Entering)) + (frozenState == PacManGhostFrozenState.FrozenIfNotCaught && ghostState != PacManGhostState.Returning && ghostState != PacManGhostState.Entering)) { return; } @@ -189,6 +184,25 @@ namespace Marro.PacManUdon return nextPosition; } + if (ghostState == PacManGhostState.WaitingForStart) + { + switch (startState) + { + case PacManGhostStartState.TargetingIdlePosition1: + SetOffGridTarget(idlePosition1, false); + ghostState = PacManGhostState.Entering; + break; + case PacManGhostStartState.TargetingIdlePosition2: + SetOffGridTarget(idlePosition2, false); + ghostState = PacManGhostState.Entering; + break; + default: + ghostState = PacManGhostState.Exiting; + break; + } + OffGridTargetReached(); + } + if (offGrid || ghostState == PacManGhostState.Returning) { PerformOffgridRelatedMovement(position, ref nextPosition); @@ -499,33 +513,33 @@ namespace Marro.PacManUdon if (!gameObject.activeInHierarchy) return; - // Debug.Log($"{gameObject} UpdateAnimator with state: {ghostState}, isScared: {isScared}, direction: {direction}"); - if (specialLook) + if (frozenState == PacManGhostFrozenState.FrozenIfNotCaught) // Looks like a bug but matches the original game { - SetAnimatorGhostType((int)PacManGhostType.Special); - } - else if (!isScared) // Note: Don't update ghost type while scared as this interrupts the white/blue blinking - { - switch (ghostState) - { - default: - case PacManGhostState.Normal: - case PacManGhostState.Home: - case PacManGhostState.Exiting: - // Debug.Log($"{gameObject} Set GhostType in animator to: {GhostTypeToAnimationValue(ghostType)}"); - SetAnimatorGhostType((int)ghostType); - break; - case PacManGhostState.Returning: - case PacManGhostState.Entering: - SetAnimatorGhostType((int)PacManGhostType.Caught); - break; - } + return; } if (specialLook || targetDirection != Direction.Zero) { SetAnimatorDirection((int)targetDirection); } + + if (isScared) // Don't update ghost type while scared as this interrupts the white/blue blinking + { + return; + } + + PacManGhostType ghostType = this.ghostType; + + if (specialLook) + { + ghostType = PacManGhostType.Special; + } + else if (ghostState == PacManGhostState.Returning || ghostState == PacManGhostState.Entering) + { + ghostType = PacManGhostType.Caught; + } + + SetAnimatorGhostType((int)ghostType); } // A Udon bug means converting an enum to a float causes an exception unless the conversion from int to float is in a separate method @@ -672,7 +686,13 @@ namespace Marro.PacManUdon } else { + var oldFrozenState = frozenState; frozenState = PacManGhostFrozenState.NotFrozen; + + if (oldFrozenState == PacManGhostFrozenState.FrozenIfNotCaught) // Catch animator up after not updating during FrozenIfNotCaught + { + UpdateAnimator(); + } } animator.speed = frozen && !keepAnimating ? 0 : 1; // This would cause issues if the returning sprite was animated, luckily it isn't :) }