Pass Turn (WIP)

This commit is contained in:
fu-majime 2024-03-15 23:48:17 +09:00
parent d5b7608438
commit 6d4a18af8f

View file

@ -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<Param>()
{
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<Param>()
{
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<string>() { "ntr", "normal" }, "ntrShootEmUp", "en", new List<string>() { }
);
@ -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<Enemy>();
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<double> passedTurns = new();
private struct QueuedInterval
{
public double beat;
public float interval;
public int placement;
public bool autoPassTurn;
}
private static List<QueuedInterval> queuedIntervals = new List<QueuedInterval>();
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);
}
}
}
}