diff --git a/Assets/Scripts/Games/BonOdori/BonOdori.cs b/Assets/Scripts/Games/BonOdori/BonOdori.cs index 9b457bf7..ce10566a 100644 --- a/Assets/Scripts/Games/BonOdori/BonOdori.cs +++ b/Assets/Scripts/Games/BonOdori/BonOdori.cs @@ -18,7 +18,7 @@ namespace HeavenStudio.Games.Loaders { public static Minigame AddGame(EventCaller eventCaller) - { + { return new Minigame("bonOdori", "The☆Bon Odori \n(Za☆Bon Odori)", "312B9F", false, false, new List() { new GameAction("bop", "Bop") { function = delegate {BonOdori.instance.Bop(eventCaller.currentEntity.beat, eventCaller.currentEntity.length, eventCaller.currentEntity["toggle"], eventCaller.currentEntity["auto"]);}, @@ -30,14 +30,14 @@ namespace HeavenStudio.Games.Loaders }, }, - + new GameAction("pan", "Pan") { - - function = delegate { + + preFunction = delegate { var e = eventCaller.currentEntity; string variation = "variation" + (new string[] { "Pan", "Pa", "Pa_n" })[e["type"]]; - BonOdori.instance.Clap(e.beat, e[variation], e["type"], e["mute"],e["clapType"]); + BonOdori.instance.PreClap(e.beat, e[variation], e["type"], e["mute"],e["clapType"], e["semitone"]); }, defaultLength = 1f, parameters = new List() @@ -51,17 +51,18 @@ namespace HeavenStudio.Games.Loaders new Param("variationPan", BonOdori.variationPan.PanC, "Pan Type", "Set the variation of the voice line."), new Param("variationPa", BonOdori.variationPa.PaG, "Pa Type", "Set the variation of the voice line."), new Param("variationPa_n", BonOdori.variationPa_n.Pa_nA , "Pa-n Type", "Set the variation of the voice line."), - new Param("clapType", BonOdori.typeClap.SideClap, "Clap Type", "Set the type of clap.") + new Param("clapType", BonOdori.typeClap.SideClap, "Clap Type", "Set the type of clap."), + new Param("semitone", new EntityTypes.Integer(-24, 24, 0), "Semitone", "Set the number of semitones up or down this note should be pitched."), } }, - + new GameAction("don", "Don") { - + function = delegate { var e = eventCaller.currentEntity; string variation = "variation" + (new string[] { "Don", "Do", "Do_n" })[e["type"]]; - BonOdori.instance.Sound(e.beat, e[variation], e["type"]); + BonOdori.instance.Sound(e.beat, e[variation], e["type"], e["semitone"]); }, defaultLength = 1f, parameters = new List() @@ -74,9 +75,10 @@ namespace HeavenStudio.Games.Loaders new Param("variationDon", BonOdori.variationDon.DonA, "Don Type", "Set the variation of the voice line."), new Param("variationDo", BonOdori.variationDo.DoC, "Do Type", "Set the variation of the voice line."), new Param("variationDo_n", BonOdori.variationDo_n.Do_nA, "Do-n Type", "Set the variation of the voice line."), + new Param("semitone", new EntityTypes.Integer(-24, 24, 0), "Semitone", "Set the number of semitones up or down this note should be pitched."), } }, - + new GameAction("show text", "Show Text") { function = delegate {BonOdori.instance.ShowText(eventCaller.currentEntity["line 1"], eventCaller.currentEntity["line 2"], eventCaller.currentEntity["line 3"], eventCaller.currentEntity["line 4"], eventCaller.currentEntity["line 5"]);}, @@ -97,7 +99,7 @@ namespace HeavenStudio.Games.Loaders - + }, priority = 1 }, @@ -153,13 +155,13 @@ namespace HeavenStudio.Games.Loaders } }, - - - + + + }); - - } + + } }; }; namespace HeavenStudio.Games @@ -170,8 +172,9 @@ namespace HeavenStudio.Games public class BonOdori : Minigame { - string prefix; - double beatUniversal; + + string prefix; + double beatUniversal; string suffix; SpriteRenderer darkPlane; bool goBopDonpans; @@ -209,7 +212,7 @@ namespace HeavenStudio.Games [SerializeField] TMP_Text Text3; [SerializeField] TMP_Text Text4; [SerializeField] TMP_Text Text5; - + [SerializeField] TMP_Text Text6; [SerializeField] TMP_Text Text7; [SerializeField] TMP_Text Text8; @@ -227,6 +230,19 @@ namespace HeavenStudio.Games { SideClap = 0, FrontClap = 1 + } + private static List queuedClaps = new(); + + private struct QueuedClaps + { + public double beat; + public int variation; + public int typeSpeak; + public bool muted; + public int clapType; + public int semitone; + + } public enum typePan { @@ -253,7 +269,7 @@ namespace HeavenStudio.Games Pa_nC = 1 } public enum variationPa - { + { PaG = 0 } @@ -261,7 +277,7 @@ namespace HeavenStudio.Games { DonA = 0, DonD = 1, - DonC = 2, + DonC = 2, DonG = 3 } public enum variationDo_n @@ -284,7 +300,7 @@ namespace HeavenStudio.Games - + clapTypeGlobal = 0; instance = this; Text1_GUI = Text1.GetComponent(); @@ -298,14 +314,14 @@ namespace HeavenStudio.Games Text9_GUI = Text9.GetComponent(); Text10_GUI = Text10.GetComponent(); - + } public void OnStop() { - DarkPlane.GetComponent().color = new Color(1f, 1f, 1f, 0f); - + DarkPlane.GetComponent().color = new Color(1f, 1f, 1f, 0f); + } public void Update() { @@ -339,47 +355,77 @@ namespace HeavenStudio.Games } - - - if (PlayerInput.GetIsAction(BonOdori.InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress)){ + + + if (PlayerInput.GetIsAction(BonOdori.InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress)) + { ScoreMiss(); SoundByte.PlayOneShotGame("bonOdori/clap"); if (clapTypeGlobal == 0) - { + { clapTypeString = "ClapSide"; } else { clapTypeString = "ClapFront"; } - - Player.Play(clapTypeString); - if (!goBopDonpans) - { - + Player.Play(clapTypeString); + if (!goBopDonpans) + { + + BeatAction.New(instance, new List() { - new BeatAction.Action(beatUniversal + 1d, delegate { Player.Play("NeutralClapped"); CPU1.Play("NeutralClapped"); CPU2.Play("NeutralClapped"); CPU3.Play("NeutralClapped"); goBopDonpans = true;}) + new BeatAction.Action(beatUniversal + 1d, delegate { Player.Play("NeutralClapped"); CPU1.Play("NeutralClapped"); CPU2.Play("NeutralClapped"); CPU3.Play("NeutralClapped");}), }); } - - - - - + + + + + + } + } + public override void OnGameSwitch(double beat) + { + + if (queuedClaps.Count > 0) + { + foreach (var clap in queuedClaps) Clap(clap.beat, clap.variation, clap.typeSpeak, clap.muted, clap.clapType, clap.semitone); + queuedClaps.Clear(); + } + } - - - public void Clap(double beat, int variation, int typeSpeak, bool muted, int clapType) - { + public void PreClap(double beat, int variation, int typeSpeak, bool muted, int clapType, int semitone) + { + if (GameManager.instance.currentGame == "bonOdori") + { + instance.Clap(beat, variation, typeSpeak, muted, clapType, semitone); + } + else + { + queuedClaps.Add(new QueuedClaps() + { + beat = beat, + variation = variation, + typeSpeak = typeSpeak, + muted = muted, + clapType = clapType, + semitone = semitone + }); + } + } + public void Clap(double beat, int variation, int typeSpeak, bool muted, int clapType, int semitone) + + { if (clapType == 1) { clapTypeGlobal = 1; @@ -391,192 +437,145 @@ namespace HeavenStudio.Games if (muted) { ScheduleInput(beat, 0f, InputAction_BasicPress, Success, Miss, Empty); - } + } else { - - - - switch (typeSpeak){ - case 0: - - switch (variation){ - case 0: - SoundByte.PlayOneShotGame("bonOdori/pan1"); - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/pan2"); break; - case 2: - SoundByte.PlayOneShotGame("bonOdori/pan3"); - break;} - break; - case 2: - switch (variation){ - case 0: - SoundByte.PlayOneShotGame("bonOdori/pa_n1"); - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/pa_n2"); - break;} - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/pa1"); - break; + string clip = typeSpeak switch + { + 0 => "pan", + 1 => "pa_n", + 2 or _ => "pa", + }; + var pitch = SoundByte.GetPitchFromSemiTones(semitone, true); + SoundByte.PlayOneShotGame($"bonOdori/" + clip + (variation + 1), beat, pitch); + + + + + beatUniversal = beat; + ScheduleInput(beat, 0f, InputAction_BasicPress, Success, Miss, Empty); + } + } + public void Sound(double beat, int variation, int typeSpeak, int semitone) + { + string clip = typeSpeak switch + { + 0 => "don", + 1 => "do_n", + 2 or _ => "do", + + }; + var pitch = SoundByte.GetPitchFromSemiTones(semitone, true); + + SoundByte.PlayOneShotGame($"bonOdori/" + clip + (variation + 1), beat, pitch); - - - } - beatUniversal = beat; - ScheduleInput(beat, 0f, InputAction_BasicPress, Success, Miss, Empty);} - } - public void Sound(double beat, int variation, int typeSpeak ) - { switch (typeSpeak){ - case 0: - switch (variation){ - case 0: - SoundByte.PlayOneShotGame("bonOdori/don1"); - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/don2"); - break; - case 2: - SoundByte.PlayOneShotGame("bonOdori/don3"); - break; - case 3: - SoundByte.PlayOneShotGame("bonOdori/don4"); - break; - } - - - break; - case 2: - switch (variation) { - case 0: - SoundByte.PlayOneShotGame("bonOdori/do_n1"); - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/do_n2"); - break; - } - break; - - case 1: - switch (variation){ - case 0: - SoundByte.PlayOneShotGame("bonOdori/do1"); - break; - case 1: - SoundByte.PlayOneShotGame("bonOdori/do2"); - break; - } - - - break; - } - } public void Success(PlayerActionEvent caller, float state) { if (clapTypeGlobal == 0) - { - clapTypeString = "ClapSide"; - } - else - { - clapTypeString = "ClapFront"; - } - - Player.Play(clapTypeString); - CPU1.Play(clapTypeString); - CPU2.Play(clapTypeString); - CPU3.Play(clapTypeString); - if (!goBopDonpans) - { + { + clapTypeString = "ClapSide"; + } + else + { + clapTypeString = "ClapFront"; + } - - BeatAction.New(instance, new List() + Player.Play(clapTypeString); + CPU1.Play(clapTypeString); + CPU2.Play(clapTypeString); + CPU3.Play(clapTypeString); + if (!goBopDonpans) + { + + + BeatAction.New(instance, new List() { new BeatAction.Action(beatUniversal + 1d, delegate { Player.Play("NeutralClapped"); CPU1.Play("NeutralClapped"); CPU2.Play("NeutralClapped"); CPU3.Play("NeutralClapped");}), }); - } + } SoundByte.PlayOneShotGame("bonOdori/clap"); } - + public void Miss(PlayerActionEvent caller) { - CPU1.Play(clapTypeString); - CPU2.Play(clapTypeString); - CPU3.Play(clapTypeString); - SoundByte.PlayOneShot("miss"); - BeatAction.New(instance, new List() + CPU1.Play(clapTypeString); + CPU2.Play(clapTypeString); + CPU3.Play(clapTypeString); + SoundByte.PlayOneShot("miss"); + BeatAction.New(instance, new List() { new BeatAction.Action(beatUniversal + 1d, delegate { Face.Play("Sad");}), new BeatAction.Action(beatUniversal + 3d, delegate {Face.Play("Neutral");}) }); - + } - - + + public void Empty(PlayerActionEvent caller) { if (clapTypeGlobal == 0) - { - clapTypeString = "ClapSide"; - } - else - { - clapTypeString = "ClapFront"; - } - - Player.Play(clapTypeString); - CPU1.Play(clapTypeString); - CPU2.Play(clapTypeString); - CPU3.Play(clapTypeString); - if (!goBopDonpans) - { - - - BeatAction.New(instance, new List() - { - new BeatAction.Action(beatUniversal + 1d, delegate { Player.Play("NeutralClapped"); CPU1.Play("NeutralClapped"); CPU2.Play("NeutralClapped"); CPU3.Play("NeutralClapped");}), - }); - } - - SoundByte.PlayOneShot("nearMiss"); - - - } - string ChangeColor(string text, bool isScroll) - { - if (text.Contains("r|") | text.Contains("y|") | text.Contains("g|")){ - if (!isScroll){ - - - return text.Replace("r|", "") - .Replace("g|", "") - .Replace("y|", "") - + ""; + { + clapTypeString = "ClapSide"; } else { - return text.Replace("r|", "") - .Replace("g|", "") - .Replace("y|", "") - + ""; + clapTypeString = "ClapFront"; + } - }} + Player.Play(clapTypeString); + CPU1.Play(clapTypeString); + CPU2.Play(clapTypeString); + CPU3.Play(clapTypeString); + if (!goBopDonpans) + { + + + BeatAction.New(instance, new List() + { + new BeatAction.Action(beatUniversal + 1d, delegate { Player.Play("NeutralClapped"); CPU1.Play("NeutralClapped"); CPU2.Play("NeutralClapped"); CPU3.Play("NeutralClapped");}), + }); + } + + SoundByte.PlayOneShot("nearMiss"); + + + } + string ChangeColor(string text, bool isScroll) + { + if (text.Contains("r|") | text.Contains("y|") | text.Contains("g|")) + { + if (!isScroll) + { + + + return text.Replace("r|", "") + .Replace("g|", "") + .Replace("y|", "") + + ""; + } + else + { + return text.Replace("r|", "") + .Replace("g|", "") + .Replace("y|", "") + + ""; + + } + } return text; - } + } public void ShowText(string text1, string text2, string text3, string text4, string text5) { - - if (text1 is not "" && text1 is not "Type r| for red text, g| for green text and y| for yellow text. These can be used multiple times in a single line."){ + + if (text1 is not "" && text1 is not "Type r| for red text, g| for green text and y| for yellow text. These can be used multiple times in a single line.") + { if (Scroll1 is not null) { StopCoroutine(Scroll1); @@ -587,12 +586,13 @@ namespace HeavenStudio.Games text1 = ChangeColor(text1, false); Text1.text = text1; - - + + Text6.text = ChangeColor(originalText1, true); - - } - if (text2 is not ""){ + + } + if (text2 is not "") + { if (Scroll2 is not null) { StopCoroutine(Scroll2); @@ -603,9 +603,10 @@ namespace HeavenStudio.Games text2 = ChangeColor(text2, false); Text2.text = text2; Text7.text = ChangeColor(originalText2, true); - - } - if (text3 is not ""){ + + } + if (text3 is not "") + { if (Scroll3 is not null) { StopCoroutine(Scroll3); @@ -613,14 +614,15 @@ namespace HeavenStudio.Games } originalText3 = text3; Text8.GetComponent().SetMask(0, new Vector4(-10f, -10f, -10f, 10)); - + text3 = ChangeColor(text3, false); - + Text3.text = text3; Text8.text = ChangeColor(originalText3, true); - - } - if (text4 is not ""){ + + } + if (text4 is not "") + { if (Scroll4 is not null) { StopCoroutine(Scroll4); @@ -631,11 +633,12 @@ namespace HeavenStudio.Games text4 = ChangeColor(text4, false); Text4.text = text4; - Text9.text = text4; + Text9.text = text4; Text9.text = ChangeColor(originalText4, true); - } - if (text5 is not ""){ + } + if (text5 is not "") + { if (Scroll5 is not null) { StopCoroutine(Scroll5); @@ -647,12 +650,14 @@ namespace HeavenStudio.Games Text5.text = text5; Text10.text = ChangeColor(originalText5, true); - } - + } + } - public void DeleteText(bool text1, bool text2, bool text3, bool text4, bool text5){ - if (text1 == true){ + public void DeleteText(bool text1, bool text2, bool text3, bool text4, bool text5) + { + if (text1 == true) + { if (Scroll1 is not null) { StopCoroutine(Scroll1); @@ -662,7 +667,8 @@ namespace HeavenStudio.Games Text1.text = ""; Text6.text = ""; } - if (text2 == true){ + if (text2 == true) + { if (Scroll2 is not null) { StopCoroutine(Scroll2); @@ -672,7 +678,8 @@ namespace HeavenStudio.Games Text2.text = ""; Text7.text = ""; } - if (text3 == true){ + if (text3 == true) + { if (Scroll3 is not null) { StopCoroutine(Scroll3); @@ -682,7 +689,8 @@ namespace HeavenStudio.Games Text3.text = ""; Text8.text = ""; } - if (text4 == true){ + if (text4 == true) + { if (Scroll4 is not null) { StopCoroutine(Scroll4); @@ -692,7 +700,8 @@ namespace HeavenStudio.Games Text4.text = ""; Text9.text = ""; } - if (text5 == true){ + if (text5 == true) + { if (Scroll5 is not null) { StopCoroutine(Scroll5); @@ -705,49 +714,57 @@ namespace HeavenStudio.Games } - IEnumerator SmoothText(TMP_Text text, float length, double beat) - { - Conductor conductor = new Conductor(); - float startTime = Time.time; - float endTime = startTime + length; - float duration = ((length / conductor.GetBpmAtBeat(beat)) * 60); - - while (Time.time < endTime) + IEnumerator SmoothText(TMP_Text text, float length, double beat) { - float t = ((Time.time - startTime) / duration); - - float maskValue = Mathf.Lerp(-10f, -7f, t); + Conductor conductor = new Conductor(); + float startTime = Time.time; + float endTime = startTime + length; + float duration = ((length / conductor.GetBpmAtBeat(beat)) * 60); - text.GetComponent().SetMask(0, new Vector4(-10, -10, maskValue, 10)); + while (Time.time < endTime) + { + float t = ((Time.time - startTime) / duration); + + float maskValue = Mathf.Lerp(-10f, -7f, t); + + text.GetComponent().SetMask(0, new Vector4(-10, -10, maskValue, 10)); + + yield return null; + + } + + + + } + public void ScrollText(bool text1, bool text2, bool text3, bool text4, bool text5, float length, double beat) + { + if (text1) + { + Scroll1 = StartCoroutine(SmoothText(Text6, length, beat)); + } + if (text2) + { + Scroll2 = StartCoroutine(SmoothText(Text7, length, beat)); + } + if (text3) + { + Scroll3 = StartCoroutine(SmoothText(Text8, length, beat)); + } + if (text4) + { + Scroll4 = StartCoroutine(SmoothText(Text9, length, beat)); + } + if (text5) + { + Scroll5 = StartCoroutine(SmoothText(Text10, length, beat)); + } - yield return null; - } - - - } - public void ScrollText(bool text1, bool text2, bool text3, bool text4, bool text5, float length, double beat) - { - if (text1){ - Scroll1 = StartCoroutine(SmoothText(Text6, length, beat));} - if (text2){ - Scroll2 = StartCoroutine(SmoothText(Text7, length, beat));} - if (text3){ - Scroll3 = StartCoroutine(SmoothText(Text8, length, beat));} - if (text4){ - Scroll4 = StartCoroutine(SmoothText(Text9, length, beat));} - if (text5){ - Scroll5 = StartCoroutine(SmoothText(Text10, length, beat));} - - } - - public void Bop(double beat, float length, bool shouldBop, bool autoBop) + public void Bop(double beat, float length, bool shouldBop, bool autoBop) { - if (!shouldBop) { goBopDonpans = false; goBopJudge = false; return; } - goBopDonpans = autoBop; - goBopJudge = autoBop; - if (autoBop) { return;} + goBopDonpans = autoBop; goBopJudge = autoBop; + if (autoBop && shouldBop) { return; } if (shouldBop) { for (int i = 0; i < length; i++) @@ -774,37 +791,41 @@ namespace HeavenStudio.Games }) }); } - + + + } + else + { + return; + } } + public void Bow(double beat, float length) + { + if (goBopDonpans == true) + { + bopDonpans = true; + } + else + { + bopDonpans = false; - } - public void Bow(double beat, float length) - { - if (goBopDonpans == true) - { - bopDonpans = true; - } - else - { - bopDonpans = false; - - } - goBopDonpans = false; - Player.Play("Bow"); - CPU1.Play("Bow"); - CPU2.Play("Bow"); - CPU3.Play("Bow"); - BeatAction.New(instance, new List() + } + goBopDonpans = false; + Player.Play("Bow"); + CPU1.Play("Bow"); + CPU2.Play("Bow"); + CPU3.Play("Bow"); + BeatAction.New(instance, new List() { new BeatAction.Action(beat + length, delegate { Player.Play("NeutralBopped"); CPU1.Play("NeutralBopped");CPU2.Play("NeutralBopped"); CPU3.Play("NeutralBopped"); if (bopDonpans) {goBopDonpans = true;}}) }); - } - // public void Spin(double beat, float length) - // { + } + // public void Spin(double beat, float length) + // { + + // } - // } - public override void OnBeatPulse(double beat) { if (goBopDonpans) @@ -820,69 +841,73 @@ namespace HeavenStudio.Games Judge.Play("Bop"); } } -public void DarkBG(double beat, bool toggle, float length) -{ - DarkerBG = StartCoroutine(DarkBGCoroutine(beat, toggle, length)); - -} -IEnumerator DarkBGCoroutine(double beat, bool toggle, float length) -{ - if (toggle) - { - if (darkBgIsOn) + public void DarkBG(double beat, bool toggle, float length) { - yield return null; + DarkerBG = StartCoroutine(DarkBGCoroutine(beat, toggle, length)); + } - else - { - - - float startTime = Time.time; - Conductor con = new Conductor(); - float realLength = length / con.GetBpmAtBeat(beat) * 60; - while (Time.time < realLength + startTime) + IEnumerator DarkBGCoroutine(double beat, bool toggle, float length) { + if (toggle) + { + if (darkBgIsOn) + { + yield return null; + } + else + { - - - darkPlane.color = new Color(1f, 1f, 1f, Mathf.Lerp(0f, 0.4666f, (Time.time - startTime) / realLength)); - darkBgIsOn = true; - yield return null; + float startTime = Time.time; + Conductor con = new Conductor(); + float realLength = length / con.GetBpmAtBeat(beat) * 60; + while (Time.time < realLength + startTime) + { - }}} - else - { - if (!darkBgIsOn) - { - yield return null; + + darkPlane.color = new Color(1f, 1f, 1f, Mathf.Lerp(0f, 0.4666f, (Time.time - startTime) / realLength)); + darkBgIsOn = true; + yield return null; + + + + } + } + } + else + { + if (!darkBgIsOn) + { + yield return null; + } + else + { + + + float startTime = Time.time; + Conductor con = new Conductor(); + float realLength = length / con.GetBpmAtBeat(beat) * 60; + while (Time.time < realLength + startTime) + { + + + + + darkPlane.color = new Color(1f, 1f, 1f, Mathf.Lerp(0.4666f, 0f, (Time.time - startTime) / realLength)); + + darkBgIsOn = true; + yield return null; + + + } + + } + + + + } } - else - { - - - float startTime = Time.time; - Conductor con = new Conductor(); - float realLength = length / con.GetBpmAtBeat(beat) * 60; - while (Time.time < realLength + startTime) - { - - - - - darkPlane.color = new Color(1f, 1f, 1f, Mathf.Lerp(0.4666f,0f, (Time.time - startTime) / realLength)); - - darkBgIsOn = true; - yield return null; - - } - -} - - - - } -}}} \ No newline at end of file +} \ No newline at end of file