auto dispense and inactive dispense iteration 1

This commit is contained in:
Rapandrasmus 2023-12-17 14:54:47 +01:00
parent ee9735c24c
commit ff21a51a31

View file

@ -16,13 +16,23 @@ namespace HeavenStudio.Games.Loaders
{ {
new GameAction("dispense", "Dispense") new GameAction("dispense", "Dispense")
{ {
function = delegate { var e = eventCaller.currentEntity; TossBoys.instance.Dispense(e.beat, e.length, e["who"], e["call"]); }, function = delegate { var e = eventCaller.currentEntity; TossBoys.instance.Dispense(e.beat, e.length, e["who"], e["auto"], e["interval"], e["ignore"], e["callAuto"], true, e["call"]); },
inactiveFunction = delegate { var e = eventCaller.currentEntity; TossBoys.DispenseSound(e.beat, e["who"], e["call"]); },
defaultLength = 2f, defaultLength = 2f,
resizable = true, resizable = true,
parameters = new List<Param>() parameters = new List<Param>()
{ {
new Param("who", TossBoys.KidChoice.Akachan, "Receiver", "Who will receive the ball?"), new Param("who", TossBoys.KidChoice.Akachan, "Receiver", "Who will receive the ball?"),
new Param("call", false, "Name Call", "Should the other kids than the receiver call their name?") new Param("call", false, "Name Call", "Should the other kids than the receiver call their name?"),
//auto dispense stuff
new Param("auto", true, "Auto Redispense", "", new()
{
new((x, _) => (bool)x, new string[] { "interval", "ignore", "callAuto" })
}),
new Param("interval", new EntityTypes.Integer(1, 20, 2), "Redispense Interval", "Based on passes and not beats"),
new Param("ignore", true, "Ignore Special Passes"),
new Param("callAuto", false, "Name Call On Redispense")
} }
}, },
new GameAction("pass", "Normal Toss") new GameAction("pass", "Normal Toss")
@ -235,6 +245,7 @@ namespace HeavenStudio.Games
colorStart = defaultBGColor; colorStart = defaultBGColor;
colorEnd = defaultBGColor; colorEnd = defaultBGColor;
SetupBopRegion("tossBoys", "bop", "auto"); SetupBopRegion("tossBoys", "bop", "auto");
SetPassBallEvents();
} }
new void OnDrawGizmos() new void OnDrawGizmos()
@ -339,6 +350,17 @@ namespace HeavenStudio.Games
public override void OnGameSwitch(double beat) public override void OnGameSwitch(double beat)
{ {
PersistColor(beat); PersistColor(beat);
HandleDispenses(beat);
}
private void HandleDispenses(double beat)
{
var allRelevantDispenses = EventCaller.GetAllInGameManagerList("tossBoys", new string[] { "dispense" }).FindAll(x => x.beat < beat && x.beat + x.length >= beat);
if (allRelevantDispenses.Count == 0) return;
var e = allRelevantDispenses[^1];
Dispense(e.beat, e.length, e["who"], e["auto"], e["interval"], e["ignore"], e["callAuto"], false, e["call"]);
} }
#region Bop #region Bop
@ -363,13 +385,108 @@ namespace HeavenStudio.Games
} }
#endregion #endregion
public void Dispense(double beat, float length, int who, bool call) public static void DispenseSound(double beat, int who, bool call)
{
SoundByte.PlayOneShotGame("tossBoys/ballStart" + GetColorBasedOnTossKid((WhichTossKid)who, true), beat, forcePlay: true);
if (!call) return;
double callBeat = beat;
switch (who)
{
case (int)WhichTossKid.Akachan:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/blueRedHigh1", callBeat),
new MultiSound.Sound("tossBoys/yellowRedHigh1", callBeat),
new MultiSound.Sound("tossBoys/blueRedHigh2", callBeat + 0.25f),
new MultiSound.Sound("tossBoys/yellowRedHigh2", callBeat + 0.25f),
new MultiSound.Sound("tossBoys/blueRedHigh3", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/yellowRedHigh3", callBeat + 0.5f),
}, forcePlay: true);
break;
case (int)WhichTossKid.Aokun:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/redBlueHigh1", callBeat),
new MultiSound.Sound("tossBoys/yellowBlueHigh1", callBeat),
new MultiSound.Sound("tossBoys/redBlueHigh2", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/yellowBlueHigh2", callBeat + 0.5f),
}, forcePlay: true);
break;
case (int)WhichTossKid.Kiiyan:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/redYellowHigh1", callBeat),
new MultiSound.Sound("tossBoys/blueYellowHigh1", callBeat),
new MultiSound.Sound("tossBoys/redYellowHigh2", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/blueYellowHigh2", callBeat + 0.5f),
}, forcePlay: true);
break;
default:
break;
}
}
public void Dispense(double beat, float length, int who, bool auto, int autoInterval, bool ignoreSpecial, bool callAuto, bool playSound, bool call)
{
if (playSound) DispenseSound(beat, who, call);
DispenseExec(beat, length, who, false, "");
if (auto && passBallDict.TryGetValue(beat + length, out var e))
{
DispenseRecursion(beat + length, -1, autoInterval, ignoreSpecial, callAuto, e["who"], (int)WhichTossKid.None, false, e.length, IsSpecialEvent(e.datamodel), false, e.datamodel);
}
}
public void DispenseRecursion(double beat, int index, int interval, bool ignore, bool call, int curReceiver, int previousReceiver, bool isBlur, float currentLength, bool isSpecial, bool shouldForce, string eventDatamodel)
{
if (index % interval == 0 && !isBlur && !(ignore && isSpecial))
{
double dispenseBeat = beat - 2;
BeatAction.New(this, new()
{
new(dispenseBeat, delegate
{
if (currentBall != null) return;
DispenseSound(dispenseBeat, curReceiver, call);
DispenseExec(dispenseBeat, 2, curReceiver, shouldForce, eventDatamodel);
})
});
}
if (!isBlur && !(ignore && isSpecial)) index++;
var tempLastReceiver = previousReceiver;
var lastLength = isBlur ? 1 : currentLength;
previousReceiver = curReceiver;
var nextIsSpecial = isSpecial;
var blurSet = isBlur;
var nextForce = false;
if (passBallDict.TryGetValue(beat + lastLength, out var e))
{
curReceiver = e["who"];
blurSet = e.datamodel == "tossBoys/blur";
currentLength = e.length;
nextIsSpecial = IsSpecialEvent(e.datamodel);
eventDatamodel = e.datamodel;
if (e.datamodel == "tossBoys/pop") return;
}
else
{
curReceiver = tempLastReceiver;
nextForce = true;
}
// let's not do a stack overflow, alright?
BeatAction.New(this, new()
{
new(beat + lastLength - 2, delegate { DispenseRecursion(beat + lastLength, index, interval, ignore, call, curReceiver, previousReceiver, blurSet, currentLength, nextIsSpecial, nextForce, eventDatamodel); })
});
}
public void DispenseExec(double beat, float length, int who, bool forcePass, string eventDatamodel)
{ {
if (currentBall != null) return; if (currentBall != null) return;
SetPassBallEvents();
SetReceiver(who); SetReceiver(who);
GetCurrentReceiver().ShowArrow(beat, length - 1); GetCurrentReceiver().ShowArrow(beat, length - 1);
SoundByte.PlayOneShotGame("tossBoys/ballStart" + GetColorBasedOnTossKid(currentReceiver, true));
hatchAnim.Play("HatchOpen", 0, 0); hatchAnim.Play("HatchOpen", 0, 0);
currentBall = Instantiate(ballPrefab, transform); currentBall = Instantiate(ballPrefab, transform);
currentBall.gameObject.SetActive(true); currentBall.gameObject.SetActive(true);
@ -388,50 +505,10 @@ namespace HeavenStudio.Games
break; break;
} }
if (call)
{
double callBeat = beat;
switch (who)
{
case (int)WhichTossKid.Akachan:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/blueRedHigh1", callBeat),
new MultiSound.Sound("tossBoys/yellowRedHigh1", callBeat),
new MultiSound.Sound("tossBoys/blueRedHigh2", callBeat + 0.25f),
new MultiSound.Sound("tossBoys/yellowRedHigh2", callBeat + 0.25f),
new MultiSound.Sound("tossBoys/blueRedHigh3", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/yellowRedHigh3", callBeat + 0.5f),
});
break;
case (int)WhichTossKid.Aokun:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/redBlueHigh1", callBeat),
new MultiSound.Sound("tossBoys/yellowBlueHigh1", callBeat),
new MultiSound.Sound("tossBoys/redBlueHigh2", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/yellowBlueHigh2", callBeat + 0.5f),
});
break;
case (int)WhichTossKid.Kiiyan:
MultiSound.Play(new MultiSound.Sound[]
{
new MultiSound.Sound("tossBoys/redYellowHigh1", callBeat),
new MultiSound.Sound("tossBoys/blueYellowHigh1", callBeat),
new MultiSound.Sound("tossBoys/redYellowHigh2", callBeat + 0.5f),
new MultiSound.Sound("tossBoys/blueYellowHigh2", callBeat + 0.5f),
});
break;
default:
break;
}
}
if (passBallDict.ContainsKey(beat + length)) if (passBallDict.ContainsKey(beat + length))
{ {
ScheduleInput(beat, length, GetInputTypeBasedOnCurrentReceiver(), JustHitBall, Miss, Empty); ScheduleInput(beat, length, GetInputTypeBasedOnCurrentReceiver(), JustHitBall, Miss, Empty);
if (passBallDict[beat + length].datamodel == "tossBoys/dual" || passBallDict[beat + length].datamodel == "tossBoys/lightning" || passBallDict[beat + length].datamodel == "tossBoys/blur") if (IsSpecialEvent(passBallDict[beat + length].datamodel))
{ {
BeatAction.New(instance, new List<BeatAction.Action>() BeatAction.New(instance, new List<BeatAction.Action>()
{ {
@ -448,6 +525,26 @@ namespace HeavenStudio.Games
}); });
} }
} }
else if (forcePass)
{
ScheduleInput(beat, length, GetInputTypeBasedOnCurrentReceiver(), JustHitBall, Miss, Empty);
if (IsSpecialEvent(eventDatamodel))
{
BeatAction.New(instance, new List<BeatAction.Action>()
{
new BeatAction.Action(beat + length - 1, delegate { DoSpecialBasedOnReceiver(beat + length - 1); })
});
}
else if (eventDatamodel == "tossBoys/pop")
{
currentBall.willBePopped = true;
if (PlayerInput.CurrentControlStyle != InputController.ControlStyles.Touch)
BeatAction.New(instance, new List<BeatAction.Action>()
{
new BeatAction.Action(beat + length - 1, delegate { GetCurrentReceiver().PopBallPrepare(); })
});
}
}
else else
{ {
BeatAction.New(instance, new List<BeatAction.Action>() BeatAction.New(instance, new List<BeatAction.Action>()
@ -461,17 +558,14 @@ namespace HeavenStudio.Games
{ {
passBallDict.Clear(); passBallDict.Clear();
var passBallEvents = EventCaller.GetAllInGameManagerList("tossBoys", new string[] { "pass", "dual", "pop", "high", "lightning", "blur" }); var passBallEvents = EventCaller.GetAllInGameManagerList("tossBoys", new string[] { "pass", "dual", "pop", "high", "lightning", "blur" });
for (int i = 0; i < passBallEvents.Count; i++) for (int i = 0; i < passBallEvents.Count; i++)
{ {
if (passBallEvents[i].beat >= Conductor.instance.songPositionInBeatsAsDouble) if (passBallDict.ContainsKey(passBallEvents[i].beat)) continue;
{ passBallDict.Add(passBallEvents[i].beat, passBallEvents[i]);
if (passBallDict.ContainsKey(passBallEvents[i].beat)) continue;
passBallDict.Add(passBallEvents[i].beat, passBallEvents[i]);
}
} }
} }
void DeterminePass(double beat, bool barely) private void DeterminePassValues(double beat)
{ {
var tempLastReceiver = lastReceiver; var tempLastReceiver = lastReceiver;
lastReceiver = currentReceiver; lastReceiver = currentReceiver;
@ -483,14 +577,13 @@ namespace HeavenStudio.Games
} }
else else
{ {
/*
RiqEntity spawnedEntity = new RiqEntity();
spawnedEntity.DynamicData.Add("who", (int)tempLastReceiver);
spawnedEntity.datamodel = currentPassType;
passBallDict.Add(beat, spawnedEntity);
*/
currentReceiver = tempLastReceiver; currentReceiver = tempLastReceiver;
} }
}
void DeterminePass(double beat, bool barely)
{
DeterminePassValues(beat);
switch (currentPassType) switch (currentPassType)
{ {
case "tossBoys/pass": case "tossBoys/pass":
@ -508,14 +601,7 @@ namespace HeavenStudio.Games
default: default:
break; break;
} }
if (barely) currentBall.anim.DoScaledAnimationAsync(barely ? "WiggleBall" : "Hit", 0.5f);
{
currentBall.anim.DoScaledAnimationAsync("WiggleBall", 0.5f);
}
else
{
currentBall.anim.DoScaledAnimationAsync("Hit", 0.5f);
}
if (passBallDict.ContainsKey(beat + currentEventLength) && passBallDict[beat + currentEventLength].datamodel == "tossBoys/pop") if (passBallDict.ContainsKey(beat + currentEventLength) && passBallDict[beat + currentEventLength].datamodel == "tossBoys/pop")
{ {
currentBall.willBePopped = true; currentBall.willBePopped = true;
@ -1048,6 +1134,7 @@ namespace HeavenStudio.Games
Destroy(currentBall.gameObject); Destroy(currentBall.gameObject);
currentBall = null; currentBall = null;
SoundByte.PlayOneShotGame("tossBoys/misshit"); SoundByte.PlayOneShotGame("tossBoys/misshit");
if (caller != null) DeterminePassValues(caller.startBeat + caller.timer);
} }
void Empty(PlayerActionEvent caller) { } void Empty(PlayerActionEvent caller) { }
@ -1110,7 +1197,7 @@ namespace HeavenStudio.Games
} }
} }
string GetColorBasedOnTossKid(WhichTossKid tossKid, bool capital) public static string GetColorBasedOnTossKid(WhichTossKid tossKid, bool capital)
{ {
switch (tossKid) switch (tossKid)
{ {
@ -1162,6 +1249,24 @@ namespace HeavenStudio.Games
return null; return null;
} }
} }
private bool IsSpecialEvent(string e)
{
bool b = false;
switch (e)
{
case "tossBoys/dual":
case "tossBoys/lightning":
case "tossBoys/blur":
b = true; break;
default:
return b;
}
return b;
}
#endregion #endregion
} }
} }