Merge branch 'RHeavenStudio:master' into master

This commit is contained in:
Tailx501 2024-03-07 14:17:24 -05:00 committed by GitHub
commit a921d37df5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -18,7 +18,7 @@ namespace HeavenStudio.Games.Loaders
{
public static Minigame AddGame(EventCaller eventCaller)
{
{
return new Minigame("bonOdori", "The☆Bon Odori \n<color=#adadad>(Za☆Bon Odori)</color>", "312B9F", false, false, new List<GameAction>()
{ 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<Param>()
@ -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<Param>()
@ -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> 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<TextMeshProUGUI>();
@ -298,14 +314,14 @@ namespace HeavenStudio.Games
Text9_GUI = Text9.GetComponent<TextMeshProUGUI>();
Text10_GUI = Text10.GetComponent<TextMeshProUGUI>();
}
public void OnStop()
{
DarkPlane.GetComponent<SpriteRenderer>().color = new Color(1f, 1f, 1f, 0f);
DarkPlane.GetComponent<SpriteRenderer>().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<BeatAction.Action>()
{
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<BeatAction.Action>()
Player.Play(clapTypeString);
CPU1.Play(clapTypeString);
CPU2.Play(clapTypeString);
CPU3.Play(clapTypeString);
if (!goBopDonpans)
{
BeatAction.New(instance, new List<BeatAction.Action>()
{
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<BeatAction.Action>()
CPU1.Play(clapTypeString);
CPU2.Play(clapTypeString);
CPU3.Play(clapTypeString);
SoundByte.PlayOneShot("miss");
BeatAction.New(instance, new List<BeatAction.Action>()
{
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<BeatAction.Action>()
{
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|", "<color=#ff0000>")
.Replace("g|", "<color=#00ff00>")
.Replace("y|", "<color=#ffff00>")
+ "</color>";
{
clapTypeString = "ClapSide";
}
else
{
return text.Replace("r|", "<color=#ff00ff>")
.Replace("g|", "<color=#00ffff>")
.Replace("y|", "<color=#ffffff>")
+ "</color>";
clapTypeString = "ClapFront";
}
}}
Player.Play(clapTypeString);
CPU1.Play(clapTypeString);
CPU2.Play(clapTypeString);
CPU3.Play(clapTypeString);
if (!goBopDonpans)
{
BeatAction.New(instance, new List<BeatAction.Action>()
{
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|", "<color=#ff0000>")
.Replace("g|", "<color=#00ff00>")
.Replace("y|", "<color=#ffff00>")
+ "</color>";
}
else
{
return text.Replace("r|", "<color=#ff00ff>")
.Replace("g|", "<color=#00ffff>")
.Replace("y|", "<color=#ffffff>")
+ "</color>";
}
}
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<TextMeshPro>().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<TextMeshPro>().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<TextMeshPro>().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<BeatAction.Action>()
}
goBopDonpans = false;
Player.Play("Bow");
CPU1.Play("Bow");
CPU2.Play("Bow");
CPU3.Play("Bow");
BeatAction.New(instance, new List<BeatAction.Action>()
{
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;
}
}
}
}}}
}