diff --git a/Assets/Scripts/Games/SpaceSoccer/Kicker.cs b/Assets/Scripts/Games/SpaceSoccer/Kicker.cs index cf18e077b..21f09071b 100644 --- a/Assets/Scripts/Games/SpaceSoccer/Kicker.cs +++ b/Assets/Scripts/Games/SpaceSoccer/Kicker.cs @@ -384,6 +384,7 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer // queue normal kick input nextHit = game.ScheduleInput(caller.startBeat + caller.timer, ball.GetAnimLength(Ball.State.Kicked), SpaceSoccer.InputAction_BasicPress, KickJust, Miss, Out); } + game.hitBeats.Add(caller.startBeat + caller.timer); } private void Miss(PlayerActionEvent caller) @@ -407,6 +408,7 @@ namespace HeavenStudio.Games.Scripts_SpaceSoccer Toe(true); nextHit = game.ScheduleInput(caller.startBeat, 3f, SpaceSoccer.InputAction_BasicPress, KickJust, Miss, Out); ball.canKick = false; + game.hitBeats.Add(caller.startBeat + caller.timer); } private void ToePrepareJust(PlayerActionEvent caller, float state) diff --git a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs index 9d2472afc..44a6e1874 100644 --- a/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs +++ b/Assets/Scripts/Games/SpaceSoccer/SpaceSoccer.cs @@ -13,12 +13,17 @@ namespace HeavenStudio.Games.Loaders { new GameAction("ball dispense", "Ball Dispense") { - function = delegate { SpaceSoccer.instance.Dispense(eventCaller.currentEntity.beat, !eventCaller.currentEntity["toggle"], false, eventCaller.currentEntity["down"]); }, + function = delegate { var e = eventCaller.currentEntity; SpaceSoccer.instance.Dispense(e.beat, !e["toggle"], false, e["down"], e["auto"], e["interval"]); }, defaultLength = 2f, parameters = new List() { new Param("toggle", false, "Disable Sound", "Disables the dispense sound"), - new Param("down", false, "Down Sound", "Will the Down sound be played?") + new Param("down", false, "Down Sound", "Will the Down sound be played?"), + new Param("auto", true, "Auto Redispense", "", new() + { + new((x, _) => (bool)x, new string[] { "interval" }) + }), + new("interval", new EntityTypes.Integer(2, 20, 2), "Redispense Interval") }, inactiveFunction = delegate { @@ -163,6 +168,7 @@ namespace HeavenStudio.Games using HeavenStudio.Common; using UnityEngine.Rendering; using UnityEngine.UI; + using System; public class SpaceSoccer : Minigame { @@ -214,6 +220,12 @@ namespace HeavenStudio.Games float yScrollMultiplier = 0.3f; [SerializeField] private float xBaseSpeed = 1; [SerializeField] private float yBaseSpeed = 1; + + private List _highKickToeBeats = new(); + private List _stopBeats = new(); + + [NonSerialized] public List hitBeats = new(); + #region Space Kicker Position Easing float easeBeat; float easeLength; @@ -234,6 +246,11 @@ namespace HeavenStudio.Games instance = this; colorStart = defaultBGColor; colorEnd = defaultBGColor; + var allHighKickToeEvents = EventCaller.GetAllInGameManagerList("spaceSoccer", new string[] { "high kick-toe!" }); + foreach (var e in allHighKickToeEvents) + { + _highKickToeBeats.Add(e.beat); + } } new void OnDrawGizmos() @@ -276,6 +293,31 @@ namespace HeavenStudio.Games } } + public override void OnBeatPulse(double beat) + { + if (!ballDispensed) return; + + double offsetBeat = beat + (lastDispensedBeat % 1); + + if (_stopBeats.Exists(x => offsetBeat >= x) || offsetBeat < lastDispensedBeat + 2) return; + + if (_highKickToeBeats.Exists(x => offsetBeat >= x + 1 && offsetBeat < x + 3)) + { + if (_highKickToeBeats.Exists(x => offsetBeat == x + 2) && !IsExpectingInputNow(InputAction_FlickRelease)) + { + if (hitBeats.Exists(x => x == offsetBeat - 0.5)) return; + ScoreMiss(); + Debug.Log("Miss toe"); + } + } + else if (!IsExpectingInputNow(InputAction_BasicPress)) + { + if (hitBeats.Exists(x => offsetBeat == x)) return; + ScoreMiss(); + Debug.Log("Miss"); + } + } + public void StopBall(bool stop) { foreach (var kicker in kickers) @@ -329,12 +371,12 @@ namespace HeavenStudio.Games continue; } bool isOnGameSwitchBeat = entity.beat == beat; - Debug.Log(isOnGameSwitchBeat); - Dispense(entity.beat, isOnGameSwitchBeat && !entity["toggle"], false, isOnGameSwitchBeat && entity["down"]); + Dispense(entity.beat, isOnGameSwitchBeat && !entity["toggle"], false, isOnGameSwitchBeat && entity["down"], entity["auto"], entity["interval"]); break; } PersistColor(beat); + AddStopEvents(beat); } public SuperCurveObject.Path GetPath(string name) @@ -349,6 +391,8 @@ namespace HeavenStudio.Games return default(SuperCurveObject.Path); } + #region VisualInterpolation + public void UpdateScrollSpeed(float scrollSpeedX, float scrollSpeedY) { xScrollMultiplier = scrollSpeedX; @@ -452,10 +496,35 @@ namespace HeavenStudio.Games kickers.Add(spawnedKicker); kickerHolder.gameObject.SetActive(true); } - if (ballDispensed) Dispense(lastDispensedBeat, false, true); + if (ballDispensed) Dispense(lastDispensedBeat, false, true, false, false); } - public void Dispense(double beat, bool playSound = true, bool ignorePlayer = false, bool playDown = false) + #endregion + + public void Dispense(double beat, bool playSound = true, bool ignorePlayer = false, bool playDown = false, bool autoDispense = true, int autoInterval = 2) + { + DispenseExec(beat, playSound, ignorePlayer, playDown); + + if (!autoDispense) return; + + DispenseRecursion(beat + 2, autoInterval); + } + + private void DispenseRecursion(double beat, int interval) + { + double dispenseBeat = beat + interval; + if (_stopBeats.Exists(x => dispenseBeat + 2 >= x)) return; + BeatAction.New(this, new() + { + new(dispenseBeat, delegate + { + if (!_highKickToeBeats.Exists(x => dispenseBeat + 2 > x && dispenseBeat + 2 < x + 3)) DispenseExec(dispenseBeat); + DispenseRecursion(dispenseBeat + 2, interval); + }) + }); + } + + private void DispenseExec(double beat, bool playSound = true, bool ignorePlayer = false, bool playDown = false) { if (!ballDispensed) lastDispensedBeat = beat; ballDispensed = true; @@ -496,6 +565,15 @@ namespace HeavenStudio.Games }, forcePlay:true); } + private void AddStopEvents(double beat) + { + var allStopEvents = EventCaller.GetAllInGameManagerList("spaceSoccer", new string[] { "stopBall" }).FindAll(x => x.beat >= beat); + foreach (var e in allStopEvents) + { + _stopBeats.Add(e.beat); + } + } + private double colorStartBeat = -1; private float colorLength = 0f; private Color colorStart; //obviously put to the default color of the game @@ -550,6 +628,7 @@ namespace HeavenStudio.Games public override void OnPlay(double beat) { PersistColor(beat); + AddStopEvents(beat); } } } \ No newline at end of file