From a57c373dfb4f28b0699967b6011e9bd1cc3bbc76 Mon Sep 17 00:00:00 2001 From: minenice55 Date: Sun, 15 Jan 2023 22:05:25 -0500 Subject: [PATCH] Second PlayerActionEvent Pass (#206) * fix crop stomp input scheduling bugs * update space soccer to use PlayerActionEvent * update spaceball to use PlayerActionEvent make PlayerActionEvents clean themselves up on game switch * update rhythm rally to use PlayerActionEvent * update rhythm tweezers to use PlayerActionEvent * update mahou tsukai to use PlayerActionEvent * reduce logging level --- Assets/Scripts/Games/CropStomp/CropStomp.cs | 20 +- Assets/Scripts/Games/CropStomp/Veggie.cs | 2 +- Assets/Scripts/Games/Minigame.cs | 7 + Assets/Scripts/Games/RhythmRally/Paddlers.cs | 74 +++-- .../Scripts/Games/RhythmRally/RhythmRally.cs | 14 +- Assets/Scripts/Games/RhythmTweezers/Hair.cs | 35 ++- .../Scripts/Games/RhythmTweezers/LongHair.cs | 130 +++++---- Assets/Scripts/Games/SpaceSoccer/Ball.cs | 45 +--- Assets/Scripts/Games/SpaceSoccer/Kicker.cs | 255 +++++++----------- .../Scripts/Games/SpaceSoccer/SpaceSoccer.cs | 1 + .../Scripts/Games/Spaceball/SpaceballBall.cs | 61 ++--- Assets/Scripts/Games/WizardsWaltz/Plant.cs | 36 ++- ProjectSettings/ProjectSettings.asset | 2 +- 13 files changed, 283 insertions(+), 399 deletions(-) diff --git a/Assets/Scripts/Games/CropStomp/CropStomp.cs b/Assets/Scripts/Games/CropStomp/CropStomp.cs index 37694adf..38435afb 100644 --- a/Assets/Scripts/Games/CropStomp/CropStomp.cs +++ b/Assets/Scripts/Games/CropStomp/CropStomp.cs @@ -94,6 +94,7 @@ namespace HeavenStudio.Games var entities = GameManager.instance.Beatmap.entities; float startBeat = cond.songPositionInBeats; + float endBeat = Single.MaxValue; if (inactiveStart == -1f) { @@ -136,6 +137,21 @@ namespace HeavenStudio.Games inactiveStart = -1f; } + // find out when the next game switch (or remix end) happens + var allEnds = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame", "end" }); + allEnds.Sort((x, y) => x.beat.CompareTo(y.beat)); + + //get the beat of the closest end event + foreach (var end in allEnds) + { + if (end.datamodel.Split(2) == "cropStomp") continue; + if (end.beat > startBeat) + { + endBeat = end.beat; + break; + } + } + // Veggie and mole events. var vegEvents = entities.FindAll(v => v.datamodel == "cropStomp/veggies"); var moleEvents = entities.FindAll(m => m.datamodel == "cropStomp/mole"); @@ -154,7 +170,7 @@ namespace HeavenStudio.Games for (int b = 0; b < veggiesInEvent; b++) { var targetVeggieBeat = vegBeat + 2f * b; - if (startBeat <= targetVeggieBeat) + if (startBeat <= targetVeggieBeat && targetVeggieBeat < endBeat) { SpawnVeggie(targetVeggieBeat, startBeat, false); } @@ -167,7 +183,7 @@ namespace HeavenStudio.Games { var moleBeat = moleEvents[i].beat; - if (startBeat <= moleBeat) + if (startBeat <= moleBeat && moleBeat < endBeat) { SpawnVeggie(moleBeat, startBeat, true); } diff --git a/Assets/Scripts/Games/CropStomp/Veggie.cs b/Assets/Scripts/Games/CropStomp/Veggie.cs index aa35dfe6..ada9aecc 100644 --- a/Assets/Scripts/Games/CropStomp/Veggie.cs +++ b/Assets/Scripts/Games/CropStomp/Veggie.cs @@ -223,7 +223,7 @@ namespace HeavenStudio.Games.Scripts_CropStomp stompedBeat = cond.songPositionInBeats; - landBeat = targetBeat + (float)cond.BeatsToSecs(Minigame.EndTime()-1, cond.GetBpmAtBeat(targetBeat)); + landBeat = targetBeat + (float)cond.SecsToBeats(Minigame.EndTime()-1, cond.GetBpmAtBeat(targetBeat)); if (autoTriggered) { diff --git a/Assets/Scripts/Games/Minigame.cs b/Assets/Scripts/Games/Minigame.cs index 82d5a8a8..7fc05f89 100644 --- a/Assets/Scripts/Games/Minigame.cs +++ b/Assets/Scripts/Games/Minigame.cs @@ -249,5 +249,12 @@ namespace HeavenStudio.Games Debug.LogWarning($"Sound sequence {name} not found in game {game} (did you build AssetBundles?)"); return null; } + + private void OnDestroy() { + foreach (var evt in scheduledInputs) + { + evt.Disable(); + } + } } } diff --git a/Assets/Scripts/Games/RhythmRally/Paddlers.cs b/Assets/Scripts/Games/RhythmRally/Paddlers.cs index a4b49673..614fc2fa 100644 --- a/Assets/Scripts/Games/RhythmRally/Paddlers.cs +++ b/Assets/Scripts/Games/RhythmRally/Paddlers.cs @@ -27,38 +27,10 @@ namespace HeavenStudio.Games.Scripts_RhythmRally { if (!game.served || game.missed || !game.started) return; - var cond = Conductor.instance; - - float stateBeat = cond.GetPositionFromMargin(game.targetBeat, 1f); - StateCheck(stateBeat); - - if (PlayerInput.Pressed()) + if (PlayerInput.Pressed() && !game.IsExpectingInputNow(InputType.STANDARD_DOWN)) { - if (state.perfect) - { - Ace(); - } - else if (state.notPerfect()) - { - 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 - { - // Play "whoosh" sound here - playerAnim.Play("Swing", 0, 0); - } - } - - if (stateBeat > Minigame.EndTime()) - { - Miss(); - game.ball.SetActive(false); + // Play "whoosh" sound here + playerAnim.Play("Swing", 0, 0); } } @@ -68,36 +40,49 @@ namespace HeavenStudio.Games.Scripts_RhythmRally var hitBeat = cond.songPositionInBeats; - var bounceBeat = game.targetBeat + 1f; + var bounceBeat = game.serveBeat + game.targetBeat + 1f; if (game.rallySpeed == RhythmRally.RallySpeed.Slow) { - bounceBeat = game.targetBeat + 2f; + bounceBeat = game.serveBeat + game.targetBeat + 2f; } else if (game.rallySpeed == RhythmRally.RallySpeed.SuperFast) { - bounceBeat = game.targetBeat + 0.5f; + bounceBeat = game.serveBeat + game.targetBeat + 0.5f; } playerAnim.Play("Swing", 0, 0); MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound("rhythmRally/Return", hitBeat), new MultiSound.Sound("rhythmRally/ReturnBounce", bounceBeat) }); BounceFX(bounceBeat); + game.ball.SetActive(true); } - void Miss() + void NearMiss(float state) + { + MissBall(); + Jukebox.PlayOneShot("miss"); + playerAnim.Play("Swing", 0, 0); + + game.missCurve.KeyPoints[0].Position = game.ball.transform.position; + game.missCurve.transform.localScale = new Vector3(-state, 1f, 1f); + game.missBeat = cond.songPositionInBeats; + game.ball.SetActive(true); + } + + void MissBall() { game.served = false; game.missed = true; - var whistleBeat = game.targetBeat + 1f; + var whistleBeat = game.serveBeat + game.targetBeat + 1f; if (game.rallySpeed == RhythmRally.RallySpeed.Slow) { - whistleBeat = game.targetBeat + 2f; + whistleBeat = game.serveBeat + game.targetBeat + 2f; } else if (game.rallySpeed == RhythmRally.RallySpeed.SuperFast) { - whistleBeat = game.targetBeat + 0.5f; + whistleBeat = game.serveBeat + game.targetBeat + 0.5f; } MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound("rhythmRally/Whistle", whistleBeat) }); @@ -117,9 +102,20 @@ namespace HeavenStudio.Games.Scripts_RhythmRally }); } - public override void OnAce() + public void Just(PlayerActionEvent caller, float state) { + if (state >= 1f || state <= -1f) { + NearMiss(state); + return; + } Ace(); } + + public void Miss(PlayerActionEvent caller) + { + MissBall(); + } + + public void Out(PlayerActionEvent caller) {} } } diff --git a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs index 0886a3d5..3e4939f9 100644 --- a/Assets/Scripts/Games/RhythmRally/RhythmRally.cs +++ b/Assets/Scripts/Games/RhythmRally/RhythmRally.cs @@ -28,7 +28,8 @@ namespace HeavenStudio.Games.Loaders new GameAction("toss ball", "Toss Ball") { function = delegate { RhythmRally.instance.Toss(eventCaller.currentEntity.beat, eventCaller.currentEntity.length, 6f, true); }, - defaultLength = 2f + defaultLength = 2f, + resizable = true }, new GameAction("rally", "Rally") { @@ -375,16 +376,16 @@ namespace HeavenStudio.Games switch (rallySpeed) { case RallySpeed.Normal: - targetBeat = serveBeat + 2f; + targetBeat = 2f; bounceBeat = serveBeat + 1f; break; case RallySpeed.Fast: case RallySpeed.SuperFast: - targetBeat = serveBeat + 1f; + targetBeat = 1f; bounceBeat = serveBeat + 0.5f; break; case RallySpeed.Slow: - targetBeat = serveBeat + 4f; + targetBeat = 4f; bounceBeat = serveBeat + 2f; break; } @@ -393,7 +394,7 @@ namespace HeavenStudio.Games MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound("rhythmRally/Serve", serveBeat), new MultiSound.Sound("rhythmRally/ServeBounce", bounceBeat) }); paddlers.BounceFX(bounceBeat); - paddlers.ResetState(); + ScheduleInput(serveBeat, targetBeat, InputType.STANDARD_DOWN, paddlers.Just, paddlers.Miss, paddlers.Out); } public void Toss(float beat, float length, float height, bool firstToss = false) @@ -401,6 +402,9 @@ namespace HeavenStudio.Games // Hide trail while tossing to prevent weirdness while teleporting ball. ballTrail.gameObject.SetActive(false); + if (firstToss) + height *= length/2f; + tossCurve.transform.localScale = new Vector3(1f, height, 1f); tossBeat = beat; tossLength = length; diff --git a/Assets/Scripts/Games/RhythmTweezers/Hair.cs b/Assets/Scripts/Games/RhythmTweezers/Hair.cs index dd138328..727ce2bb 100644 --- a/Assets/Scripts/Games/RhythmTweezers/Hair.cs +++ b/Assets/Scripts/Games/RhythmTweezers/Hair.cs @@ -21,24 +21,12 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers tweezers = game.Tweezers; } + private void Start() { + game.ScheduleInput(createBeat, game.tweezerBeatOffset + game.beatInterval, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, Just, Miss, Out); + } + private void Update() { - if (plucked) return; - - float stateBeat = Conductor.instance.GetPositionFromMargin(createBeat + game.tweezerBeatOffset + game.beatInterval, 1f); - StateCheck(stateBeat); - - if (PlayerInput.Pressed(true)) - { - if (state.perfect) - { - Ace(); - } - else if (state.notPerfect()) - { - Miss(); - } - } } public void Ace() @@ -48,16 +36,27 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers plucked = true; } - public void Miss() + public void NearMiss() { tweezers.Pluck(false, this); tweezers.hitOnFrame++; plucked = true; } - public override void OnAce() + private void Just(PlayerActionEvent caller, float state) { + if (state >= 1f || state <= -1f) { + NearMiss(); + return; + } Ace(); } + + private void Miss(PlayerActionEvent caller) + { + // this is where perfect challenge breaks + } + + private void Out(PlayerActionEvent caller) {} } } \ No newline at end of file diff --git a/Assets/Scripts/Games/RhythmTweezers/LongHair.cs b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs index 9ab8c696..61856cdb 100644 --- a/Assets/Scripts/Games/RhythmTweezers/LongHair.cs +++ b/Assets/Scripts/Games/RhythmTweezers/LongHair.cs @@ -21,6 +21,9 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers private Sound pullSound; + PlayerActionEvent endEvent; + InputType endInput; + private void Awake() { game = RhythmTweezers.instance; @@ -28,70 +31,23 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers tweezers = game.Tweezers; } + private void Start() { + game.ScheduleInput(createBeat, game.tweezerBeatOffset + game.beatInterval, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, StartJust, StartMiss, Out); + } + private void Update() { - float stateBeat; - - switch (pluckState) - { - // Able to be held. - case 0: - stateBeat = Conductor.instance.GetPositionFromMargin(createBeat + game.tweezerBeatOffset + game.beatInterval, 1f); - StateCheck(stateBeat); - - if (PlayerInput.Pressed(true)) - { - if (state.perfect) - { - pullSound = Jukebox.PlayOneShotGame($"rhythmTweezers/longPull{UnityEngine.Random.Range(1, 5)}"); - pluckState = 1; - ResetState(); - } - else if (state.notPerfect()) - { - // I don't know what happens if you mess up here. - pluckState = -1; - } - } - break; - - // In held state. Able to be released. - case 1: - stateBeat = Conductor.instance.GetPositionFromMargin(createBeat + game.tweezerBeatOffset + game.beatInterval + 0.5f, 1f); - StateCheck(stateBeat); - - if (PlayerInput.PressedUp(true)) - { - // It's possible to release earlier than earlyTime, - // and the hair will automatically be released before lateTime, - // so standard state checking isn't applied here - // (though StateCheck is still used for autoplay). - if (stateBeat >= Minigame.perfectTime) - { - Ace(); - } - else - { - var normalized = Conductor.instance.GetPositionFromBeat(createBeat + game.tweezerBeatOffset + game.beatInterval, 0.5f); - // Hair gets released early and returns whoops. - anim.Play("LoopPullReverse", 0, normalized); - tweezers.anim.Play("Idle", 0, 0); - - if (pullSound != null) - pullSound.Stop(); - - pluckState = -1; - } - } - break; - - // Released or missed. Can't be held or released. - default: - break; - } - if (pluckState == 1) { + bool input = PlayerInput.PressedUp(); + if (endInput == InputType.DIRECTION_UP) input = PlayerInput.GetAnyDirectionUp(); + if (input && !game.IsExpectingInputNow(endInput)) + { + endEvent.MakeInEligible(); + EndEarly(); + return; + } + Vector3 tst = tweezers.tweezerSpriteTrans.position; var hairDirection = new Vector3(tst.x + 0.173f, tst.y) - holder.transform.position; holder.transform.rotation = Quaternion.FromToRotation(Vector3.down, hairDirection); @@ -102,13 +58,13 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers // Auto-release if holding at release time. if (normalizedBeat >= 1f) - Ace(); + endEvent.Hit(0f); } loop.transform.localScale = Vector2.one / holder.transform.localScale; } - public void Ace() + public void EndAce() { tweezers.LongPluck(true, this); tweezers.hitOnFrame++; @@ -119,18 +75,52 @@ namespace HeavenStudio.Games.Scripts_RhythmTweezers pluckState = -1; } - public override void OnAce() + public void EndEarly() { - if (pluckState == 0) - { - pullSound = Jukebox.PlayOneShotGame($"rhythmTweezers/longPull{UnityEngine.Random.Range(1, 5)}"); - pluckState = 1; - ResetState(); + var normalized = Conductor.instance.GetPositionFromBeat(createBeat + game.tweezerBeatOffset + game.beatInterval, 0.5f); + anim.Play("LoopPullReverse", 0, normalized); + tweezers.anim.Play("Idle", 0, 0); + + if (pullSound != null) + pullSound.Stop(); + + pluckState = -1; + } + + private void StartJust(PlayerActionEvent caller, float state) + { + // don't count near misses + if (state >= 1f || state <= -1f) { + pluckState = -1; + return; } - else if (pluckState == 1) + if (PlayerInput.GetAnyDirectionDown()) { - Ace(); + endInput = InputType.DIRECTION_UP; } + else + { + endInput = InputType.STANDARD_UP; + } + pullSound = Jukebox.PlayOneShotGame($"rhythmTweezers/longPull{UnityEngine.Random.Range(1, 5)}"); + pluckState = 1; + endEvent = game.ScheduleInput(createBeat, game.tweezerBeatOffset + game.beatInterval + 0.5f, endInput, EndJust, Out, Out); + } + + private void StartMiss(PlayerActionEvent caller) + { + // this is where perfect challenge breaks + } + + private void Out(PlayerActionEvent caller) {} + + private void EndJust(PlayerActionEvent caller, float state) + { + if (state <= -1f) { + EndEarly(); + return; + } + EndAce(); } } } \ No newline at end of file diff --git a/Assets/Scripts/Games/SpaceSoccer/Ball.cs b/Assets/Scripts/Games/SpaceSoccer/Ball.cs index 257e67e0..b40eba99 100644 --- a/Assets/Scripts/Games/SpaceSoccer/Ball.cs +++ b/Assets/Scripts/Games/SpaceSoccer/Ball.cs @@ -27,7 +27,8 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer public float nextAnimBeat; public float highKickSwing = 0f; private float lastSpriteRot; - public bool canKick; //unused + public bool canKick; + public bool waitKickRelease; private bool lastKickLeft; public void Init(Kicker kicker, float dispensedBeat) @@ -182,14 +183,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer holder.transform.localPosition = dispenseCurve.GetPoint(normalizedBeatAnim); spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(0f, -1440f, normalizedBeatAnim)); - - /*if (PlayerInput.Pressed()) - { - if (state.perfect) - { - Kick(); - } - }*/ break; } case State.Kicked: @@ -208,22 +201,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer } holder.transform.localPosition = kickCurve.GetPoint(normalizedBeatAnim); - - /*if (PlayerInput.Pressed()) - { - if (state.perfect) - { - if (kicker.canHighKick) - { - HighKick(); - } - else if (kicker.canKick) - { - Kick(); - } - // print(normalizedBeat); - } - }*/ break; } case State.HighKicked: @@ -234,24 +211,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer holder.transform.localPosition = highKickCurve.GetPoint(normalizedBeatAnim); spriteHolder.transform.eulerAngles = new Vector3(0, 0, Mathf.Lerp(lastSpriteRot, lastSpriteRot + 360f, normalizedBeatAnim)); - - // if (state.perfect) Debug.Break(); - - /*if (PlayerInput.Pressed()) - { - kickPrepare = true; - kicker.Kick(this); - } - if (kickPrepare) - { - if (PlayerInput.PressedUp()) - { - if (state.perfect) - { - Toe(); - } - } - }*/ break; } case State.Toe: diff --git a/Assets/Scripts/Games/SpaceSoccer/Kicker.cs b/Assets/Scripts/Games/SpaceSoccer/Kicker.cs index e5e55af6..9465cc53 100644 --- a/Assets/Scripts/Games/SpaceSoccer/Kicker.cs +++ b/Assets/Scripts/Games/SpaceSoccer/Kicker.cs @@ -8,6 +8,8 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer { public class Kicker : PlayerActionObject { + SpaceSoccer game; + [Header("Properties")] public bool canKick = true; //why was this false by default??? public bool canHighKick; @@ -21,40 +23,25 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer private Animator anim; public Ball ball; + PlayerActionEvent nextHit; + PlayerActionEvent nextAutoKick; + private void Awake() { + game = SpaceSoccer.instance; anim = GetComponent(); } - public override void OnAce() + public void DispenseBall(float beat) { - if (ball.state == Ball.State.HighKicked) + if (player) { - if (!kickPrepare) - { - Kick(false, true); - } - else - { - Toe(true); - } - } - else - { - if (canHighKick) - { - HighKick(true); - } - else - { - Kick(true); - } + nextHit = game.ScheduleInput(beat, ball.GetAnimLength(Ball.State.Dispensing), InputType.STANDARD_DOWN, KickJust, Miss, Out); } } public void Kick(bool hit, bool highKick = false) { - kickTimes++; aceTimes = 0; if (player) @@ -87,6 +74,7 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer if (highKick == false) { + kickTimes++; if (ball != null && hit) ball.Kick(player); } @@ -94,8 +82,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer { kickPrepare = true; } - - ResetState(); } public void HighKick(bool hit) @@ -123,8 +109,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer if (player) Jukebox.PlayOneShotGame("spaceSoccer/highkicktoe1"); } - - ResetState(); } public void Toe(bool hit) @@ -153,8 +137,8 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer if (hit && ball) ball.Toe(); + kickTimes++; kickPrepare = false; - ResetState(); } private void Update() @@ -168,21 +152,6 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer kickLeft = true; } - // List keepUps = GameManager.instance.Beatmap.entities.FindAll(c => c.datamodel == "spaceSoccer/keep-up"); - // for (int i = 0; i < keepUps.Count; i++) - // { - // if ((keepUps[i].beat - 0.15f) <= Conductor.instance.songPositionInBeats && (keepUps[i].beat + keepUps[i].length) - 0.15f > Conductor.instance.songPositionInBeats) - // { - // canKick = true; - // canHighKick = false; - // break; - // } - // else - // { - // canKick = false; - // } - // } - var highKicks = GameManager.instance.Beatmap.entities.FindAll(c => c.datamodel == "spaceSoccer/high kick-toe!"); for (int i = 0; i < highKicks.Count; i++) { @@ -206,128 +175,29 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer } } - if (ball) + if (player) { - switch (ball.state) + if (PlayerInput.Pressed() && !game.IsExpectingInputNow(InputType.STANDARD_DOWN)) { - case Ball.State.Dispensing: - { - float normalizedBeat = Conductor.instance.GetPositionFromBeat(ball.startBeat, ball.GetAnimLength(Ball.State.Dispensing)); - StateCheck(normalizedBeat, !player); - CheckIfFall(normalizedBeat); - - if (player) - { - if (PlayerInput.Pressed()) - { - if (state.perfect) - { - KickCheck(true); - } - else - { - KickCheck(false, true); - } - } - } - break; - } - case Ball.State.Kicked: - { - float normalizedBeat = Conductor.instance.GetPositionFromBeat(ball.startBeat, ball.GetAnimLength(Ball.State.Kicked)); - StateCheck(normalizedBeat, !player); - CheckIfFall(normalizedBeat); - - if (player) - { - if (PlayerInput.Pressed()) - { - if (state.perfect) - { - KickCheck(true); - } - else - { - KickCheck(false, true); - } - } - } - break; - } - case Ball.State.HighKicked: - { - float normalizedBeat = Conductor.instance.GetPositionFromMargin(ball.startBeat + ball.GetAnimLength(Ball.State.HighKicked), 1f); - if (!kickPrepare) - { - float normalizedBeatPrepare = Conductor.instance.GetPositionFromBeat(ball.startBeat, 1f); - StateCheck(normalizedBeatPrepare, !player); - CheckIfFall(normalizedBeat); - - if (player) - { - if (PlayerInput.Pressed() || PlayerInput.AltPressed()) - { - Kick(false, true); - } - } - } - else - { - StateCheck(normalizedBeat, !player); - CheckIfFall(normalizedBeat); - - if (player) - { - if (PlayerInput.PressedUp() || PlayerInput.AltPressedUp()) - { - if (state.perfect) - { - Toe(true); - } - else - { - Toe(false); - } - } - } - } - break; - } - case Ball.State.Toe: - { - float normalizedBeat = Conductor.instance.GetPositionFromMargin(ball.startBeat + ball.GetAnimLength(Ball.State.Toe), 1f); - StateCheck(normalizedBeat, !player); - CheckIfFall(normalizedBeat); - - if (player) - { - if (PlayerInput.Pressed()) - { - if (state.perfect) - { - KickCheck(true); - } - else - { - KickCheck(false, true); - } - } - } - break; - } - } - } - else - { - if (player) - { - if (PlayerInput.Pressed()) - { + if (ball == null) KickCheck(false, true); + else + Kick(false, ball.canKick); + + } + if (PlayerInput.PressedUp() && ball != null) + { + if (ball.waitKickRelease) + { + ball.waitKickRelease = false; + } + else if (ball.canKick && !game.IsExpectingInputNow(InputType.STANDARD_UP)) + { + ball.canKick = false; + Kick(false); } } } - } private void KickCheck(bool hit, bool overrideState = false) @@ -346,14 +216,71 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer } } - private void CheckIfFall(float normalizedBeat) + void MissBall(float targetBeat) { - if (normalizedBeat > Minigame.LateTime() && (!GameManager.instance.autoplay || !GameManager.instance.canInput)) - { - Jukebox.PlayOneShotGame("spaceSoccer/missNeutral"); - ball = null; - ResetState(); + var cond = Conductor.instance; + ball = null; + // queue the miss sound + MultiSound.Play(new MultiSound.Sound[] { new MultiSound.Sound("spaceSoccer/missNeutral", targetBeat + (float)cond.SecsToBeats(Minigame.EndTime()-1, cond.GetBpmAtBeat(targetBeat))) }); + } + + private void KickJust(PlayerActionEvent caller, float state) + { + if (ball == null || state >= 1f || state <= -1f) { //todo: proper near miss feedback + KickCheck(false, true); + MissBall(caller.startBeat + caller.timer); + return; } + KickCheck(true); + if (canHighKick) + { + // queue high kick inputs + nextHit = game.ScheduleInput(caller.startBeat + caller.timer, ball.GetAnimLength(Ball.State.Toe), InputType.STANDARD_UP, ToeJust, Miss, Out); + nextAutoKick = game.ScheduleAutoplayInput(caller.startBeat + caller.timer, ball.GetAnimLength(Ball.State.Kicked), InputType.STANDARD_DOWN, ToePrepareJust, Out, Out); + ball.canKick = true; + ball.waitKickRelease = true; + } + else + { + // queue normal kick input + nextHit = game.ScheduleInput(caller.startBeat + caller.timer, ball.GetAnimLength(Ball.State.Kicked), InputType.STANDARD_DOWN, KickJust, Miss, Out); + } + } + + private void Miss(PlayerActionEvent caller) + { + if (ball != null) + MissBall(caller.startBeat + caller.timer); + + // if this were any other keep the beat game you'd cue the next input here + } + + private void ToeJust(PlayerActionEvent caller, float state) + { + if (ball == null || (!ball.canKick) || state >= 1f || state <= -1f) { //todo: proper near miss feedback + Toe(false); + MissBall(caller.startBeat + caller.timer); + return; + } + Toe(true); + nextHit = game.ScheduleInput(caller.startBeat, 3f, InputType.STANDARD_DOWN, KickJust, Miss, Out); + ball.canKick = false; + } + + private void ToePrepareJust(PlayerActionEvent caller, float state) + { + //autoplay only + Kick(true, true); + } + + private void Out(PlayerActionEvent caller) {} + + void OnDestroy() + { + if (nextHit != null) + nextHit.Disable(); + if (nextAutoKick != null) + nextAutoKick.Disable(); } } } \ No newline at end of file diff --git a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs index 1ce348b3..6574dd8e 100644 --- a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs +++ b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs @@ -116,6 +116,7 @@ namespace HeavenStudio.Games { DispenseSound(beat); } + kicker.DispenseBall(beat); kicker.canKick = true; } diff --git a/Assets/Scripts/Games/Spaceball/SpaceballBall.cs b/Assets/Scripts/Games/Spaceball/SpaceballBall.cs index e2719864..0078034f 100644 --- a/Assets/Scripts/Games/Spaceball/SpaceballBall.cs +++ b/Assets/Scripts/Games/Spaceball/SpaceballBall.cs @@ -35,15 +35,12 @@ namespace HeavenStudio.Games.Scripts_Spaceball float rot = Random.Range(0, 360); Sprite.gameObject.transform.eulerAngles = new Vector3(0, 0, rot); - - // PlayerActionInit(this.gameObject, startBeat, Spaceball.instance.EligibleHits); - isEligible = true; } - public override void OnAce() + private void Start() { - this.Hit(); + Spaceball.instance.ScheduleInput(startBeat, high ? 2f : 1f, InputType.STANDARD_DOWN, Just, Miss, Out); } private void Hit() @@ -67,7 +64,7 @@ namespace HeavenStudio.Games.Scripts_Spaceball SpaceballPlayer.instance.Swing(this); } - private void Miss() + private void NearMiss() { Holder.transform.GetChild(0).gameObject.AddComponent().rotateSpeed = -55; @@ -85,9 +82,10 @@ namespace HeavenStudio.Games.Scripts_Spaceball private void Update() { + var cond = Conductor.instance; if (hit) { - float nba = Conductor.instance.GetPositionFromBeat(hitBeat, 14); + float nba = cond.GetPositionFromBeat(hitBeat, 14); Holder.transform.localPosition = Vector3.Lerp(hitPos, new Vector3(randomEndPosX, 0f, -600f), nba); Holder.transform.eulerAngles = Vector3.Lerp(new Vector3(0, 0, hitRot), new Vector3(0, 0, -2260), nba); } @@ -96,8 +94,7 @@ namespace HeavenStudio.Games.Scripts_Spaceball float beatLength = 1f; if (high) beatLength = 2f; - float normalizedBeatAnim = Conductor.instance.GetPositionFromBeat(startBeat, beatLength + 0.15f); - // print(normalizedBeatAnim + " " + Time.frameCount); + float normalizedBeatAnim = cond.GetPositionFromBeat(startBeat, beatLength + (float)cond.SecsToBeats(Minigame.EndTime()-1, cond.GetBpmAtBeat(startBeat + beatLength))); if (high) { @@ -109,35 +106,25 @@ namespace HeavenStudio.Games.Scripts_Spaceball } anim.speed = 0; - - float normalizedBeat = Conductor.instance.GetPositionFromBeat(startBeat, beatLength); - - StateCheck(normalizedBeat); - - if (PlayerInput.Pressed()) - { - if (state.perfect) - { - Hit(); - } - else if (state.notPerfect()) - { - Miss(); - } - } - - // too lazy to make a proper fix for this - float endTime = 1.2f; - if (high) endTime = 1.1f; - - if (normalizedBeat > endTime) - { - Jukebox.PlayOneShotGame("spaceball/fall"); - Instantiate(Spaceball.instance.Dust, Spaceball.instance.Dust.transform.parent).SetActive(true); - Destroy(this.gameObject); - } } } - } + private void Just(PlayerActionEvent caller, float state) + { + if (state >= 1f || state <= -1f) { + NearMiss(); + return; + } + Hit(); + } + + private void Miss(PlayerActionEvent caller) + { + Jukebox.PlayOneShotGame("spaceball/fall"); + Instantiate(Spaceball.instance.Dust, Spaceball.instance.Dust.transform.parent).SetActive(true); + Destroy(this.gameObject); + } + + private void Out(PlayerActionEvent caller) {} + } } diff --git a/Assets/Scripts/Games/WizardsWaltz/Plant.cs b/Assets/Scripts/Games/WizardsWaltz/Plant.cs index 5832a531..c888c429 100644 --- a/Assets/Scripts/Games/WizardsWaltz/Plant.cs +++ b/Assets/Scripts/Games/WizardsWaltz/Plant.cs @@ -24,6 +24,10 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz animator.Play("Appear", 0, 0); } + private void Start() { + game.ScheduleInput(createBeat, game.beatInterval, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, Just, Miss, Out); + } + private void Update() { if (!passed && Conductor.instance.songPositionInBeats > createBeat + game.beatInterval) @@ -31,23 +35,6 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz StartCoroutine(FadeOut()); passed = true; } - - if (hit) return; - - float stateBeat = Conductor.instance.GetPositionFromMargin(createBeat + game.beatInterval, 1f); - StateCheck(stateBeat); - - if (PlayerInput.Pressed(true)) - { - if (state.perfect) - { - Ace(); - } else if (state.notPerfect()) - { - Miss(); - } - } - } public void Bloom() @@ -81,17 +68,28 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz hit = true; } - public void Miss() + public void NearMiss() { game.wizard.Magic(this, false); hit = true; } - public override void OnAce() + private void Just(PlayerActionEvent caller, float state) { + if (state >= 1f || state <= -1f) { + NearMiss(); + return; + } Ace(); } + private void Miss(PlayerActionEvent caller) + { + // this is where perfect challenge breaks + } + + private void Out(PlayerActionEvent caller) {} + public IEnumerator FadeOut() { yield return new WaitForSeconds(Conductor.instance.secPerBeat * game.beatInterval / 2f); diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 66955a6f..4a9cc8c0 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -51,7 +51,7 @@ PlayerSettings: m_MTRendering: 1 mipStripping: 0 numberOfMipsStripped: 0 - m_StackTraceTypes: 020000000200000002000000020000000200000001000000 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 iosUseCustomAppBackgroundBehavior: 0