From 94d62309fb522b34a88895fffe1b1c99ef5efd20 Mon Sep 17 00:00:00 2001 From: Rapandrasmus <78219215+Rapandrasmus@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:49:32 +0200 Subject: [PATCH] Second Contact Rework + Small CNR API changes (#500) * Just need to rewrite how player text works * text almost fixed * text is now fixed * ellipses added * Removed cnr api from rockers and working dough * oops --- Assets/Resources/Games/firstContact.prefab | 13 +- .../Games/FirstContact/FirstContact.cs | 274 +++++++++++------- .../Games/RhythmTweezers/RhythmTweezers.cs | 2 - Assets/Scripts/Games/Rockers/Rockers.cs | 97 +++---- .../Games/WorkingDough/WorkingDough.cs | 80 ++--- 5 files changed, 247 insertions(+), 219 deletions(-) diff --git a/Assets/Resources/Games/firstContact.prefab b/Assets/Resources/Games/firstContact.prefab index f2497c20..3fcbea08 100644 --- a/Assets/Resources/Games/firstContact.prefab +++ b/Assets/Resources/Games/firstContact.prefab @@ -317,7 +317,7 @@ SpriteRenderer: m_Size: {x: 5.12, y: 5.12} m_AdaptiveModeThreshold: 0.5 m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 + m_WasSpriteAssigned: 0 m_MaskInteraction: 0 m_SpriteSortPoint: 0 --- !u!1 &646572621760847893 @@ -1408,7 +1408,7 @@ SpriteRenderer: m_Size: {x: 5.12, y: 5.12} m_AdaptiveModeThreshold: 0.5 m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 + m_WasSpriteAssigned: 0 m_MaskInteraction: 0 m_SpriteSortPoint: 0 --- !u!1 &2618106657828263176 @@ -4191,19 +4191,16 @@ MonoBehaviour: alienSpeakCount: 0 translatorSpeakCount: 0 hasMissed: 0 - alien: {fileID: 7783123803599722790} - translator: {fileID: 179726693367595051} - dummyHolder: {fileID: 0} + alien: {fileID: 1725356918350344904} + translator: {fileID: 2669316826032871973} missionControl: {fileID: 1703073459706337243} - liveBar: {fileID: 6386057715023792916} + liveBar: {fileID: 6529724687638495651} alienTextbox: {fileID: 4232889953588772276} alienText: {fileID: 8658955634054422971} translateTextbox: {fileID: 2397353702484880984} translateText: {fileID: 115920198331035770} translateFailTextbox: {fileID: 224928759238017390} translateFailText: {fileID: 907427456758261759} - intervalStarted: 0 - beatInterval: 4 noHitOnce: 0 isSpeaking: 0 lookAtLength: 1 diff --git a/Assets/Scripts/Games/FirstContact/FirstContact.cs b/Assets/Scripts/Games/FirstContact/FirstContact.cs index 706aa6a8..7559229d 100644 --- a/Assets/Scripts/Games/FirstContact/FirstContact.cs +++ b/Assets/Scripts/Games/FirstContact/FirstContact.cs @@ -2,9 +2,11 @@ using System; using System.Text; using System.Collections.Generic; using UnityEngine; -using UnityEngine.UI; using HeavenStudio.Util; using TMPro; +using Jukebox; +using UnityEngine.Assertions.Must; +using UnityEngine.UIElements; namespace HeavenStudio.Games.Loaders { @@ -17,10 +19,11 @@ namespace HeavenStudio.Games.Loaders { new GameAction("beat intervals", "Start Interval") { - function = delegate { var e = eventCaller.currentEntity; FirstContact.instance.SetIntervalStart(e.beat, e.length, e["dialogue"]); }, + preFunction = delegate { var e = eventCaller.currentEntity; FirstContact.PreInterval(e.beat, e.length, e["dialogue"], e["auto"]); }, parameters = new List() { - new Param("dialogue", "REPLACE THIS", "Mistranslation Dialogue", "The line to use when messing up the translation") + new Param("dialogue", "REPLACE THIS", "Mistranslation Dialogue", "The line to use when messing up the translation"), + new Param("auto", true, "Auto Pass Turn") }, defaultLength = 4f, resizable = true, @@ -28,19 +31,18 @@ namespace HeavenStudio.Games.Loaders }, new GameAction("alien speak", "Bob Speak") { - function = delegate { var e = eventCaller.currentEntity; FirstContact.instance.AlienSpeak(e.beat, e["dialogue"], e["spaceNum"]); }, defaultLength = 0.5f, parameters = new List() { new Param("spaceNum", new EntityTypes.Integer(0, 12, 0), "Amount of spaces", "Spaces to add before the untranslated icon"), + new Param("dotdotdot", false, "Has ellipses?", "Will the man symbol be proceeded by a <...>?"), new Param("dialogue", "", "Dialogue", "What should this sound translate to?") }, priority = 1 }, new GameAction("alien turnover", "Pass Turn") { - function = delegate { FirstContact.instance.AlienTurnOver(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); }, - resizable = true + function = delegate { FirstContact.instance.PassTurnStandalone(eventCaller.currentEntity.beat); }, }, new GameAction("alien success", "Success") { @@ -92,23 +94,21 @@ namespace HeavenStudio.Games const string MID_MSG_MISS = " ..? "; const string MSG_ALIEN = ""; const string MSG_MAN = ""; + const string MSG_MAN_DDD = "..."; // I should add a DonkTroll sprite 🫰🫰🫰🫰🫰 public static FirstContact instance { get; private set; } - [Header("Properties")] - public int alienSpeakCount; - public int translatorSpeakCount; - public bool hasMissed; + //[Header("Properties")] + private bool hasMissed; private double lastReportedBeat = 0; [Header("Components")] - [SerializeField] GameObject alien; - [SerializeField] GameObject translator; + [SerializeField] Animator alien; + [SerializeField] Animator translator; //[SerializeField] GameObject alienSpeech; - [SerializeField] GameObject dummyHolder; [SerializeField] GameObject missionControl; - [SerializeField] GameObject liveBar; + [SerializeField] Animator liveBar; [SerializeField] GameObject alienTextbox; [SerializeField] TMP_Text alienText; @@ -119,9 +119,6 @@ namespace HeavenStudio.Games [Header("Variables")] int currentVoicelineIndex = -1; - public bool intervalStarted; - double intervalStartBeat; - public float beatInterval = 4f; public bool noHitOnce, isSpeaking; //public int version; public float lookAtLength = 1f; @@ -133,14 +130,14 @@ namespace HeavenStudio.Games string respDiagBuffer = ""; List callDiagList = new List(); int callDiagIndex = 0; - - - static List queuedInputs = new List(); - struct QueuedSecondContactInput + private struct QueuedInterval { - public double beatAwayFromStart; - public string dialogue; + public double beat; + public float interval; + public bool autoPassTurn; + public string outDialogue; } + private static List queuedIntervals = new List(); //public enum VersionOfContact //{ @@ -163,10 +160,6 @@ namespace HeavenStudio.Games void OnDestroy() { - if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) - { - if (queuedInputs.Count > 0) queuedInputs.Clear(); - } foreach (var evt in scheduledInputs) { evt.Disable(); @@ -190,47 +183,115 @@ namespace HeavenStudio.Games translateFailTextbox.SetActive(false); } - public void SetIntervalStart(double beat, float interval, string outDialogue) + private List GetAllSpeaksInBetweenBeat(double beat, double endBeat) { - translator.GetComponent().Play("translator_lookAtAlien", 0, 0); - if (!intervalStarted) + List speakEvents = EventCaller.GetAllInGameManagerList("firstContact", new string[] { "alien speak" }); + List tempEvents = new(); + + foreach (var entity in speakEvents) { - //alienSpeakCount = 0; - //translatorSpeakCount = 0; - intervalStarted = true; + if (entity.beat >= beat && entity.beat < endBeat) + { + tempEvents.Add(entity); + } } + return tempEvents; + } - intervalStartBeat = beat; - beatInterval = interval; + private RiqEntity GetLastIntervalBeforeBeat(double beat) + { + List intervalEvents = EventCaller.GetAllInGameManagerList("firstContact", new string[] { "beat intervals" }); + if (intervalEvents.Count == 0) return null; + var tempEvents = intervalEvents.FindAll(x => x.beat <= beat); + tempEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); + return tempEvents[^1]; + } - onOutDialogue = outDialogue; - callDiagBuffer = ""; - respDiagBuffer = ""; - callDiagList.Clear(); - callDiagIndex = 0; + public static void PreInterval(double beat, float interval, string outDialogue, bool autoPassTurn) + { + if (GameManager.instance.currentGame == "firstContact") + { + instance.SetIntervalStart(beat, interval, outDialogue, beat, autoPassTurn); + } + else + { + queuedIntervals.Add(new QueuedInterval + { + beat = beat, + interval = interval, + outDialogue = outDialogue, + autoPassTurn = autoPassTurn + }); + } + } - alienText.text = ""; - translateText.text = ""; - translateFailText.text = ""; + private void SetIntervalStart(double beat, float interval, string outDialogue, double gameSwitchBeat, bool autoPassTurn) + { + List relevantSpeakEvents = GetAllSpeaksInBetweenBeat(beat, beat + interval); + relevantSpeakEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); + List queuedSpeaks = new() + { + new BeatAction.Action(beat, delegate + { + translator.Play("translator_lookAtAlien", 0, 0); - alienTextbox.SetActive(false); - translateTextbox.SetActive(false); - translateFailTextbox.SetActive(false); + onOutDialogue = outDialogue; + callDiagBuffer = ""; + respDiagBuffer = ""; + callDiagList.Clear(); + callDiagIndex = 0; + + alienText.text = ""; + translateText.text = ""; + translateFailText.text = ""; + + alienTextbox.SetActive(false); + translateTextbox.SetActive(false); + translateFailTextbox.SetActive(false); + if (autoPassTurn) + { + AlienTurnOver(beat + interval, beat, beat + interval); + } + }) + }; + for (int i = 0; i < relevantSpeakEvents.Count; i++) + { + RiqEntity speakEventToCheck = relevantSpeakEvents[i]; + if (speakEventToCheck.beat >= gameSwitchBeat) + { + queuedSpeaks.Add(new BeatAction.Action(speakEventToCheck.beat, delegate + { + AlienSpeak(speakEventToCheck.beat, speakEventToCheck["spaceNum"], speakEventToCheck["dotdotdot"]); + })); + } + else + { + AlienSpeakInactive(speakEventToCheck["spaceNum"]); + } + } + BeatAction.New(gameObject, queuedSpeaks); + } + + public override void OnGameSwitch(double beat) + { + if (Conductor.instance.isPlaying && !Conductor.instance.isPaused) + { + if (queuedIntervals.Count > 0) + { + foreach (var interval in queuedIntervals) + { + SetIntervalStart(interval.beat, interval.interval, interval.outDialogue, beat, interval.autoPassTurn); + } + queuedIntervals.Clear(); + } + } } private void Update() { - if (!Conductor.instance.isPlaying || Conductor.instance.isPaused) - { - if (queuedInputs.Count > 0) queuedInputs.Clear(); - } - if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted) - { - intervalStarted = false; - } if (Conductor.instance.ReportBeat(ref lastReportedBeat, offset: liveBarBeatOffset)) { - liveBar.GetComponent().Play("liveBar", 0, 0); + liveBar.Play("liveBar", 0, 0); } else if (Conductor.instance.songPositionInBeatsAsDouble < lastReportedBeat) { @@ -239,7 +300,7 @@ namespace HeavenStudio.Games if (PlayerInput.Pressed(true) && !IsExpectingInputNow(InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN)) { - translator.GetComponent().DoScaledAnimationAsync("translator_eh", 0.5f); + translator.DoScaledAnimationAsync("translator_eh", 0.5f); if (isSpeaking) { if (callDiagIndex == 0) @@ -273,42 +334,47 @@ namespace HeavenStudio.Games switch (alienLookAt) { case 0: - alien.GetComponent().Play("alien_lookAt", 0, 0); + alien.Play("alien_lookAt", 0, 0); break; case 1: - alien.GetComponent().Play("alien_idle", 0, 0); + alien.Play("alien_idle", 0, 0); break; } switch (translatorLookAt) { case 0: - translator.GetComponent().Play("translator_lookAtAlien", 0, 0); + translator.Play("translator_lookAtAlien", 0, 0); break; case 1: - translator.GetComponent().Play("translator_idle", 0, 0); + translator.Play("translator_idle", 0, 0); break; } } - public void AlienSpeak(double beat, string dialogue, int spaceNum) + private void AlienSpeak(double beat, int spaceNum, bool hasDDD) { - queuedInputs.Add(new QueuedSecondContactInput() - { - beatAwayFromStart = beat - intervalStartBeat, - dialogue = dialogue - }); int voiceline = UnityEngine.Random.Range(1, 11); if (voiceline == currentVoicelineIndex) voiceline++; if (voiceline > 10) voiceline = 1; currentVoicelineIndex = voiceline; SoundByte.PlayOneShotGame("firstContact/Bob" + voiceline, beat, SoundByte.GetPitchFromCents(UnityEngine.Random.Range(-100, 0), false)); SoundByte.PlayOneShotGame("firstContact/BobB"); - alien.GetComponent().DoScaledAnimationAsync("alien_talk", 0.5f); - if (UnityEngine.Random.Range(0, 5) == 0) translator.GetComponent().DoScaledAnimationAsync("translator_lookAtAlien_nod", 0.5f); - callDiagList.Add(dialogue); + alien.DoScaledAnimationAsync("alien_talk", 0.5f); + if (UnityEngine.Random.Range(0, 5) == 0) translator.DoScaledAnimationAsync("translator_lookAtAlien_nod", 0.5f); + alienTextbox.SetActive(true); + for (int i = 0; i < spaceNum * 2; i++) + { + callDiagBuffer += " "; + } + callDiagBuffer += hasDDD ? MSG_MAN_DDD : MSG_MAN; + UpdateAlienTextbox(); + } + + private void AlienSpeakInactive(int spaceNum) + { alienTextbox.SetActive(true); for (int i = 0; i < spaceNum * 2; i++) { @@ -318,28 +384,38 @@ namespace HeavenStudio.Games UpdateAlienTextbox(); } - public void AlienTurnOver(double beat, float length) + public void PassTurnStandalone(double beat) { - if (queuedInputs.Count == 0) return; - SoundByte.PlayOneShotGame("firstContact/turnover"); - alienTextbox.SetActive(false); - alien.GetComponent().Play("alien_point", 0, 0); + RiqEntity lastInterval = GetLastIntervalBeforeBeat(beat); + if (lastInterval == null) return; + AlienTurnOver(beat, lastInterval.beat, lastInterval.beat + lastInterval.length); + } - isSpeaking = true; - intervalStarted = false; - BeatAction.New(alien, new List() + private void AlienTurnOver(double beat, double intervalBeat, double endBeat) + { + var inputs = GetAllSpeaksInBetweenBeat(intervalBeat, endBeat); + inputs.Sort((x, y) => x.beat.CompareTo(y.beat)); + for (int i = 0; i < inputs.Count; i++) { - new BeatAction.Action(beat + 0.5f, delegate { alien.GetComponent().Play("alien_idle", 0, 0); }) + var input = inputs[i]; + double relativeBeat = input.beat - intervalBeat; + ScheduleInput(beat, 1 + relativeBeat, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, AlienTapping, AlienOnMiss, AlienEmpty); + callDiagList.Add(input["dialogue"]); + } + BeatAction.New(gameObject, new List() + { + new BeatAction.Action(beat, delegate + { + isSpeaking = true; + SoundByte.PlayOneShotGame("firstContact/turnover"); + alienTextbox.SetActive(false); + alien.Play("alien_point", 0, 0); + }), + new BeatAction.Action(beat + 0.5f, delegate + { + alien.Play("alien_idle", 0, 0); + }) }); - if (!isSpeaking) - { - translator.GetComponent().Play("translator_idle", 0, 0); - } - foreach (var input in queuedInputs) - { - ScheduleInput(beat, length + input.beatAwayFromStart, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, AlienTapping, AlienOnMiss, AlienEmpty); - } - queuedInputs.Clear(); } public void AlienSuccess(double beat) @@ -372,14 +448,13 @@ namespace HeavenStudio.Games MultiSound.Play(sound.ToArray()); - BeatAction.New(alien, new List() + BeatAction.New(gameObject, new List() { - new BeatAction.Action(beat, delegate { alien.GetComponent().Play(animString, 0, 0); }), - new BeatAction.Action(beat + .5f, delegate { alien.GetComponent().Play(animString, 0, 0); }), + new BeatAction.Action(beat, delegate { alien.Play(animString, 0, 0); }), + new BeatAction.Action(beat + .5f, delegate { alien.Play(animString, 0, 0); }), new BeatAction.Action(beat + 1, delegate { alienTextbox.SetActive(false); translateTextbox.SetActive(false); translateFailTextbox.SetActive(false); }) }); - intervalStarted = false; isSpeaking = false; hasMissed = false; noHitOnce = false; @@ -430,8 +505,8 @@ namespace HeavenStudio.Games } missionControl.GetComponentInParent().Play(textToPut, 0, 0); - alien.GetComponentInParent().Play("alien_idle", 0, 0); - translator.GetComponent().Play("translator_idle", 0, 0); + alien.Play("alien_idle", 0, 0); + translator.Play("translator_idle", 0, 0); if (!stay) { @@ -444,16 +519,13 @@ namespace HeavenStudio.Games { missionControl.SetActive(true); } - - alienSpeakCount = 0; - translatorSpeakCount = 0; isSpeaking = false; } void FailContact() { SoundByte.PlayOneShotGame("firstContact/failContact"); - translator.GetComponent().DoScaledAnimationAsync("translator_speak", 0.5f); + translator.DoScaledAnimationAsync("translator_speak", 0.5f); if (!hasMissed && callDiagIndex == 0) { translateFailTextbox.SetActive(true); @@ -467,7 +539,7 @@ namespace HeavenStudio.Games void TrailingContact() { SoundByte.PlayOneShotGame("firstContact/slightlyFail"); - translator.GetComponent().Play("translator_eh", 0, 0); + translator.Play("translator_eh", 0, 0); if (!hasMissed) { respDiagBuffer += MID_MSG_MISS; @@ -495,13 +567,13 @@ namespace HeavenStudio.Games if (state >= 1f || state <= -1f) { SoundByte.PlayOneShotGame("firstContact/ALIEN_PLAYER_A", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-3, 3), false)); - translator.GetComponent().DoScaledAnimationAsync("translator_speak", 0.5f); + translator.DoScaledAnimationAsync("translator_speak", 0.5f); if (callDiagIndex == 0) return; TrailingContact(); return; } - translator.GetComponent().DoScaledAnimationAsync("translator_speak", 0.5f); + translator.DoScaledAnimationAsync("translator_speak", 0.5f); SoundByte.PlayOneShotGame("firstContact/ALIEN_PLAYER_A", -1, SoundByte.GetPitchFromSemiTones(UnityEngine.Random.Range(-3, 3), false)); SoundByte.PlayOneShotGame("firstContact/ALIEN_PLAYER_B"); if (hasMissed) @@ -533,7 +605,7 @@ namespace HeavenStudio.Games hasMissed = true; } - alien.GetComponent().Play("alien_noHit", 0, 0); + alien.Play("alien_noHit", 0, 0); } public void AlienEmpty(PlayerActionEvent caller) { } //OnEmpty diff --git a/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs b/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs index b0d9c570..4b936e75 100644 --- a/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs +++ b/Assets/Scripts/Games/RhythmTweezers/RhythmTweezers.cs @@ -171,8 +171,6 @@ namespace HeavenStudio.Games public GameObject DroppedHairsHolder; [Header("Variables")] - private double passTurnBeat; - private double passTurnEndBeat = 2; private static List queuedPeeks = new List(); [Header("Sprites")] diff --git a/Assets/Scripts/Games/Rockers/Rockers.cs b/Assets/Scripts/Games/Rockers/Rockers.cs index 89bc077d..5ba51998 100644 --- a/Assets/Scripts/Games/Rockers/Rockers.cs +++ b/Assets/Scripts/Games/Rockers/Rockers.cs @@ -356,8 +356,6 @@ namespace HeavenStudio.Games } public static Rockers instance; - public static CallAndResponseHandler crHandlerInstance; - [Header("Rockers")] public RockersRocker JJ; public RockersRocker Soshi; @@ -392,10 +390,6 @@ namespace HeavenStudio.Games private void Awake() { instance = this; - if (crHandlerInstance == null) - { - crHandlerInstance = new CallAndResponseHandler(); - } var tempEvents = EventCaller.GetAllInGameManagerList("rockers", new string[] { "prepare" }); foreach (var tempEvent in tempEvents) { @@ -470,6 +464,15 @@ namespace HeavenStudio.Games return tempEvents; } + private RiqEntity GetLastIntervalBeforeBeat(double beat) + { + List intervalEvents = EventCaller.GetAllInGameManagerList("rockers", new string[] { "intervalStart" }); + if (intervalEvents.Count == 0) return null; + var tempEvents = intervalEvents.FindAll(x => x.beat <= beat); + tempEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); + return tempEvents[^1]; + } + private List GrabAllTogetherEvents(double beat) { var tempEvents = EventCaller.GetAllInGameManagerList("rockers", new string[] { "riffTogether", "riffTogetherEnd" }); @@ -536,11 +539,6 @@ namespace HeavenStudio.Games } } - public override void OnPlay(double beat) - { - crHandlerInstance = null; - } - private void OnDestroy() { if (queuedCameraEvents.Count > 0) queuedCameraEvents.Clear(); @@ -741,7 +739,7 @@ namespace HeavenStudio.Games public void TogetherPrepare(double beat, bool cmon, bool muteSound, float muteBeat, float goToMiddleBeat, bool moveCamera) { List togetherEvents = GrabAllTogetherEvents(beat); - if (togetherEvents.Count == 0 || crHandlerInstance.IntervalIsActive()) return; + if (togetherEvents.Count == 0) return; if (!muteSound) SoundByte.PlayOneShotGame(cmon ? "rockers/Cmon" : "rockers/LastOne"); List actions = new List(); if (moveCamera) @@ -841,9 +839,6 @@ namespace HeavenStudio.Games public void StartInterval(double beat, float length, double gameSwitchBeat, bool autoPassTurn, bool moveCamera) { - CallAndResponseHandler newHandler = new(); - crHandlerInstance = newHandler; - crHandlerInstance.StartInterval(beat, length); List relevantInputs = GrabAllInputsBetween(beat, beat + length); List riffUsedBeats = new List(); List bendUsedBeats = new(); @@ -854,21 +849,6 @@ namespace HeavenStudio.Games RiqEntity foundEvent = riffEvents.Find(x => x.beat == input.beat); if ((foundEvent == null || (riffUsedBeats.Count > 0 && riffUsedBeats.Contains((float)foundEvent.beat))) && riffEvents.Count > 1) continue; riffUsedBeats.Add(input.beat); - if (input["respond"]) - { - crHandlerInstance.AddEvent(input.beat, input.length, "riff", new List() - { - new CallAndResponseHandler.CallAndResponseEventParam("gleeClub", input["gcS"]), - new CallAndResponseHandler.CallAndResponseEventParam("1", input["1S"]), - new CallAndResponseHandler.CallAndResponseEventParam("2", input["2S"]), - new CallAndResponseHandler.CallAndResponseEventParam("3", input["3S"]), - new CallAndResponseHandler.CallAndResponseEventParam("4", input["4S"]), - new CallAndResponseHandler.CallAndResponseEventParam("5", input["5S"]), - new CallAndResponseHandler.CallAndResponseEventParam("6", input["6S"]), - new CallAndResponseHandler.CallAndResponseEventParam("sample", input["sampleS"]), - new CallAndResponseHandler.CallAndResponseEventParam("sampleTones", input["pitchSampleS"]) - }); - } if (input.beat >= gameSwitchBeat) { BeatAction.New(instance.gameObject, new List() @@ -889,18 +869,11 @@ namespace HeavenStudio.Games else { if (riffEvents.Count == 0) continue; - RiqEntity foundEvent = bendEvents.Find(x => x.beat == beat); + RiqEntity foundEvent = bendEvents.Find(x => x.beat == input.beat); if ((foundEvent == null || (bendUsedBeats.Count > 0 && bendUsedBeats.Contains((float)foundEvent.beat))) && bendEvents.Count > 1) continue; - RiqEntity riffEventToCheck = riffEvents.Find(x => beat >= x.beat && beat < x.beat + x.length); + RiqEntity riffEventToCheck = riffEvents.Find(x => input.beat >= x.beat && input.beat < x.beat + x.length); if (riffEventToCheck == null) continue; bendUsedBeats.Add(beat); - if (input["respond"]) - { - crHandlerInstance.AddEvent(input.beat, input.length, "bend", new List() - { - new CallAndResponseHandler.CallAndResponseEventParam("Pitch", input["1S"]), - }); - } if (input.beat >= gameSwitchBeat) { BeatAction.New(instance.gameObject, new List() @@ -926,7 +899,7 @@ namespace HeavenStudio.Games } }), }); - if (autoPassTurn) PassTurn(beat + length, moveCamera, newHandler); + if (autoPassTurn) PassTurn(beat + length, moveCamera, beat, length); } public void Riff(double beat, float length, int[] pitches, bool gleeClubJJ, int sampleJJ, int sampleTonesJJ, bool noRespond) @@ -1004,12 +977,15 @@ namespace HeavenStudio.Games private void StandalonePassTurn(double beat, bool moveCamera) { - if (crHandlerInstance != null) PassTurn(beat, moveCamera, crHandlerInstance); + RiqEntity lastInterval = GetLastIntervalBeforeBeat(beat); + if (lastInterval == null) return; + PassTurn(beat, moveCamera, lastInterval.beat, lastInterval.length); } - private void PassTurn(double beat, bool moveCamera, CallAndResponseHandler handler) + private void PassTurn(double beat, bool moveCamera, double intervalStartBeat, float intervalLength) { - if (crHandlerInstance.queuedEvents.Count > 0) + var relevantInputs = GrabAllInputsBetween(intervalStartBeat, intervalStartBeat + intervalLength); + if (relevantInputs.Count > 0) { BeatAction.New(instance.gameObject, new List() { @@ -1024,25 +1000,38 @@ namespace HeavenStudio.Games }), new BeatAction.Action(beat -0.25, delegate { - List crEvents = handler.queuedEvents; - - foreach (var crEvent in crEvents) + List riffUsedBeats = new List(); + List bendUsedBeats = new(); + foreach (var crEvent in relevantInputs) { - if (crEvent.tag == "riff") + if (!crEvent["respond"]) continue; + double relativeBeat = crEvent.beat - intervalStartBeat; + if (crEvent.datamodel == "rockers/riff") { + RiqEntity foundEvent = riffEvents.Find(x => x.beat == crEvent.beat); + if ((foundEvent == null || (riffUsedBeats.Count > 0 && riffUsedBeats.Contains((float)foundEvent.beat))) && riffEvents.Count > 1) continue; + riffUsedBeats.Add(crEvent.beat); + RockersInput riffComp = Instantiate(rockerInputRef, transform); - riffComp.Init(crEvent["gleeClub"], new int[6] { crEvent["1"], crEvent["2"], crEvent["3"], crEvent["4"], crEvent["5"], crEvent["6"] }, beat, crEvent.relativeBeat, - (PremadeSamples)crEvent["sample"], crEvent["sampleTones"]); - ScheduleInput(beat, crEvent.relativeBeat + crEvent.length, InputType.STANDARD_DOWN, JustMute, MuteMiss, Empty); + riffComp.Init(crEvent["gcS"], new int[6] { crEvent["1S"], crEvent["2S"], crEvent["3S"], crEvent["4S"], crEvent["5S"], crEvent["6S"] }, beat, relativeBeat, + (PremadeSamples)crEvent["sampleS"], crEvent["pitchSampleS"]); + if (crEvent.length > 0.5f) ScheduleAutoplayInput(beat, relativeBeat + crEvent.length, InputType.STANDARD_DOWN, JustMute, MuteMiss, Empty); + else ScheduleInput(beat, relativeBeat + crEvent.length, InputType.STANDARD_DOWN, JustMute, MuteMiss, Empty); } - else if (crEvent.tag == "bend") + else { + if (riffEvents.Count == 0) continue; + RiqEntity foundEvent = bendEvents.Find(x => x.beat == crEvent.beat); + if ((foundEvent == null || (bendUsedBeats.Count > 0 && bendUsedBeats.Contains((float)foundEvent.beat))) && bendEvents.Count > 1) continue; + RiqEntity riffEventToCheck = riffEvents.Find(x => crEvent.beat >= x.beat && crEvent.beat < x.beat + x.length); + if (riffEventToCheck == null) continue; + bendUsedBeats.Add(beat); + RockerBendInput bendComp = Instantiate(rockerBendInputRef, transform); - bendComp.Init(crEvent["Pitch"], beat, crEvent.relativeBeat); - ScheduleInput(beat, crEvent.relativeBeat + crEvent.length, InputType.DIRECTION_UP, JustUnBend, UnBendMiss, Empty); + bendComp.Init(crEvent["1S"], beat, relativeBeat); + ScheduleAutoplayInput(beat, relativeBeat + crEvent.length, InputType.DIRECTION_UP, JustUnBend, UnBendMiss, Empty); } } - handler.queuedEvents.Clear(); }), new BeatAction.Action(beat, delegate { diff --git a/Assets/Scripts/Games/WorkingDough/WorkingDough.cs b/Assets/Scripts/Games/WorkingDough/WorkingDough.cs index 33450699..7a98ba01 100644 --- a/Assets/Scripts/Games/WorkingDough/WorkingDough.cs +++ b/Assets/Scripts/Games/WorkingDough/WorkingDough.cs @@ -206,7 +206,6 @@ namespace HeavenStudio.Games public Sprite redArrowSprite; public static WorkingDough instance; - private static CallAndResponseHandler crHandlerInstance; void Awake() { @@ -232,7 +231,7 @@ namespace HeavenStudio.Games shipObject.SetActive(!bgDisabled && !shipOnly); } - private static List GetAllBallsInBetweenBeat(double beat, double endBeat) + private List GetAllBallsInBetweenBeat(double beat, double endBeat) { List ballEvents = EventCaller.GetAllInGameManagerList("workingDough", new string[] { "small ball", "big ball" }); List tempEvents = new(); @@ -247,11 +246,17 @@ namespace HeavenStudio.Games return tempEvents; } + private RiqEntity GetLastIntervalBeforeBeat(double beat) + { + List intervalEvents = EventCaller.GetAllInGameManagerList("workingDough", new string[] { "beat intervals" }); + if (intervalEvents.Count == 0) return null; + var tempEvents = intervalEvents.FindAll(x => x.beat <= beat); + tempEvents.Sort((x, y) => x.beat.CompareTo(y.beat)); + return tempEvents[^1]; + } + public void SetIntervalStart(double beat, double gameSwitchBeat, float interval = 8f, bool autoPassTurn = true) { - CallAndResponseHandler newHandler = new(); - crHandlerInstance = newHandler; - crHandlerInstance.StartInterval(beat, interval); List relevantBalls = GetAllBallsInBetweenBeat(beat, beat + interval); bool hasBigBall = false; foreach (var ball in relevantBalls) @@ -260,17 +265,14 @@ namespace HeavenStudio.Games if (ball.beat >= gameSwitchBeat) { SpawnBall(ball.beat - 1, isBig, isBig && ball["hasGandw"]); - OnSpawnBall(ball.beat, isBig, isBig && ball["hasGandw"]); - } - else - { - OnSpawnBallInactive(ball.beat, isBig, isBig && ball["hasGandw"]); + OnSpawnBall(ball.beat, isBig); } if (isBig) hasBigBall = true; } + Debug.Log(autoPassTurn); if (autoPassTurn) { - PassTurn(beat + interval, interval, newHandler); + PassTurn(beat + interval, interval, beat); } BeatAction.New(ballTransporterLeftNPC, new List() { @@ -305,10 +307,12 @@ namespace HeavenStudio.Games private void PassTurnStandalone(double beat) { - if (crHandlerInstance != null) PassTurn(beat, crHandlerInstance.intervalLength, crHandlerInstance); + RiqEntity lastInterval = GetLastIntervalBeforeBeat(beat); + if (lastInterval == null) return; + PassTurn(beat, lastInterval.length, lastInterval.beat); } - private void PassTurn(double beat, double length, CallAndResponseHandler crHandler) + private void PassTurn(double beat, double length, double startBeat) { BeatAction.New(instance.gameObject, new List() { @@ -316,15 +320,17 @@ namespace HeavenStudio.Games { ballTransporterRightPlayer.GetComponent().Play("BallTransporterRightOpen", 0, 0); ballTransporterLeftPlayer.GetComponent().Play("BallTransporterLeftOpen", 0, 0); - if (crHandler.queuedEvents.Count > 0) + var relevantBallEvents = GetAllBallsInBetweenBeat(startBeat, startBeat + length); + if (relevantBallEvents.Count > 0) { bool hasBig = false; - foreach (var ball in crHandler.queuedEvents) + foreach (var ball in relevantBallEvents) { - SpawnPlayerBall(beat + ball.relativeBeat - 1, ball.tag == "big", ball["hasGandw"]); - if (ball.tag == "big") hasBig = true; + double relativeBeat = ball.beat - startBeat; + bool isBig = ball.datamodel == "workingDough/big ball"; + SpawnPlayerBall(beat + relativeBeat - 1, isBig, isBig ? ball["hasGandw"] : false); + if (isBig) hasBig = true; } - crHandler.queuedEvents.Clear(); bigModePlayer = hasBig; if (bigModePlayer) { @@ -335,7 +341,7 @@ namespace HeavenStudio.Games new BeatAction.Action(beat + 1, delegate { if (gandwHasEntered && !bgDisabled) gandwAnim.Play("MrGameAndWatchLeverDown", 0, 0); - if (crHandlerInstance == null || !crHandlerInstance.IntervalIsActive()) + if (beat + 1 > GetLastIntervalBeforeBeat(beat + 1).beat + GetLastIntervalBeforeBeat(beat + 1).length) { ballTransporterLeftNPC.GetComponent().Play("BallTransporterLeftClose", 0, 0); ballTransporterRightNPC.GetComponent().Play("BallTransporterRightClose", 0, 0); @@ -381,24 +387,8 @@ namespace HeavenStudio.Games }); } - public static void OnSpawnBallInactive(double beat, bool isBig, bool hasGandw) + public void OnSpawnBall(double beat, bool isBig) { - if (crHandlerInstance == null) - { - crHandlerInstance = new CallAndResponseHandler(); - } - crHandlerInstance.AddEvent(beat, 0, isBig ? "big" : "small", new List() - { - new CallAndResponseHandler.CallAndResponseEventParam("hasGandw", hasGandw) - }); - } - - public void OnSpawnBall(double beat, bool isBig, bool hasGandw) - { - crHandlerInstance.AddEvent(beat, 0, isBig ? "big" : "small", new List() - { - new CallAndResponseHandler.CallAndResponseEventParam("hasGandw", hasGandw) - }); SoundByte.PlayOneShotGame(isBig ? "workingDough/hitBigOther" : "workingDough/hitSmallOther", beat); SoundByte.PlayOneShotGame(isBig ? "workingDough/bigOther" : "workingDough/smallOther", beat); } @@ -445,19 +435,6 @@ namespace HeavenStudio.Games }); } } - - void OnDestroy() - { - if (crHandlerInstance != null && !Conductor.instance.isPlaying) - { - crHandlerInstance = null; - } - foreach (var evt in scheduledInputs) - { - evt.Disable(); - } - } - public override void OnGameSwitch(double beat) { if (Conductor.instance.isPlaying && !Conductor.instance.isPaused) @@ -473,11 +450,6 @@ namespace HeavenStudio.Games } } - public override void OnPlay(double beat) - { - crHandlerInstance = null; - } - void Update() { if (spaceshipRising && !bgDisabled) spaceshipAnimator.DoScaledAnimation("RiseSpaceship", risingStartBeat, risingLength);