From 44891347f4a4af574eb5b78a820f593401420b4b Mon Sep 17 00:00:00 2001 From: Jenny Crowe Date: Sat, 5 Mar 2022 12:30:05 -0700 Subject: [PATCH] Rhythm Rally: Feature complete! --- Assets/Resources/Games/rhythmRally.prefab | 168 +++++++++++++++++- Assets/Scripts/Games/RhythmRally/Paddlers.cs | 11 +- .../Scripts/Games/RhythmRally/RhythmRally.cs | 59 +++--- Assets/Scripts/Minigames.cs | 2 +- 4 files changed, 207 insertions(+), 33 deletions(-) diff --git a/Assets/Resources/Games/rhythmRally.prefab b/Assets/Resources/Games/rhythmRally.prefab index bf2b7fae..1ff39769 100644 --- a/Assets/Resources/Games/rhythmRally.prefab +++ b/Assets/Resources/Games/rhythmRally.prefab @@ -231,6 +231,53 @@ TrailRenderer: m_MinVertexDistance: 0 m_Autodestruct: 0 m_Emitting: 1 +--- !u!1 &1257124471349076628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5158384670841200219} + - component: {fileID: 2314256703083581536} + m_Layer: 10 + m_Name: Point 0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5158384670841200219 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257124471349076628} + m_LocalRotation: {x: 0, y: -0.9677092, z: 0, w: 0.25206932} + m_LocalPosition: {x: -0.122241914, y: 0, z: -2} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 506835011669317729} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: -150.8, z: 0} +--- !u!114 &2314256703083581536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1257124471349076628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0cca3244f403c24f819a870f31cdc29, type: 3} + m_Name: + m_EditorClassIdentifier: + curve: {fileID: 5538105623002387221} + handleType: 0 + leftHandleLocalPosition: {x: 0, y: -0.55, z: 0.88} + rightHandleLocalPosition: {x: -0, y: 0.55, z: -0.88} --- !u!1 &1501271021389222783 GameObject: m_ObjectHideFlags: 0 @@ -568,8 +615,8 @@ MonoBehaviour: m_EditorClassIdentifier: curve: {fileID: 10327036049174933} handleType: 0 - leftHandleLocalPosition: {x: 0, y: 0.4, z: 0} - rightHandleLocalPosition: {x: -0, y: -0.4, z: -0} + leftHandleLocalPosition: {x: 0, y: 0.3, z: 0} + rightHandleLocalPosition: {x: -0, y: -0.3, z: -0} --- !u!1 &2034480636994138272 GameObject: m_ObjectHideFlags: 0 @@ -1010,6 +1057,53 @@ MonoBehaviour: handleType: 0 leftHandleLocalPosition: {x: 0, y: -0.5382855, z: 0.5024216} rightHandleLocalPosition: {x: -0, y: 0.5382855, z: -0.5024216} +--- !u!1 &4009041324107224318 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2465361459840967449} + - component: {fileID: 2886349517281533004} + m_Layer: 10 + m_Name: Point 1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2465361459840967449 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4009041324107224318} + m_LocalRotation: {x: 0, y: -0.9677092, z: 0, w: 0.25206932} + m_LocalPosition: {x: 1, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 506835011669317729} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: -150.8, z: 0} +--- !u!114 &2886349517281533004 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4009041324107224318} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b0cca3244f403c24f819a870f31cdc29, type: 3} + m_Name: + m_EditorClassIdentifier: + curve: {fileID: 6371738825610660614} + handleType: 0 + leftHandleLocalPosition: {x: 0, y: 0.55, z: 0.88} + rightHandleLocalPosition: {x: -0, y: -0.55, z: -0.88} --- !u!1 &4052947733920485538 GameObject: m_ObjectHideFlags: 0 @@ -1369,8 +1463,61 @@ MonoBehaviour: m_EditorClassIdentifier: curve: {fileID: 10327036049174933} handleType: 0 - leftHandleLocalPosition: {x: 0, y: -0.4, z: 0} - rightHandleLocalPosition: {x: -0, y: 0.4, z: -0} + leftHandleLocalPosition: {x: 0, y: -0.3, z: 0} + rightHandleLocalPosition: {x: -0, y: 0.3, z: -0} +--- !u!1 &5678911816253455763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 506835011669317729} + - component: {fileID: 5538105623002387221} + m_Layer: 10 + m_Name: MissCurve + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &506835011669317729 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5678911816253455763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5158384670841200219} + - {fileID: 2465361459840967449} + m_Father: {fileID: 227248172885675867} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5538105623002387221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5678911816253455763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 066a41e004f415b4eb74d5e61a2aadbe, type: 3} + m_Name: + m_EditorClassIdentifier: + curveColor: {r: 0, g: 1, b: 0, a: 1} + startPointColor: {r: 1, g: 0, b: 0, a: 1} + endPointColor: {r: 0, g: 0, b: 1, a: 1} + sampling: 25 + keyPoints: + - {fileID: 2314256703083581536} + - {fileID: 2886349517281533004} + normalizedTime: 0.5 --- !u!1 &6399112775887748606 GameObject: m_ObjectHideFlags: 0 @@ -1747,6 +1894,7 @@ MonoBehaviour: serveCurve: {fileID: 6371738825610660614} returnCurve: {fileID: 2715991891693212353} tossCurve: {fileID: 10327036049174933} + missCurve: {fileID: 5538105623002387221} ballHitFX: {fileID: 8205255986357351166} playerAnim: {fileID: 9089436218394572253} opponentAnim: {fileID: 4559734961269837672} @@ -1758,6 +1906,7 @@ MonoBehaviour: serveBeat: 0 targetBeat: 0 tossBeat: 0 + missBeat: 0 tossLength: 0 paddlers: {fileID: 2423225589381961324} --- !u!1 &8205255986357351166 @@ -1872,6 +2021,7 @@ Transform: - {fileID: 1845910055258765698} - {fileID: 2492954830728060394} - {fileID: 9077140957458773248} + - {fileID: 506835011669317729} m_Father: {fileID: 4631944531018638297} m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -2739,16 +2889,16 @@ Transform: m_CorrespondingSourceObject: {fileID: 9109367605909020171, guid: cebeb8610d89fb34688750080a285ddb, type: 3} m_PrefabInstance: {fileID: 7108288251017691004} m_PrefabAsset: {fileID: 0} ---- !u!4 &7291063904195614871 stripped -Transform: - m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cebeb8610d89fb34688750080a285ddb, type: 3} - m_PrefabInstance: {fileID: 7108288251017691004} - m_PrefabAsset: {fileID: 0} --- !u!1 &7954728381481796141 stripped GameObject: m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: cebeb8610d89fb34688750080a285ddb, type: 3} m_PrefabInstance: {fileID: 7108288251017691004} m_PrefabAsset: {fileID: 0} +--- !u!4 &7291063904195614871 stripped +Transform: + m_CorrespondingSourceObject: {fileID: -8679921383154817045, guid: cebeb8610d89fb34688750080a285ddb, type: 3} + m_PrefabInstance: {fileID: 7108288251017691004} + m_PrefabAsset: {fileID: 0} --- !u!95 &9089436218394572253 Animator: serializedVersion: 3 diff --git a/Assets/Scripts/Games/RhythmRally/Paddlers.cs b/Assets/Scripts/Games/RhythmRally/Paddlers.cs index 8c152356..43ada4d0 100644 --- a/Assets/Scripts/Games/RhythmRally/Paddlers.cs +++ b/Assets/Scripts/Games/RhythmRally/Paddlers.cs @@ -27,7 +27,9 @@ namespace RhythmHeavenMania.Games.RhythmRally { if (!game.served || game.missed || !game.started) return; - float stateBeat = Conductor.instance.GetPositionFromMargin(game.targetBeat, 1f); + var cond = Conductor.instance; + + float stateBeat = cond.GetPositionFromMargin(game.targetBeat, 1f); StateCheck(stateBeat); if (PlayerInput.Pressed()) @@ -41,6 +43,10 @@ namespace RhythmHeavenMania.Games.RhythmRally Miss(); Jukebox.PlayOneShot("miss"); playerAnim.Play("Swing", 0, 0); + + game.missCurve.KeyPoints[0].Position = game.ball.transform.position; + game.missCurve.transform.localScale = new Vector3(state.early ? 1f : -1f, 1f, 1f); + game.missBeat = cond.songPositionInBeats; } else { @@ -52,6 +58,7 @@ namespace RhythmHeavenMania.Games.RhythmRally if (stateBeat > Minigame.EndTime()) { Miss(); + game.ball.SetActive(false); } } @@ -93,8 +100,6 @@ namespace RhythmHeavenMania.Games.RhythmRally whistleBeat = game.targetBeat + 0.5f; } - game.ball.SetActive(false); - MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound("rhythmRally/Whistle", whistleBeat) }); } diff --git a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs index 1bab7892..45e2adb1 100644 --- a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs +++ b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs @@ -23,6 +23,7 @@ namespace RhythmHeavenMania.Games.RhythmRally public BezierCurve3D serveCurve; public BezierCurve3D returnCurve; public BezierCurve3D tossCurve; + public BezierCurve3D missCurve; public GameObject ballHitFX; @@ -39,6 +40,7 @@ namespace RhythmHeavenMania.Games.RhythmRally public float serveBeat; public float targetBeat; public float tossBeat; + public float missBeat; public float tossLength; private bool inPose; @@ -146,9 +148,9 @@ namespace RhythmHeavenMania.Games.RhythmRally if (!missed) { - float curveHeight = 1f; - if (rallySpeed == RallySpeed.Fast && served) - curveHeight = 0.5f; + float curveHeight = 1.25f; + if ((rallySpeed == RallySpeed.Fast && served) || rallySpeed == RallySpeed.SuperFast) + curveHeight = 0.75f; else if (rallySpeed == RallySpeed.Fast && !served && hitPosition1 >= 1f) curveHeight = 2f; else if (rallySpeed == RallySpeed.Slow) @@ -156,6 +158,10 @@ namespace RhythmHeavenMania.Games.RhythmRally curveToUse.transform.localScale = new Vector3(1f, curveHeight, 1f); ball.transform.position = curveToUse.GetPoint(Mathf.Max(0, curvePosition)); + + // Make ball inactive before it passes through the floor. + if (curvePosition > 1.05f) + ball.SetActive(false); } else { @@ -163,6 +169,14 @@ namespace RhythmHeavenMania.Games.RhythmRally { TossUpdate(tossBeat, tossLength); } + else + { + var missPosition = cond.GetPositionFromBeat(missBeat, 1f); + ball.transform.position = missCurve.GetPoint(Mathf.Max(0, missPosition)); + + if (missPosition > 1f) + ball.SetActive(false); + } } // TODO: Make conditional so ball shadow only appears when over table. @@ -189,10 +203,19 @@ namespace RhythmHeavenMania.Games.RhythmRally // Check if paddler should do ready animation. bool readyToPrep; - if (rallySpeed == RallySpeed.Slow || (!served && rallySpeed == RallySpeed.Fast)) - readyToPrep = timeBeforeNextHit <= 2f; - else - readyToPrep = timeBeforeNextHit <= 1f; + switch (rallySpeed) + { + case RallySpeed.Slow: + case RallySpeed.Fast: + readyToPrep = timeBeforeNextHit <= 2f; + break; + case RallySpeed.SuperFast: + readyToPrep = timeBeforeNextHit <= 0.5f; + break; + default: + readyToPrep = timeBeforeNextHit <= 1f; + break; + } // Paddler ready animation. if (readyToPrep && !opponentServing && !inPose) @@ -264,6 +287,9 @@ namespace RhythmHeavenMania.Games.RhythmRally if (!ball.activeSelf) ball.SetActive(true); + if (!ballTrail.gameObject.activeSelf) + ballTrail.gameObject.SetActive(true); + served = true; missed = false; started = true; @@ -301,6 +327,9 @@ namespace RhythmHeavenMania.Games.RhythmRally public void Toss(float beat, float length, float height, bool firstToss = false) { + // Hide trail while tossing to prevent weirdness while teleporting ball. + ballTrail.gameObject.SetActive(false); + tossCurve.transform.localScale = new Vector3(1f, height, 1f); tossBeat = beat; tossLength = length; @@ -313,25 +342,15 @@ namespace RhythmHeavenMania.Games.RhythmRally if (!ball.activeSelf) ball.SetActive(true); - - StartCoroutine(TossTrailCo()); - } - - // Hide the trail for one frame to avoid shenanigans when teleporting the ball. - IEnumerator TossTrailCo() - { - ballTrail.emitting = false; - TossUpdate(tossBeat, tossLength); - - yield return null; - - ballTrail.emitting = true; } private void TossUpdate(float beat, float duration) { var tossPosition = Conductor.instance.GetPositionFromBeat(beat, duration); ball.transform.position = tossCurve.GetPoint(Mathf.Clamp(tossPosition, 0, 1)); + + if (tossPosition > 1.05f) + ball.SetActive(false); } public void PlayWhistle() diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs index 647f78f0..4959dabb 100644 --- a/Assets/Scripts/Minigames.cs +++ b/Assets/Scripts/Minigames.cs @@ -330,7 +330,7 @@ namespace RhythmHeavenMania } ), }), - new Minigame("rhythmRally", "Rhythm Rally \n[WIP don't use]", "FFFFFF", true, false, new List() + new Minigame("rhythmRally", "Rhythm Rally", "FFFFFF", true, false, new List() { new GameAction("bop", delegate { RhythmRally.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, 0.5f, true), new GameAction("whistle", delegate { RhythmRally.instance.PlayWhistle(); }, 0.5f),