diff --git a/Assets/Scripts/Games/ShootEmUp/ShootEmUp.cs b/Assets/Scripts/Games/ShootEmUp/ShootEmUp.cs index 669b9567b..b09fdc5a8 100644 --- a/Assets/Scripts/Games/ShootEmUp/ShootEmUp.cs +++ b/Assets/Scripts/Games/ShootEmUp/ShootEmUp.cs @@ -20,12 +20,13 @@ namespace HeavenStudio.Games.Loaders { new GameAction("start interval", "Start Interval") { - preFunction = delegate { var e = eventCaller.currentEntity; ShootEmUp.PreInterval(e.beat, e.length, e["placement"]); }, + preFunction = delegate { var e = eventCaller.currentEntity; ShootEmUp.PreInterval(e.beat, e.length, e["placement"], e["auto"]); }, defaultLength = 4f, resizable = true, parameters = new List() { - new Param("placement", ShootEmUp.PlacementType.PatternA, "Placement Pattern") + new Param("placement", ShootEmUp.PlacementType.PatternA, "Placement Pattern"), + new Param("auto", true, "Auto Pass Turn", "Toggle if the turn should be passed automatically at the end of the start interval."), }, }, new GameAction("spawn enemy", "Spawn Enemy") @@ -33,10 +34,14 @@ namespace HeavenStudio.Games.Loaders defaultLength = 0.5f, parameters = new List() { - new Param("x", new EntityTypes.Float(-4, 4, 0), "X"), - new Param("y", new EntityTypes.Float(-3, 3, 0), "Y"), + new Param("x", new EntityTypes.Float(-5, 5, 0), "X"), + new Param("y", new EntityTypes.Float(-5, 5, 0), "Y"), }, }, + new GameAction("passTurn", "Pass Turn") + { + preFunction = delegate { var e = eventCaller.currentEntity; ShootEmUp.PrePassTurn(e.beat); }, + }, }, new List() { "ntr", "normal" }, "ntrShootEmUp", "en", new List() { } ); @@ -103,6 +108,13 @@ namespace HeavenStudio.Games void Awake() { instance = this; + if (crHandlerInstance != null && crHandlerInstance.queuedEvents.Count > 0) + { + foreach (var crEvent in crHandlerInstance.queuedEvents) + { + SpawnEnemy(crEvent.beat, crEvent.DynamicData["pos"], false, crHandlerInstance.intervalLength); + } + } } @@ -111,6 +123,15 @@ namespace HeavenStudio.Games var cond = Conductor.instance; if (!cond.isPlaying || cond.isPaused) return; + if (passedTurns.Count > 0) + { + foreach (var pass in passedTurns) + { + PassTurnStandalone(pass); + } + passedTurns.Clear(); + } + if (PlayerInput.GetIsAction(InputAction_Press) && !IsExpectingInputNow(InputAction_Press)) { if (!playerShip.isDamage) @@ -130,7 +151,7 @@ namespace HeavenStudio.Games { foreach (var interval in queuedIntervals) { - SetIntervalStart(interval.beat, beat, interval.interval, interval.placement); + SetIntervalStart(interval.beat, beat, interval.interval, interval.placement, interval.autoPassTurn); } queuedIntervals.Clear(); } @@ -159,13 +180,19 @@ namespace HeavenStudio.Games } } - public void SpawnEnemy(double beat, float x, float y, bool active = true, float interval = 4f) + public void SpawnEnemy(double beat, Vector2 pos, bool active = true, float interval = 4f) { + if (crHandlerInstance.queuedEvents.Count > 0 && crHandlerInstance.queuedEvents.Find(x => x.beat == beat || (beat >= x.beat && beat <= x.beat + x.length)) != null) return; + + crHandlerInstance.AddEvent(beat, crParams: new(){ + new CallAndResponseHandler.CallAndResponseEventParam("pos", pos), + }); + var newEnemy = Instantiate(baseEnemy, enemyHolder).GetComponent(); spawnedEnemies.Add(newEnemy); newEnemy.createBeat = beat; newEnemy.scaleSpeed = scaleSpeed/interval; - newEnemy.pos = new Vector2(x, y); + newEnemy.pos = pos; newEnemy.Init(); if (active) @@ -186,15 +213,17 @@ namespace HeavenStudio.Games } } + private static List passedTurns = new(); private struct QueuedInterval { public double beat; public float interval; public int placement; + public bool autoPassTurn; } private static List queuedIntervals = new List(); - private void SetIntervalStart(double beat, double gameSwitchBeat, float interval = 4f, int placement = -1) + private void SetIntervalStart(double beat, double gameSwitchBeat, float interval = 4f, int placement = -1, bool autoPassTurn = true) { CallAndResponseHandler newHandler = new(); crHandlerInstance = newHandler; @@ -211,34 +240,33 @@ namespace HeavenStudio.Games for (int i = 0; i < relevantInputsCount; i++) { var evt = relevantInputs[i]; - crHandlerInstance.AddEvent(evt.beat); int relevantIndex = Mathf.Min(relevantInputsCount - 1, posPatternLength - 1); var posData = plcPattern.posPattern[relevantIndex].posData; int posDataIndex = Mathf.Min(posData.Length - 1, i); var pos = posData[posDataIndex]; - - SpawnEnemy(evt.beat, pos.x, pos.y, evt.beat >= gameSwitchBeat, interval); + SpawnEnemy(evt.beat, pos, evt.beat >= gameSwitchBeat, interval); } } else { foreach (var evt in relevantInputs) { - crHandlerInstance.AddEvent(evt.beat); - SpawnEnemy(evt.beat, evt["x"], evt["y"], evt.beat >= gameSwitchBeat, interval); + var pos = new Vector2(evt["x"], evt["y"]); + SpawnEnemy(evt.beat, pos, evt.beat >= gameSwitchBeat, interval); } } - - - PassTurn(beat + interval, interval, newHandler); + if (autoPassTurn) + { + PassTurn(beat + interval, interval, newHandler); + } } - public static void PreInterval(double beat, float interval = 4f, int placement = -1) + public static void PreInterval(double beat, float interval = 4f, int placement = -1, bool autoPassTurn = true) { if (GameManager.instance.currentGame == "shootEmUp") { - instance.SetIntervalStart(beat, beat, interval, placement); + instance.SetIntervalStart(beat, beat, interval, placement, autoPassTurn); } else { @@ -247,6 +275,7 @@ namespace HeavenStudio.Games beat = beat, interval = interval, placement = placement, + autoPassTurn = autoPassTurn, }); } } @@ -280,5 +309,17 @@ namespace HeavenStudio.Games }), }); } + + public static void PrePassTurn(double beat) + { + if (GameManager.instance.currentGame == "tambourine") + { + instance.PassTurnStandalone(beat); + } + else + { + passedTurns.Add(beat); + } + } } } \ No newline at end of file